@@ -0,0 +1,2996 @@
2+var Guid = function() {
4+ var guid = function() { counter += 1; return counter; };
8+Elm.JavaScript = function() {
9+ function castJSBoolToBool(b) { return b; }
10+ function castBoolToJSBool(b) { return b; }
12+ function castJSNumberToFloat(n) { return n; }
13+ function castFloatToJSNumber(n) { return n; }
15+ function castJSNumberToInt(n) { return ~~n; }
16+ function castIntToJSNumber(n) { return n; }
18+ function castJSElementToElement(w) {
20+ return function(node) {
21+ return ["Element",Guid.guid(),
22+ ["EExternalHtml",node],
23+ w,h,1,Nothing,Nothing];
27+ function castElementToJSElement(elem) { return Render.render(elem); }
29+ function castJSArrayToList(arr) {
31+ for (var i = arr.length; i--; ) {
32+ list = [ "Cons", arr[i], list ];
36+ function castListToJSArray(list) {
38+ while (list[0] === "Cons") {
45+ var castJSStringToString = castJSArrayToList;
46+ function castStringToJSString(str) {
47+ if (typeof str === "string") return str;
48+ return castListToJSArray(str).join('');
51+ function fromTuple(t) { return t.slice(1); }
52+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
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
78+Elm.JSON = function() {
79+ var JS = Elm.JavaScript;
80+ var empty = ['JSON',{}];
81+ function singleton(k) { return function(v) {
83+ obj[JS.castStringToJSString(k)] = v;
84+ return ['JSON', obj ];
87+ function insert(k) { return function(v) { return function(inObj) {
93+ outObj[JS.castStringToJSString(k)] = v;
94+ return ['JSON', outObj ];
98+ function lookup(key) { return function(obj) {
99+ var k = JS.castStringToJSString(key);
100+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
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 ;
109+ function remove(k) { return function(inObj) {
112+ for (var i in obj) {
115+ delete outObj[JS.castStringToJSString(k)];
116+ return ['JSON', outObj];
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 ]; }
127+ function toList(json) {
130+ for (var i in obj) {
131+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
133+ return JS.castJSArrayToList(arr);
135+ function fromList(list) {
136+ var arr = JS.castListToJSArray(list);
138+ for (var i = arr.length; i--; ) {
139+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
141+ return [ "JSON", obj ];
144+ function toPrettyJSString(sep) { return function (obj) {
145+ function fromValue(v) {
147+ case 'JsonNull' : return null;
148+ case 'JsonString' : return JS.castStringToJSString(v[1]);
152+ for (var i in from) {
153+ o[i] = fromValue(from[i]);
157+ var a = JS.castListToJSArray(v[1]);
158+ for (var i = a.length; i--; ) {
159+ a[i] = fromValue(a[i]);
166+ return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
169+ function fromJSString(str) {
170+ var obj = JSON.parse(str);
171+ function toValue(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) ];
177+ if (v === null) return [ "JsonNull" ];
179+ v[i] = toValue(v[i]);
181+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182+ return [ "JsonObject", [ "JSON", v ] ];
185+ for (var i in obj) {
186+ obj[i] = toValue(obj[i]);
188+ return ['JSON',obj];
190+ return {empty : empty,
191+ singleton : singleton,
194+ findWithDefault : lookupWithDefault,
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)); },
204+ fromList : fromList,
205+ JsonString : JsonString,
206+ JsonNumber : JsonNumber,
207+ JsonBool : JsonBool,
208+ JsonNull : JsonNull,
209+ JsonArray : JsonArray,
210+ JsonObject : JsonObject
213+var Value = function(){
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;
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];
237+ var listToArray = function(list) {
239+ while (list[0] === "Cons") {
246+ function makeSpaces(s) {
247+ if (s.length == 0) { return s; }
248+ var arr = s.split('');
249+ if (arr[0] == ' ') { arr[0] = " " }
250+ for (var i = arr.length; --i; ) {
251+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
252+ arr[i-1] = arr[i-1] + arr[i];
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] = ' ';
262+ arr[i] = spaces.join('');
265+ return arr.join('');
268+ function properEscape(str) {
269+ if (str.length == 0) return str;
270+ str = str //.replace(/&/g, "&")
271+ .replace(/"/g, /*"*/ """)
272+ .replace(/'/g, /*'*/ "'")
273+ .replace(/</g, "<")
274+ .replace(/>/g, ">")
275+ .replace(/\n/g, "<br/>");
276+ var arr = str.split('<br/>');
277+ for (var i = arr.length; i--; ) {
278+ arr[i] = makeSpaces(arr[i]);
280+ return arr.join('<br/>');
283+ var toText = function(elmList) {
284+ if (typeof elmList === "string") return properEscape(elmList);
286+ while (elmList[0] === "Cons") {
288+ elmList = elmList[2];
290+ return properEscape(a.join(''));
293+ function getTextSize(w,h,txt) {
294+ var t = document.createElement('div');
296+ t.style.textAlign = 'left';
297+ if (w > 0) { t.style.width = w + "px"; }
299+ t.style.visibility = "hidden";
300+ t.style.styleFloat = "left";
301+ t.style.cssFloat = "left";
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);
309+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
312+ function getSize(e) {
313+ var t = e.cloneNode(true);
315+ t.style.visibility = "hidden";
316+ t.style.styleFloat = "left";
317+ t.style.cssFloat = "left";
319+ document.body.appendChild(t);
320+ var w = t.offsetWidth;
321+ var h = t.offsetHeight;
322+ document.body.removeChild(t);
327+ function getExcess(e) {
328+ var t = e.cloneNode(true);
330+ t.style.visibility = "hidden";
331+ t.style.styleFloat = "left";
332+ t.style.cssFloat = "left";
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);
346+ function groupForms(forms) {
347+ forms = Elm.JavaScript.castListToJSArray(forms);
350+ for (var i = forms.length; i--; ) {
354+ if (arr.length > 0) {
364+ if (arr.length > 0) groups.push(arr);
368+ var toString = function(v) {
369+ if (typeof v === "boolean") {
370+ return v ? "True" : "False";
371+ } else if (typeof v === "number") {
373+ } else if (typeof v === "string" && v.length < 2) {
376+ if (v[0].substring(0,5) === "Tuple") {
378+ for (var i = v.length; --i; ) {
379+ output = "," + toString(v[i]) + output;
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]);
391+ if (v[0] === "Cons") {
392+ output += div + f(v[1]);
395+ return output + end;
398+ } else if (v[0] === "Nil") {
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)) + ")";
407+ for (var i = v.length; --i; ) {
408+ output = " " + toString(v[i]) + output
410+ output = v[0] + output;
411+ return (v.length > 1) ? "(" + output + ")" : output;
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);
421+ if (xs[0] === "Nil") {
424+ var root = ["Cons", xs[1], ["Nil"]];
427+ while (xs[0]==="Cons") {
428+ curr[2] = ["Cons", xs[1], ["Nil"]];
436+ var str = function(s) {
438+ for (var i = s.length; i--; ) {
439+ out = ["Cons", s[i], out];
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];
449+ var addListener = function() {
450+ if(document.addEventListener) {
451+ return function(element, event, handler) {
452+ element.addEventListener(event, handler, false);
455+ return function(element, event, handler) {
456+ element.attachEvent('on' + event, handler);
466+ listToArray:listToArray,
468+ properEscape : properEscape,
469+ getTextSize : getTextSize,
471+ getExcess : getExcess,
472+ groupForms : groupForms,
474+ addListener : addListener
476+}();var Elm = Elm || {};
477+Elm.List = function() {
479+ var throwError = function(f) {
480+ throw "Function '" + f + "' expecting a list!";
483+ function length(xs) {
485+ while (xs[0] === "Cons") {
491+ var reverse = foldl(function(x_72) {
492+ return function(y_73) {
493+ return["Cons", x_72, y_73]
496+ var concat = foldr(function(x_74) {
497+ return function(y_75) {
498+ return Value.append(x_74, y_75)
501+ var and = foldl(function(x_77) {
502+ return function(y_78) {
506+ var or = foldl(function(x_79) {
507+ return function(y_80) {
511+ var sum = foldl(function(x_89) {
512+ return function(y_90) {
516+ var product = foldl(function(x_91) {
517+ return function(y_92) {
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) } });
524+ if (v[0] !== "Cons") {
525+ throw "Error: 'head' only accepts lists of length greater than one.";
530+ if (v[0] !== "Cons") {
531+ throw "Error: 'tail' only accepts lists of length greater than one.";
536+ if (v[0] !== "Cons") {
537+ throw "Error: 'last' only accepts lists of length greater than one.";
540+ while (v[0] === "Cons") {
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"]];
553+ while (xs[0]==="Cons") {
554+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
562+ return function(b) {
563+ return function(xs) {
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);
576+ return function(b) {
577+ return function(xs) {
579+ if (xs[0] === "Nil") { return acc; }
580+ if (xs[0] !== "Cons") { throwError('foldr'); }
582+ while (xs[0] === "Cons") {
586+ for (var i = arr.length; i--; ) {
587+ acc = f(arr[i])(acc);
593+ function foldl1(f_49) {
594+ return function(_temp_50) {
595+ return function(v) {
596+ if("Cons" !== v[0]) {
601+ return foldl(f_49)(x_51)(xs_52)
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'); }
611+ while (xs[0] === "Cons") {
615+ var acc = arr.pop();
616+ for (var i = arr.length; i--; ) {
617+ acc = f(arr[i])(acc);
623+ return function(b) {
624+ return function(xs) {
625+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
626+ if (xs[0] !== "Cons") { throwError('scanl'); }
628+ while (xs[0] === "Cons") {
634+ for (var i = arr.length; i--; ) {
635+ out = ["Cons", arr[i], out];
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.";
646+ return scanl(f)(xs[1])(xs[2]);
649+ function filter(pred) {
650+ return function(xs) {
651+ if (xs[0] === "Nil") { return xs; }
652+ if (xs[0] !== "Cons") { throwError('filter'); }
654+ while (xs[0] === "Cons") {
655+ if (pred(xs[1])) { arr.push(xs[1]); }
659+ for (var i = arr.length; i--; ) {
660+ out = ["Cons", arr[i], out];
665+ function concatMap(f_76) {
666+ return function(x) {
667+ return concat(map(f_76)(x))
670+ function all(pred) {
671+ return foldl(function(x) { return function(acc) {
672+ return acc && pred(x);
675+ function any(pred) {
676+ return foldl(function(x) { return function(acc) {
677+ return acc || pred(x);
680+ function partition(pred_93) {
681+ return function(lst_94) {
684+ var c = [function(v) {
685+ if("Nil" !== v[0]) {
688+ return["Tuple2", ["Nil"], ["Nil"]]
691+ if("Cons" !== v[0]) {
696+ return function(v) {
697+ if("Tuple2" !== v[0]) {
702+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
704+ }(partition(pred_93)(xs_96))
707+ for(var i = c.length;i--;) {
709+ if(r !== undefined) {
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'); }
722+ while (listA[0] === "Cons" && listB[0] === "Cons") {
723+ arr.push(f(listA[1])(listB[1]));
728+ for (var i = arr.length; i--; ) {
729+ out = ["Cons", arr[i], out];
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'); }
740+ while (listA[0] === "Cons" && listB[0] === "Cons") {
741+ arr.push(["Tuple2", listA[1], listB[1]]);
746+ for (var i = arr.length; i--; ) {
747+ out = ["Cons", arr[i], out];
752+ function unzip(pairs_112) {
755+ var c = [function(v) {
756+ if("Nil" !== v[0]) {
759+ return["Tuple2", ["Nil"], ["Nil"]]
762+ if("Cons" !== v[0]) {
767+ return function(v) {
768+ if("Tuple2" !== v[0]) {
771+ if("Tuple2" !== v[1][0]) {
774+ var x_115 = v[1][1];
775+ var y_116 = v[1][2];
776+ if("Tuple2" !== v[2][0]) {
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]]
785+ }(["Tuple2", p_113, unzip(ps_114)])
788+ for(var i = c.length;i--;) {
790+ if(r !== undefined) {
796+ function intersperse(sep_119) {
797+ return function(xs_120) {
800+ var c = [function(v) {
801+ if("Nil" !== v[0]) {
807+ if("Cons" !== v[0]) {
811+ if("Nil" !== v[2][0]) {
814+ return["Cons", a_124, ["Nil"]]
818+ if("Cons" !== v[0]) {
822+ if("Cons" !== v[2][0]) {
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])]]
831+ for(var i = c.length;i--;) {
833+ if(r !== undefined) {
840+ function intercalate(sep_125) {
841+ return function(xs_126) {
844+ var c = [function(v) {
845+ if("Nil" !== v[0]) {
851+ if("Cons" !== v[0]) {
855+ if("Nil" !== v[2][0]) {
862+ if("Cons" !== v[0]) {
866+ if("Cons" !== v[2][0]) {
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])))
875+ for(var i = c.length;i--;) {
877+ if(r !== undefined) {
885+ if (xs[0] === "Nil") { return xs; }
886+ if (xs[0] !== "Cons") { throwError('sort'); }
888+ while (xs[0] === "Cons") {
892+ arr.sort(function(a,b) { return a - b});
894+ for (var i = arr.length; i--; ) {
895+ out = [ "Cons", arr[i], out ];
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"] ];
907+ while (xs[0] === "Cons" && n > 0) {
908+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
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) {
940+ concatMap:concatMap,
949+ partition:partition,
953+ intersperse:intersperse,
954+ intercalate:intercalate,
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))&¬(isRedLeftLeft_35(t_186)))?moveRedLeft_38(t_186):t_186)}
995+function moveRedRightIfNeeded_41(t_187){return((not(isRedRight_36(t_187))&¬(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;
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));
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)),
1027+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1028+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
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];
1039+ function fromMaybe(b) { return function(m) {
1040+ if (m[0] === "Just") return m[1];
1044+ function mapCons(f) { return function(y) { return function(xs) {
1046+ if (x[0] === "Just") return ["Cons", x[1], xs];
1051+ function maybe(b) { return function(f) { return function(m) {
1052+ if (m[0] === "Just") return f(m[1]);
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"]); },
1071+var String = function() {
1073+ function append(s1) { return function(s2) {
1074+ return s1.concat(s2);
1077+ function map(f) { return function(s) {
1078+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
1082+ function intercalate(sep) { return function(ss) {
1083+ return Value.listToArray(ss).join(sep);
1086+ function intersperse(sep) { return function(s) {
1087+ return s.split("").join(sep);
1091+ function foldl(f) { return function(b) { return function(s) {
1093+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1098+ function foldr(f) { return function(b) { return function(s) {
1100+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1106+ function concatMap(f) { return function(s) {
1107+ var a = s.split("");
1108+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1113+ function forall(pred) { return function(s) {
1114+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1118+ function exists(pred) { return function(s) {
1119+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1124+ return {cons : 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; },
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(); },
1138+ concat : function(ss) { return Value.listToArray(ss).join(""); },
1139+ concatMap : concatMap,
1145+ toText : Value.toText,
1146+ properEscape : Value.properEscape
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]
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]
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] + ')';
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}
1188+var Collage = function() {
1190+var JS = Elm.JavaScript;
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]); }
1199+function solid(ctx,color,points) {
1200+ tracePoints(ctx,points);
1201+ ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1205+function filled(ctx,color,points) {
1206+ tracePoints(ctx,points);
1207+ ctx.fillStyle = Elm.Graphics.Color.extract(color);
1211+function textured(redo,ctx,src,points) {
1212+ var img = new Image();
1213+ img.src = JS.castStringToJSString(src);
1216+ tracePoints(ctx,points);
1217+ ctx.fillStyle = ctx.createPattern(img,'repeat');
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);
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];
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);
1249+ pindex = (pindex + 1) % plen;
1250+ segmentLength = pattern[pindex];
1252+ if (remaining > 0) {
1253+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1254+ segmentLength -= remaining;
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);
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);
1280+function drawImage(redo,ctx,w,h,src) {
1281+ var img = new Image();
1283+ img.src = JS.castStringToJSString(src);
1284+ ctx.drawImage(img,-w/2,-h/2,w,h);
1287+function renderForm(redo,ctx,theta,scale,x,y,form) {
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);
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;
1301+function renderForms(redo,ctx,w,h,forms) {
1302+ ctx.clearRect(0,0,w,h);
1303+ for (var i = forms.length; i--; ) {
1305+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
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);
1323+ canvas.innerHTML = "Your browser does not support the canvas element.";
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";
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--; ) {
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]);
1354+ elems[i] = collageForms(w,h,f);
1357+ if (formss.length === 1) { return elems[0]; }
1358+ return Render.flowWith(Render.goIn,function(x){return x},elems);
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);
1373+ var newNode = collageForms(w,h,nextSet);
1374+ newNode.style.position = 'absolute';
1375+ return node.parentNode.replaceChild(newNode,node);
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);
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]);
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]);
1395+function style(clr,n,list) {
1397+ '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1401+function insideForm(point) { return function(form) {
1402+ if (!inBoundsOf(point[1],point[2],form)) return false;
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;
1408+ hw = form[4][1] / 2;
1409+ hh = form[4][2] / 2;
1412+ hw = form[4][1][3] / 2;
1413+ hh = form[4][1][4] / 2;
1416+ return insideShape(point,form[1],form[2],form[3],
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]) {
1432+ var points = form[4][3][1];
1433+ for (var i = points.length; --i; ) {
1435+ radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1437+ radiusSquared *= scale * scale;
1442+ var x = scale * form[4][1] / 2;
1443+ var y = scale * form[4][2] / 2;
1444+ radiusSquared = x*x + y*y;
1447+ var x = scale * form[4][1][3] / 2;
1448+ var y = scale * form[4][1][4] / 2;
1449+ radiusSquared = x*x + y*y;
1452+ form.push(function(px,py) {
1455+ return dx*dx + dy*dy < radiusSquared + 1;
1458+ return form[5](px,py);
1461+function insideShape(point,theta,scale,pos,points) {
1463+ var list = ["Nil"];
1466+ var x = (point[1] - pos[1]) / scale;
1467+ var y = (point[2] - pos[2]) / scale;
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);
1475+ if (points.length === 0) { return false; }
1477+ for (var i = points.length - 1; i--; ) {
1479+ var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
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;}
1484+ if (ymin < y && y <= ymax && x <= xmax) {
1485+ if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1491+ return (counter % 2) === 1;
1494+return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
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]
1509+ function Relative_13(a1) {
1510+ return["Relative", a1]
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]
1520+ function PositionTL_18(a1) {
1521+ return function(a2) {
1522+ return["PositionTL", a1, a2]
1525+ function PositionTR_19(a1) {
1526+ return function(a2) {
1527+ return["PositionTR", a1, a2]
1530+ function PositionBL_20(a1) {
1531+ return function(a2) {
1532+ return["PositionBL", a1, a2]
1535+ function PositionBR_21(a1) {
1536+ return function(a2) {
1537+ return["PositionBR", a1, a2]
1540+ function Element_37(id,e,w,h,o,c,l) {
1541+ return["Element", id, e, w, h, o, c, l ]
1543+ function EText_39(a1) {
1544+ return function(a2) {
1545+ return["EText", a1, a2]
1548+ function EImage_40(a1) {
1549+ return["EImage", JS.castStringToJSString(a1)]
1551+ function EVideo_41(a1) {
1552+ return["EVideo", JS.castStringToJSString(a1)]
1554+ function EFittedImage_42(a1) {
1555+ return["EFittedImage", JS.castStringToJSString(a1)]
1557+ function EFlow_43(a1) {
1558+ return function(a2) {
1559+ return["EFlow", a1, JS.castListToJSArray(a2)]
1562+ function ECollage_44(a1) {
1563+ return function(a2) {
1564+ return function(a3) {
1565+ return["ECollage", a1, a2, Value.groupForms(a3)]
1569+ var EEmpty_45 = ["EEmpty"];
1570+ function EContainer_46(a1) {
1571+ return function(a2) {
1572+ return["EContainer", a1, a2]
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)]
1581+ var Filled_72 = ["Filled"];
1582+ var Outlined_73 = ["Outlined"];
1583+ function CustomOutline_74(a1) {
1584+ return["CustomOutline", JS.castListToJSArray(a1)]
1586+ function Line_75(a1) {
1587+ return["Line", JS.castListToJSArray(a1)]
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];
1596+ function Form_84(a1) {
1597+ return function(a2) {
1598+ return function(a3) {
1599+ return function(a4) {
1600+ return["Form", a1, a2, a3, a4]
1605+ function FLine_85(a1) {
1606+ return function(a2) {
1607+ return function(a3) {
1608+ return["FLine", a1, a2, a3]
1612+ function FShape_86(a1) {
1613+ return function(a2) {
1614+ return function(a3) {
1615+ return["FShape", a1, a2, a3]
1619+ function FImage_87(a1) {
1620+ return function(a2) {
1621+ return function(a3) {
1622+ return["FImage", a1, a2, JS.castStringToJSString(a3)]
1626+ function FElement_88(a1) {
1627+ return["FElement", a1]
1629+ var left_6 = DLeft_0;
1630+ var right_7 = DRight_1;
1631+ var down_8 = DDown_3;
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]
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))
1668+ function toForm_97(pos) {
1669+ return function(e) {
1670+ return Form_84(0)(1)(pos)(FElement_88(e))
1673+ function width_47(w__101) {
1674+ return function(e) {
1679+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
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]);
1684+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1687+ function height_48(h__108) {
1688+ return function(e) {
1693+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1695+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
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]);
1705+ function opacity_50(o) {
1706+ return function(e) {
1707+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
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]);
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)));
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])
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])
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])
1737+ function centeredText(txt) {
1738+ var p = Value.getTextSize(0,0,txt);
1739+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1741+ function justifiedText(txt) {
1742+ var p = Value.getTextSize(0,0,txt);
1743+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1745+ function rightedText(txt) {
1746+ var p = Value.getTextSize(0,0,txt);
1747+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1749+ function image_57(w) {
1750+ return function(h) {
1751+ return function(src) {
1752+ return basicNewElement(EImage_40(src),w,h)
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));
1767+ function f(x) { return function(y) { return x; } }
1768+ var combine = Elm.Signal.lift2(f)(pics)(update);
1771+ function video_58(w) {
1772+ return function(h) {
1773+ return function(src) {
1774+ return basicNewElement(EVideo_41(src),w,h)
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)
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) {
1794+ return sum(ws_154);
1798+ return maximum(ws_154)
1801+ var h_153 = function() {
1802+ var hs_155 = map(heightOf_53)(es_151);
1803+ return function(case3) {
1807+ return sum(hs_155);
1811+ return maximum(hs_155)
1814+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
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))
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))
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)))
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)))
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)
1843+ function spacer_66(w_166) {
1844+ return function(h_167) {
1845+ return basicNewElement(EEmpty_45,w_166,h_167)
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)
1857+ function segment_77(p1_172) {
1858+ return function(p2_173) {
1859+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
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)
1872+ function oval_81(w_177) {
1873+ return function(h_178) {
1874+ return function(pos_179) {
1875+ return function() {
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)]
1881+ return Shape_78(map(f_181)(function() {
1883+ var hi = n_180 - 1;
1887+ var lst = ["Cons", hi, lst]
1897+ function circle_82(r_183) {
1898+ return oval_81(2 * r_183)(2 * r_183)
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)]
1909+ return Shape_78(map(f_188)(function() {
1911+ var hi = n_184 - 1;
1915+ var lst = ["Cons", hi, lst]
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))
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))
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))
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))
1947+ function filled_93(clr) {
1948+ return function(shape) {
1949+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1952+ function outlined_94(clr) {
1953+ return function(shape) {
1954+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
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));
1964+ function textured(src) {
1965+ return function(shape) {
1966+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1969+ function rotate_98(t_212) {
1970+ return function(Form$thetascaleposform_213) {
1971+ return function(case5) {
1975+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1976+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1978+ throw"Non-exhaustive pattern match in case";
1979+ }(Form$thetascaleposform_213)
1982+ function scale_99(s) {
1983+ return function(form) {
1984+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1987+ function move_100(x_224) {
1988+ return function(y_225) {
1989+ return function(Form$thetascaleTuple2$pxpyform_226) {
1990+ return function(case7) {
1994+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1997+ var case5 = case3[1], case6 = case3[2];
1998+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
2002+ throw"Non-exhaustive pattern match in case";
2003+ }(Form$thetascaleTuple2$pxpyform_226)
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}
2012+var Text = function() {
2013+ function fromString(s) { return Value.toText(s); }
2015+ var addTag = function(tag) { return function(text) {
2016+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
2019+ var addStyle = function(style, value) { return function(text) {
2020+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
2024+ var typeface = function(name) {
2025+ name = Elm.JavaScript.castStringToJSString(name);
2026+ return addStyle('font-family', name);
2028+ var size = function(px) {
2029+ return addStyle('font-size', px + 'px');
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));
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>";
2046+ return {fromString : fromString,
2047+ toText: fromString,
2052+ underline : underline,
2053+ overline : overline,
2054+ strikeThrough : strikeThrough,
2055+ monospace : typeface('monospace'),
2056+ typeface : typeface,
2061+var Elm = Elm || {};
2062+Elm.Graphics.Text = Text;
2064+var Render = function(){
2066+function newElement(elementType) {
2067+ var e = document.createElement(elementType);
2068+ e.style.padding = "0";
2069+ e.style.margin = "0";
2073+function addTo(container, elem) {
2074+ container.appendChild(elem);
2077+function makeText(pos,txt) {
2078+ var e = newElement('div');
2080+ e.style.textAlign = pos;
2084+function image(src) {
2085+ var img = newElement('img');
2088+ img.style.display = "block";
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';
2099+ canvas.innerHTML = "Your browser does not support the canvas element.";
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;
2110+ sWidth = this.height * w / h;
2111+ sx = (this.width - sWidth) / 2;
2113+ ctx.drawImage(img, sx, sy, sWidth, sHeight,
2114+ 0,0, canvas.width, canvas.height);
2121+var video = function(src) {
2122+ var e = newElement('video');
2123+ e.controls = "controls";
2124+ var source = newElement('source');
2126+ var segs = src.split('.');
2127+ source.type = "video/" + segs[segs.length-1];
2129+ e.style.display = "block";
2133+function divify(e) {
2134+ var div = newElement('div');
2138+function goDown(e) {
2139+ return e //.tagName === "DIV" ? e : divify(e);
2141+function goRight(e) {
2142+ e.style.styleFloat = "left";
2143+ e.style.cssFloat = "left";
2147+ e.style.position = 'absolute';
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])));
2158+function flow(dir,elist) {
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);
2169+function toPos(pos) {
2171+ case "Absolute": return pos[1] + "px";
2172+ case "Relative": return (pos[1] * 100) + "%";
2176+function setPos(pos,e) {
2177+ e.style.position = 'absolute';
2178+ e.style.margin = 'auto';
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;
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;
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]);
2203+function container(pos,elem) {
2204+ var e = render(elem);
2206+ var div = newElement('div');
2207+ div.style.position = "relative";
2208+ div.style.overflow = "hidden";
2213+function render(elem) {
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;
2226+ if (e.type !== 'button') {
2227+ var p = Value.getExcess(e);
2232+ case "EExternalHtml":
2233+ e = newElement('div');
2234+ addTo(e, elem[2][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]);
2244+ if (elem[7][0] === "Just") {
2245+ var a = newElement('a');
2246+ a.href = elem[7][1];
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);
2259+ var nextE = next[2], currE = curr[2];
2262+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2263+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2266+ if (nextE[1] !== currE[1]) node.src = nextE[1];
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);
2275+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2276+ return node.parentNode.replaceChild(render(next),node);
2278+ Collage.updateCollage(node,currE[3],nextE[3]);
2281+ if (nextE[1] !== currE[1]) {
2282+ return node.parentNode.replaceChild(render(next),node);
2284+ var nexts = nextE[2];
2285+ var kids = node.childNodes;
2286+ if (nexts.length !== kids.length) {
2287+ return node.parentNode.replaceChild(render(next),node);
2289+ var currs = currE[2];
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;
2296+ for (var i = kids.length; i-- ;) {
2297+ update(kids[i],currs[i],nexts[i]);
2302+ update(node.childNodes[0],currE[2],nextE[2]);
2303+ setPos(nextE[1],node.childNodes[0]);
2308+ if (next[1] !== curr[1]) {
2309+ var e = render(next);
2310+ node.parentNode.replaceChild(e,node);
2313+ if (e.type !== 'button') {
2314+ var p = Value.getExcess(node);
2319+ case "EExternalHtml":
2320+ if (next[1] !== curr[1])
2321+ node.parentNode.replaceChild(render(next),node);
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;
2331+ if (next[7].length === 2) {
2332+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2337+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
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);
2348+ var input = function(base) {
2349+ this.id = Guid.guid();
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);
2359+ Dispatcher.inputs.push(this);
2361+ var lift = function(func,args) {
2362+ this.id = Guid.guid();
2366+ this.changed = false;
2369+ this.recalc = function() {
2371+ for (var i = args.length; i--; ) {
2372+ f = f(args[i].value);
2378+ this.recv = function(timestep, changed, parentID) {
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;
2388+ for (var i = args.length; i--; ) {
2389+ args[i].kids.push(this);
2392+ var fold = function(func,base,baseIsFunc,input) {
2393+ this.id = Guid.guid();
2394+ this.value = baseIsFunc ? base(input.value) : base;
2396+ this.recv = function(timestep, changed, parentID) {
2397+ if (changed) { this.value = func(input.value)(this.value); }
2398+ send(this, timestep, changed);
2400+ input.kids.push(this);
2403+ var dropIf = function(pred,base,input) {
2404+ this.id = Guid.guid();
2405+ this.value = pred(input.value) ? base : input.value;
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);
2412+ input.kids.push(this);
2414+ var dropRepeats = function(input) {
2415+ this.id = Guid.guid();
2416+ this.value = input.value;
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);
2423+ input.kids.push(this);
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]); }; };
2432+ var sampleOn = function(s1,s2) {
2433+ this.id = Guid.guid();
2434+ this.value = s2.value;
2437+ this.changed = false;
2439+ this.recv = function(timestep, changed, parentID) {
2440+ if (parentID === s1.id) this.changed = changed;
2442+ if (this.count == 2) {
2443+ if (this.changed) { this.value = s2.value; }
2444+ send(this, timestep, this.changed);
2446+ this.changed = false;
2449+ s1.kids.push(this);
2450+ s2.kids.push(this);
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);};}
2482+var Dispatcher = function() {
2483+ var program = null;
2486+ var currentElement = null;
2488+ var initialize = function() {
2489+ program = Elm.main();
2490+ if (!program.hasOwnProperty('recv')) {
2491+ program = Elm.Signal.constant(program);
2494+ currentElement = program.value;
2495+ filterDeadInputs();
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));
2503+ program = Elm.Signal.lift(function(value) {
2504+ var content = document.getElementById('content');
2505+ Render.update(content.firstChild,currentElement,value);
2506+ currentElement = value;
2510+ var notify = function(id, v) {
2512+ //console.log(timestep);
2513+ var hasListener = false;
2514+ for (var i = inputs.length; i--; ) {
2515+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2517+ return hasListener;
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;
2526+ for (var i = len; i--; ) {
2527+ alive = alive || isAlive(input.kids[i]);
2531+ function filterDeadInputs() {
2533+ for (var i = inputs.length; i--; ) {
2534+ if (isAlive(inputs[i])) temp.push(inputs[i]);
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",
2547+ verb : JS.castStringToJSString(verb),
2548+ url : JS.castStringToJSString(url),
2549+ data : data === null ? null : JS.castStringToJSString(data),
2550+ headers : headers }; }; }; };
2552+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
2553+ function post(url) { return function(data) {
2554+ return request("POST")(url)(data)(["Nil"]); }; }
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");
2564+ request.onreadystatechange = function(e) {
2565+ if (request.readyState === 4) {
2568+ request.status === 200
2569+ ? ["Success", toElmString(request.responseText)]
2570+ : ["Failure", request.status, toElmString(request.statusText)]);
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]));
2579+ request.send(req.data);
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);
2596+ sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
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));
2610+ elem.style.padding = "1px";
2611+ return Value.Tuple(Value.wrap(elem), str);
2613+ var newElement = function(name) {
2614+ var e = document.createElement(name);
2615+ e.style.padding = "0";
2616+ e.style.margin = "0";
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, "");
2626+ var textField = function(ghostText) {
2627+ var field = newElement('input');
2628+ field.type = 'text';
2629+ return newTextInput(field, ghostText);
2631+ var password = function(ghostText) {
2632+ var field = newElement('input');
2633+ field.type = 'password';
2634+ return newTextInput(field, ghostText);
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);
2644+ return Value.Tuple(Value.wrap(box), status);
2646+ var dropDown = function(options) {
2647+ var slct = newElement('select');
2649+ while (options[0] === "Cons") {
2650+ var opt = newElement('option');
2651+ var str = Text.toText(options[1][1]);
2653+ opt.innerHTML = str;
2654+ slct.appendChild(opt);
2655+ opts.push(options[1][2]);
2656+ options = options[2];
2658+ var status = Elm.Signal.constant(opts[0]);
2659+ Value.addListener(slct, 'change', function(e) {
2660+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2662+ return Value.Tuple(Value.wrap(slct), status);
2664+ var stringDropDown = function(opts) {
2665+ return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2667+ var button = function(name) {
2668+ var b = newElement('input');
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);
2676+ return Value.Tuple(Value.wrap(b),press);
2678+ return {textArea:textArea, textField:textField,
2679+ password:password, checkbox:checkbox,
2680+ dropDown:dropDown, stringDropDown:stringDropDown,
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])];
2692+ function has(x,xs) {
2693+ while (xs[0] !== "Nil") {
2694+ if (xs[1] === x) return true;
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]);
2703+ this.removeEventListener('keydown',arguments.callee,false);
2705+ Value.addListener(document, 'keyup', function(e) {
2706+ var codes = remove(e.keyCode, keysDown.value);
2707+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2709+ this.removeEventListener('keyup',arguments.callee,false);
2711+ Value.addListener(window, 'blur', function(e) {
2712+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2714+ this.removeEventListener('blur',arguments.callee,false);
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"]);
2720+ this.removeEventListener('keypress',arguments.callee,false);
2722+ return {keysDown:keysDown,
2723+ charPressed:charPressed};
2726+Elm.Mouse = function() {
2727+ var position = Elm.Signal.constant(Value.Tuple(0,0));
2728+ position.defaultNumberOfKids = 2;
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;
2735+ var isDown = Elm.Signal.constant(false);
2736+ var isClicked = Elm.Signal.constant(false);
2737+ var clicks = Elm.Signal.constant(Value.Tuple());
2739+ function getXY(e) {
2742+ if (!e) var e = window.event;
2743+ if (e.pageX || 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;
2752+ return Value.Tuple(posx, posy);
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);
2762+ Value.addListener(document, 'mousedown', function(e) {
2763+ var hasListener = Dispatcher.notify(isDown.id, true);
2765+ this.removeEventListener('mousedown',arguments.callee,false);
2767+ Value.addListener(document, 'mouseup', function(e) {
2768+ var hasListener = Dispatcher.notify(isDown.id, false);
2770+ this.removeEventListener('mouseup',arguments.callee,false);
2772+ Value.addListener(document, 'mousemove', function(e) {
2773+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2775+ this.removeEventListener('mousemove',arguments.callee,false);
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);
2784+ return Value.Tuple(Value.wrap(node), click);
2786+ return {position: position,
2789+ isClicked: isClicked,
2792+ isClickedOn: clickedOn
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);
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);
2806+ return { inRange:inRange, randomize:randomize };
2807+}();Elm.Time = function() {
2808+ var every = function(t) {
2810+ var clock = Elm.Signal.constant(0);
2812+ setInterval(function() {
2814+ Dispatcher.notify(clock.id, time/1000);
2818+ var after = function(t) {
2820+ var thread = Elm.Signal.constant(false);
2821+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2824+ var before = function(t) {
2826+ var thread = Elm.Signal.constant(true);
2827+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
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;
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;
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));
2846+ this.removeEventListener('resize',arguments.callee,false);
2848+ return {dimensions:dimensions,width:width,height:height};
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; }
2857+var Elm = Elm || {};
2858+Elm.Prelude = function() {
2859+ var mod = function(x) { return function(y) {
2861+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2862+ return m == y ? 0 : m;
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); }; };
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)); };
2873+ var curry = function(f) { return function(x) { return function(y) {
2874+ return f(["Tuple2",x,y]); }; };
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.";
2880+ return f(p[1])(p[2]); };
2883+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
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') ];
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; },
2913+ atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
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,
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
2972+ var include = function(library) {
2973+ for (var i in library) {
2974+ Elm.Prelude[i] = library[i];
2977+ include (Elm.Graphics.Color);
2978+ include (Elm.Graphics.Text);
2979+ include (Elm.Graphics.Element);
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}}