Change Wi-Fi config to POST

This commit is contained in:
2025-07-19 11:18:30 -04:00
parent d3b12890bb
commit d25218898b
5 changed files with 389 additions and 310 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ window.onload = () => {
<div><h1>Web Keyboard Wi-Fi Settings</h1></div>
<div class="container">
<form method="get" action="wifi.cgi">
<form method="post" action="wifi.cgi">
<div><h2>Wi-Fi Network</h2></div>
<div class="field">
+1
View File
@@ -115,6 +115,7 @@
#define LWIP_HTTPD_CGI 1
#define LWIP_HTTPD_SSI 1
#define LWIP_HTTPD_SSI_INCLUDE_TAG 0
#define LWIP_HTTPD_SUPPORT_POST 1
#define HTTPD_FSDATA_FILE "my_fsdata.c"
+221 -221
View File
@@ -143,253 +143,253 @@ static const unsigned char data_wifi_shtml[] = {
0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x61,
0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f,
0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d,
0x22, 0x67, 0x65, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x2e, 0x63,
0x67, 0x69, 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x57, 0x69, 0x2d, 0x46, 0x69,
0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3c, 0x2f,
0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa,
0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22,
0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x22, 0x3e, 0x53, 0x53, 0x49, 0x44, 0x3a, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
0x73, 0x69, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
0x22, 0x73, 0x73, 0x69, 0x64, 0x22, 0xa, 0x9, 0x9, 0x9,
0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d,
0x22, 0x33, 0x32, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23,
0x73, 0x73, 0x69, 0x64, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0x9, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69,
0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64,
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x50, 0x61, 0x73,
0x73, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73,
0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d,
0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d,
0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0xa, 0x9,
0x9, 0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74,
0x68, 0x3d, 0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d,
0x2d, 0x23, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x2d, 0x3e, 0x3e,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66,
0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x48, 0x6f,
0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65,
0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x6f,
0x73, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
0x68, 0x6f, 0x73, 0x74, 0x22, 0xa, 0x9, 0x9, 0x9, 0x6d,
0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22,
0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x68,
0x6f, 0x73, 0x74, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c,
0x68, 0x32, 0x3e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20,
0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xa, 0xa, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9,
0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e,
0x55, 0x73, 0x65, 0x20, 0x44, 0x48, 0x43, 0x50, 0x3a, 0x3c,
0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x2e,
0x63, 0x67, 0x69, 0x22, 0x3e, 0xa, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x57, 0x69, 0x2d, 0x46,
0x69, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3c,
0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64,
0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62,
0x65, 0x6c, 0x22, 0x3e, 0x53, 0x53, 0x49, 0x44, 0x3a, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64,
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x20,
0x69, 0x64, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70, 0x22, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70,
0x22, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x21, 0x2d, 0x2d, 0x23,
0x64, 0x68, 0x63, 0x70, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9,
0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c,
0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
0x73, 0x73, 0x69, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
0x3d, 0x22, 0x73, 0x73, 0x69, 0x64, 0x22, 0xa, 0x9, 0x9,
0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
0x3d, 0x22, 0x33, 0x32, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d,
0x23, 0x73, 0x73, 0x69, 0x64, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0xa, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66,
0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x50, 0x61,
0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61,
0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64,
0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x6e, 0x61,
0x6d, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0xa,
0x9, 0x9, 0x9, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67,
0x74, 0x68, 0x3d, 0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21,
0x2d, 0x2d, 0x23, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x2d, 0x3e,
0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64,
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x49,
0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a,
0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x48,
0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68,
0x6f, 0x73, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
0x22, 0x68, 0x6f, 0x73, 0x74, 0x22, 0xa, 0x9, 0x9, 0x9,
0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d,
0x22, 0x36, 0x33, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23,
0x68, 0x6f, 0x73, 0x74, 0x2d, 0x2d, 0x3e, 0x3e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x3e,
0x3c, 0x68, 0x32, 0x3e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c,
0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x43,
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xa, 0xa, 0x9,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa,
0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
0x3e, 0x55, 0x73, 0x65, 0x20, 0x44, 0x48, 0x43, 0x50, 0x3a,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d,
0x22, 0x69, 0x70, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0xa, 0x9, 0x9, 0x9,
0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65,
0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74,
0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39,
0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21,
0x2d, 0x2d, 0x23, 0x69, 0x70, 0x30, 0x2d, 0x2d, 0x3e, 0x3e,
0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65,
0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70,
0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69,
0x70, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f,
0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72,
0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31,
0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23,
0x69, 0x70, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9,
0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22,
0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22,
0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22,
0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d,
0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x32,
0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64,
0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0x20, 0x6e, 0x61, 0x6d,
0x65, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0xa, 0x9, 0x9,
0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e,
0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61,
0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d,
0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c,
0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x33, 0x2d, 0x2d, 0x3e,
0x3e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa,
0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22,
0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x6d, 0x61, 0x73, 0x6b,
0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x68, 0x63, 0x70, 0x22,
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x68, 0x63,
0x70, 0x22, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x21, 0x2d, 0x2d,
0x23, 0x64, 0x68, 0x63, 0x70, 0x2d, 0x2d, 0x3e, 0x3e, 0xa,
0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9,
0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e,
0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x9,
0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e, 0x3c,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64,
0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30, 0x22, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30,
0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d,
0x65, 0x3d, 0x22, 0x69, 0x70, 0x30, 0x22, 0xa, 0x9, 0x9,
0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e,
0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61,
0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d,
0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c,
0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x30, 0x2d, 0x2d, 0x3e,
0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69,
0x70, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
0x69, 0x70, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77,
0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65,
0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b,
0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d,
0x23, 0x69, 0x70, 0x31, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa,
0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x70, 0x32, 0x22,
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x32,
0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d,
0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33,
0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70,
0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9,
0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70,
0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69,
0x64, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0x20, 0x6e, 0x61,
0x6d, 0x65, 0x3d, 0x22, 0x69, 0x70, 0x33, 0x22, 0xa, 0x9,
0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70,
0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30,
0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20,
0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x33, 0x2d, 0x2d,
0x3e, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64,
0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x62,
0x65, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x6d, 0x61, 0x73,
0x6b, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9,
0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3e,
0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70,
0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69,
0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x30, 0x22, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b,
0x30, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,
0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e,
0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c,
0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d,
0x61, 0x73, 0x6b, 0x30, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa,
0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b,
0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
0x61, 0x73, 0x6b, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74,
0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74,
0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d,
0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d,
0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x31, 0x2d, 0x2d, 0x3e,
0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d,
0x61, 0x73, 0x6b, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x22, 0xa, 0x9,
0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70,
0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30,
0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20,
0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x32,
0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64,
0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33,
0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d,
0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33,
0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61,
0x73, 0x6b, 0x30, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9,
0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
0x73, 0x6b, 0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66,
0x69, 0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c,
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x44, 0x65,
0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x47, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x31,
0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
0x73, 0x6b, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77,
0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65,
0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b,
0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d,
0x23, 0x6d, 0x61, 0x73, 0x6b, 0x31, 0x2d, 0x2d, 0x3e, 0x3e,
0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65,
0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x61,
0x73, 0x6b, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
0x22, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x22, 0xa, 0x9, 0x9,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22,
0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22,
0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22,
0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d,
0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x30,
0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64,
0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d,
0x65, 0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0xa, 0x9, 0x9,
0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e,
0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61,
0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d,
0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c,
0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73, 0x6b, 0x32, 0x2d,
0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d,
0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22, 0x20, 0x6e, 0x61,
0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x73, 0x6b, 0x33, 0x22,
0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22,
0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22,
0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d,
0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6d, 0x61, 0x73,
0x6b, 0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c,
0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69,
0x65, 0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64,
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x44, 0x65, 0x66,
0x61, 0x75, 0x6c, 0x74, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa,
0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22,
0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79,
0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20,
0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0x20, 0x6e,
0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x30, 0x22, 0xa,
0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20,
0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b,
0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22,
0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x30, 0x2d,
0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d,
0x22, 0x67, 0x77, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
0x3d, 0x22, 0x67, 0x77, 0x31, 0x22, 0xa, 0x9, 0x9, 0x9,
0x9, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65,
0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74,
0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39,
0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21,
0x2d, 0x2d, 0x23, 0x67, 0x77, 0x31, 0x2d, 0x2d, 0x3e, 0x3e,
0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65,
0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77,
0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67,
0x77, 0x32, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f,
0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72,
0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31,
0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23,
0x67, 0x77, 0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa, 0x9,
0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22,
0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22, 0x20,
0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22,
0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22,
0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d, 0x22,
0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33, 0x7d,
0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x33,
0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65, 0x6c,
0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76,
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61,
0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, 0x61, 0x76,
0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73,
0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x2a, 0x3c, 0x62,
0x72, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x2a, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e,
0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x66,
0x6f, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20,
0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x3c, 0x2f, 0x64,
0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69, 0x76,
0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xa,
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c, 0x2f,
0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f, 0x68,
0x74, 0x6d, 0x6c, 0x3e, 0xa, };
0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77, 0x31, 0x2d, 0x2d, 0x3e,
0x3e, 0x2e, 0xa, 0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67,
0x77, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
0x67, 0x77, 0x32, 0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77,
0x6f, 0x72, 0x6b, 0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65,
0x72, 0x6e, 0x3d, 0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b,
0x31, 0x2c, 0x33, 0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d,
0x23, 0x67, 0x77, 0x32, 0x2d, 0x2d, 0x3e, 0x3e, 0x2e, 0xa,
0x9, 0x9, 0x9, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x67, 0x77, 0x33, 0x22,
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x67, 0x77, 0x33,
0x22, 0xa, 0x9, 0x9, 0x9, 0x9, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x3d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
0x22, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3d,
0x22, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x33,
0x7d, 0x22, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x67, 0x77,
0x33, 0x2d, 0x2d, 0x3e, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0xa, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x69, 0x65,
0x6c, 0x64, 0x22, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69,
0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c,
0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0x9, 0x9, 0x3c, 0x64, 0x69, 0x76, 0x20,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, 0x61,
0x76, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x2a, 0x3c,
0x62, 0x72, 0x3e, 0xa, 0x9, 0x9, 0x9, 0x2a, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
0x20, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x65, 0x64, 0x20,
0x66, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65,
0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x3c, 0x2f,
0x64, 0x69, 0x76, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x64, 0x69,
0x76, 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e,
0xa, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x3c,
0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0xa, 0x3c, 0x2f,
0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, };
static const unsigned char data_index_html[] = {
/* /index.html */
@@ -1071,7 +1071,7 @@ static const unsigned char data_index_html[] = {
0x72, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x20, 0x73,
0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x28, 0x6b, 0x65,
0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x2c, 0x20, 0x32, 0x35,
0x79, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x2c, 0x20, 0x32, 0x30,
0x30, 0x20, 0x29, 0x3b, 0xa, 0x9, 0x7d, 0xa, 0x7d, 0xa,
0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x55, 0x70, 0x28, 0x65, 0x76,
+164 -87
View File
@@ -25,6 +25,7 @@ static bool clientmode = false;
static bool config_loaded = false;
static bool bad_config = false;
static bool reboot = false;
static void *current_connection;
// list of SSI variable names for lwIP SSI handler
const char * __not_in_flash("httpd") ssi_tags[] = {
@@ -49,10 +50,24 @@ const char * __not_in_flash("httpd") ssi_tags[] = {
"dhcp"
};
const char * ip_parts[] = {
"ip0=",
"ip1=",
"ip2=",
"ip3=",
"mask0=",
"mask1=",
"mask2=",
"mask3=",
"gw0=",
"gw1=",
"gw2=",
"gw3="
};
#define NPARTS ( sizeof( ip_parts )/ sizeof(ip_parts[0]) )
static const tCGI cgi_handlers[] = {
{ "/sendkeys.cgi", sendkeys_cgi },
{ "/wifi.cgi", save_wifi },
{ "/reboot.cgi", reboot_cgi },
};
@@ -119,7 +134,7 @@ void run_http_server() {
// start the HTTP web server for keyboard input and config page
httpd_init();
http_set_cgi_handlers(cgi_handlers, 3);
http_set_cgi_handlers(cgi_handlers, 2);
for (size_t i = 0; i < LWIP_ARRAYSIZE(ssi_tags); i++) {
LWIP_ASSERT("tag too long for LWIP_HTTPD_MAX_TAG_NAME_LEN",
strlen(ssi_tags[i]) <= LWIP_HTTPD_MAX_TAG_NAME_LEN);
@@ -184,89 +199,6 @@ const char * sendkeys_cgi (int iIndex, int iNumParams, char *pcParam[], char *pc
return "/success.html";
}
// lwIP cgi handler for form submission of network config to wifi.cgi
const char * save_wifi (int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) {
// clear all values in manual network settings
memset(ip, 0, sizeof(ip));
memset(mask, 0, sizeof(mask));
memset(gw, 0, sizeof(gw));
bad_config = false;
wifi.manual = true;
// read parameter values
for (int i=0; i < iNumParams; i++) {
if (strcmp(pcParam[i], "ssid") == 0){
if (pcValue[i][0] == "\0") {
bad_config = true;
} else {
urldecode(pcValue[i], wifi.ssid);
}
} else if (strcmp(pcParam[i], "pass") == 0) {
urldecode(pcValue[i], wifi.pass);
} else if (strcmp(pcParam[i], "host") == 0) {
urldecode(pcValue[i], wifi.host);
} else if (strcmp(pcParam[i], "dhcp") == 0) {
wifi.manual = false;
} else if (strncmp(pcParam[i], "ip", 2) ==0 ) {
uint8_t part = atoi(&(pcParam[i][2]));
int val = atoi(pcValue[i]);
if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) {
bad_config = true;
} else {
ip[part] = (uint8_t) val;
}
} else if (strncmp(pcParam[i], "gw", 2) ==0 ) {
uint8_t part = atoi(&(pcParam[i][2]));
int val = atoi(pcValue[i]);
if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) {
bad_config = true;
} else {
gw[part] = (uint8_t) val;
}
} else if (strncmp(pcParam[i], "mask", 4) ==0 ) {
uint8_t part = atoi(&(pcParam[i][4]));
int val = atoi(pcValue[i]);
if (pcValue[i][0] == "\0" || val > 255 || val < 0 || part > 4) {
bad_config = true;
} else {
mask[part] = (uint8_t) val;
}
}
}
if (bad_config) {
// config is invalid, so don't save and return to config page
return "/wifi.shtml";
} else {
// config is valid, prepare for saving to flash
IP4_ADDR(&(wifi.ip), ip[0], ip[1], ip[2], ip[3]);
if(!wifi.ip.addr) {
wifi.ip.addr = IPADDR_NONE;
}
IP4_ADDR(&(wifi.mask), mask[0], mask[1], mask[2], mask[3]);
if(!wifi.mask.addr) {
wifi.mask.addr = IPADDR_NONE;
}
IP4_ADDR(&(wifi.gw), gw[0], gw[1], gw[2], gw[3]);
if(!wifi.gw.addr) {
wifi.gw.addr = IPADDR_NONE;
}
wifi.header = STARTFILE;
wifi.footer = ENDFILE;
config_loaded = true;
watchdog_update();
// save configuratitons to flash
net_config_write(&wifi);
printf("wifi settings saved\n");
return "/success.html";
}
}
// lwIP cgi handler for reboots initiated from the web
const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) {
// turn on reboot flag to prevent watchdog from updating
@@ -275,7 +207,7 @@ const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcVal
return "/success.html";
}
// write configuration data to flash memory
void net_config_write(net_config *config) {
// core 0 must have its TinyUSB interrupts disabled to allow flash writes
multicore_lockout_start_blocking();
@@ -397,12 +329,157 @@ uint16_t __time_critical_func(ssi_handler)(int iIndex, char *pcInsert, int iInse
return (uint16_t)printed;
}
// lwIP handler for POST requests
err_t httpd_post_begin(void *connection, const char *uri,
const char * http_request, u16_t http_request_len, int content_len,
char *response_uri,u16_t response_uri_len, u8_t *post_auto_wnd) {
if (memcmp(uri, "/wifi.cgi", 9) == 0 && current_connection != connection) {
// initiate post request to wifi.cgi
current_connection = connection;
// default page is wifi config page
snprintf(response_uri, response_uri_len, "/wifi.shtml");
*post_auto_wnd = 1;
return ERR_OK;
}
return ERR_VAL;
}
// lwIP handler for receiving POST data
err_t httpd_post_receive_data(void *connection, struct pbuf *p) {
if (current_connection == connection) {
// clear all values in manual network settings
memset(ip, 0, sizeof(ip));
memset(mask, 0, sizeof(mask));
memset(gw, 0, sizeof(gw));
bad_config = false;
wifi.manual = true;
char buf[MAX_POST_PARAM_LEN];
char * value;
// read parameter values
value = find_post_param(p, "ssid=", buf, sizeof(buf));
if (value) {
urldecode(value, wifi.ssid);
} else {
bad_config = true;
}
value = find_post_param(p, "pass=", buf, sizeof(buf));
if (value) {
urldecode(value, wifi.pass);
} else {
wifi.pass[0]=0;
}
value = find_post_param(p, "host=", buf, sizeof(buf));
if (value) {
urldecode(value, wifi.host);
} else {
wifi.host[0]=0;
}
value = find_post_param(p, "dhcp=", buf, sizeof(buf));
if (value) {
wifi.manual = false;
} else {
for (int i=0; i< NPARTS; i++) {
value = find_post_param(p, ip_parts[i], buf, sizeof(buf));
if (value) {
int ip_part = atoi(value);
if (ip_part > 255 || ip_part < 0) {
bad_config = true;
} else {
if (strncmp(ip_parts[i], "ip", 2) == 0) {
uint8_t part = atoi(&ip_parts[i][2]);
ip[part] = (uint8_t) ip_part;
} else if (strncmp(ip_parts[i], "gw", 2) == 0) {
uint8_t part = atoi(&ip_parts[i][2]);
gw[part] = (uint8_t) ip_part;
} else if (strncmp(ip_parts[i], "mask", 4) == 0) {
uint8_t part = atoi(&ip_parts[i][4]);
mask[part] = (uint8_t) ip_part;
}
}
} else {
bad_config = true;
}
}
}
if (!bad_config) {
// config is valid, prepare for saving to flash
IP4_ADDR(&(wifi.ip), ip[0], ip[1], ip[2], ip[3]);
if(!wifi.ip.addr) {
wifi.ip.addr = IPADDR_NONE;
}
IP4_ADDR(&(wifi.mask), mask[0], mask[1], mask[2], mask[3]);
if(!wifi.mask.addr) {
wifi.mask.addr = IPADDR_NONE;
}
IP4_ADDR(&(wifi.gw), gw[0], gw[1], gw[2], gw[3]);
if(!wifi.gw.addr) {
wifi.gw.addr = IPADDR_NONE;
}
wifi.header = STARTFILE;
wifi.footer = ENDFILE;
config_loaded = true;
watchdog_update();
// save configurations to flash
net_config_write(&wifi);
printf("wifi settings saved\n");
pbuf_free(p);
return ERR_OK;
}
}
pbuf_free(p);
current_connection = NULL;
return ERR_VAL;
}
// lwIP handler for end of POST request
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len) {
// return to Wi-Fi config page unless save was successful
snprintf(response_uri, response_uri_len, "/wifi.shtml");
if (current_connection == connection) {
snprintf(response_uri, response_uri_len, "/success.html");
}
current_connection = NULL;
}
// Return a value for a parameter from POST
char *find_post_param(struct pbuf *p, const char *param, char *buf, size_t len) {
size_t param_len = strlen(param);
uint16_t param_pos = pbuf_memfind(p, param, param_len, 0);
if (param_pos != 0xFFFF) {
uint16_t value_pos = param_pos + param_len;
uint16_t value_len = 0;
uint16_t tmp;
tmp = pbuf_memfind(p, "&", 1, value_pos);
if (tmp != 0xFFFF) {
value_len = tmp - value_pos;
} else {
value_len = p->tot_len - value_pos;
}
if (value_len > 0 && value_len < len) {
char *value = (char *) pbuf_get_contiguous(p, buf, len, value_len, value_pos);
if (value) {
value[value_len]=0;
return value;
}
}
}
return NULL;
}
// save keyboard's LED indicator status to memory
void set_indicator(uint8_t const* buffer) {
led_code = *buffer;
}
// turn URL-formatted string from GET request and turn into regular string
// take URL-formatted string from GET request and turn into regular string
void urldecode(char *urlstring, char *decoded) {
uint8_t conv;
while(*urlstring) {
+2 -1
View File
@@ -7,6 +7,7 @@
#define ENDFILE 0x0464
#define DEFAULTHOST "picokb"
#define DEFAULTPASS "password"
#define MAX_POST_PARAM_LEN 63+1
typedef struct {
uint16_t header;
@@ -22,13 +23,13 @@ typedef struct {
void run_http_server();
const char * sendkeys_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
const char * save_wifi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
const char * reboot_cgi(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
uint16_t __time_critical_func(ssi_handler)(int iIndex, char *pcInsert, int iInsertLen);
void set_indicator(uint8_t const* buffer);
void urldecode(char *urlstring, char *dest);
bool net_config_load(net_config *wifi);
void net_config_write(net_config *wifi);
char *find_post_param(struct pbuf *p, const char *param, char *buf, size_t len);
#define FLASH_TARGET_OFFSET ((PICO_FLASH_SIZE_BYTES) - FLASH_SECTOR_SIZE)