1
0
mirror of https://github.com/s00500/ESPUI.git synced 2026-02-05 17:02:41 +00:00
Files
ESPUI/src/dataControlsJS.h
2026-01-28 09:25:24 +01:00

6 lines
36 KiB
C

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