1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-27 21:34:13 +00:00
ESPUI/src/dataControlsJS.h

112 lines
32 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 UI_TIME=20;const UPDATE_TIME=120;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;var WebSocketTimer=null;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);let idData=savedData[id];return Array.isArray(idData)?idData:[];}
return[];}
function restart(){$(document).add("*").off();$("#row").html("");conStatusError();start();}
function conStatusError(){if(true===websockConnected){websockConnected=false;websock.close();$("#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");}
if(null===WebSocketTimer){WebSocketTimer=setInterval(function(){if(websock.readyState===3){restart();}},5000);}
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("websock Error");console.log(evt);restart();};var handleEvent=function(evt){console.log(evt);try{var data=JSON.parse(evt.data);}
catch(Event){console.error(Event);websock.send("uiok:"+0);return;}
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){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("min",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("max",data.value);}else if($('#text'+data.parentControl).length){$('#text'+data.parentControl).attr("maxlength",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).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($("#sl"+data.id).parent().parent(),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);}
if(data.hasOwnProperty('inputType')){$("#text"+data.id).attr("type",data.inputType);}
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;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;default:console.error("Unknown type or event");break;}
if(data.type>=UI_TITEL&&data.type<UPDATE_OFFSET){processEnabled(data);}
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.hasOwnProperty('visible')){if(data['visible'])
$("#id"+data.id).show();else
$("#id"+data.id).hide();}
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));}
processEnabled(data);}
$(".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){if($("#id"+number+" nav").hasClass("disabled")){return;}
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+"' ":"";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)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";break;case UI_TIME:break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data));}}
var elementHTML=function(data){var id=data.id
var elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";var inputType=data.hasOwnProperty('inputType')?" type='"+data.inputType+"' ":"";switch(data.type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+data.value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
data.value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(data.value=="1"?"checked":"")+
(data.hasOwnProperty('vertical')?" vert-switcher ":"")+
"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(data.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>"+
(data.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 "+
(data.hasOwnProperty('vertical')?" vert-slider ":"")+
"'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+data.value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
data.value+"</span></div>";case UI_NUMBER:return"<input style='color:black; "+data.elementStyle+"' id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input "+inputType+"style='color:black; "+data.elementStyle+"' id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black; "+data.elementStyle+"' id='select"+id+
"' onchange='selectchange("+id+")' />";case UI_GRAPH:return"<figure id='graph"+id+"'><figcaption>"+data.label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+data.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"";}}
var processEnabled=function(data){switch(data.type){case UI_SWITCHER:case UPDATE_SWITCHER:if(data.enabled){$("#sl"+data.id).removeClass('disabled');$("#s"+data.id).prop("disabled",false);}else{$("#sl"+data.id).addClass('disabled');$("#s"+data.id).prop("disabled",true);}
break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+data.id).prop("disabled",!data.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+data.id).prop("disabled",!data.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+data.id).prop("disabled",!data.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+data.id).prop("disabled",!data.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+data.id).prop("disabled",!data.enabled);break;case UI_PAD:case UI_CPAD:case UPDATE_PAD:case UPDATE_CPAD:if(data.enabled){$("#id"+data.id+" nav").removeClass('disabled');}else{$("#id"+data.id+" nav").addClass('disabled');}
break;}}
)=====";
const uint8_t JS_CONTROLS_GZIP[4334] PROGMEM = { 31,139,8,0,167,12,99,99,2,255,197,27,105,119,219,56,238,123,126,133,162,246,213,242,198,241,209,107,58,118,148,62,215,113,91,239,228,218,196,153,206,219,78,55,79,182,233,88,47,178,164,145,228,164,153,212,255,125,65,240,16,169,195,118,146,153,221,47,141,5,130,32,136,131,0,1,118,28,248,113,98,92,12,46,7,199,131,225,160,123,120,249,233,98,96,191,108,54,59,99,49,112,214,63,60,233,30,0,172,37,96,167,7,221,97,255,242,228,227,199,243,254,208,110,169,184,253,223,134,253,227,3,70,163,165,192,135,131,97,255,208,86,0,167,64,49,67,15,65,233,34,131,203,30,133,188,212,145,122,12,235,101,138,245,225,98,56,60,57,182,95,233,120,28,218,106,190,74,49,15,187,31,128,137,215,58,34,3,182,154,175,83,188,243,47,131,97,239,115,255,204,126,163,163,74,120,171,249,70,193,62,28,28,0,236,109,6,151,65,91,205,183,41,230,241,197,209,7,128,253,164,99,114,104,171,249,147,34,46,144,35,40,228,244,98,104,191,211,177,149,145,86,243,93,58,227,211,89,247,244,179,253,51,7,116,15,14,24,228,242,244,100,112,76,81,249,64,239,176,223,61,227,200,173,230,207,202,138,221,15,118,43,163,16,6,83,20,114,222,63,236,247,128,90,70,39,2,220,82,180,114,114,58,28,80,249,103,212,34,192,45,69,45,71,3,0,100,180,130,176,150,162,147,163,238,111,118,43,163,15,132,181,84,85,12,251,167,118,43,171,9,4,182,20,61,124,234,94,124,234,219,173,140,30,56,180,165,168,161,219,235,81,219,200,168,128,67,91,239,84,193,156,118,207,186,195,19,80,227,207,89,217,200,145,150,42,238,193,81,31,60,42,35,111,10,108,41,80,233,48,7,39,95,142,165,187,28,246,63,14,165,91,156,13,62,125,30,74,227,239,245,143,135,96,75,66,110,189,203,225,197,217,191,46,78,6,231,125,73,170,119,217,63,234,159,117,15,83,247,235,93,158,246,97,214,217,224,87,152,250,82,2,191,244,135,221,243,211,207,221,67,133,252,229,249,197,241,199,195,147,47,218,26,189,238,217,217,201,80,58,75,239,178,123,56,248,119,247,12,52,248,86,130,14,186,103,191,72,195,239,93,30,159,28,195,246,223,188,233,220,56,145,113,21,57,225,236,192,73,28,219,39,183,70,55,138,156,59,171,138,35,51,39,238,142,199,196,179,167,142,23,19,4,197,158,59,33,81,47,240,19,215,95,4,139,152,15,77,23,254,56,113,3,223,24,7,94,16,245,60,39,142,45,252,57,152,84,239,249,15,251,120,49,31,145,72,194,59,241,173,155,140,103,10,158,19,19,85,102,237,136,36,139,200,55,225,159,63,22,129,27,19,179,195,81,184,8,5,2,153,147,200,241,38,114,56,149,167,192,8,73,66,162,200,189,33,145,68,74,229,43,144,110,73,226,196,225,204,241,18,137,36,229,45,112,226,133,63,245,130,91,133,14,19,191,24,31,59,81,20,164,243,133,42,196,176,227,185,127,58,145,235,75,4,170,152,54,255,77,181,34,16,39,78,116,109,118,38,100,234,44,188,68,0,205,206,114,185,69,181,112,75,70,113,48,190,238,40,191,65,37,62,25,39,100,162,40,235,11,25,157,195,16,73,134,46,72,200,246,23,158,151,106,42,34,127,44,72,156,156,68,46,241,19,135,130,78,73,52,119,227,24,126,89,213,251,229,150,196,140,157,27,242,73,24,9,12,121,193,216,241,206,147,32,114,174,72,61,38,201,32,33,115,203,36,113,184,112,209,150,98,179,246,207,243,147,227,122,156,192,78,175,220,233,157,37,77,172,90,237,40,132,35,88,63,136,20,218,46,88,1,90,25,172,56,65,147,212,214,186,42,92,43,37,222,113,167,150,156,186,141,251,173,222,167,180,144,169,208,137,98,146,98,85,59,30,73,12,151,33,72,232,87,119,242,173,195,132,206,28,162,238,198,204,49,24,102,245,61,251,219,254,250,13,246,195,16,241,167,182,53,39,74,64,90,207,173,73,48,94,204,65,200,213,186,51,153,88,230,63,204,106,61,152,78,193,199,158,91,230,179,40,184,133,239,89,50,247,44,211,172,82,15,61,7,109,44,226,62,216,81,4,56,156,140,74,59,139,115,15,219,78,162,5,177,109,59,107,12,213,251,18,243,224,224,250,216,11,64,28,140,21,73,23,24,138,200,60,184,33,204,145,77,244,208,221,171,136,16,223,204,163,194,166,52,188,136,76,10,176,216,14,145,99,163,97,28,7,6,231,136,110,232,197,179,119,111,95,189,233,20,204,74,229,164,65,125,235,126,236,185,227,235,54,23,115,109,89,165,174,33,37,52,115,252,137,71,126,117,99,119,228,122,110,114,215,3,192,21,97,146,218,206,74,228,197,139,109,161,161,250,204,157,76,136,95,189,151,234,211,200,10,149,74,116,216,122,255,6,126,28,186,113,66,124,56,219,204,27,185,230,24,215,52,107,197,188,212,80,13,104,177,183,174,63,9,110,235,212,210,233,42,245,48,136,146,109,219,52,127,252,40,30,121,215,44,27,121,253,250,149,84,56,30,230,242,0,176,204,219,184,221,104,152,59,217,137,179,32,78,124,103,78,118,204,118,126,144,82,221,49,27,183,32,243,206,146,0,191,143,38,206,105,108,193,118,169,87,130,165,234,103,83,245,62,115,86,209,99,197,135,51,251,198,241,44,33,127,166,63,97,185,17,113,38,119,212,36,168,221,191,210,85,86,123,211,108,54,233,122,2,57,240,131,144,248,182,164,68,110,18,26,151,252,56,240,8,240,123,5,91,96,152,6,197,219,192,200,203,156,33,33,223,65,30,210,182,0,35,231,128,212,85,59,203,78,202,26,250,224,38,188,33,98,209,33,161,82,35,20,182,9,53,156,204,168,201,65,138,221,81,36,201,211,0,106,193,104,232,43,232,226,212,36,186,195,3,124,146,57,111,97,176,62,193,227,118,185,5,198,1,81,31,201,165,20,144,107,14,148,155,137,137,15,231,229,194,13,174,193,56,155,85,126,34,119,88,12,36,182,116,195,81,48,185,67,78,199,132,218,12,248,142,200,45,232,154,245,228,46,36,60,187,208,239,89,237,130,3,152,130,18,103,20,251,206,77,17,24,248,5,79,79,212,33,176,73,92,38,155,26,65,232,201,38,75,133,120,176,31,132,83,210,81,224,197,245,105,16,245,29,96,158,120,132,110,207,222,71,145,66,38,240,157,233,224,158,162,183,51,33,150,35,87,107,203,142,162,47,75,206,2,201,167,172,38,65,226,120,98,189,125,75,95,222,35,254,85,50,219,109,85,229,89,162,43,162,20,29,54,50,2,175,188,238,8,81,167,183,209,246,255,119,135,76,238,212,168,225,132,34,223,119,30,181,227,77,230,231,101,192,110,239,237,236,209,24,17,47,112,38,224,98,58,54,222,211,219,210,176,19,55,241,8,179,26,207,25,17,15,205,112,238,184,254,103,56,252,32,7,229,86,152,34,100,233,225,237,186,45,190,216,85,87,126,166,119,89,9,98,87,73,249,137,119,50,101,144,223,165,218,66,202,24,237,60,82,133,211,113,24,124,30,30,29,90,204,201,117,38,88,45,32,55,233,62,59,139,110,110,148,248,230,14,162,65,46,136,129,62,9,22,227,25,202,190,157,30,62,213,123,82,15,35,66,213,126,192,114,100,42,202,69,146,208,211,20,18,3,139,147,168,209,195,22,148,82,67,42,160,211,199,208,224,161,122,137,89,70,70,189,162,38,177,126,119,236,68,130,28,65,144,101,232,142,135,12,102,200,210,50,139,148,59,253,189,145,240,194,233,163,101,23,58,19,182,233,139,211,218,99,101,87,68,67,149,29,178,232,61,157,69,122,1,127,58,147,26,149,28,155,209,211,217,196,210,192,211,249,212,201,228,24,29,61,157,81,90,221,120,58,159,26,149,28,155,227,167,179,201,138,43,79,103,52,67,103,165,119,99,21,113,189,243,69,52,165,63,199,184,110,109,231,242,128,28,217,97,247,67,158,166,158,120,56,97,136,17,104,207,115,247,247,28,35,240,231,64,137,44,66,187,2,56,108,31,82,162,59,102,181,98,204,34,50,181,43,148,130,2,175,236,243,15,60,102,118,204,189,134,179,191,215,0,146,133,25,141,92,115,226,222,192,149,24,151,210,136,237,53,96,132,206,165,243,108,32,80,215,9,192,215,136,76,122,236,219,186,247,130,32,108,83,53,45,171,152,252,89,166,19,186,108,101,7,176,167,174,7,201,154,154,221,243,27,247,115,43,153,185,49,240,147,36,112,163,162,27,51,171,144,227,67,162,77,247,189,155,4,187,236,44,53,33,224,83,99,50,17,110,214,84,3,160,249,4,176,99,135,81,48,15,33,35,31,58,35,35,9,12,54,145,254,130,123,8,173,70,25,112,29,5,155,124,207,242,184,109,186,159,58,67,130,25,22,124,66,78,224,120,36,162,36,102,78,66,105,26,147,128,196,134,31,36,6,249,14,247,62,163,253,251,239,120,183,41,176,185,2,147,98,21,88,169,126,72,143,97,70,143,101,18,140,109,6,162,226,125,22,67,206,51,78,184,14,116,212,14,251,76,149,22,132,120,71,165,122,99,63,205,157,45,161,187,45,179,98,160,9,216,21,1,101,22,65,7,4,132,45,70,40,246,190,128,97,82,1,128,189,6,163,185,111,230,119,116,52,40,221,14,128,159,91,149,103,177,87,41,218,2,207,155,168,233,151,227,48,35,152,187,190,169,7,76,122,29,53,56,125,80,229,250,5,74,145,202,86,200,237,179,251,219,223,191,79,231,251,138,125,210,203,229,250,21,202,177,228,26,12,253,239,150,104,110,47,185,227,117,216,63,221,208,19,220,73,145,23,236,152,134,235,135,139,132,121,47,247,136,216,253,147,88,224,182,194,65,144,153,56,33,225,26,110,176,43,179,254,172,151,229,198,175,220,187,190,217,185,58,166,8,117,112,99,133,251,66,132,3,231,55,87,86,126,110,205,68,88,26,29,117,247,202,52,146,218,120,172,197,246,145,147,204,234,81,176,0,199,167,149,24,160,8,59,166,229,81,90,60,177,170,141,22,150,63,242,171,213,195,69,60,179,238,191,183,147,184,118,215,78,165,1,231,84,166,200,251,24,206,21,190,149,62,87,187,64,96,95,191,253,197,235,137,102,17,85,159,232,90,84,217,184,108,98,96,221,101,125,40,95,89,22,207,28,126,74,11,19,107,9,106,114,155,222,204,184,193,137,165,129,161,147,91,255,52,10,66,8,43,119,86,133,223,107,207,147,59,143,84,170,44,17,80,9,9,3,134,97,110,193,234,140,98,150,228,181,100,197,173,3,34,106,211,124,223,108,183,30,198,90,252,100,222,88,82,85,66,11,89,211,60,117,139,37,84,151,180,32,109,229,102,49,47,183,210,31,202,212,154,9,142,96,42,165,214,255,221,38,249,85,155,210,130,99,82,33,70,11,154,143,181,10,157,210,99,216,82,174,252,152,255,65,168,248,139,120,203,144,90,207,92,25,113,60,208,135,119,225,106,202,180,166,199,9,203,9,37,230,198,74,26,185,116,234,169,27,206,17,123,140,62,120,105,36,95,249,200,114,150,199,192,74,243,99,153,215,73,61,134,243,180,64,145,62,12,105,231,209,88,5,137,46,121,229,44,174,200,95,36,251,44,173,199,108,128,197,139,2,23,25,28,245,49,206,70,55,182,18,92,147,96,112,126,114,142,197,72,43,91,161,78,32,234,182,205,157,232,6,187,40,153,248,36,122,184,122,165,219,188,240,175,253,224,214,55,168,33,211,75,8,222,28,76,49,41,117,15,58,190,111,139,210,224,139,23,18,184,167,61,3,130,116,39,10,198,36,142,251,190,3,113,109,98,137,106,123,134,142,58,71,35,166,21,198,89,250,37,170,179,90,254,69,55,86,166,170,208,241,137,167,41,74,157,86,160,165,116,194,170,19,129,199,106,74,147,163,124,149,176,111,213,173,220,58,241,44,184,5,29,209,124,54,63,56,131,88,98,101,5,99,219,90,108,170,222,243,173,235,109,80,22,135,118,229,115,4,254,24,98,151,63,63,16,159,233,91,3,1,73,31,22,8,136,124,70,32,0,236,221,128,248,146,207,4,232,46,136,104,53,234,108,152,59,202,91,11,94,143,134,239,170,104,213,21,110,33,229,93,48,173,112,171,178,41,249,227,140,173,226,168,148,143,173,18,155,164,149,3,44,153,236,242,208,126,137,95,102,181,78,104,87,64,169,8,240,82,192,215,230,55,158,179,232,181,1,150,44,208,211,145,65,125,122,38,242,212,171,16,147,93,201,149,110,217,28,216,115,174,136,173,116,20,212,86,59,227,143,181,114,121,197,128,249,6,208,179,69,162,192,225,120,162,101,143,134,216,195,149,225,88,128,191,120,60,112,236,206,131,133,160,39,72,89,201,240,98,131,228,156,45,179,130,115,76,38,86,177,238,151,113,174,172,66,131,208,138,53,88,232,94,181,72,178,201,34,162,226,85,184,4,173,81,173,92,193,25,109,176,6,139,230,171,20,205,195,253,74,101,111,176,144,218,96,96,195,53,55,158,64,36,192,195,141,255,212,201,142,40,76,161,134,23,245,12,202,34,44,94,78,86,61,233,49,87,203,47,40,206,71,54,2,247,105,222,247,116,98,126,98,76,220,24,157,23,124,231,94,246,95,121,119,85,105,172,178,162,106,187,108,11,225,120,253,30,194,177,182,9,45,50,151,19,158,110,64,120,90,70,152,214,172,203,73,111,32,247,112,84,70,154,182,23,202,73,123,27,144,246,202,72,99,71,160,156,118,180,1,237,168,128,182,246,210,69,92,27,185,197,196,244,157,5,26,76,204,94,92,176,183,85,180,100,154,61,5,83,211,1,2,227,107,102,57,25,63,113,96,149,27,162,31,134,26,17,229,185,133,32,162,191,64,17,148,92,127,45,45,253,41,83,74,78,22,188,248,150,90,233,213,111,21,27,89,28,136,113,97,58,46,218,18,25,218,205,60,237,18,182,214,144,23,221,10,246,6,66,233,59,164,47,51,220,248,192,141,199,224,171,188,12,142,72,118,105,184,81,158,117,142,71,182,18,118,180,216,167,199,32,56,49,232,6,66,207,25,19,171,241,159,223,15,118,26,87,53,19,195,43,235,133,96,143,7,47,102,237,130,64,166,134,105,10,225,17,108,185,228,157,148,210,8,88,50,177,131,7,153,202,224,216,241,188,145,51,190,62,39,144,83,111,219,38,213,138,201,236,85,21,143,152,148,114,43,4,177,20,246,166,162,48,89,104,56,91,229,235,214,248,170,157,229,82,188,164,145,197,166,84,206,152,19,221,167,137,176,189,54,179,126,111,26,152,67,211,90,126,38,139,222,161,229,252,182,105,118,16,116,11,108,22,147,163,35,148,16,253,139,248,84,48,37,11,43,229,214,74,245,199,15,25,115,203,171,195,251,77,173,124,187,9,221,247,171,200,166,207,116,216,115,36,208,254,234,39,62,250,171,7,126,199,206,117,236,75,123,237,153,238,223,227,95,79,96,249,179,248,45,5,187,125,178,173,200,126,155,114,81,65,77,238,168,154,53,198,244,168,176,43,201,109,64,95,89,47,230,126,44,48,168,26,41,130,19,77,140,132,189,129,162,93,157,226,188,28,27,121,179,55,162,51,200,58,60,230,94,3,64,123,179,168,65,91,63,60,195,79,171,162,216,1,194,222,95,166,232,154,62,9,121,204,86,98,246,254,19,73,138,61,209,150,37,172,182,130,193,98,78,240,218,46,46,207,122,111,140,178,38,220,121,163,182,66,182,185,150,147,135,60,128,149,145,172,75,211,97,144,4,23,130,138,189,194,207,245,98,71,206,211,213,97,233,235,184,144,168,129,217,235,106,106,64,19,111,188,130,164,28,146,244,214,249,21,127,140,190,23,131,74,81,215,16,173,132,150,53,6,183,164,162,81,135,6,254,187,123,27,57,97,190,47,77,137,237,155,217,39,67,98,41,150,52,227,98,88,185,42,91,142,183,201,105,2,4,152,74,166,205,166,212,12,140,206,180,7,106,170,45,245,34,76,22,104,43,251,122,191,20,56,101,200,10,175,242,64,17,220,178,221,82,102,227,245,162,225,29,105,241,200,76,84,230,91,230,123,25,244,65,41,224,129,37,181,17,248,227,66,212,65,197,210,143,93,145,186,25,124,158,201,61,138,122,38,95,211,245,57,12,149,207,237,1,87,27,5,223,43,140,115,193,120,224,247,168,92,4,163,244,141,51,147,16,102,128,216,61,94,195,185,41,92,118,175,129,146,81,68,151,59,122,133,8,225,22,34,152,229,175,236,224,208,90,120,140,107,237,73,4,211,181,250,244,200,208,149,77,57,52,21,101,23,162,114,109,227,214,233,43,42,246,222,225,197,179,159,223,190,105,118,210,87,19,235,86,103,111,117,54,101,32,131,173,241,16,61,154,7,124,215,180,41,11,58,178,198,129,247,104,14,240,37,208,166,28,232,200,26,7,163,149,28,52,152,57,104,69,60,102,81,239,77,96,45,181,158,169,27,205,43,37,172,242,183,64,27,242,202,177,139,185,29,11,110,79,126,161,140,10,239,219,107,128,45,171,167,5,75,42,132,161,43,94,169,102,231,169,91,109,224,240,124,134,238,238,204,181,245,67,136,57,58,174,83,49,230,46,8,162,9,127,157,239,118,165,213,108,42,47,68,212,3,15,165,161,199,157,34,134,249,117,2,188,20,195,66,33,6,82,44,56,81,241,236,23,81,61,147,109,9,57,177,237,240,104,136,137,76,123,4,183,143,235,142,81,18,26,233,206,177,196,197,159,191,176,189,179,91,85,233,86,33,8,96,138,47,16,249,229,135,201,15,20,221,80,24,84,242,63,157,73,192,78,99,234,3,57,102,5,179,236,139,157,50,38,149,234,91,33,139,60,31,149,1,27,75,88,15,21,162,40,124,113,166,210,213,181,146,89,225,250,44,1,22,203,79,221,171,69,68,144,38,239,228,243,87,101,48,48,118,248,243,162,76,206,167,12,225,7,16,80,233,99,74,205,233,127,25,28,30,26,31,250,70,215,64,176,81,110,50,108,95,188,135,244,119,153,7,75,240,57,111,248,97,52,232,255,123,2,159,156,135,76,204,100,98,76,33,136,222,109,171,167,128,67,223,42,144,40,152,211,186,60,227,20,65,146,211,125,21,123,4,247,77,41,71,22,100,67,144,113,17,173,96,145,208,151,50,18,57,68,81,150,253,15,67,189,114,159,205,109,203,83,196,204,237,42,243,26,65,244,92,8,35,91,208,107,87,171,34,21,81,123,172,240,178,136,218,246,199,178,136,44,78,202,186,8,191,179,103,59,248,162,142,243,16,146,188,146,83,252,36,116,147,7,13,89,130,219,218,222,51,247,23,237,118,185,230,13,193,131,8,231,238,169,155,188,4,120,208,10,218,181,119,125,211,253,65,180,181,203,251,154,158,249,131,8,171,153,103,47,219,204,46,108,110,23,26,175,118,207,229,197,243,50,27,78,141,179,104,86,161,141,10,235,91,46,255,11,224,15,156,118,40,66,0,0 };