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