From 45f47a72c5c792e3f745c328e4d597ed4a2b1fbc Mon Sep 17 00:00:00 2001 From: ayushsharma82 Date: Sat, 20 May 2017 05:02:31 +0530 Subject: [PATCH] Updated to V0.6 - Added Internet Detection to Switch to CDN - Optimized PROGMEM Data - Improved UI for Mobile Displays - Added SoftAP Example - Fixed Example code for Generic ESP8266 Boards --- README.md | 24 +++---- img-example1.PNG => docs/img1.PNG | Bin docs/img2.PNG | Bin 0 -> 3765 bytes docs/img3.PNG | Bin 0 -> 2479 bytes docs/img4.PNG | Bin 0 -> 1958 bytes docs/img5.PNG | Bin 0 -> 1891 bytes examples/UI_Test/UI_Test.ino | 8 ++- examples/softAP_UI_Test/softAP_UI_Test.ino | 29 +++++++++ keywords.txt | 1 + src/CSS_STYLE.h | 6 +- src/EasyUI.cpp | 70 ++++++++++++--------- src/EasyUI.h | 4 +- src/HTML_PAGE.h | 4 +- src/JS_JQUERY.h | 45 ++----------- 14 files changed, 97 insertions(+), 94 deletions(-) rename img-example1.PNG => docs/img1.PNG (100%) create mode 100644 docs/img2.PNG create mode 100644 docs/img3.PNG create mode 100644 docs/img4.PNG create mode 100644 docs/img5.PNG create mode 100644 examples/softAP_UI_Test/softAP_UI_Test.ino diff --git a/README.md b/README.md index 7f14ae4..3c72311 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # EasyUI -![alt text](https://github.com/ayushsharma82/EasyUI/blob/master/img-example1.PNG "EasyUI") - Did you Ever Got into the Trouble of Making a good Looking UI for ESP8266 without having the skills to Build Perfect Webpages? -EasyUI is an User Interface Library for ESP8266 to Solve this Problem. This Library Uses Light-weight Websockets Protocol for Communicating with Webpage to Control, Make and Update Elements. All Elements are Created in a Card Type Grid, Where Each Element Stacks aside the other. The Whole webpage is Responsive and Adapts to Mobile Displays. +EasyUI is an User Interface Library for ESP8266 to Solve this Problem. This Library Uses Light-weight Websockets Protocol for Communicating with Webpage to Control, Make and Update Elements. EasyUI uses functions native to arduino for creating the perfect Good Looking User Interface without the Need of Knowing Complex Javascripts etc. @@ -58,45 +56,37 @@ EasyUI is Based on [Skeleton CSS](http://getskeleton.com/) and Jquery for Handli EasyUI is not Internet Dependent and will Continue working without any Internet Connection, All Assets are Loaded form ESP8266 Program Memory. ##### Following Functions can be Used in Sketch: - +
**To Set an Title for your Webpage:** This Line of Code will Add your Custom Title to the Webpage Displayed by ESP8266. By Default is "EasyUI". - ``` EasyUI.title(""); ``` - +
**To Make Label on Webpage:** This will add an Label on your Web Interface. - ``` EasyUI.label("Title", "Value"); ``` - - +
**To Make Toggle Button on Webpage:** This will add an toggle Button on your Webpage. For Extra Functionality* See Below - ``` EasyUI.toggleButton(pin,"Title"); ``` - - +
**Start the Library:** Once you have Specified Any of the above Elements, Use this Below them to Start Inializing the Library. - ``` EasyUI.begin(); ``` - - +
**Loop Function:** Don't Forget to Add this in your void loop() - ``` EasyUI.loop(); ``` - +
## Extra Functionality There are Some Elements in Library which have Added extra Functionality for Ease of Use. diff --git a/img-example1.PNG b/docs/img1.PNG similarity index 100% rename from img-example1.PNG rename to docs/img1.PNG diff --git a/docs/img2.PNG b/docs/img2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..64b365b51d34278534619258dafca86fe604b5a0 GIT binary patch literal 3765 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 Gd-8wz-Z9Vs literal 0 HcmV?d00001 diff --git a/docs/img3.PNG b/docs/img3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..595837f24653253ef50425e8dc28ae56df6bf76d GIT binary patch literal 2479 zcmbVOc{tQ-8~zP5#**Z;%&{c9R%0uMGGmKLmgK9586`#`vLA*9No5J0Oo)=D&`_3R zjVWcB(eQ<8Fa~4Ez8hwYIWy;<@89n_f4uK~J@<7z&->ob@?P&lM|*2&NqI>C0Ho12 zmQDg35v*u&F~Q#0AAlDCDA>u`94MzLP74e$&dkmX0Ny{A+P(%6*b;#@F2Mk>yH&VA z?E!CY2slf$rI~XCW}eaQtAJA?Ebp8!{<230?0VQhi#tX(He%|n;l?{Qc@{`u2i6Uo`LMVuRq!?`>)lv8( zx7ASu{Pt&Lfr#ICm0wAND}Sh~rg!Ym(jx_=mH5u+tFCN)fVHis=pMPuSPVM5(5yp( zmIjM%*-xPqXX7V8Fve?w6%|Ix1Qw~#iXYYO8}sTb4BveOG&Rc>{1$GE#hEY+%G2y{q& z)WQRWc$oW(=bKMho;+8}1{x!?C<7Hj(4wtVB@C}XLcg@=dlq9 zBT?EEwyg$BVvlss3P_u`S_mW4bM#h^*4>Vtxr&%*X3B1Pmu@!f?vb8OiY14Y6%Y%5 zxc^Wy^nO&)jh|}&5sYp-7f)$UdpN6AWJ@wZD6b~;NC@OD1F##LWv0_-!rX43K1E`t zy|2BhkvE|HL`L{EhsU+@D? z4bSTLUI_7%$}bX~{4=g-Fvyi>lDfm-g%`GK*R#~HDIJj!Zv#SqC7Tq_atitKg7nVs z_XxB2jxF!}#(I{_Xq2lv>?yf4W9h?<^Eka)%Nbfu_dGMaRfKk^HJqIDcRAUVxD`y` z)mRZ0o_0DQ*J!OG4Mp5%Y-Ss9D6@sA^}EApTFn9Q1F>7YBpo(wb2QX;5r?Jp&x-0P zCUtgIokZiV{9_?y zW;ut__Rd7}g30UYaK`c%I!O?nQxiszsff7dEZ?Ggl*mRvcMYF9{H<28p?ph!n5u$U zjG>{o+VNWvp*5j119zr5bq@B?hSTl{4U_@O7kcIQyKdT#4~Sm;W~;k3**o?%!jq6X zTwyKh@cy_oc5OjaDRehdYSbv!{RbNar!c;0c~vUtRn$rhnW&@sx}6C9f0&hIz1|FY zlpQ;CEQ9kf(~}p(a^2iO>5^M8jbrT_*8)vKZA@e%6;CuOw_-Oh8z1DLpJDi_kBy;c zkj{}dwuCp>Bk{uqdO+3#WdsNH~(86 z!b6lm*<(5oBLl6R{;^)_VBvY#U%7vNF6VQaZ81&`(D)ZF2{*BTD-~+AqOQ_d{AL%( zzC7V*WKKo`bU2^Y5f4FsSjV!7LqUCm8)yo;tZuxPrFSsYT;UOA?HuiHKlU%8hU-dJ zzffO|A3;sVTO)6`Vu%>A5-9jhrn>UjLuk?L!TcWe`484}E>3#&XFB=$-zU{~ET+S% zGB~XY3))dd`nXVG;!enqRI9hnPpp27porkrsd8{toKJ$|a|@RM-++=pB{`jH<($Rs z+C4&C#|C5PG**X@ex!7vz*%Tr zP6mSgXdImf|Jutt>_XK%S-h9cu~GYZ={$#7{%_QLGR=A)ZC6 z_cSuaX`kP@p|mKM{+>It@#UrEi~G0Z#|^y}0R4R7m8_vYsc?AKlxN%WQ%hpJ*1g6u zR@)s-p{j!l9$z+N79bA(v73!J-8|`z&Qk^*D4ITnLuW)S`vG#lt z7W7}o+`S(3QJl0bJ>YzDM*-F;BkJmk{Wkna;Ddp~_5#gGo>eSmWE1Zv0lH^=gupcOVKHb^jcqwsMNGdpR=3srH(2D6`o&DV4L!aXM~ zNZCrt1XU66aa9!gf8f{YFRScftIchb3XG!GHSYt7NM{b?HL|KD)8zK}l=@B96lRoF zKDF=M4HEhKgb{gSw&jagFw2l0X6`%{SA3_))KOu+PiGGb(Vu$j*LtKmMl-XC-hGB2 zb@3_zemRfoiofvNGXLCl2o literal 0 HcmV?d00001 diff --git a/docs/img4.PNG b/docs/img4.PNG new file mode 100644 index 0000000000000000000000000000000000000000..654a323de35206a7ed8e5492a1e42e7a5939ba18 GIT binary patch literal 1958 zcmbtVdobJi7XN9jD%(YkN2Ox1n^sZjT#t%Zm6e8|7iB$)cr-{VB=y>$Y1bv~+R3(3 zLW**URZ?3CEp2R@wAB!zLP$fgRj-hidJ{IicV>6)%>85M-apRg%sHQPzH{b#KJ)!v zJL?BOpkbr|0Kfsn8P5QvpHdo8T}_G6H@6{5r$PvTp9b#r9-dVOs%Up#cL2Cg(cDIT zri}NeoCzfWz!$tvrqYS~ISv5!IUzjVgEAu*M#nILXu~Iq3TsXo^n+Q*KTe|_mCDp! z(6dBc(S(3$>Vee4Q7feSF|5JW0p@z_9oCoX+_yh{2TfNl9kx@%gaN$V3XZC z()Q=iK68v-l@aFjTvr#UIsW{6y)MnWZ;S9*an(y{S7@rJGC3BL1kXRzy46Q2>?w!@ zk=^M963db!Rx&#(52;8xFLd1sPu9vc!*PN~9>_SFOVB8e7Fh!oChmUGBWrw-HBLN^ z(J|q&8w-9c9}6Fmrg_Oj#aE7MGvYa1!8u36$71kCvY`13PZHExc5CP6`!^Qy-I+~x zym3N@y%x()wg+n^XxTMcDj#pK5p*m2h`j@yaht(=_6~$*Oo`@}5sa2_((yu%@NI?~nOL$<7Nl$8K?s`CDy~ ze$Ldp;G1J`{R)+bJ$00er=<<&kfWmE+v=j2H4t%f9K9EhDeMkm=kG)9`Ihomw*H@z zNJ^xYBGrcVv14P$PsaXr{j@j>>iN5IGq1JqQ-VZ9ohTs|=22eTJ7A9)XsSic0co^f z$2NS6@tR_n1e1SJ)RUuZTcl$4?)PkFRn9Cjt+mx|piWuqAKXioQhI~Xm~fArFeApB zl3_4>E4DRRUH3-x|A*-bv?4sy&GedQOJIgKF}d5~*7Vheo>c75G zj$7@jpJYzTwcrW)7>#dL`@=$=X z&4)}bWC~{=j~T?L%}uQ(Gh4mS)U$6b_K<)-QYWQ#KkwxsNwj zK#u7V>Y@WEds9KbB0j}t9Tk>bcrGd#3~t9&;Hnp3$B(#~7rpkfZ5VWyN zU&sCGsCf&l$<5xq?yRw3(MhkQP81;!U-c;7&E=p5DZjOIZHU?bfJ%Yx zd_K1Nta5@d)DPX@wMca@KNO$$;Z6E;a5n#zvD=EAQHwfed}rs>8P;PHtEm z-gjHv)39PXni}63$R0z+V@o>)p2geyjUAj2m}yqW+2 literal 0 HcmV?d00001 diff --git a/docs/img5.PNG b/docs/img5.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c98b1099be807f9282b3f6bd491fe629a44129aa GIT binary patch literal 1891 zcmbVNYc!kb7LKBnx(zDh5|xw+b!tZ1x`ompp_G`RCBm6|*0ZmL zhXonvS?Ym6AOj2h6(4hX8MYU&G9azJ=#}X-XC~F zABV7M{&ja`$Mxv>7w!uw`Xh8cZlaK=>5A|pZlYpbANzcqgvgb@RrJ5+dZJ?8-A~ z`m6pixyq^iqi9U&VQ|LB{a_7lJ!;PTB)#)*u24T#qgV3rsx@@27++QXYUz2hCd@Su z$aTut!lQ#P%Mw%vS$)=;I_iZnv7|lv^o52jm~a;zyURmkmKd(>z*o7DKC2sriNMW$1rKDR*Narqg0x1TEd`r$+8XQ)RqmGv zFrQWp@cQn%ph}ozTF$cApVS4`xpEOrV+>aXD4G@z+jb_f3K4da4XmPbQn>#hBlF2G zR4c;0kVlG#2$=HNzUTj7A>C;ec{t`EOmZ1LkW0lkW*>q_@^F7ZZK?zG?wWsb(qE*3 zJe2h+We-??bS>BP4(5NS&aXu(=F+`vpUBb`Tl06qtM+s_vLoxx5;axlrm_>v$1M=!1qbYAL+{rr@}P_>nv5~h%`|0GjMF?% zDm3h%0kfQ?d}9Dg8O=Ichz2~9k$X`rbd?$g#j?ceViP#_3|HrJp&6Sus_Bm^8b0+! zm{G>to{Kk_eKDuS)rk`W6_T*U%#}x!ZeW5qSMRfb`N7COp1{Q-Ms5x1<^Ic4DRSk( zhNOpHHO$~v+&MiPS>(=MY7V=n?0A!G=HYfX%d}dS`N=L7gy3H9l+m!{5qUyJQUNcB zI?_@YB@eYcS-yGf)6A)nO;iS=4=;C;usEswR`s;xVa0*L24oD?$Qldx$ zlzE51_H6L+ns_#Cd{XrN zub}5P!iM^JY1uS|LIjc00Qo*fy=eP$2*2%xGLVMFZwE^$n0DI6#;v#fQH{Xfo8%2+ z0t(B@nods9hbqVd4_;iSH8TBUP|cz4*lBOCk~`}k*J??uxPuu+M(?gpABNgQqbvtK zBwLADV+J;Dj;gI^2%huexLDkQJ0~VwOAv2zh?o^GA(8W(TeNORC12yG$sBcka%Ddz zU9t+Q*8l>^#lvZX{mBPJOr%iiX;C!<>1v^HhtD}5Zf)tyoXs7r{9wr*S~Ka32>sT^ z=O;VK{IUOc)}K=((-a<`LtXoG7yNz!bnLaK!dH?m!wA&DrTQvup^t5uPZG1_+aI)B!|Vj;P?bpadvjPW}-ziY6A@3t*^(+^tFOO}EU z)xQcl4m7;@8g8y@4n`=0*Ck^9qtuoBKD6_@HA-_-M|oTcV{EoI%zO52XlQi-VDmk%t zdy9wJQ43v$d@|Br5f)upV;fsO7BZlrI!Yt(Yi$T8#w(WVs!nYNQ0R!)dSj6f@otLS zu|oYiFP)d2cWuXj<#O^hs}Ur&&MRFtS2pD^IzUogiU#GpOvU+j#ZAcW_f75Y0d}B2 eQy;G5mgbFRG-I #include -const char* ssid = "hotspotk4c"; -const char* password = "frenzy99"; +const char* ssid = "........."; +const char* password = ".........."; void setup(void) { Serial.begin(115200); @@ -24,8 +24,10 @@ void setup(void) { Serial.print("IP address: "); Serial.println(WiFi.localIP()); +// Detects Internet Connectivity and Switches to Online CDN. (For STA Mode Only) + EasyUI.detectCDN(true); EasyUI.label("Label","123"); - EasyUI.toggleButton(D4, "LED", HIGH, true); // LED Toggle Button * D4 for Nodemcu , 2 for Generic + EasyUI.toggleButton(2, "LED", HIGH, true); // LED Toggle Button EasyUI.begin(); } diff --git a/examples/softAP_UI_Test/softAP_UI_Test.ino b/examples/softAP_UI_Test/softAP_UI_Test.ino new file mode 100644 index 0000000..03d0be2 --- /dev/null +++ b/examples/softAP_UI_Test/softAP_UI_Test.ino @@ -0,0 +1,29 @@ +/* + * Author: Ayush Sharma (ayushsharma82) Github + * Library: EasyUI + * - This is a Test Code of EasyUI Library + * - It Will Use the OnBoard LED of ESP8266 and toggle it. + */ +#include +#include +#include + +const char* ssid = "EasyUI"; +const char* password = ""; + +void setup(void) { + Serial.begin(115200); + WiFi.mode(WIFI_AP); + WiFi.softAP(ssid, password); + Serial.println(""); + Serial.print("IP address: "); + Serial.println(WiFi.softAPIP()); + + EasyUI.label("Label","123"); + EasyUI.toggleButton(2, "LED", HIGH, true); // LED Toggle Button + EasyUI.begin(); +} + +void loop(void) { + EasyUI.loop(); +} diff --git a/keywords.txt b/keywords.txt index e79ebb0..4b19b1d 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,5 +1,6 @@ EasyUI KEYWORD1 +detectCDN KEYWORD2 title KEYWORD2 begin KEYWORD2 label KEYWORD2 diff --git a/src/CSS_STYLE.h b/src/CSS_STYLE.h index 7e40b83..df56854 100644 --- a/src/CSS_STYLE.h +++ b/src/CSS_STYLE.h @@ -4,7 +4,7 @@ const char CSS_STYLE[] PROGMEM = R"=====( } .container { position: relative; - width: 100%; + width: 79%; margin: 20px; box-sizing: border-box; } .column, @@ -51,7 +51,7 @@ const char CSS_STYLE[] PROGMEM = R"=====( /* For devices larger than 400px */ @media (min-width: 400px) { .container { - width: 85%;} + width: 84%;} } @@ -155,7 +155,7 @@ const char CSS_STYLE[] PROGMEM = R"=====( h2 { font-size: 4.2rem; } h3 { font-size: 3.6rem; } h4 { font-size: 3.0rem; } - h5 { font-size: 2.4rem; } + h5 { font-size: 2.0rem; } h6 { font-size: 1.5rem; } } diff --git a/src/EasyUI.cpp b/src/EasyUI.cpp index aebecad..801fb5b 100644 --- a/src/EasyUI.cpp +++ b/src/EasyUI.cpp @@ -3,7 +3,7 @@ #include "HTML_PAGE.h" // Added HTML Index Page #include "CSS_STYLE.h" // Added Main CSS Style #include "CSS_NORMALIZE.h" // Added Normalize CSS -#include "JS_JQUERY.h" // Added Jquery JS +#include "JS_JQUERY.h" #include using namespace std; @@ -12,7 +12,14 @@ using namespace std::placeholders; // Generate Websockets Script for Webpage void EasyUIClass::handleSockets(){ - String ip = WiFi.localIP().toString(); + String ip; + if(WiFi.localIP().toString() != "0.0.0.0"){ + ip = WiFi.localIP().toString(); + } + else if(WiFi.softAPIP().toString() != "0.0.0.0"){ + ip = WiFi.softAPIP().toString(); + } + String ws; ws = "var connection = new WebSocket(\"ws://"+ip+":81/\", ['easyui']);"; ws += " var keys = {};"; @@ -69,6 +76,10 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght } } +void EasyUIClass::detectCDN(bool _autoState){ + CDN = _autoState; +} + void EasyUIClass::title(const char* _title){ ui_title = _title; } @@ -123,43 +134,47 @@ void EasyUIClass::tbuttonStatus(){ // Handle Index HTML void EasyUIClass::handleRoot(){ -server->setContentLength(CONTENT_LENGTH_UNKNOWN); -server->send(200,"text/html", ""); -server->sendContent(HTML_HEAD1); -server->sendContent(String("")+ui_title+""); -server->sendContent(HTML_HEAD2); -server->sendContent(String("

")+ui_title+" Offline


"); -server->sendContent(HTML_BODY); -server->client().stop(); + bool internet = false; +if(CDN){ + HTTPClient http; + http.begin("http://www.google.com/"); + int httpCode = http.GET(); + if(httpCode > 0) { + internet = true; + } +} + server->setContentLength(CONTENT_LENGTH_UNKNOWN); + server->send(200,"text/html", ""); + server->sendContent(HTML_HEAD1); + server->sendContent(String("")+ui_title+""); + server->sendContent(HTML_HEAD2); + server->sendContent(String("

")+ui_title+" Offline


"); + server->sendContent(HTML_BODY); + + if(internet){ + server->sendContent(""); + } + else{ + server->sendContent(""); + } + + server->sendContent(HTML_END); + server->client().stop(); } // Handle Main Style CSS void EasyUIClass::handleSCSS(){ -server->send(200, "text/css", CSS_STYLE); +server->send_P(200, "text/css", CSS_STYLE); } // Handle Normalize CSS void EasyUIClass::handleNCSS(){ -server->send(200, "text/css", CSS_NORMALIZE); +server->send_P(200, "text/css", CSS_NORMALIZE); } // Handle Jquery void EasyUIClass::handleJS(){ - server->setContentLength(CONTENT_LENGTH_UNKNOWN); - server->send(200,"application/javascript", ""); - server->sendContent(JS_JQUERY1); - server->sendContent(JS_JQUERY2); - server->sendContent(JS_JQUERY3); - server->sendContent(JS_JQUERY4); - server->sendContent(JS_JQUERY5); - server->sendContent(JS_JQUERY6); - server->sendContent(JS_JQUERY7); - server->sendContent(JS_JQUERY8); - server->sendContent(JS_JQUERY9); - server->sendContent(JS_JQUERY10); - server->sendContent(JS_JQUERY11); - - server->client().stop(); + server->send_P(200, "application/javascript", JS_JQUERY); } // Handle Not found Page @@ -188,7 +203,6 @@ void EasyUIClass::handleNotFound() { file.close(); } else { - Serial.println("File not Found : " + url); server->send(200, "text/html", "

404 - You are Lost

"); } } diff --git a/src/EasyUI.h b/src/EasyUI.h index defd519..262f932 100644 --- a/src/EasyUI.h +++ b/src/EasyUI.h @@ -7,17 +7,18 @@ #include "ESP8266WiFi.h" #include "WiFiClient.h" #include "ESP8266WebServer.h" +#include "ESP8266HTTPClient.h" #include "ArduinoJson.h" #include "WebSocketsServer.h" #include "Hash.h" - #define HARDWARE "esp8266" class EasyUIClass{ public: void begin(); // Begin HTTP Server + WebSocketsServer & Initalize All Elements + void detectCDN(bool _autoState = true); // Detect if Internet Available or Switch to Offline Jquery void title(const char* _title); // Define Webpage Header Name and title void toggleButton(uint8_t pin, const char* tbutton_label, int start_state = 0, bool swap_state = false); // Create Toggle Button void label(const char* label_name, const char* label_val); // Create Label @@ -50,6 +51,7 @@ public: std::unique_ptr server; // Create Unique Instance for Webserver std::unique_ptr webSocket; // Create Unique Instance for WebSocketsServer + bool CDN = false; void handleRoot(); // Handle Index HTML void handleNCSS(); // Handle Normalize CSS diff --git a/src/HTML_PAGE.h b/src/HTML_PAGE.h index da86513..a8f589e 100644 --- a/src/HTML_PAGE.h +++ b/src/HTML_PAGE.h @@ -20,7 +20,9 @@ const char HTML_BODY[] PROGMEM = R"=====(
- + )====="; + +const char HTML_END[] PROGMEM = R"=====( diff --git a/src/JS_JQUERY.h b/src/JS_JQUERY.h index c72b53d..66898ee 100644 --- a/src/JS_JQUERY.h +++ b/src/JS_JQUERY.h @@ -1,43 +1,6 @@ -const char JS_JQUERY1[] PROGMEM = R"=====( +const char JS_JQUERY[] PROGMEM = R"=====( /*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in - a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var -)====="; - -const char JS_JQUERY2[] PROGMEM = R"=====( - a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push - ("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return - a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return -)====="; - -const char JS_JQUERY3[] PROGMEM = R"=====( - e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return -)====="; -const char JS_JQUERY4[] PROGMEM = R"=====( - 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return -)====="; - -const char JS_JQUERY5[] PROGMEM = R"=====( - n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; -}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return -)====="; -const char JS_JQUERY6[] PROGMEM = R"=====( - n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var -)====="; -const char JS_JQUERY7[] PROGMEM = R"=====( - f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("