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-16 14:47:41 +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);$("#btn"+data.id).text(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,data.label,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[3878] PROGMEM = { 31,139,8,0,88,15,228,97,2,255,197,27,107,115,218,72,242,187,127,133,172,108,5,113,96,30,121,109,22,44,167,8,38,9,183,196,246,217,120,179,117,217,156,75,136,193,168,44,36,173,36,140,189,14,255,253,122,122,30,154,17,2,179,120,247,238,75,140,122,122,122,122,186,123,166,95,19,55,12,146,212,184,236,95,245,79,250,195,126,103,112,245,241,178,111,191,104,52,218,174,24,56,239,13,78,59,199,0,107,10,216,217,113,103,216,187,58,253,240,225,162,55,180,155,42,110,239,215,97,239,228,152,209,104,42,240,97,127,216,27,216,10,224,12,40,230,232,33,40,91,164,127,213,165,144,23,58,82,151,97,189,200,176,222,95,14,135,167,39,246,75,29,143,67,155,141,151,25,230,160,243,30,152,120,165,35,50,96,179,241,42,195,187,248,210,31,118,63,245,206,237,215,58,170,132,55,27,175,21,236,65,255,24,96,111,114,184,12,218,108,188,201,48,79,46,63,191,7,216,143,58,38,135,54,27,63,42,226,2,57,130,66,206,46,135,246,91,29,91,25,105,54,222,102,51,62,158,119,206,62,217,63,113,64,231,248,152,65,174,206,78,251,39,20,149,15,116,7,189,206,57,71,110,54,126,82,86,236,188,183,155,57,133,48,152,162,144,139,222,160,215,5,106,57,157,8,112,83,209,202,233,217,176,79,229,159,83,139,0,55,21,181,124,238,3,32,167,21,132,53,21,157,124,238,252,106,55,115,250,64,88,83,85,197,176,119,102,55,243,154,64,96,83,209,195,199,206,229,199,158,221,204,233,129,67,155,138,26,58,221,46,181,141,156,10,56,180,249,86,21,204,89,231,188,51,60,5,53,254,148,151,141,28,81,134,228,73,56,62,253,114,34,207,193,160,247,97,40,237,253,188,255,241,211,80,90,117,183,119,50,4,35,17,2,233,94,13,47,207,255,117,121,218,191,232,73,82,221,171,222,231,222,121,103,144,157,171,238,213,89,15,102,157,247,127,129,169,47,36,240,75,111,216,185,56,251,212,25,40,228,175,46,46,79,62,12,78,191,104,107,116,59,231,231,167,67,121,10,186,87,157,65,255,223,157,115,80,205,27,9,58,238,156,255,44,45,186,123,117,114,122,210,179,95,188,126,221,190,117,98,227,58,118,162,233,177,147,58,118,64,22,70,39,142,157,123,171,140,35,83,39,233,184,46,241,237,137,227,39,4,65,137,239,141,73,220,13,131,212,11,230,225,60,225,67,147,121,224,166,94,24,24,110,232,135,113,215,119,146,196,194,159,253,113,249,129,255,176,79,230,179,17,137,37,188,157,44,188,212,157,42,120,78,66,84,153,181,98,146,206,227,192,132,127,126,159,135,94,66,204,54,71,225,34,20,8,100,70,98,199,31,203,225,76,158,2,35,34,41,137,99,239,150,196,18,41,147,175,64,90,144,212,73,162,169,227,167,18,73,202,91,224,36,243,96,226,135,11,133,14,19,191,24,119,157,56,14,179,249,66,21,98,216,241,189,63,156,216,11,36,2,85,76,139,255,166,90,17,136,99,39,190,49,219,99,50,113,230,126,42,128,102,123,185,220,163,90,88,144,81,18,186,55,109,229,55,168,36,32,110,74,198,121,141,196,228,247,57,73,210,211,216,35,65,234,80,208,25,137,103,94,146,192,47,171,252,176,220,147,152,137,115,75,62,10,99,128,33,63,116,29,255,34,13,99,231,154,212,18,146,246,83,50,179,76,146,68,115,15,109,38,49,171,255,188,56,61,169,37,41,236,232,218,155,220,91,210,148,202,229,182,66,56,134,245,195,88,161,237,129,182,209,154,96,197,49,154,158,182,214,117,225,90,25,241,182,55,177,228,212,125,59,152,251,126,249,33,163,133,76,69,78,156,144,12,171,220,102,50,204,150,252,234,141,191,1,147,12,252,245,91,158,95,39,78,65,4,63,88,227,208,157,207,64,114,229,154,51,30,91,230,63,204,114,45,156,76,224,128,252,96,153,207,226,112,1,223,211,116,230,91,166,89,110,115,85,212,92,63,132,181,193,192,25,21,149,52,156,192,11,208,194,60,233,129,157,196,176,194,26,245,81,234,18,23,214,136,201,44,188,37,236,96,153,120,98,14,174,99,66,2,179,188,130,10,124,106,120,49,25,23,96,49,166,145,11,163,110,156,132,6,231,128,50,249,252,217,219,55,47,95,183,11,102,101,91,215,160,129,245,224,250,158,123,211,226,146,171,46,181,77,79,157,96,236,147,95,188,196,27,121,190,151,222,119,1,112,13,2,122,0,61,238,231,5,240,252,249,190,144,121,109,234,141,199,36,40,63,72,133,208,3,144,217,43,87,146,68,135,157,247,110,225,199,192,75,82,18,192,85,99,222,202,53,93,92,211,172,22,243,82,69,169,163,97,45,188,96,28,46,106,212,32,233,42,181,40,140,211,125,219,52,191,127,47,30,121,219,88,55,242,234,213,75,169,95,188,91,191,144,209,5,252,38,169,101,46,146,86,189,110,86,242,19,167,97,146,6,206,140,84,204,214,234,32,165,90,49,235,11,16,121,123,73,128,223,157,137,115,26,123,194,96,195,32,140,72,96,11,201,90,228,54,165,215,118,144,132,62,129,249,215,64,146,97,26,20,111,11,155,91,103,155,41,185,3,254,164,174,179,51,147,217,127,26,207,73,123,217,206,88,195,211,180,13,111,136,8,36,243,103,76,163,70,40,108,3,53,10,40,162,192,252,33,181,29,52,177,199,40,80,244,113,238,50,130,129,218,24,239,34,58,74,108,105,183,163,112,124,143,48,23,190,72,12,198,38,124,35,69,175,165,247,17,225,222,81,79,0,90,5,119,16,5,165,206,40,9,156,219,34,48,48,10,71,35,85,135,192,230,113,153,188,107,135,43,53,239,236,11,241,192,142,16,78,73,199,161,159,212,38,97,220,115,128,121,226,19,186,61,251,8,239,122,240,100,119,76,116,15,20,189,149,115,29,28,185,92,93,182,21,49,91,114,22,232,32,99,53,13,83,199,23,235,29,89,250,242,62,9,174,211,233,65,179,44,15,31,56,175,0,238,238,185,23,222,192,177,90,139,14,27,25,197,196,185,105,11,81,103,105,82,235,255,187,67,38,119,122,221,193,145,38,119,149,157,118,188,205,252,85,25,176,180,178,149,191,75,98,226,135,206,24,78,134,142,141,9,100,75,26,118,234,165,62,97,86,227,59,35,226,163,25,206,28,47,248,68,28,176,33,97,133,25,66,158,30,166,125,45,241,197,114,48,249,153,37,89,18,196,114,28,249,137,201,130,50,200,131,252,150,144,50,186,7,159,148,225,250,26,134,159,134,159,7,22,59,159,58,19,44,73,93,153,244,144,159,69,55,55,74,3,179,130,104,16,227,160,99,76,195,185,59,69,217,183,178,59,163,252,64,106,81,76,168,218,143,89,140,71,69,57,79,83,122,221,129,35,181,56,137,42,189,13,65,41,85,164,2,58,221,133,6,247,109,75,230,149,245,189,137,100,249,241,221,177,27,9,156,170,32,203,208,29,31,25,204,145,165,249,191,148,59,253,189,149,240,162,201,206,178,139,156,49,219,244,229,89,117,87,217,21,209,80,101,135,44,250,79,103,145,38,144,79,103,82,163,178,194,102,252,116,54,49,181,125,58,159,58,153,21,70,71,79,103,148,102,231,79,231,83,163,178,194,166,251,116,54,89,113,224,233,140,230,232,108,60,221,88,222,122,252,240,197,52,6,190,64,191,110,237,175,196,1,43,100,135,157,247,171,52,245,192,195,137,34,244,64,135,190,119,116,232,24,97,48,3,74,100,30,217,37,192,97,251,144,18,173,152,229,146,49,141,201,196,46,81,10,10,188,116,196,63,240,154,169,152,135,117,231,232,176,14,36,11,35,26,185,230,216,187,53,188,49,46,165,17,59,172,195,8,157,75,231,217,64,160,166,19,128,175,17,25,119,217,183,5,249,111,24,181,168,154,150,101,140,219,44,211,137,60,182,178,3,216,19,207,135,96,205,146,106,163,105,10,166,152,63,88,233,212,75,128,159,52,133,20,132,110,204,44,219,182,13,145,48,221,247,65,26,30,176,187,20,210,121,52,38,19,225,102,85,53,0,26,79,0,59,118,20,135,179,8,66,230,161,51,50,210,208,96,19,233,47,43,192,106,138,1,233,27,216,228,59,22,199,237,211,253,212,24,18,204,176,224,19,98,2,199,39,49,37,49,117,82,74,211,24,135,36,49,130,48,53,200,29,36,74,70,235,183,223,48,25,40,176,185,2,147,98,165,65,169,126,136,108,97,70,151,69,18,140,109,6,162,226,125,150,64,204,227,166,92,7,58,106,155,125,102,74,11,35,76,234,168,222,216,79,179,178,39,116,183,103,150,12,52,1,187,36,160,204,34,232,128,128,176,197,8,197,62,18,48,12,42,0,112,88,103,52,143,204,213,29,125,238,111,187,29,111,92,180,149,138,105,120,65,52,79,153,10,248,182,18,239,15,72,112,203,15,98,151,104,10,51,47,48,117,183,185,194,75,231,215,191,143,23,106,32,26,63,52,177,48,87,152,116,238,88,60,152,99,21,19,206,60,102,126,59,43,23,208,176,119,246,63,18,46,164,252,209,35,210,197,130,250,227,183,161,44,52,125,229,246,247,205,94,169,96,9,103,208,6,14,224,182,196,129,139,219,107,107,117,110,213,68,88,230,63,116,3,204,245,0,90,120,240,19,251,179,147,78,107,113,56,135,163,65,147,123,160,8,59,166,133,177,161,55,131,95,245,102,163,209,40,226,180,22,205,147,169,245,112,215,74,147,234,125,43,147,6,156,228,92,121,111,23,206,21,190,149,22,69,171,64,96,95,191,253,197,235,137,58,63,85,159,168,75,151,217,184,44,83,99,233,224,113,103,183,177,32,154,187,30,148,238,19,102,219,106,248,151,229,46,220,224,196,210,192,208,233,34,56,139,195,8,46,222,123,171,196,51,191,139,244,222,39,165,50,115,149,42,33,97,192,48,204,45,88,157,81,204,146,12,220,55,196,229,224,115,26,230,187,70,171,249,231,88,75,158,204,27,11,59,214,208,66,214,180,147,186,199,66,142,43,90,226,180,180,187,0,102,41,136,85,19,204,222,84,106,117,255,187,45,241,212,147,210,2,199,171,16,3,198,118,182,1,157,210,46,108,41,41,48,198,67,228,46,253,139,120,203,145,218,201,12,88,50,190,18,8,60,149,181,21,98,187,48,199,147,250,213,156,61,207,217,42,6,22,49,119,101,94,39,181,11,231,89,106,157,245,218,91,171,104,172,246,65,151,188,118,230,215,228,47,146,125,158,214,46,27,96,247,56,131,139,14,151,40,160,98,121,214,50,47,131,155,32,92,4,6,141,80,104,136,139,113,169,41,28,194,114,79,150,201,96,252,200,214,94,58,60,127,46,71,14,245,114,41,11,57,68,205,46,127,207,172,21,67,228,4,196,215,132,160,78,43,144,64,54,161,156,99,213,182,181,27,18,242,60,198,140,222,222,97,183,225,129,108,123,242,166,235,1,111,115,138,207,172,167,41,32,89,3,83,64,100,187,82,0,88,127,82,124,201,118,100,185,45,56,201,42,249,28,199,172,40,61,93,94,55,132,239,178,8,9,11,183,144,241,46,152,86,184,85,217,148,252,113,198,54,113,180,150,143,229,30,205,229,48,137,61,224,174,228,10,191,32,75,35,180,78,171,228,104,60,57,251,218,248,198,125,164,158,173,49,231,68,79,61,131,6,244,172,115,87,95,136,201,146,36,165,193,48,35,73,226,92,19,91,169,241,170,189,48,198,31,235,70,241,28,142,217,37,208,179,133,171,226,112,60,169,89,91,145,213,116,19,31,87,110,153,21,248,139,125,34,142,221,254,211,66,208,29,114,94,50,60,253,147,156,179,101,54,112,142,238,108,19,235,193,58,206,149,85,232,229,186,97,13,230,150,54,45,146,110,179,136,168,65,20,46,65,171,6,27,87,112,70,91,172,193,188,212,38,69,115,55,182,81,217,91,44,164,150,124,217,112,213,75,198,112,123,98,198,199,127,234,100,71,20,166,80,163,7,217,200,161,204,163,226,229,100,29,138,94,104,213,220,130,188,109,165,116,172,88,181,170,181,142,147,200,125,156,149,200,213,120,209,28,202,122,194,147,45,8,79,214,17,166,197,192,245,164,183,16,95,52,90,71,154,214,109,215,147,246,183,32,237,175,35,141,165,214,245,180,227,45,104,199,5,180,181,158,187,200,54,184,226,19,200,160,8,26,26,254,178,249,99,12,90,106,200,95,102,224,87,69,143,120,74,220,27,218,253,205,247,171,18,7,86,185,37,250,157,166,17,81,26,205,130,136,222,11,23,148,188,224,81,90,250,155,138,140,28,210,51,178,45,53,179,28,98,19,27,121,156,8,34,136,108,92,212,123,115,180,27,171,180,215,176,245,8,121,81,6,102,15,132,148,130,110,214,169,246,146,99,47,113,99,146,242,250,34,34,217,107,189,134,242,222,203,29,217,138,247,208,92,152,238,74,32,50,162,27,136,124,199,37,86,253,63,191,29,87,234,215,85,19,189,36,43,50,99,241,28,43,58,173,2,127,164,122,91,10,225,142,104,185,228,37,234,181,142,108,205,68,26,211,233,12,186,142,239,143,28,247,230,130,64,56,185,111,155,84,43,38,179,87,85,60,98,82,198,173,16,196,82,216,155,138,194,100,161,225,236,173,95,183,202,87,109,47,151,226,101,129,172,81,100,114,198,98,197,67,22,75,218,143,6,167,239,76,3,195,80,90,36,205,5,162,21,90,39,109,153,102,91,141,206,237,45,162,254,21,154,234,176,164,138,11,45,96,243,197,36,233,8,37,69,255,34,62,21,247,154,237,40,181,191,82,249,251,119,233,144,11,42,136,188,111,125,212,208,106,137,219,208,125,183,137,108,246,170,130,61,250,0,155,218,252,34,67,111,82,243,196,114,165,193,186,182,53,154,107,214,236,222,236,198,90,92,113,235,155,165,92,108,43,178,61,162,164,49,168,201,138,106,47,134,75,47,32,187,148,46,66,250,168,115,62,11,18,129,65,213,72,17,156,120,108,164,236,201,10,45,194,23,135,231,216,119,153,190,22,141,28,86,144,55,15,235,0,58,156,198,117,90,169,231,38,37,75,116,40,222,234,106,57,171,154,81,168,106,89,38,22,248,177,181,147,171,24,102,29,255,93,182,158,176,231,112,72,82,200,128,118,164,96,181,13,27,210,57,89,238,233,125,14,202,135,184,65,182,42,128,231,27,37,79,22,150,244,17,10,165,236,214,65,106,64,136,209,40,152,94,16,226,201,35,192,159,169,30,38,32,77,20,51,184,43,33,96,237,222,216,147,50,198,21,12,252,247,96,17,59,17,149,175,108,246,81,58,71,102,254,29,134,88,133,197,189,184,14,22,85,214,173,196,123,143,52,248,1,76,37,88,102,83,170,6,122,102,218,88,50,213,62,101,17,38,115,178,104,3,146,73,134,167,176,41,79,188,96,148,237,145,242,153,60,46,16,222,225,51,43,150,40,225,54,205,119,210,205,195,229,89,102,109,209,61,102,204,124,150,23,112,24,58,43,44,155,216,37,156,52,10,239,74,108,109,177,116,24,116,233,166,196,82,244,153,36,219,30,134,110,216,79,219,176,182,48,240,195,58,110,75,217,247,202,197,38,246,31,56,146,79,254,228,8,174,132,185,207,24,214,250,195,76,71,234,59,12,67,87,18,101,206,84,148,84,136,202,181,132,187,166,79,74,88,243,247,249,179,159,222,188,110,180,179,22,242,99,171,179,135,11,219,50,144,195,214,120,136,119,230,1,31,121,108,203,130,142,172,113,224,239,204,1,62,139,216,150,3,29,89,227,96,180,145,131,58,51,7,139,23,201,152,49,189,51,129,171,204,112,38,94,60,43,173,225,146,191,137,216,146,77,142,93,204,168,43,24,61,253,153,242,200,204,158,178,8,102,172,158,114,230,173,133,141,43,103,81,13,166,181,83,169,223,0,236,140,34,114,201,152,121,176,155,6,252,117,238,236,82,179,209,80,218,221,252,162,193,221,232,193,87,209,130,60,122,135,3,134,151,112,33,6,82,212,47,49,188,105,133,231,202,69,32,98,139,108,19,60,26,68,231,222,26,65,156,127,211,94,185,205,76,220,42,150,131,120,243,158,109,150,165,46,69,123,131,139,22,67,104,129,195,147,11,38,43,208,76,93,97,75,137,132,118,101,141,85,145,242,15,11,10,184,81,170,81,133,188,240,16,76,58,62,44,233,252,9,70,68,13,136,179,146,45,172,85,143,10,151,102,225,158,88,121,226,93,207,99,130,52,121,19,149,63,121,129,1,215,225,111,31,42,50,88,81,160,248,1,115,85,210,24,59,114,210,95,250,131,129,241,190,103,116,12,4,27,155,132,141,203,179,14,193,223,160,120,22,196,114,182,240,195,168,211,255,186,0,39,107,22,49,217,146,177,49,1,47,118,191,175,30,72,135,54,135,73,28,206,104,9,154,49,137,32,201,228,145,138,61,130,76,77,74,143,185,186,8,36,91,68,43,156,167,244,105,130,68,142,80,138,5,255,105,231,191,84,243,29,73,190,57,0,0 };