1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-28 07:54:12 +00:00
ESPUI/src/dataControlsJS.h
2022-01-15 15:13:28 +00:00

94 lines
28 KiB
C

const char JS_CONTROLS[] PROGMEM = R"=====(
const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
var websock;var websockConnected=false;function requestOrientationPermission(){}
function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));}
function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);return savedData[id];}
return[];}
function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();}
function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart,});}
function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}}
function start(){document.addEventListener("visibilitychange",handleVisibilityChange,false);if(window.location.port!=""||window.location.port!=80||window.location.port!=443){websock=new WebSocket("ws://"+window.location.hostname+":"+window.location.port+"/ws");}else{websock=new WebSocket("ws://"+window.location.hostname+"/ws");}
websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};var handleEvent=function(evt){console.log(evt);var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:$("#row").html("");$("#tabsnav").html("");$("#tabscontent").html("");if(data.sliderContinuous){sliderContinuous=data.sliderContinuous;}
data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>(data.controls.length-1)){websock.send("uiok:"+(data.controls.length-1));}
break;case UI_EXTEND_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>data.startindex+(data.controls.length-1)){websock.send("uiok:"+(data.startindex+(data.controls.length-1)));}
break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:if(data.visible)addToHTML(data);break;case UI_BUTTON:if(data.visible){addToHTML(data);$("#btn"+data.id).on({touchstart:function(e){e.preventDefault();buttonclick(data.id,true);},touchend:function(e){e.preventDefault();buttonclick(data.id,false);},});}
break;case UI_SWITCHER:if(data.visible){addToHTML(data);switcher(data.id,data.value);}
break;case UI_CPAD:case UI_PAD:if(data.visible){addToHTML(data);$("#pf"+data.id).on({touchstart:function(e){e.preventDefault();padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();padclick(UP,data.id,false);},});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();padclick(LEFT,data.id,false);},});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();padclick(RIGHT,data.id,false);},});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();padclick(DOWN,data.id,false);},});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();padclick(CENTER,data.id,false);},});}
break;case UI_SLIDER:if(data.visible){addToHTML(data);rangeSlider(!sliderContinuous);}
break;case UI_TAB:if(data.visible){$("#tabsnav").append("<li><a onmouseup='tabclick("+data.id+")' href='#tab"+data.id+"'>"+data.value+"</a></li>");$("#tabscontent").append("<div id='tab"+data.id+"'></div>");tabs=$(".tabscontent").tabbedContent({loop:true}).data("api");$("a").filter(function(){return $(this).attr("href")==="#click-to-switch";}).on("click",function(e){var tab=prompt("Tab to switch to (number or id)?");if(!tabs.switchTab(tab)){alert("That tab does not exist :\\");}
e.preventDefault();});}
break;case UI_OPTION:if(data.parentControl){var parent=$("#select"+data.parentControl);parent.append("<option id='option"+
data.id+
"' value='"+
data.value+
"' "+
data.selected+
">"+
data.label+
"</option>");}
break;case UI_MIN:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){if(!parent.attr("type")){parent.attr("maxlength",data.value);}else{parent.attr("max",data.value);}}}
break;case UI_STEP:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.attr("step",data.value);}}
break;case UI_GRAPH:if(data.visible){addToHTML(data);graphData[data.id]=restoreGraphData(data.id);renderGraphSvg(graphData[data.id],"graph"+data.id);}
break;case ADD_GRAPH_POINT:var ts=Math.round(new Date().getTime()/1000);graphData[data.id].push({x:ts,y:data.value});saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case CLEAR_GRAPH:graphData[data.id]=[];saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=true;if(data.visible){addToHTML(data);requestOrientationPermission();}
break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);if(data.hasOwnProperty('elementStyle')){$("#l"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SWITCHER:switcher(data.id,data.value=="0"?0:1);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SLIDER:$("#sl"+data.id).attr("value",data.value)
slider_move($("#id"+data.id),data.value,"100",false);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_ACCEL:break;default:console.error("Unknown type or event");break;}
if(data.type>=UPDATE_OFFSET&&data.type<UI_INITIAL_GUI){var element=$("#id"+data.id);if(data.hasOwnProperty('panelStyle')){$("#id"+data.id).attr("style",data.panelStyle);}
if(data.type==UPDATE_SLIDER){element.removeClass("slider-turquoise slider-emerald slider-peterriver slider-wetasphalt slider-sunflower slider-carrot slider-alizarin");element.addClass("slider-"+colorClass(data.color));}else{element.removeClass("turquoise emerald peterriver wetasphalt sunflower carrot alizarin");element.addClass(colorClass(data.color));}}
$(".range-slider__range").each(function(){$(this)[0].value=$(this).attr("value");$(this).next().html($(this).attr("value"));});};websock.onmessage=handleEvent;}
function sliderchange(number){var val=$("#sl"+number).val();websock.send("slvalue:"+val+":"+number);$(".range-slider__range").each(function(){$(this).attr("value",$(this)[0].value);});}
function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);}
function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);}
function tabclick(number){var val=$("#tab"+number).val();websock.send("tabvalue:"+val+":"+number);}
function selectchange(number){var val=$("#select"+number).val();websock.send("svalue:"+val+":"+number);}
function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);}
function padclick(type,number,isdown){switch(type){case CENTER:if(isdown)websock.send("pcdown:"+number);else websock.send("pcup:"+number);break;case UP:if(isdown)websock.send("pfdown:"+number);else websock.send("pfup:"+number);break;case DOWN:if(isdown)websock.send("pbdown:"+number);else websock.send("pbup:"+number);break;case LEFT:if(isdown)websock.send("pldown:"+number);else websock.send("plup:"+number);break;case RIGHT:if(isdown)websock.send("prdown:"+number);else websock.send("prup:"+number);break;}}
function switcher(number,state){if(state==null){if(!$("#sl"+number).hasClass("checked")){websock.send("sactive:"+number);$("#sl"+number).addClass("checked");}else{websock.send("sinactive:"+number);$("#sl"+number).removeClass("checked");}}else if(state==1){$("#sl"+number).addClass("checked");$("#sl"+number).prop("checked",true);}else if(state==0){$("#sl"+number).removeClass("checked");$("#sl"+number).prop("checked",false);}}
var rangeSlider=function(isDiscrete){var range=$(".range-slider__range");var slidercb=function(){sliderchange($(this).attr("id").replace(/^\D+/g,""));};range.on({input:function(){$(this).next().html(this.value)}});range.each(function(){$(this).next().html(this.value);if($(this).attr("callbackSet")!="true"){if(!isDiscrete){$(this).on({input:slidercb});}else{$(this).on({change:slidercb});}
$(this).attr("callbackSet","true");}});};var addToHTML=function(data){panelStyle=data.hasOwnProperty('panelStyle')?" style='"+data.panelStyle+"' ":"";elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";panelwide=data.hasOwnProperty('wide')?"wide":"";if(!data.hasOwnProperty('parentControl')||$("#tab"+data.parentControl).length>0){var parent=data.hasOwnProperty('parentControl')?$("#tab"+data.parentControl):$("#row");var html="";switch(data.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:html="<div id='id"+data.id+"' "+panelStyle+" class='two columns "+panelwide+" card tcenter "+
colorClass(data.color)+"'><h5>"+data.label+"</h5><hr/>"+
elementHTML(data.type,data.id,data.value,elementStyle)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data.type,data.id,data.value,data.label,elementStyle));}}
var elementHTML=function(type,id,value,label,elementStyle){switch(type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(value=="1"?"checked":"")+"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(value=="1"?"checked":"")+"/></div></label>";case UI_CPAD:case UI_PAD:return"<nav class='control'><ul>"+
"<li><a onmousedown='padclick(UP, "+id+", true)' "+
"onmouseup='padclick(UP, "+id+", false)' id='pf"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(RIGHT, "+id+", true)' "+
"onmouseup='padclick(RIGHT, "+id+", false)' id='pr"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(LEFT, "+id+", true)' "+
"onmouseup='padclick(LEFT, "+id+", false)' id='pl"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(DOWN, "+id+", true)' "+
"onmouseup='padclick(DOWN, "+id+", false)' id='pb"+id+"'>&#9650;</a></li>"+
"</ul>"+
(type==UI_CPAD?"<a class='confirm' onmousedown='padclick(CENTER,"+id+", true)' "+
"onmouseup='padclick(CENTER, "+id+", false)' id='pc"+id+"'>OK</a>":"")+
"</nav>";case UI_SLIDER:return"<div class='range-slider'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
value+"</span></div>";case UI_NUMBER:return"<input style='color:black;' "+elementStyle+" id='num"+id+
"' type='number' value='"+value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input style='color:black;' "+elementStyle+" id='text"+id+
"' value='"+value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black;' "+elementStyle+" id='select"+id+
"' onchange='selectchange("+id+")' />";case UI_GRAPH:return"<figure id='graph"+id+"'><figcaption>"+label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+value+"' onchange='numberchange("+id+")' />";case UI_ACCEL:return"ACCEL // Not implemented fully!<div class='accelerometer' id='accel"+id+
"' ><div class='ball"+id+"'></div><pre class='accelerometeroutput"+id+"'></pre>";default:return"";}}
)=====";
const uint8_t JS_CONTROLS_GZIP[3874] PROGMEM = { 31,139,8,0,118,228,226,97,2,255,197,91,91,119,218,72,18,126,247,175,144,149,57,65,44,152,75,110,147,1,203,57,4,147,132,29,98,123,109,60,153,179,153,172,143,16,141,209,177,144,52,146,48,246,56,252,247,173,174,190,168,91,8,204,224,153,221,151,24,85,151,170,191,174,174,238,186,41,110,24,36,169,113,217,191,234,159,244,135,253,206,224,234,227,101,223,126,209,104,180,93,49,112,222,27,156,118,142,129,214,20,180,179,227,206,176,119,117,250,225,195,69,111,104,55,85,222,222,175,195,222,201,49,147,209,84,232,195,254,176,55,176,21,194,25,72,204,201,67,82,54,73,255,170,75,41,47,116,166,46,227,122,145,113,189,191,28,14,79,79,236,151,58,31,167,54,27,47,51,206,65,231,61,128,120,165,51,50,98,179,241,42,227,187,248,210,31,118,63,245,206,237,215,58,171,164,55,27,175,21,238,65,255,24,104,111,114,188,140,218,108,188,201,56,79,46,63,191,7,218,143,58,39,167,54,27,63,42,234,2,61,194,134,156,93,14,237,183,58,183,50,210,108,188,205,222,248,120,222,57,251,100,255,196,9,157,227,99,70,185,58,59,237,159,80,86,62,208,29,244,58,231,156,185,217,248,73,153,177,243,222,110,230,54,132,209,148,13,185,232,13,122,93,144,150,219,19,65,110,42,187,114,122,54,236,83,253,231,182,69,144,155,202,182,124,238,3,33,183,43,72,107,42,123,242,185,243,171,221,204,237,7,210,154,234,86,12,123,103,118,51,191,19,72,108,42,251,240,177,115,249,177,103,55,115,251,192,169,77,101,27,58,221,46,181,141,220,22,112,106,243,173,170,152,179,206,121,103,120,10,219,248,83,94,55,114,68,25,146,39,225,248,244,203,137,60,7,131,222,135,161,180,247,243,254,199,79,67,105,213,221,222,201,16,140,68,40,164,123,53,188,60,255,215,229,105,255,162,39,69,117,175,122,159,123,231,157,65,118,174,186,87,103,61,120,235,188,255,11,188,250,66,18,191,244,134,157,139,179,79,157,129,34,254,234,226,242,228,195,224,244,139,54,71,183,115,126,126,58,148,167,160,123,213,25,244,255,221,57,135,173,121,35,73,199,157,243,159,165,69,119,175,78,78,79,122,246,139,215,175,219,183,78,108,92,199,78,52,61,118,82,199,14,200,194,232,196,177,115,111,149,113,100,234,36,29,215,37,190,61,113,252,132,32,41,241,189,49,137,187,97,144,122,193,60,156,39,124,104,50,15,220,212,11,3,195,13,253,48,238,250,78,146,88,248,179,63,46,63,240,31,246,201,124,54,34,177,164,183,147,133,151,186,83,133,207,73,136,170,179,86,76,210,121,28,152,240,207,239,243,208,75,136,217,230,44,92,133,130,129,204,72,236,248,99,57,156,233,83,112,68,36,37,113,236,221,146,88,50,101,250,21,76,11,146,58,73,52,117,252,84,50,73,125,11,158,100,30,76,252,112,161,200,97,234,23,227,174,19,199,97,246,190,216,10,49,236,248,222,31,78,236,5,146,129,110,76,139,255,166,187,34,24,199,78,124,99,182,199,100,226,204,253,84,16,205,246,114,185,71,119,97,65,70,73,232,222,180,149,223,176,37,1,113,83,50,206,239,72,76,126,159,147,36,61,141,61,18,164,14,37,157,145,120,230,37,9,252,178,202,15,203,61,201,153,56,183,228,163,48,6,24,242,67,215,241,47,210,48,118,174,73,45,33,105,63,37,51,203,36,73,52,247,208,102,18,179,250,207,139,211,147,90,146,194,138,174,189,201,189,37,77,169,92,110,43,130,99,152,63,140,21,217,30,236,54,90,19,204,56,70,211,211,230,186,46,156,43,19,222,246,38,150,124,117,223,14,230,190,95,126,200,100,33,168,200,137,19,146,113,149,219,76,135,217,148,95,189,241,55,0,201,200,95,191,229,241,58,113,10,42,248,193,26,135,238,124,6,154,43,215,156,241,216,50,255,97,150,107,225,100,2,7,228,7,203,124,22,135,11,120,158,166,51,223,50,205,114,155,111,69,205,245,67,152,27,12,156,73,81,69,195,9,188,128,93,152,39,61,176,147,24,102,88,179,125,84,186,228,133,57,98,50,11,111,9,59,88,38,158,152,131,235,152,144,192,44,175,176,2,78,141,47,38,227,2,46,6,26,81,24,117,227,36,52,56,2,10,242,249,179,183,111,94,190,110,23,188,149,45,93,163,6,214,131,235,123,238,77,139,107,174,186,212,22,61,117,130,177,79,126,241,18,111,228,249,94,122,223,5,194,53,40,232,1,246,113,63,175,128,231,207,247,133,206,107,83,111,60,38,65,249,65,110,8,61,0,153,189,242,77,146,236,176,242,222,45,252,24,120,73,74,2,184,106,204,91,57,167,139,115,154,213,98,44,85,212,58,26,214,194,11,198,225,162,70,13,146,206,82,139,194,56,221,183,77,243,251,247,226,145,183,141,117,35,175,94,189,148,251,139,119,235,23,50,186,128,223,36,181,204,69,210,170,215,205,74,254,197,105,152,164,129,51,35,21,179,181,58,72,165,86,204,250,2,84,222,94,18,192,187,179,112,46,99,79,24,108,24,132,17,9,108,161,89,139,220,166,244,218,14,146,208,39,240,254,53,136,100,156,6,229,219,194,230,214,217,102,74,238,0,159,220,235,236,204,100,246,159,198,115,210,94,182,51,104,120,154,182,193,134,140,32,50,127,198,52,105,132,210,54,72,163,132,34,9,204,31,82,219,65,19,123,76,2,101,31,231,46,35,24,168,141,241,46,162,163,196,150,118,59,10,199,247,72,115,225,137,196,96,108,194,55,82,246,90,122,31,17,238,29,245,4,160,85,112,7,81,82,234,140,146,192,185,45,34,3,80,56,26,169,58,4,54,143,211,228,93,59,92,169,121,103,95,200,7,118,132,116,42,58,14,253,164,54,9,227,158,3,224,137,79,232,242,236,35,188,235,193,147,221,49,213,61,80,246,86,206,117,112,230,114,117,217,86,212,108,201,183,96,15,50,168,105,152,58,190,152,239,200,210,167,247,73,112,157,78,15,154,101,121,248,192,121,5,112,119,207,189,240,6,142,213,90,118,88,200,40,38,206,77,91,168,58,75,147,90,255,223,21,50,189,211,235,14,142,52,185,171,236,180,226,109,222,95,213,1,75,43,91,249,187,36,38,126,232,140,225,100,232,220,152,64,182,164,97,167,94,234,19,102,53,190,51,34,62,154,225,204,241,130,79,196,1,27,18,86,152,49,228,229,97,218,215,18,79,44,7,147,143,89,146,37,73,44,199,145,143,152,44,40,131,60,200,111,9,45,163,123,240,73,25,174,175,97,248,105,248,121,96,177,243,169,131,96,73,234,202,75,15,249,183,232,226,70,105,96,86,144,13,98,28,116,140,105,56,119,167,168,251,86,118,103,148,31,72,45,138,9,221,246,99,22,227,81,85,206,211,148,94,119,224,72,45,46,162,74,111,67,216,148,42,74,129,61,221,69,6,247,109,75,230,149,245,181,137,100,249,241,213,177,27,9,156,170,16,203,216,29,31,1,230,196,210,252,95,234,157,254,222,74,121,209,100,103,221,69,206,152,45,250,242,172,186,171,238,138,100,168,186,67,136,254,211,33,210,4,242,233,32,53,41,43,48,227,167,195,196,212,246,233,56,117,49,43,64,71,79,7,74,179,243,167,227,212,164,172,192,116,159,14,147,21,7,158,14,52,39,103,227,233,198,242,214,227,135,47,166,49,240,5,250,117,107,127,37,14,88,17,59,236,188,95,149,169,7,30,78,20,161,7,58,244,189,163,67,199,8,131,25,72,34,243,200,46,1,15,91,135,212,104,197,44,151,140,105,76,38,118,137,74,80,232,165,35,254,128,215,76,197,60,172,59,71,135,117,16,89,24,209,200,57,199,222,173,225,141,113,42,77,216,97,29,70,232,187,244,61,27,4,212,116,1,240,52,34,227,46,123,182,32,255,13,163,22,221,166,101,25,227,54,203,116,34,143,205,236,0,247,196,243,33,88,179,228,182,209,52,5,83,204,31,172,116,234,37,128,39,77,33,5,161,11,51,203,182,109,67,36,76,215,125,144,134,7,236,46,133,116,30,141,201,68,186,89,85,13,128,198,19,0,199,142,226,112,22,65,200,60,116,70,70,26,26,236,69,250,203,10,176,154,98,64,250,6,54,249,142,197,113,251,116,61,53,198,4,111,88,240,8,49,129,227,147,152,138,152,58,41,149,105,140,67,146,24,65,152,26,228,14,18,37,163,245,219,111,152,12,20,216,92,129,73,177,210,160,220,126,136,108,225,141,46,139,36,24,108,70,162,234,125,150,64,204,227,166,124,15,116,214,54,123,204,54,45,140,48,169,163,251,198,126,154,149,61,177,119,123,102,201,64,19,176,75,130,202,44,130,14,8,10,155,140,80,238,35,65,195,160,2,8,135,117,38,243,200,92,93,209,231,254,182,203,241,198,69,75,169,152,134,23,68,243,148,109,1,95,86,226,253,1,9,110,249,65,172,18,77,97,230,5,166,238,54,87,176,116,126,253,251,176,80,3,209,240,208,196,194,92,1,233,220,177,120,48,7,21,19,206,60,103,126,57,43,23,208,176,119,246,63,82,46,164,252,209,35,218,197,130,250,227,183,161,44,52,125,229,246,247,205,94,169,96,9,103,208,6,4,112,91,226,192,197,237,181,181,250,110,213,68,90,230,63,116,3,204,245,0,90,120,240,19,251,179,147,78,107,113,56,135,163,65,147,123,144,8,43,166,133,177,161,55,131,95,245,102,163,209,40,66,90,139,230,201,212,122,184,107,165,73,245,190,149,105,3,78,114,174,188,183,11,114,5,183,210,162,104,21,40,236,235,183,191,120,62,81,231,167,219,39,234,210,101,54,46,203,212,88,58,120,220,217,109,44,136,230,174,7,165,251,132,217,182,26,254,101,185,11,55,56,49,53,0,58,93,4,103,113,24,193,197,123,111,149,120,230,119,145,222,251,164,84,102,174,82,21,36,12,24,134,185,5,171,111,20,67,146,129,251,134,184,28,124,78,195,124,215,104,53,255,28,180,228,201,216,88,216,177,70,22,66,211,78,234,30,11,57,174,104,137,211,210,238,2,120,75,97,172,154,96,246,166,82,171,251,223,45,137,167,158,84,22,56,94,69,24,0,219,217,6,116,73,187,192,82,82,96,140,135,200,93,250,23,97,203,137,218,201,12,88,50,190,18,8,60,21,218,138,176,93,192,241,164,126,53,103,127,10,50,93,210,46,176,178,188,57,107,164,183,86,217,88,97,131,78,121,237,204,175,201,95,4,63,47,107,151,5,176,75,154,209,69,251,74,84,71,177,246,106,153,151,193,77,16,46,2,131,134,31,52,126,197,160,211,20,183,253,114,79,214,192,96,252,200,214,62,99,120,254,92,142,28,234,181,80,22,79,136,130,92,254,18,89,171,134,200,9,136,175,41,65,125,173,64,3,217,11,229,28,84,219,214,174,63,72,226,24,24,189,119,195,174,186,3,217,211,228,29,213,3,222,195,20,143,89,195,82,80,178,238,164,160,200,94,164,32,176,230,163,120,146,189,198,114,91,32,201,202,244,156,199,172,40,13,91,94,20,132,231,178,136,247,10,151,144,97,23,160,21,180,42,76,137,143,3,219,132,104,45,142,229,30,77,212,48,67,61,224,126,226,10,159,32,5,35,180,8,171,36,96,60,243,250,218,248,198,29,160,158,138,49,207,67,19,56,70,13,104,55,130,251,241,66,78,150,1,41,221,131,25,73,18,231,154,216,74,1,87,109,116,49,124,172,213,196,19,52,102,151,32,207,22,126,136,211,241,164,102,61,67,86,176,77,124,156,185,101,86,224,47,54,129,56,119,251,79,43,65,247,182,121,205,240,220,78,34,103,211,108,64,142,190,106,19,244,96,29,114,101,22,234,84,54,204,193,124,206,166,73,210,109,38,17,5,134,194,41,104,73,96,227,12,206,104,139,57,152,11,218,180,209,220,71,109,220,236,45,38,82,235,185,108,184,234,37,99,184,61,49,157,227,63,117,177,35,74,83,164,209,131,108,228,88,230,81,241,116,178,200,68,47,180,106,110,66,222,147,82,218,81,172,20,213,90,135,36,114,31,135,18,185,26,22,205,161,172,23,60,217,66,240,100,157,96,90,233,91,47,122,11,245,69,163,117,162,105,81,118,189,104,127,11,209,254,58,209,88,71,93,47,59,222,66,118,92,32,91,107,168,139,84,130,111,124,2,233,17,65,67,195,95,54,255,210,130,214,17,242,151,25,248,85,209,0,158,18,247,134,182,118,243,205,168,196,129,89,110,137,126,167,105,66,148,46,178,16,162,55,186,133,36,47,120,84,150,254,193,68,38,14,229,25,217,146,154,89,130,176,9,70,158,39,130,8,34,27,23,197,220,156,236,198,170,236,53,176,30,17,47,106,188,236,235,31,165,90,155,181,161,189,228,216,75,220,152,164,188,120,136,76,246,90,175,161,124,204,229,142,108,197,123,104,46,76,119,37,16,25,209,5,68,190,227,18,171,254,159,223,142,43,245,235,170,137,94,146,85,144,177,50,142,229,154,86,129,63,82,189,45,165,112,71,180,92,242,250,243,90,71,182,230,69,26,211,233,0,93,199,247,71,142,123,115,65,32,156,220,183,77,186,43,38,179,87,85,61,226,165,12,173,80,196,82,216,155,202,194,116,161,241,236,173,159,183,202,103,109,47,151,226,179,1,89,128,200,244,140,149,136,135,44,150,180,31,13,78,223,153,6,134,161,180,2,154,11,68,43,180,8,218,50,205,182,26,157,219,91,68,253,43,50,213,97,41,21,39,90,192,226,139,69,210,17,42,138,254,69,126,170,238,53,203,81,10,123,165,242,247,239,210,33,23,148,7,121,83,250,168,161,21,10,183,145,251,110,147,216,236,147,9,246,69,7,216,212,230,207,45,244,14,52,207,26,87,186,167,107,251,158,185,78,204,238,157,108,44,180,21,247,181,89,202,197,150,34,123,31,74,26,131,59,89,81,237,197,112,233,5,100,151,210,69,72,191,216,156,207,130,68,112,208,109,164,12,78,60,54,82,246,61,10,173,176,23,135,231,216,84,153,190,22,93,26,86,109,55,15,235,64,58,156,198,117,90,134,231,38,37,235,111,168,222,234,106,173,170,170,165,150,88,178,199,102,77,174,6,152,245,240,119,89,111,194,62,112,67,145,98,225,180,199,4,179,109,88,133,142,100,185,167,119,46,40,14,113,109,108,85,210,206,183,62,182,214,80,134,78,87,150,116,12,138,164,236,170,65,105,32,136,201,40,120,189,32,174,147,118,207,63,60,61,76,64,155,168,102,240,81,66,193,218,101,177,39,117,140,51,24,248,239,193,34,118,34,170,95,217,190,163,114,142,204,252,151,21,98,22,22,236,226,60,88,73,89,55,19,239,38,210,136,7,56,149,8,153,189,82,53,208,29,211,86,145,169,118,30,139,56,153,103,69,27,144,32,25,159,2,83,30,115,1,148,173,145,226,76,30,87,8,239,217,153,21,75,20,101,155,230,59,233,219,225,198,44,179,70,231,30,51,102,254,150,23,112,26,122,40,172,149,216,37,124,105,20,222,149,216,220,98,234,48,232,210,69,137,169,232,135,143,108,121,24,175,97,135,108,195,220,194,192,15,235,184,44,101,221,43,183,153,88,127,224,72,156,252,35,34,184,7,230,62,3,172,117,124,217,30,169,95,86,24,250,38,81,112,166,178,73,133,172,124,151,112,213,244,35,17,214,206,125,254,236,167,55,175,27,237,172,41,252,216,236,236,83,132,109,1,228,184,53,12,241,206,24,240,179,141,109,33,232,204,26,2,127,103,4,248,161,195,182,8,116,102,13,193,104,35,130,58,51,7,139,87,198,152,49,189,51,1,85,102,56,19,47,158,149,214,160,228,95,57,108,9,147,115,23,3,117,5,208,211,159,41,70,102,246,20,34,152,177,122,202,153,139,22,54,174,156,69,53,130,214,78,165,126,3,176,51,138,204,37,99,230,193,106,26,240,215,185,179,75,205,70,67,105,96,243,139,6,87,163,71,92,69,19,242,144,29,14,24,94,194,133,28,40,81,191,196,240,166,21,158,43,23,118,136,37,178,69,240,16,16,61,122,107,4,193,253,77,123,229,54,51,113,169,88,3,226,237,120,182,88,150,175,20,173,13,46,90,140,155,5,15,207,40,152,174,96,103,234,10,44,37,252,217,21,26,43,29,229,63,21,40,64,163,148,160,10,177,240,184,75,58,62,172,227,252,9,32,162,240,195,161,100,19,107,37,163,194,169,89,140,39,102,158,120,215,243,152,160,76,222,22,229,31,177,192,128,235,240,175,25,42,50,88,81,168,248,0,239,170,162,49,96,228,162,191,244,7,3,227,125,207,232,24,72,54,54,41,27,167,103,109,129,191,97,227,89,228,202,97,225,131,81,167,255,25,1,78,214,44,98,186,37,99,99,2,94,236,126,95,61,144,14,109,247,146,56,156,209,186,51,3,137,36,9,242,72,229,30,65,122,38,181,199,92,93,4,154,45,146,21,206,83,250,177,129,100,142,80,139,5,255,13,231,191,179,173,176,99,144,57,0,0 };