From 2a1ac9559b4a94b7a4b910959ea88bd73567185f Mon Sep 17 00:00:00 2001 From: Khoi Hoang <57012152+khoih-prog@users.noreply.github.com> Date: Tue, 25 Oct 2022 19:37:27 -0400 Subject: [PATCH] v1.12.1 using random channel for softAP w/o PWD ### Releases v1.12.1 1. Using random channel for softAP without password. Check [fix: using random CH for non-password use too #118](https://github.com/khoih-prog/ESPAsync_WiFiManager/pull/118) 2. Add astyle using `allman` style. Restyle the library --- CONTRIBUTING.md | 23 +- README.md | 51 +- changelog.md | 6 + library.json | 2 +- library.properties | 2 +- src/ESP_WiFiManager-Impl.h | 492 +++++++++--------- src/ESP_WiFiManager.h | 5 +- src/ESP_WiFiManager.hpp | 9 +- src/ESP_WiFiManager_Debug.h | 5 +- src/utils/TZ.h | 968 ++++++++++++++++++------------------ utils/astyle_library.conf | 70 +++ utils/restyle.sh | 6 + 12 files changed, 879 insertions(+), 760 deletions(-) create mode 100644 utils/astyle_library.conf create mode 100644 utils/restyle.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f496968..aa17b51 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ Please ensure to specify the following, or your post will be ignored and deleted Arduino IDE version: 1.8.19 ESP8266 Core Version 3.0.2 OS: Ubuntu 20.04 LTS -Linux xy-Inspiron-3593 5.15.0-48-generic #54~20.04.1-Ubuntu SMP Thu Sep 1 16:17:26 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux +Linux xy-Inspiron-3593 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux Context: I encountered a crash when using this library @@ -40,14 +40,33 @@ Steps to reproduce: 3. ... 4. ... ``` +--- ### Sending Feature Requests Feel free to post feature requests. It's helpful if you can explain exactly why the feature would be useful. -There are usually some outstanding feature requests in the [existing issues list](https://github.com/khoih-prog/ESP_WiFiManager/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement), feel free to add comments to them. +There are usually some outstanding feature requests in the [existing issues list](https://github.com/khoih-prog/ESPAsync_WiFiManager/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement), feel free to add comments to them. + +--- ### Sending Pull Requests Pull Requests with changes and fixes are also welcome! +Please use the `astyle` to reformat the updated library code as follows (demo for Ubuntu Linux) + +1. Change directory to the library GitHub + +``` +xy@xy-Inspiron-3593:~$ cd Arduino/xy/ESP_WifiManager_GitHub/ +xy@xy-Inspiron-3593:~/Arduino/xy/ESP_WifiManager_GitHub$ +``` + +2. Issue astyle command + +``` +xy@xy-Inspiron-3593:~/Arduino/xy/ESP_WifiManager_GitHub$ bash utils/restyle.sh +``` + + diff --git a/README.md b/README.md index a3a6108..000e720 100644 --- a/README.md +++ b/README.md @@ -458,7 +458,6 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is `192 #include #include - // From v1.1.0 #include WiFiMulti wifiMulti; @@ -520,7 +519,6 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is `192 #include #include - // From v1.1.0 #include ESP8266WiFiMulti wifiMulti; @@ -544,7 +542,6 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is `192 #define LED_OFF HIGH #endif -// From v1.1.0 // You only need to format the filesystem once //#define FORMAT_FILESYSTEM true #define FORMAT_FILESYSTEM false @@ -552,7 +549,7 @@ then connect WebBrowser to configurable ConfigPortal IP address, default is `192 #define MIN_AP_PASSWORD_SIZE 8 #define SSID_MAX_LEN 32 -//From v1.0.10, WPA2 passwords can be up to 63 characters long. +//WPA2 passwords can be up to 63 characters long. #define PASS_MAX_LEN 64 typedef struct @@ -601,7 +598,6 @@ String Router_Pass; #include #include - // From v1.1.0 #include WiFiMulti wifiMulti; @@ -657,7 +653,6 @@ String Router_Pass; #include #include - // From v1.1.0 #include ESP8266WiFiMulti wifiMulti; @@ -681,7 +676,6 @@ String Router_Pass; #define LED_OFF HIGH #endif -// From v1.1.0 // You only need to format the filesystem once //#define FORMAT_FILESYSTEM true #define FORMAT_FILESYSTEM false @@ -689,7 +683,7 @@ String Router_Pass; #define MIN_AP_PASSWORD_SIZE 8 #define SSID_MAX_LEN 32 -//From v1.0.10, WPA2 passwords can be up to 63 characters long. +// WPA2 passwords can be up to 63 characters long. #define PASS_MAX_LEN 64 typedef struct @@ -778,7 +772,6 @@ bool initialConfig = false; IPAddress dns1IP = gatewayIP; IPAddress dns2IP = IPAddress(8, 8, 8, 8); -// New in v1.4.0 IPAddress APStaticIP = IPAddress(192, 168, 100, 1); IPAddress APStaticGW = IPAddress(192, 168, 100, 1); IPAddress APStaticSN = IPAddress(255, 255, 255, 0); @@ -794,7 +787,6 @@ String Router_SSID; String Router_Pass; /////////////////////////////////////////// -// New in v1.4.0 /****************************************** * // Defined in ESP_WiFiManager.h typedef struct @@ -1009,7 +1001,7 @@ ESP_wifiManager.setConfigPortalChannel(3); ```cpp -// Set static IP, Gateway, Subnetmask, DNS1 and DNS2. New in v1.0.5 +// Set static IP, Gateway, Subnetmask, DNS1 and DNS2 //ESP_wifiManager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask, dns1IP, dns2IP); ESP_wifiManager.setSTAStaticIPConfig(WM_STA_IPconfig); ``` @@ -1047,7 +1039,6 @@ ESP_wifiManager.setSTAStaticIPConfig(WM_STA_IPconfig); ... - // New from v1.1.1 #if USING_CORS_FEATURE ESP_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin"); #endif @@ -1974,7 +1965,7 @@ void loop() #if !USE_DHCP_IP #if USE_CONFIGURABLE_DNS - // Set static IP, Gateway, Subnetmask, DNS1 and DNS2. New in v1.0.5 + // Set static IP, Gateway, Subnetmask, DNS1 and DNS2 ESP_wifiManager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask, dns1IP, dns2IP); #else // Set static IP, Gateway, Subnetmask, Use auto DNS1 and DNS2. @@ -1982,7 +1973,6 @@ void loop() #endif #endif - // New from v1.1.1 #if USING_CORS_FEATURE ESP_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin"); #endif @@ -1997,7 +1987,7 @@ void loop() //Remove this line if you do not want to see WiFi password printed Serial.println("ESP Self-Stored: SSID = " + Router_SSID + ", Pass = " + Router_Pass); - // From v1.1.0, Don't permit NULL password + // Don't permit NULL password if ( (Router_SSID != "") && (Router_Pass != "") ) { LOGERROR3(F("* Add SSID = "), Router_SSID, F(", PW = "), Router_Pass); @@ -2062,7 +2052,6 @@ void loop() } } - // New in v1.4.0 ESP_wifiManager.getSTAStaticIPConfig(WM_STA_IPconfig); ////// @@ -2208,7 +2197,7 @@ This is terminal debug output when running [ConfigOnSwitchFS_MQTT_Ptr](examples/ ``` Starting ConfigOnSwichFS_MQTT_Ptr using LittleFS on ESP8266_NODEMCU_ESP12E -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 Configuration file not found Failed to read configuration file, using default values [WM] RFC925 Hostname = ConfigOnSwichFS-MQTT @@ -2321,7 +2310,7 @@ This is terminal debug output when running [ESP32_FSWebServer_DRD](examples/ESP3 ``` Starting ESP32_FSWebServer_DRD with DoubleResetDetect using SPIFFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 FS File: /ConfigSW.json, size: 150B FS File: /CanadaFlag_1.png, size: 40.25KB @@ -2386,7 +2375,7 @@ This is terminal debug output when running [ESP32_FSWebServer_DRD](examples/ESP3 ``` Starting ESP32_FSWebServer_DRD with DoubleResetDetect using LittleFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 FS File: /CanadaFlag_1.png, size: 40.25KB FS File: /CanadaFlag_2.png, size: 8.12KB @@ -2445,7 +2434,7 @@ This is terminal debug output when running [ConfigOnDRD_FS_MQTT_Ptr_Complex](exa ``` Starting ConfigOnDRD_FS_MQTT_Ptr_Complex using LittleFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 {"AIO_KEY_Label":"aio_key","AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name"} Config File successfully parsed @@ -2488,7 +2477,7 @@ WWWW WTWWWW WWTWWW WWWTWW WWWWTW WWWWW ``` Starting ConfigOnDRD_FS_MQTT_Ptr_Complex using LittleFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 {"AIO_KEY_Label":"aio_key","AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name"} Config File successfully parsed @@ -2573,7 +2562,7 @@ This is terminal debug output when running [ConfigOnDRD_FS_MQTT_Ptr_Complex](exa ``` Starting ConfigOnDRD_FS_MQTT_Ptr_Medium using LittleFS on ESP8266_NODEMCU_ESP12E -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 {"AIO_KEY_Label":"aio_key","AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name"} Config File successfully parsed @@ -2613,7 +2602,7 @@ TWWWW WTWWWW WWTWWW WWWTWW WWWWTW WWWWW ``` Starting ConfigOnDRD_FS_MQTT_Ptr_Medium using LittleFS on ESP8266_NODEMCU_ESP12E -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 {"AIO_KEY_Label":"aio_key","AIO_SERVER_Label":"io.adafruit.com","AIO_SERVERPORT_Label":"1883","AIO_USERNAME_Label":"user_name"} Config File successfully parsed @@ -2690,7 +2679,7 @@ This is terminal debug output when running [ConfigOnDoubleReset](examples/Config ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32S2_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] setAPStaticIPConfig @@ -2740,7 +2729,7 @@ This is terminal debug output when running [ConfigOnDoubleReset](examples/Config ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin @@ -2850,7 +2839,7 @@ Local Date/Time: Fri Oct 7 15:56:03 2022 ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin @@ -2903,7 +2892,7 @@ This is terminal debug output when running [ConfigOnDoubleReset](examples/Config ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32S2_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin @@ -3049,7 +3038,7 @@ Local Date/Time: Thu May 6 21:29:18 2021 ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32S2_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin @@ -3101,7 +3090,7 @@ This is terminal debug output when running [ESP32_FSWebServer_DRD](examples/ESP3 ``` Starting ESP32_FSWebServer_DRD with DoubleResetDetect using SPIFFS on ESP32C3_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 FS File: wm_cp.dat, size: 4B FS File: wm_cp.bak, size: 4B @@ -3175,7 +3164,7 @@ This is terminal debug output when running [ConfigOnDoubleReset](examples/Config ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32S3_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin @@ -3228,7 +3217,7 @@ This is terminal debug output when running [ConfigOnDoubleReset](examples/Config ``` Starting ConfigOnDoubleReset with DoubleResetDetect using LittleFS on ESP32C3_DEV -ESP_WiFiManager v1.12.0 +ESP_WiFiManager v1.12.1 ESP_DoubleResetDetector v1.3.2 [WM] RFC925 Hostname = ConfigOnDoubleReset [WM] Set CORS Header to : Your Access-Control-Allow-Origin diff --git a/changelog.md b/changelog.md index 264c42a..6388f0a 100644 --- a/changelog.md +++ b/changelog.md @@ -13,6 +13,7 @@ ## Table of Contents * [Changelog](#changelog) + * [Releases v1.12.1](#releases-v1121) * [Releases v1.12.0](#releases-v1120) * [Releases v1.11.0](#releases-v1110) * [Releases v1.10.2](#releases-v1102) @@ -56,6 +57,11 @@ ## Changelog +### Releases v1.12.1 + +1. Using random channel for softAP without password. Check [fix: using random CH for non-password use too #118](https://github.com/khoih-prog/ESPAsync_WiFiManager/pull/118) +2. Add astyle using `allman` style. Restyle the library + ### Releases v1.12.0 1. Optionally display Credentials (SSIDs, PWDs) in Config Portal. Check [Populate portal wifi with saved credentials #91](https://github.com/khoih-prog/ESP_WiFiManager/discussions/91) diff --git a/library.json b/library.json index d20aed1..26463cb 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "ESP_WifiManager", - "version": "1.12.0", + "version": "1.12.1", "keywords": "wifi, wi-fi, MultiWiFi, multi-wifi, WiFiManager, esp8266, esp32, esp32-s2, esp32-s3, esp32-c3, Communication, iot, credentials, persistent, config-portal, DoubleReset, MultiReset, DoubleResetDetector, littlefs, spiffs, eeprom, dns-server", "description": "Library to configure MultiWiFi/Credentials at runtime for ESP32 (including ESP32-S2, ESP32-S3 and ESP32-C3) and ESP8266 boards. With enhanced GUI and fallback web ConfigPortal. This Library is used for configuring ESP32 (including ESP32-S2, ESP32-S3 and ESP32-C3) and ESP8266 MultiWiFi Credentials at runtime. You can also specify static DNS servers, personalized HostName, DHCP HostName, static AP and STA IP, fixed or random AP channel. Now with MultiWiFi auto(Re)connect, configurable CORS Header and auto-Timezone features. Auto detect ESP32 core and use either built-in LittleFS or external LITTLEFS library. Now using correct ESP32 chipIP and optional display Credentials on Config Portal", "authors": diff --git a/library.properties b/library.properties index 3da36a3..1313662 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESP_WiFiManager -version=1.12.0 +version=1.12.1 author=Khoi Hoang maintainer=Khoi Hoang license=MIT diff --git a/src/ESP_WiFiManager-Impl.h b/src/ESP_WiFiManager-Impl.h index ce72bae..f12cabd 100644 --- a/src/ESP_WiFiManager-Impl.h +++ b/src/ESP_WiFiManager-Impl.h @@ -15,8 +15,8 @@ Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager Licensed under MIT license - - Version: 1.12.0 + + Version: 1.12.1 Version Modified By Date Comments ------- ----------- ---------- ----------- @@ -29,6 +29,7 @@ 1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function 1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI() 1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal + 1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style *****************************************************************************************************************************/ #pragma once @@ -51,7 +52,7 @@ ESP_WMParameter::ESP_WMParameter(const char *custom) ////////////////////////////////////////// -ESP_WMParameter::ESP_WMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length, +ESP_WMParameter::ESP_WMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length, const char *custom, const int& labelPlacement) { init(id, placeholder, defaultValue, length, custom, labelPlacement); @@ -61,12 +62,13 @@ ESP_WMParameter::ESP_WMParameter(const char *id, const char *placeholder, const ESP_WMParameter::ESP_WMParameter(const WMParam_Data& WMParam_data) { - init(WMParam_data._id, WMParam_data._placeholder, WMParam_data._value, WMParam_data._length, "", WMParam_data._labelPlacement); -} + init(WMParam_data._id, WMParam_data._placeholder, WMParam_data._value, WMParam_data._length, "", + WMParam_data._labelPlacement); +} ////////////////////////////////////////// -void ESP_WMParameter::init(const char *id, const char *placeholder, const char *defaultValue, const int& length, +void ESP_WMParameter::init(const char *id, const char *placeholder, const char *defaultValue, const int& length, const char *custom, const int& labelPlacement) { _WMParam_data._id = id; @@ -85,7 +87,7 @@ void ESP_WMParameter::init(const char *id, const char *placeholder, const char * strncpy(_WMParam_data._value, defaultValue, _WMParam_data._length); } } - + _customHTML = custom; } @@ -105,7 +107,7 @@ ESP_WMParameter::~ESP_WMParameter() void ESP_WMParameter::setWMParam_Data(const WMParam_Data& WMParam_data) { LOGINFO(F("setWMParam_Data")); - + memcpy(&_WMParam_data, &WMParam_data, sizeof(_WMParam_data)); } @@ -114,7 +116,7 @@ void ESP_WMParameter::setWMParam_Data(const WMParam_Data& WMParam_data) void ESP_WMParameter::getWMParam_Data(WMParam_Data &WMParam_data) { LOGINFO(F("getWMParam_Data")); - + memcpy(&WMParam_data, &_WMParam_data, sizeof(WMParam_data)); } @@ -167,7 +169,7 @@ const char* ESP_WMParameter::getCustomHTML() [getParameters description] @access public */ -ESP_WMParameter** ESP_WiFiManager::getParameters() +ESP_WMParameter** ESP_WiFiManager::getParameters() { return _params; } @@ -178,7 +180,7 @@ ESP_WMParameter** ESP_WiFiManager::getParameters() [getParametersCount description] @access public */ -int ESP_WiFiManager::getParametersCount() +int ESP_WiFiManager::getParametersCount() { return _paramsCount; } @@ -201,7 +203,7 @@ char* ESP_WiFiManager::getRFC952_hostname(const char* iHostname) j++; } } - + // no '-' as last char if (isalnum(iHostname[len - 1]) || (iHostname[len - 1] != '-')) RFC952_hostname[j] = iHostname[len - 1]; @@ -225,9 +227,9 @@ ESP_WiFiManager::ESP_WiFiManager(const char *iHostname) { #ifdef ESP8266 String _hostname = "ESP8266-" + String(ESP.getChipId(), HEX); -#else //ESP32 +#else //ESP32 String _hostname = "ESP32-" + String(ESP_getChipId(), HEX); - + #endif _hostname.toUpperCase(); @@ -252,12 +254,14 @@ ESP_WiFiManager::ESP_WiFiManager(const char *iHostname) ESP_WiFiManager::~ESP_WiFiManager() { #if USE_DYNAMIC_PARAMS + if (_params != NULL) { LOGINFO(F("freeing allocated params!")); free(_params); } + #endif if (networkIndices) @@ -269,9 +273,9 @@ ESP_WiFiManager::~ESP_WiFiManager() ////////////////////////////////////////// #if USE_DYNAMIC_PARAMS -bool ESP_WiFiManager::addParameter(ESP_WMParameter *p) + bool ESP_WiFiManager::addParameter(ESP_WMParameter *p) #else -void ESP_WiFiManager::addParameter(ESP_WMParameter *p) + void ESP_WiFiManager::addParameter(ESP_WMParameter *p) #endif { #if USE_DYNAMIC_PARAMS @@ -280,9 +284,9 @@ void ESP_WiFiManager::addParameter(ESP_WMParameter *p) { // rezise the params array _max_params += WIFI_MANAGER_MAX_PARAMS; - + LOGINFO1(F("Increasing _max_params to:"), _max_params); - + ESP_WMParameter** new_params = (ESP_WMParameter**)realloc(_params, _max_params * sizeof(ESP_WMParameter*)); if (new_params != NULL) @@ -292,16 +296,16 @@ void ESP_WiFiManager::addParameter(ESP_WMParameter *p) else { LOGINFO(F("ERROR: failed to realloc params, size not increased!")); - + return false; } } _params[_paramsCount] = p; _paramsCount++; - + LOGINFO1(F("Adding parameter"), p->getID()); - + return true; #else @@ -311,7 +315,7 @@ void ESP_WiFiManager::addParameter(ESP_WMParameter *p) { _params[_paramsCount] = p; _paramsCount++; - + LOGINFO1(F("Adding parameter"), p->getID()); } else @@ -338,7 +342,7 @@ void ESP_WiFiManager::setupConfigPortal() #ifdef ESP8266 server.reset(new ESP8266WebServer(HTTP_PORT_TO_USE)); -#else //ESP32 +#else //ESP32 server.reset(new WebServer(HTTP_PORT_TO_USE)); #endif @@ -347,8 +351,9 @@ void ESP_WiFiManager::setupConfigPortal() // Check (https://github.com/khoih-prog/ESP_WiFiManager/issues/58) if (_WiFi_AP_IPconfig._ap_static_ip) { - LOGWARN3(F("Custom AP IP/GW/Subnet = "), _WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw, _WiFi_AP_IPconfig._ap_static_sn); - + LOGWARN3(F("Custom AP IP/GW/Subnet = "), _WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw, + _WiFi_AP_IPconfig._ap_static_sn); + WiFi.softAPConfig(_WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw, _WiFi_AP_IPconfig._ap_static_sn); } @@ -356,7 +361,7 @@ void ESP_WiFiManager::setupConfigPortal() if (dnsServer) { dnsServer->setErrorReplyCode(DNSReplyCode::NoError); - + // DNSServer started with "*" domain name, all DNS requests will be passsed to WiFi.softAPIP() if (! dnsServer->start(DNS_PORT, "*", WiFi.softAPIP())) { @@ -380,36 +385,28 @@ void ESP_WiFiManager::setupConfigPortal() { // fail passphrase to short or long! LOGERROR(F("Invalid AccessPoint password. Ignoring")); - + _apPassword = NULL; } + LOGWARN1(F("AP PWD ="), _apPassword); } - + // KH, To enable dynamic/random channel static int channel; - + // Use random channel if _WiFiAPChannel == 0 if (_WiFiAPChannel == 0) channel = (_configPortalStart % MAX_WIFI_CHANNEL) + 1; else channel = _WiFiAPChannel; - - if (_apPassword != NULL) - { - LOGWARN1(F("AP Channel ="), channel); - - //WiFi.softAP(_apName, _apPassword);//password option - WiFi.softAP(_apName, _apPassword, channel); - } - else - { - // Can't use channel here - WiFi.softAP(_apName); - } - + + LOGWARN1(F("AP Channel ="), channel); + + WiFi.softAP(_apName, _apPassword, channel); + delay(500); // Without delay I've seen the IP address blank - + LOGWARN1(F("AP IP address ="), WiFi.softAPIP()); /* Setup web pages: root, wifi config pages, SO captive portal detectors and not found. */ @@ -421,9 +418,11 @@ void ESP_WiFiManager::setupConfigPortal() server->on("/r", std::bind(&ESP_WiFiManager::handleReset, this)); server->on("/state", std::bind(&ESP_WiFiManager::handleState, this)); server->on("/scan", std::bind(&ESP_WiFiManager::handleScan, this)); + //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. + server->on("/fwlink", std::bind(&ESP_WiFiManager::handleRoot, this)); server->onNotFound(std::bind(&ESP_WiFiManager::handleNotFound, this)); server->begin(); // Web server start - + LOGWARN(F("HTTP server started")); } @@ -433,9 +432,9 @@ bool ESP_WiFiManager::autoConnect() { #ifdef ESP8266 String ssid = "ESP_" + String(ESP.getChipId()); -#else //ESP32 +#else //ESP32 String ssid = "ESP_" + String(ESP_getChipId()); - + #endif return autoConnect(ssid.c_str(), NULL); @@ -466,23 +465,22 @@ bool ESP_WiFiManager::autoConnect(char const *apName, char const *apPassword) #else LOGINFO(F("\nAutoConnect using previously saved SSID/PW, but invalidate previous settings")); // Connect to previously saved SSID/PW, but invalidate previous settings - connectWifi(WiFi_SSID(), WiFi_Pass()); + connectWifi(WiFi_SSID(), WiFi_Pass()); #endif - + unsigned long startedAt = millis(); while (millis() - startedAt < 10000) { - //delay(100); delay(200); if (WiFi.status() == WL_CONNECTED) { float waited = (millis() - startedAt); - + LOGWARN1(F("Connected after waiting (s) :"), waited / 1000); LOGWARN1(F("Local ip ="), WiFi.localIP()); - + return true; } } @@ -496,7 +494,7 @@ bool ESP_WiFiManager::startConfigPortal() { #ifdef ESP8266 String ssid = "ESP_" + String(ESP.getChipId()); -#else //ESP32 +#else //ESP32 String ssid = "ESP_" + String(ESP_getChipId()); #endif ssid.toUpperCase(); @@ -516,7 +514,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw if (connRes == WL_CONNECTED) { LOGINFO("SET AP_STA"); - + WiFi.mode(WIFI_AP_STA); //Dual mode works fine if it is connected to WiFi } else @@ -527,7 +525,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw // When ESP8266 station is trying to find a target AP, it will scan on every channel, // that means ESP8266 station is changing its channel to scan. This makes the channel of ESP8266 softAP keep changing too.. // So the connection may break. From http://bbs.espressif.com/viewtopic.php?t=671#p2531 - + WiFi.mode(WIFI_AP); } @@ -538,7 +536,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw if (_apcallback != NULL) { LOGINFO("_apcallback"); - + _apcallback(this); } @@ -556,8 +554,8 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw dnsServer->processNextRequest(); //HTTP server->handleClient(); - -#if ( USING_ESP32_S2 || USING_ESP32_C3 ) + +#if ( USING_ESP32_S2 || USING_ESP32_C3 ) // Fix ESP32-S2 issue with WebServer (https://github.com/espressif/arduino-esp32/issues/4348) delay(1); #endif @@ -571,9 +569,9 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw // using user-provided _ssid, _pass in place of system-stored ssid and pass if (connectWifi(_ssid, _pass) != WL_CONNECTED) - { + { LOGERROR(F("Failed to connect")); - + WiFi.mode(WIFI_AP); // Dual mode becomes flaky if not connected to a WiFi network. } else @@ -584,6 +582,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw //todo: check if any custom parameters actually exist, and check if they really changed maybe _savecallback(); } + break; } @@ -596,31 +595,33 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw //todo: check if any custom parameters actually exist, and check if they really changed maybe _savecallback(); } - + break; } } if (stopConfigPortal) { - LOGERROR("Stop ConfigPortal"); //KH - + //TimedOut = false; + + LOGERROR("Stop ConfigPortal"); //KH + stopConfigPortal = false; break; } - + yield(); } WiFi.mode(WIFI_STA); - + if (TimedOut) { setHostname(); - // New v1.0.8 to fix static IP when CP not entered or timed-out + // To fix static IP when CP not entered or timed-out setWifiStaticIP(); - + WiFi.begin(); int connRes = waitForConnectResult(); @@ -638,31 +639,35 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw ////////////////////////////////////////// void ESP_WiFiManager::setWifiStaticIP() -{ +{ #if USE_CONFIGURABLE_DNS + if (_WiFi_STA_IPconfig._sta_static_ip) { LOGWARN(F("Custom STA IP/GW/Subnet")); - + //***** Added section for DNS config option ***** - if (_WiFi_STA_IPconfig._sta_static_dns1 && _WiFi_STA_IPconfig._sta_static_dns2) - { + if (_WiFi_STA_IPconfig._sta_static_dns1 && _WiFi_STA_IPconfig._sta_static_dns2) + { LOGWARN(F("DNS1 and DNS2 set")); - - WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, _WiFi_STA_IPconfig._sta_static_dns1, _WiFi_STA_IPconfig._sta_static_dns2); + + WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, + _WiFi_STA_IPconfig._sta_static_dns1, _WiFi_STA_IPconfig._sta_static_dns2); } - else if (_WiFi_STA_IPconfig._sta_static_dns1) + else if (_WiFi_STA_IPconfig._sta_static_dns1) { LOGWARN(F("Only DNS1 set")); - - WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, _WiFi_STA_IPconfig._sta_static_dns1); + + WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, + _WiFi_STA_IPconfig._sta_static_dns1); } - else + else { LOGWARN(F("No DNS server set")); - + WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn); - } + } + //***** End added section for DNS config option ***** LOGINFO1(F("setWifiStaticIP IP ="), WiFi.localIP()); @@ -671,14 +676,17 @@ void ESP_WiFiManager::setWifiStaticIP() { LOGWARN(F("Can't use Custom STA IP/GW/Subnet")); } + #else + // check if we've got static_ip settings, if we do, use those. if (_WiFi_STA_IPconfig._sta_static_ip) { WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn); - + LOGWARN1(F("Custom STA IP/GW/Subnet : "), WiFi.localIP()); } + #endif } @@ -687,14 +695,14 @@ void ESP_WiFiManager::setWifiStaticIP() int ESP_WiFiManager::reconnectWifi() { int connectResult; - + // using user-provided _ssid, _pass instead of system-stored if ( ( connectResult = connectWifi(_ssid, _pass) ) != WL_CONNECTED) - { + { LOGERROR1(F("Failed to connect to"), _ssid); - + if ( ( connectResult = connectWifi(_ssid1, _pass1) ) != WL_CONNECTED) - { + { LOGERROR1(F("Failed to connect to"), _ssid1); } @@ -702,8 +710,8 @@ int ESP_WiFiManager::reconnectWifi() LOGERROR1(F("Connected to"), _ssid1); } else - LOGERROR1(F("Connected to"), _ssid); - + LOGERROR1(F("Connected to"), _ssid); + return connectResult; } @@ -714,14 +722,14 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass) // Add option if didn't input/update SSID/PW => Use the previous saved Credentials. // But update the Static/DHCP options if changed. if ( (ssid != "") || ( (ssid == "") && (WiFi_SSID() != "") ) ) - { + { //fix for auto connect racing issue, to avoid resetSettings() if (WiFi.status() == WL_CONNECTED) { LOGWARN(F("Already connected. Bailing out.")); return WL_CONNECTED; } - + if (ssid != "") resetSettings(); @@ -732,7 +740,7 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass) WiFi.mode(WIFI_AP_STA); //It will start in station mode if it was previously in AP mode. setHostname(); - + // KH, Fix ESP32 staticIP after exiting CP #ifdef ESP32 setWifiStaticIP(); @@ -742,14 +750,14 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass) { // Start Wifi with new values. LOGWARN(F("Connect to new WiFi using new IP parameters")); - + WiFi.begin(ssid.c_str(), pass.c_str()); } else { // Start Wifi with old values. LOGWARN(F("Connect to previous WiFi using new IP parameters")); - + WiFi.begin(); } } @@ -759,7 +767,7 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass) } int connRes = waitForConnectResult(); - + LOGWARN1("Connection result: ", getStatus(connRes)); //not connected, WPS enabled, no pass - first attempt @@ -780,13 +788,13 @@ uint8_t ESP_WiFiManager::waitForConnectResult() if (_connectTimeout == 0) { unsigned long startedAt = millis(); - + // In ESP8266, WiFi.waitForConnectResult() @return wl_status_t (0-255) or -1 on timeout !!! // In ESP32, WiFi.waitForConnectResult() @return wl_status_t (0-255) // So, using int for connRes to be safe //int connRes = WiFi.waitForConnectResult(); WiFi.waitForConnectResult(); - + float waited = (millis() - startedAt); LOGWARN1(F("Connected after waiting (s) :"), waited / 1000); @@ -799,7 +807,7 @@ uint8_t ESP_WiFiManager::waitForConnectResult() else { LOGERROR(F("Waiting WiFi connection with time out")); - + unsigned long start = millis(); bool keepConnecting = true; uint8_t status; @@ -807,7 +815,7 @@ uint8_t ESP_WiFiManager::waitForConnectResult() while (keepConnecting) { status = WiFi.status(); - + if (millis() > start + _connectTimeout) { keepConnecting = false; @@ -818,10 +826,10 @@ uint8_t ESP_WiFiManager::waitForConnectResult() { keepConnecting = false; } - + delay(100); } - + return status; } } @@ -834,7 +842,7 @@ void ESP_WiFiManager::startWPS() LOGINFO("START WPS"); WiFi.beginWPSConfig(); LOGINFO("END WPS"); -#else //ESP32 +#else //ESP32 // TODO LOGINFO("ESP32 WPS TODO"); #endif @@ -850,14 +858,19 @@ const char* ESP_WiFiManager::getStatus(const int& status) { case WL_IDLE_STATUS: return "WL_IDLE_STATUS"; + case WL_NO_SSID_AVAIL: return "WL_NO_SSID_AVAIL"; + case WL_CONNECTED: return "WL_CONNECTED"; + case WL_CONNECT_FAILED: return "WL_CONNECT_FAILED"; + case WL_DISCONNECTED: return "WL_DISCONNECTED"; + default: return "UNKNOWN"; } @@ -882,20 +895,20 @@ String ESP_WiFiManager::getConfigPortalPW() void ESP_WiFiManager::resetSettings() { LOGINFO(F("Previous settings invalidated")); - -#ifdef ESP8266 + +#ifdef ESP8266 WiFi.disconnect(true); #else WiFi.disconnect(true, true); - // New in v1.0.11 + // Temporary fix for issue of not clearing WiFi SSID/PW from flash of ESP32 // See https://github.com/khoih-prog/ESP_WiFiManager/issues/25 and https://github.com/espressif/arduino-esp32/issues/400 - WiFi.begin("0","0"); + WiFi.begin("0", "0"); ////// #endif delay(200); - + return; } @@ -958,7 +971,7 @@ void ESP_WiFiManager::setAPStaticIPConfig(const IPAddress& ip, const IPAddress& void ESP_WiFiManager::setAPStaticIPConfig(const WiFi_AP_IPConfig& WM_AP_IPconfig) { LOGINFO(F("setAPStaticIPConfig")); - + memcpy((void*) &_WiFi_AP_IPconfig, &WM_AP_IPconfig, sizeof(_WiFi_AP_IPconfig)); } @@ -967,7 +980,7 @@ void ESP_WiFiManager::setAPStaticIPConfig(const WiFi_AP_IPConfig& WM_AP_IPconfi void ESP_WiFiManager::getAPStaticIPConfig(WiFi_AP_IPConfig &WM_AP_IPconfig) { LOGINFO(F("getAPStaticIPConfig")); - + memcpy((void*) &WM_AP_IPconfig, &_WiFi_AP_IPconfig, sizeof(WM_AP_IPconfig)); } @@ -986,7 +999,7 @@ void ESP_WiFiManager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& void ESP_WiFiManager::setSTAStaticIPConfig(const WiFi_STA_IPConfig& WM_STA_IPconfig) { LOGINFO(F("setSTAStaticIPConfig")); - + memcpy((void*) &_WiFi_STA_IPconfig, &WM_STA_IPconfig, sizeof(_WiFi_STA_IPconfig)); } @@ -995,14 +1008,14 @@ void ESP_WiFiManager::setSTAStaticIPConfig(const WiFi_STA_IPConfig& WM_STA_IPcon void ESP_WiFiManager::getSTAStaticIPConfig(WiFi_STA_IPConfig &WM_STA_IPconfig) { LOGINFO(F("getSTAStaticIPConfig")); - + memcpy((void*) &WM_STA_IPconfig, &_WiFi_STA_IPconfig, sizeof(WM_STA_IPconfig)); } ////////////////////////////////////////// #if USE_CONFIGURABLE_DNS -void ESP_WiFiManager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn, +void ESP_WiFiManager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn, const IPAddress& dns_address_1, const IPAddress& dns_address_2) { LOGINFO(F("setSTAStaticIPConfig for USE_CONFIGURABLE_DNS")); @@ -1066,7 +1079,7 @@ void ESP_WiFiManager::handleRoot() LOGDEBUG(F("Handle root")); // Disable _configPortalTimeout when someone accessing Portal to give some time to config - _configPortalTimeout = 0; //KH + _configPortalTimeout = 0; //KH if (captivePortal()) { @@ -1077,15 +1090,15 @@ void ESP_WiFiManager::handleRoot() server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); #if USING_CORS_FEATURE - // New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" + // For configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "Options"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_SCRIPT_NTP); @@ -1129,20 +1142,20 @@ void ESP_WiFiManager::handleWifi() LOGDEBUG(F("Handle WiFi")); // Disable _configPortalTimeout when someone accessing Portal to give some time to config - _configPortalTimeout = 0; //KH - + _configPortalTimeout = 0; //KH + server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); #if USING_CORS_FEATURE - // New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" + // For configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); - + String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "Config ESP"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_SCRIPT_NTP); @@ -1162,13 +1175,13 @@ void ESP_WiFiManager::handleWifi() else { page += FPSTR(WM_FLDSET_START); - + //display networks in page for (int i = 0; i < numberOfNetworks; i++) { if (networkIndices[i] == -1) continue; // skip dups and those that are below the required quality - + LOGDEBUG1(F("Index ="), i); LOGDEBUG1(F("SSID ="), WiFi.SSID(networkIndices[i])); LOGDEBUG1(F("RSSI ="), WiFi.RSSI(networkIndices[i])); @@ -1182,8 +1195,9 @@ void ESP_WiFiManager::handleWifi() item.replace("{r}", rssiQ); #ifdef ESP8266 + if (WiFi.encryptionType(networkIndices[i]) != ENC_TYPE_NONE) -#else //ESP32 +#else //ESP32 if (WiFi.encryptionType(networkIndices[i]) != WIFI_AUTH_OPEN) #endif { @@ -1195,20 +1209,20 @@ void ESP_WiFiManager::handleWifi() } //LOGDEBUG(item); - + page += item; delay(0); } - + page += FPSTR(WM_FLDSET_END); page += "
"; } - + page += "*Hint: To reuse the saved WiFi credentials, leave SSID and PWD fields empty"; page += FPSTR(WM_HTTP_FORM_START); - + #if DISPLAY_STORED_CREDENTIALS_IN_CP // Populate SSIDs and PWDs if valid page.replace("[[ssid]]", _ssid ); @@ -1216,11 +1230,11 @@ void ESP_WiFiManager::handleWifi() page.replace("[[ssid1]]", _ssid1 ); page.replace("[[pwd1]]", _pass1 ); #endif - + char parLength[2]; - + page += FPSTR(WM_FLDSET_START); - + // add the extra parameters to the form for (int i = 0; i < _paramsCount; i++) { @@ -1228,16 +1242,19 @@ void ESP_WiFiManager::handleWifi() { break; } - + String pitem; + switch (_params[i]->getLabelPlacement()) { case WFM_LABEL_BEFORE: pitem = FPSTR(WM_HTTP_FORM_LABEL_BEFORE); break; + case WFM_LABEL_AFTER: pitem = FPSTR(WM_HTTP_FORM_LABEL_AFTER); break; + default: // WFM_NO_LABEL pitem = FPSTR(WM_HTTP_FORM_PARAM); @@ -1261,7 +1278,7 @@ void ESP_WiFiManager::handleWifi() page += pitem; } - + if (_paramsCount > 0) { page += FPSTR(WM_FLDSET_END); @@ -1273,20 +1290,21 @@ void ESP_WiFiManager::handleWifi() } LOGDEBUG1(F("Static IP ="), _WiFi_STA_IPconfig._sta_static_ip.toString()); - - // KH, Comment out in v1.0.9 to permit changing from DHCP to static IP, or vice versa + + // KH, Comment out to permit changing from DHCP to static IP, or vice versa // and add staticIP label in CP - - // From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. + + // To permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. // You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa // You have to explicitly specify false to disable the feature. #if !USE_STATIC_IP_CONFIG_IN_CP + if (_WiFi_STA_IPconfig._sta_static_ip) -#endif +#endif { page += FPSTR(WM_FLDSET_START); - + String item = FPSTR(WM_HTTP_FORM_LABEL); item += FPSTR(WM_HTTP_FORM_PARAM); item.replace("{i}", "ip"); @@ -1315,7 +1333,7 @@ void ESP_WiFiManager::handleWifi() item.replace("{l}", "15"); item.replace("{v}", _WiFi_STA_IPconfig._sta_static_sn.toString()); - #if USE_CONFIGURABLE_DNS +#if USE_CONFIGURABLE_DNS //***** Added for DNS address options ***** page += item; @@ -1337,15 +1355,15 @@ void ESP_WiFiManager::handleWifi() item.replace("{l}", "15"); item.replace("{v}", _WiFi_STA_IPconfig._sta_static_dns2.toString()); //***** End added for DNS address options ***** - #endif +#endif page += item; - + page += FPSTR(WM_FLDSET_END); page += "
"; } - + page += FPSTR(WM_HTTP_SCRIPT_NTP_HIDDEN); page += FPSTR(WM_HTTP_FORM_END); @@ -1370,18 +1388,18 @@ void ESP_WiFiManager::handleWifiSave() _ssid1 = server->arg("s1").c_str(); _pass1 = server->arg("p1").c_str(); - + /////////////////////// - + #if USING_CORS_FEATURE // For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); -#endif +#endif + +#if USE_ESP_WIFIMANAGER_NTP -#if USE_ESP_WIFIMANAGER_NTP - if (server->arg("timezone") != "") - { + { _timezoneName = server->arg("timezone"); LOGDEBUG1(F("TZ name ="), _timezoneName); } @@ -1392,7 +1410,7 @@ void ESP_WiFiManager::handleWifiSave() #endif /////////////////////// - + //parameters for (int i = 0; i < _paramsCount; i++) { @@ -1403,10 +1421,10 @@ void ESP_WiFiManager::handleWifiSave() //read parameter String value = server->arg(_params[i]->getID()).c_str(); - + //store it in array value.toCharArray(_params[i]->_WMParam_data._value, _params[i]->_WMParam_data._length); - + LOGDEBUG2(F("Parameter and value :"), _params[i]->getID(), value); } @@ -1414,7 +1432,7 @@ void ESP_WiFiManager::handleWifiSave() { String ip = server->arg("ip"); optionalIPFromString(&_WiFi_STA_IPconfig._sta_static_ip, ip.c_str()); - + LOGDEBUG1(F("New Static IP ="), _WiFi_STA_IPconfig._sta_static_ip.toString()); } @@ -1422,7 +1440,7 @@ void ESP_WiFiManager::handleWifiSave() { String gw = server->arg("gw"); optionalIPFromString(&_WiFi_STA_IPconfig._sta_static_gw, gw.c_str()); - + LOGDEBUG1(F("New Static Gateway ="), _WiFi_STA_IPconfig._sta_static_gw.toString()); } @@ -1430,17 +1448,18 @@ void ESP_WiFiManager::handleWifiSave() { String sn = server->arg("sn"); optionalIPFromString(&_WiFi_STA_IPconfig._sta_static_sn, sn.c_str()); - + LOGDEBUG1(F("New Static Netmask ="), _WiFi_STA_IPconfig._sta_static_sn.toString()); } #if USE_CONFIGURABLE_DNS + //***** Added for DNS Options ***** if (server->arg("dns1") != "") { String dns1 = server->arg("dns1"); optionalIPFromString(&_WiFi_STA_IPconfig._sta_static_dns1, dns1.c_str()); - + LOGDEBUG1(F("New Static DNS1 ="), _WiFi_STA_IPconfig._sta_static_dns1.toString()); } @@ -1448,14 +1467,15 @@ void ESP_WiFiManager::handleWifiSave() { String dns2 = server->arg("dns2"); optionalIPFromString(&_WiFi_STA_IPconfig._sta_static_dns2, dns2.c_str()); - + LOGDEBUG1(F("New Static DNS2 ="), _WiFi_STA_IPconfig._sta_static_dns2.toString()); } + //***** End added for DNS Options ***** #endif String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "Credentials Saved"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_STYLE); @@ -1465,7 +1485,7 @@ void ESP_WiFiManager::handleWifiSave() page.replace("{v}", _apName); page.replace("{x}", _ssid); page.replace("{x1}", _ssid1); - + page += FPSTR(WM_HTTP_END); server->send(200, "text/html", page); @@ -1484,19 +1504,19 @@ void ESP_WiFiManager::handleWifiSave() void ESP_WiFiManager::handleServerClose() { LOGDEBUG(F("Server Close")); - + server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); #if USING_CORS_FEATURE // For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); - + String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "Close Server"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_STYLE); @@ -1510,15 +1530,15 @@ void ESP_WiFiManager::handleServerClose() page += WiFi.localIP().toString(); page += F("

"); page += F("Portal closed...

"); - + //page += F("Push button on device to restart configuration server!"); - + page += FPSTR(WM_HTTP_END); - + server->send(200, "text/html", page); - + stopConfigPortal = true; //signal ready to shutdown config portal - + LOGDEBUG(F("Sent server close page")); // Restore when Press Save WiFi @@ -1533,7 +1553,7 @@ void ESP_WiFiManager::handleInfo() LOGDEBUG(F("Info")); // Disable _configPortalTimeout when someone accessing Portal to give some time to config - _configPortalTimeout = 0; //KH + _configPortalTimeout = 0; //KH server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); @@ -1541,41 +1561,41 @@ void ESP_WiFiManager::handleInfo() // For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); - + String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "Info"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_SCRIPT_NTP); page += FPSTR(WM_HTTP_STYLE); page += _customHeadElement; page += FPSTR(WM_HTTP_HEAD_END); - + page += F("

WiFi Information

"); - + reportStatus(page); - + page += FPSTR(WM_FLDSET_START); - + page += F("

Device Data

"); page += F(""); page += F(""); page += F(""); page += F("
NameValue
Chip ID"); page += F("0x"); #ifdef ESP8266 - page += String(ESP.getChipId(), HEX); //ESP.getChipId(); -#else //ESP32 + page += String(ESP.getChipId(), HEX); //ESP.getChipId(); +#else //ESP32 + + page += String(ESP_getChipId(), HEX); //ESP.getChipId(); - page += String(ESP_getChipId(), HEX); //ESP.getChipId(); - page += F("
Chip OUI"); page += F("0x"); - page += String(getChipOUI(), HEX); //ESP.getChipId(); - + page += String(getChipOUI(), HEX); //ESP.getChipId(); + page += F("
Chip Model"); page += ESP.getChipModel(); @@ -1587,8 +1607,8 @@ void ESP_WiFiManager::handleInfo() page += F("
Flash Chip ID"); #ifdef ESP8266 - page += String(ESP.getFlashChipId(), HEX); //ESP.getFlashChipId(); -#else //ESP32 + page += String(ESP.getFlashChipId(), HEX); //ESP.getFlashChipId(); +#else //ESP32 // TODO page += F("TODO"); #endif @@ -1601,7 +1621,7 @@ void ESP_WiFiManager::handleInfo() #ifdef ESP8266 page += ESP.getFlashChipRealSize(); -#else //ESP32 +#else //ESP32 // TODO page += F("TODO"); #endif @@ -1628,12 +1648,12 @@ void ESP_WiFiManager::handleInfo() page += F("
"); page += FPSTR(WM_FLDSET_END); - -#if USE_AVAILABLE_PAGES + +#if USE_AVAILABLE_PAGES page += FPSTR(WM_FLDSET_START); - + page += FPSTR(WM_HTTP_AVAILABLE_PAGES); - + page += FPSTR(WM_FLDSET_END); #endif @@ -1652,19 +1672,19 @@ void ESP_WiFiManager::handleInfo() void ESP_WiFiManager::handleState() { LOGDEBUG(F("State - json")); - + server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); #if USING_CORS_FEATURE // For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); - + String page = F("{\"Soft_AP_IP\":\""); - + page += WiFi.softAPIP().toString(); page += F("\",\"Soft_AP_MAC\":\""); page += WiFi.softAPmacAddress(); @@ -1686,9 +1706,9 @@ void ESP_WiFiManager::handleState() page += F("\"SSID\":\""); page += WiFi_SSID(); page += F("\"}"); - + server->send(200, "application/json", page); - + LOGDEBUG(F("Sent state page in json format")); } @@ -1700,17 +1720,17 @@ void ESP_WiFiManager::handleScan() LOGDEBUG(F("Scan")); // Disable _configPortalTimeout when someone accessing Portal to give some time to config - _configPortalTimeout = 0; //KH + _configPortalTimeout = 0; //KH LOGDEBUG(F("State-Json")); - + server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE)); #if USING_CORS_FEATURE // For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*" server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header); #endif - + server->sendHeader(FPSTR(WM_HTTP_PRAGMA), FPSTR(WM_HTTP_NO_CACHE)); server->sendHeader(FPSTR(WM_HTTP_EXPIRES), "-1"); @@ -1721,9 +1741,9 @@ void ESP_WiFiManager::handleScan() //and should be freed when indices no longer required. n = scanWifiNetworks(&indices); - + LOGDEBUG(F("In handleScan, scanWifiNetworks done")); - + String page = F("{\"Access_Points\":["); //display networks in page @@ -1742,14 +1762,15 @@ void ESP_WiFiManager::handleScan() int quality = getRSSIasQuality(WiFi.RSSI(indices[i])); String item = FPSTR(JSON_ITEM); String rssiQ; - + rssiQ += quality; item.replace("{v}", WiFi.SSID(indices[i])); item.replace("{r}", rssiQ); #ifdef ESP8266 + if (WiFi.encryptionType(indices[i]) != ENC_TYPE_NONE) -#else //ESP32 +#else //ESP32 if (WiFi.encryptionType(indices[i]) != WIFI_AUTH_OPEN) #endif { @@ -1759,9 +1780,9 @@ void ESP_WiFiManager::handleScan() { item.replace("{i}", "false"); } - + //LOGDEBUG(item); - + page += item; delay(0); } @@ -1772,9 +1793,9 @@ void ESP_WiFiManager::handleScan() } page += F("]}"); - + server->send(200, "application/json", page); - + LOGDEBUG(F("Sent WiFiScan Data in Json format")); } @@ -1784,13 +1805,13 @@ void ESP_WiFiManager::handleScan() void ESP_WiFiManager::handleReset() { LOGDEBUG(F("Reset")); - + server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server->sendHeader("Pragma", "no-cache"); server->sendHeader("Expires", "-1"); - + String page = FPSTR(WM_HTTP_HEAD_START); - + page.replace("{v}", "WiFi Information"); page += FPSTR(WM_HTTP_SCRIPT); page += FPSTR(WM_HTTP_STYLE); @@ -1798,22 +1819,22 @@ void ESP_WiFiManager::handleReset() page += FPSTR(WM_HTTP_HEAD_END); page += F("Resetting"); page += FPSTR(WM_HTTP_END); - + server->send(200, "text/html", page); LOGDEBUG(F("Sent reset page")); delay(5000); - + // Temporary fix for issue of not clearing WiFi SSID/PW from flash of ESP32 // See https://github.com/khoih-prog/ESP_WiFiManager/issues/25 and https://github.com/espressif/arduino-esp32/issues/400 resetSettings(); - + //WiFi.disconnect(true); // Wipe out WiFi credentials. ////// #ifdef ESP8266 ESP.reset(); -#else //ESP32 +#else //ESP32 ESP.restart(); #endif @@ -1831,7 +1852,7 @@ void ESP_WiFiManager::handleNotFound() } String message = "File Not Found\n\n"; - + message += "URI: "; message += server->uri(); message += "\nMethod: "; @@ -1848,7 +1869,7 @@ void ESP_WiFiManager::handleNotFound() server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server->sendHeader("Pragma", "no-cache"); server->sendHeader("Expires", "-1"); - + server->send(404, "text/plain", message); } @@ -1862,18 +1883,21 @@ void ESP_WiFiManager::handleNotFound() bool ESP_WiFiManager::captivePortal() { LOGDEBUG1(F("captivePortal: hostHeader = "), server->hostHeader()); - + if (!isIp(server->hostHeader())) { LOGINFO1(F("Request redirected to captive portal : "), server->client().localIP()); - + server->sendHeader(F("Location"), (String)F("http://") + toStringIp(server->client().localIP()), true); - server->send(302, FPSTR(WM_HTTP_HEAD_CT2), ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. + + // Empty content inhibits Content-length header so we have to close the socket ourselves. + server->send(302, FPSTR(WM_HTTP_HEAD_CT2), ""); + server->client().stop(); // Stop is needed because we sent no content length - + return true; } - + return false; } @@ -1896,7 +1920,7 @@ void ESP_WiFiManager::setSaveConfigCallback(void(*func)()) ////////////////////////////////////////// //sets a custom element to add to head, like a new style tag -void ESP_WiFiManager::setCustomHeadElement(const char* element) +void ESP_WiFiManager::setCustomHeadElement(const char* element) { _customHeadElement = element; } @@ -1917,7 +1941,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) int n = WiFi.scanNetworks(false, true); - LOGDEBUG1(F("scanWifiNetworks: Done, Scanned Networks n ="), n); + LOGDEBUG1(F("scanWifiNetworks: Done, Scanned Networks n ="), n); //KH, Terrible bug here. WiFi.scanNetworks() returns n < 0 => malloc( negative == very big ) => crash!!! //In .../esp32/libraries/WiFi/src/WiFiType.h @@ -1927,7 +1951,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) if (n <= 0) { LOGDEBUG(F("No network found")); - + return (0); } else @@ -1940,12 +1964,12 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) { LOGDEBUG(F("ERROR: Out of memory")); *indicesptr = NULL; - + return (0); } *indicesptr = indices; - + //sort networks for (int i = 0; i < n; i++) { @@ -1973,14 +1997,14 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) if (_removeDuplicateAPs) { String cssid; - + for (int i = 0; i < n; i++) { if (indices[i] == -1) continue; cssid = WiFi.SSID(indices[i]); - + for (int j = i + 1; j < n; j++) { if (cssid == WiFi.SSID(indices[j])) @@ -2007,6 +2031,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) } #if (DEBUG_WIFIMGR > 2) + for (int i = 0; i < n; i++) { if (indices[i] == -1) @@ -2014,6 +2039,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr) else Serial.println(WiFi.SSID(indices[i])); } + #endif return (n); @@ -2056,7 +2082,7 @@ bool ESP_WiFiManager::isIp(const String& str) return false; } } - + return true; } @@ -2066,7 +2092,7 @@ bool ESP_WiFiManager::isIp(const String& str) String ESP_WiFiManager::toStringIp(const IPAddress& ip) { String res = ""; - + for (int i = 0; i < 3; i++) { res += String((ip >> (8 * i)) & 0xFF) + "."; @@ -2100,9 +2126,9 @@ String ESP_WiFiManager::getStoredWiFiSSID() else { wifi_config_t conf; - + esp_wifi_get_config(WIFI_IF_STA, &conf); - + return String(reinterpret_cast(conf.sta.ssid)); } @@ -2119,9 +2145,9 @@ String ESP_WiFiManager::getStoredWiFiPass() } wifi_config_t conf; - + esp_wifi_get_config(WIFI_IF_STA, &conf); - + return String(reinterpret_cast(conf.sta.password)); } @@ -2135,7 +2161,7 @@ uint32_t getChipID() { chipId64 |= ( ( (uint64_t) ESP.getEfuseMac() >> (40 - (i * 8)) ) & 0xff ) << (i * 8); } - + return (uint32_t) (chipId64 & 0xFFFFFF); } @@ -2149,7 +2175,7 @@ uint32_t getChipOUI() { chipId64 |= ( ( (uint64_t) ESP.getEfuseMac() >> (40 - (i * 8)) ) & 0xff ) << (i * 8); } - + return (uint32_t) (chipId64 >> 24); } diff --git a/src/ESP_WiFiManager.h b/src/ESP_WiFiManager.h index 09b414b..cbb1cd3 100644 --- a/src/ESP_WiFiManager.h +++ b/src/ESP_WiFiManager.h @@ -15,8 +15,8 @@ Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager Licensed under MIT license - - Version: 1.12.0 + + Version: 1.12.1 Version Modified By Date Comments ------- ----------- ---------- ----------- @@ -29,6 +29,7 @@ 1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function 1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI() 1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal + 1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style *****************************************************************************************************************************/ #pragma once diff --git a/src/ESP_WiFiManager.hpp b/src/ESP_WiFiManager.hpp index 63b0e06..b11475d 100644 --- a/src/ESP_WiFiManager.hpp +++ b/src/ESP_WiFiManager.hpp @@ -16,7 +16,7 @@ Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager Licensed under MIT license - Version: 1.12.0 + Version: 1.12.1 Version Modified By Date Comments ------- ----------- ---------- ----------- @@ -29,6 +29,7 @@ 1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function 1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI() 1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal + 1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style *****************************************************************************************************************************/ #pragma once @@ -70,13 +71,13 @@ //////////////////////////////////////////////////// -#define ESP_WIFIMANAGER_VERSION "ESP_WiFiManager v1.12.0" +#define ESP_WIFIMANAGER_VERSION "ESP_WiFiManager v1.12.1" #define ESP_WIFIMANAGER_VERSION_MAJOR 1 #define ESP_WIFIMANAGER_VERSION_MINOR 12 -#define ESP_WIFIMANAGER_VERSION_PATCH 0 +#define ESP_WIFIMANAGER_VERSION_PATCH 1 -#define ESP_WIFIMANAGER_VERSION_INT 1012000 +#define ESP_WIFIMANAGER_VERSION_INT 1012001 //////////////////////////////////////////////////// diff --git a/src/ESP_WiFiManager_Debug.h b/src/ESP_WiFiManager_Debug.h index 39d1506..c031f8a 100644 --- a/src/ESP_WiFiManager_Debug.h +++ b/src/ESP_WiFiManager_Debug.h @@ -15,8 +15,8 @@ Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager Licensed under MIT license - - Version: 1.12.0 + + Version: 1.12.1 Version Modified By Date Comments ------- ----------- ---------- ----------- @@ -29,6 +29,7 @@ 1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function 1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI() 1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal + 1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style *****************************************************************************************************************************/ #pragma once diff --git a/src/utils/TZ.h b/src/utils/TZ.h index ee26e91..4ac4cdc 100644 --- a/src/utils/TZ.h +++ b/src/utils/TZ.h @@ -71,466 +71,466 @@ //////////////////////////////////////////////////// -#define TZ_Africa_Abidjan ("GMT0") -#define TZ_Africa_Accra ("GMT0") -#define TZ_Africa_Addis_Ababa ("EAT-3") -#define TZ_Africa_Algiers ("CET-1") -#define TZ_Africa_Asmara ("EAT-3") -#define TZ_Africa_Bamako ("GMT0") -#define TZ_Africa_Bangui ("WAT-1") -#define TZ_Africa_Banjul ("GMT0") -#define TZ_Africa_Bissau ("GMT0") -#define TZ_Africa_Blantyre ("CAT-2") -#define TZ_Africa_Brazzaville ("WAT-1") -#define TZ_Africa_Bujumbura ("CAT-2") -#define TZ_Africa_Cairo ("EET-2") -#define TZ_Africa_Casablanca ("<+01>-1") -#define TZ_Africa_Ceuta ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Africa_Conakry ("GMT0") -#define TZ_Africa_Dakar ("GMT0") -#define TZ_Africa_Dar_es_Salaam ("EAT-3") -#define TZ_Africa_Djibouti ("EAT-3") -#define TZ_Africa_Douala ("WAT-1") -#define TZ_Africa_El_Aaiun ("<+01>-1") -#define TZ_Africa_Freetown ("GMT0") -#define TZ_Africa_Gaborone ("CAT-2") -#define TZ_Africa_Harare ("CAT-2") -#define TZ_Africa_Johannesburg ("SAST-2") -#define TZ_Africa_Juba ("EAT-3") -#define TZ_Africa_Kampala ("EAT-3") -#define TZ_Africa_Khartoum ("CAT-2") -#define TZ_Africa_Kigali ("CAT-2") -#define TZ_Africa_Kinshasa ("WAT-1") -#define TZ_Africa_Lagos ("WAT-1") -#define TZ_Africa_Libreville ("WAT-1") -#define TZ_Africa_Lome ("GMT0") -#define TZ_Africa_Luanda ("WAT-1") -#define TZ_Africa_Lubumbashi ("CAT-2") -#define TZ_Africa_Lusaka ("CAT-2") -#define TZ_Africa_Malabo ("WAT-1") -#define TZ_Africa_Maputo ("CAT-2") -#define TZ_Africa_Maseru ("SAST-2") -#define TZ_Africa_Mbabane ("SAST-2") -#define TZ_Africa_Mogadishu ("EAT-3") -#define TZ_Africa_Monrovia ("GMT0") -#define TZ_Africa_Nairobi ("EAT-3") -#define TZ_Africa_Ndjamena ("WAT-1") -#define TZ_Africa_Niamey ("WAT-1") -#define TZ_Africa_Nouakchott ("GMT0") -#define TZ_Africa_Ouagadougou ("GMT0") -#define TZ_Africa_PortomNovo ("WAT-1") -#define TZ_Africa_Sao_Tome ("GMT0") -#define TZ_Africa_Tripoli ("EET-2") -#define TZ_Africa_Tunis ("CET-1") -#define TZ_Africa_Windhoek ("CAT-2") -#define TZ_America_Adak ("HST10HDT,M3.2.0,M11.1.0") -#define TZ_America_Anchorage ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_Anguilla ("AST4") -#define TZ_America_Antigua ("AST4") -#define TZ_America_Araguaina ("<-03>3") -#define TZ_America_Argentina_Buenos_Aires ("<-03>3") -#define TZ_America_Argentina_Catamarca ("<-03>3") -#define TZ_America_Argentina_Cordoba ("<-03>3") -#define TZ_America_Argentina_Jujuy ("<-03>3") -#define TZ_America_Argentina_La_Rioja ("<-03>3") -#define TZ_America_Argentina_Mendoza ("<-03>3") -#define TZ_America_Argentina_Rio_Gallegos ("<-03>3") -#define TZ_America_Argentina_Salta ("<-03>3") -#define TZ_America_Argentina_San_Juan ("<-03>3") -#define TZ_America_Argentina_San_Luis ("<-03>3") -#define TZ_America_Argentina_Tucuman ("<-03>3") -#define TZ_America_Argentina_Ushuaia ("<-03>3") -#define TZ_America_Aruba ("AST4") -#define TZ_America_Asuncion ("<-04>4<-03>,M10.1.0/0,M3.4.0/0") -#define TZ_America_Atikokan ("EST5") -#define TZ_America_Bahia ("<-03>3") -#define TZ_America_Bahia_Banderas ("CST6CDT,M4.1.0,M10.5.0") -#define TZ_America_Barbados ("AST4") -#define TZ_America_Belem ("<-03>3") -#define TZ_America_Belize ("CST6") -#define TZ_America_BlancmSablon ("AST4") -#define TZ_America_Boa_Vista ("<-04>4") -#define TZ_America_Bogota ("<-05>5") -#define TZ_America_Boise ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Cambridge_Bay ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Campo_Grande ("<-04>4") -#define TZ_America_Cancun ("EST5") -#define TZ_America_Caracas ("<-04>4") -#define TZ_America_Cayenne ("<-03>3") -#define TZ_America_Cayman ("EST5") -#define TZ_America_Chicago ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Chihuahua ("MST7MDT,M4.1.0,M10.5.0") -#define TZ_America_Costa_Rica ("CST6") -#define TZ_America_Creston ("MST7") -#define TZ_America_Cuiaba ("<-04>4") -#define TZ_America_Curacao ("AST4") -#define TZ_America_Danmarkshavn ("GMT0") -#define TZ_America_Dawson ("MST7") -#define TZ_America_Dawson_Creek ("MST7") -#define TZ_America_Denver ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Detroit ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Dominica ("AST4") -#define TZ_America_Edmonton ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Eirunepe ("<-05>5") -#define TZ_America_El_Salvador ("CST6") -#define TZ_America_Fortaleza ("<-03>3") -#define TZ_America_Fort_Nelson ("MST7") -#define TZ_America_Glace_Bay ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_America_Godthab ("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1") -#define TZ_America_Goose_Bay ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_America_Grand_Turk ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Grenada ("AST4") -#define TZ_America_Guadeloupe ("AST4") -#define TZ_America_Guatemala ("CST6") -#define TZ_America_Guayaquil ("<-05>5") -#define TZ_America_Guyana ("<-04>4") -#define TZ_America_Halifax ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_America_Havana ("CST5CDT,M3.2.0/0,M11.1.0/1") -#define TZ_America_Hermosillo ("MST7") -#define TZ_America_Indiana_Indianapolis ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Knox ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Marengo ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Petersburg ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Tell_City ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Vevay ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Vincennes ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Indiana_Winamac ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Inuvik ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Iqaluit ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Jamaica ("EST5") -#define TZ_America_Juneau ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_Kentucky_Louisville ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Kentucky_Monticello ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Kralendijk ("AST4") -#define TZ_America_La_Paz ("<-04>4") -#define TZ_America_Lima ("<-05>5") -#define TZ_America_Los_Angeles ("PST8PDT,M3.2.0,M11.1.0") -#define TZ_America_Lower_Princes ("AST4") -#define TZ_America_Maceio ("<-03>3") -#define TZ_America_Managua ("CST6") -#define TZ_America_Manaus ("<-04>4") -#define TZ_America_Marigot ("AST4") -#define TZ_America_Martinique ("AST4") -#define TZ_America_Matamoros ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Mazatlan ("MST7MDT,M4.1.0,M10.5.0") -#define TZ_America_Menominee ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Merida ("CST6CDT,M4.1.0,M10.5.0") -#define TZ_America_Metlakatla ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_Mexico_City ("CST6CDT,M4.1.0,M10.5.0") -#define TZ_America_Miquelon ("<-03>3<-02>,M3.2.0,M11.1.0") -#define TZ_America_Moncton ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_America_Monterrey ("CST6CDT,M4.1.0,M10.5.0") -#define TZ_America_Montevideo ("<-03>3") -#define TZ_America_Montreal ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Montserrat ("AST4") -#define TZ_America_Nassau ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_New_York ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Nipigon ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Nome ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_Noronha ("<-02>2") -#define TZ_America_North_Dakota_Beulah ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_North_Dakota_Center ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_North_Dakota_New_Salem ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Ojinaga ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_America_Panama ("EST5") -#define TZ_America_Pangnirtung ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Paramaribo ("<-03>3") -#define TZ_America_Phoenix ("MST7") -#define TZ_America_PortmaumPrince ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Port_of_Spain ("AST4") -#define TZ_America_Porto_Velho ("<-04>4") -#define TZ_America_Puerto_Rico ("AST4") -#define TZ_America_Punta_Arenas ("<-03>3") -#define TZ_America_Rainy_River ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Rankin_Inlet ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Recife ("<-03>3") -#define TZ_America_Regina ("CST6") -#define TZ_America_Resolute ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Rio_Branco ("<-05>5") -#define TZ_America_Santarem ("<-03>3") -#define TZ_America_Santiago ("<-04>4<-03>,M9.1.6/24,M4.1.6/24") -#define TZ_America_Santo_Domingo ("AST4") -#define TZ_America_Sao_Paulo ("<-03>3") -#define TZ_America_Scoresbysund ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") -#define TZ_America_Sitka ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_St_Barthelemy ("AST4") -#define TZ_America_St_Johns ("NST3:30NDT,M3.2.0,M11.1.0") -#define TZ_America_St_Kitts ("AST4") -#define TZ_America_St_Lucia ("AST4") -#define TZ_America_St_Thomas ("AST4") -#define TZ_America_St_Vincent ("AST4") -#define TZ_America_Swift_Current ("CST6") -#define TZ_America_Tegucigalpa ("CST6") -#define TZ_America_Thule ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_America_Thunder_Bay ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Tijuana ("PST8PDT,M3.2.0,M11.1.0") -#define TZ_America_Toronto ("EST5EDT,M3.2.0,M11.1.0") -#define TZ_America_Tortola ("AST4") -#define TZ_America_Vancouver ("PST8PDT,M3.2.0,M11.1.0") -#define TZ_America_Whitehorse ("MST7") -#define TZ_America_Winnipeg ("CST6CDT,M3.2.0,M11.1.0") -#define TZ_America_Yakutat ("AKST9AKDT,M3.2.0,M11.1.0") -#define TZ_America_Yellowknife ("MST7MDT,M3.2.0,M11.1.0") -#define TZ_Antarctica_Casey ("<+11>-11") -#define TZ_Antarctica_Davis ("<+07>-7") -#define TZ_Antarctica_DumontDUrville ("<+10>-10") -#define TZ_Antarctica_Macquarie ("AEST-10AEDT,M10.1.0,M4.1.0/3") -#define TZ_Antarctica_Mawson ("<+05>-5") -#define TZ_Antarctica_McMurdo ("NZST-12NZDT,M9.5.0,M4.1.0/3") -#define TZ_Antarctica_Palmer ("<-03>3") -#define TZ_Antarctica_Rothera ("<-03>3") -#define TZ_Antarctica_Syowa ("<+03>-3") -#define TZ_Antarctica_Troll ("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3") -#define TZ_Antarctica_Vostok ("<+06>-6") -#define TZ_Arctic_Longyearbyen ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Asia_Aden ("<+03>-3") -#define TZ_Asia_Almaty ("<+06>-6") -#define TZ_Asia_Amman ("EET-2EEST,M3.5.4/24,M10.5.5/1") -#define TZ_Asia_Anadyr ("<+12>-12") -#define TZ_Asia_Aqtau ("<+05>-5") -#define TZ_Asia_Aqtobe ("<+05>-5") -#define TZ_Asia_Ashgabat ("<+05>-5") -#define TZ_Asia_Atyrau ("<+05>-5") -#define TZ_Asia_Baghdad ("<+03>-3") -#define TZ_Asia_Bahrain ("<+03>-3") -#define TZ_Asia_Baku ("<+04>-4") -#define TZ_Asia_Bangkok ("<+07>-7") -#define TZ_Asia_Barnaul ("<+07>-7") -#define TZ_Asia_Beirut ("EET-2EEST,M3.5.0/0,M10.5.0/0") -#define TZ_Asia_Bishkek ("<+06>-6") -#define TZ_Asia_Brunei ("<+08>-8") -#define TZ_Asia_Chita ("<+09>-9") -#define TZ_Asia_Choibalsan ("<+08>-8") -#define TZ_Asia_Colombo ("<+0530>-5:30") -#define TZ_Asia_Damascus ("EET-2EEST,M3.5.5/0,M10.5.5/0") -#define TZ_Asia_Dhaka ("<+06>-6") -#define TZ_Asia_Dili ("<+09>-9") -#define TZ_Asia_Dubai ("<+04>-4") -#define TZ_Asia_Dushanbe ("<+05>-5") -#define TZ_Asia_Famagusta ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Asia_Gaza ("EET-2EEST,M3.4.4/48,M10.4.4/49") -#define TZ_Asia_Hebron ("EET-2EEST,M3.4.4/48,M10.4.4/49") -#define TZ_Asia_Ho_Chi_Minh ("<+07>-7") -#define TZ_Asia_Hong_Kong ("HKT-8") -#define TZ_Asia_Hovd ("<+07>-7") -#define TZ_Asia_Irkutsk ("<+08>-8") -#define TZ_Asia_Jakarta ("WIB-7") -#define TZ_Asia_Jayapura ("WIT-9") -#define TZ_Asia_Jerusalem ("IST-2IDT,M3.4.4/26,M10.5.0") -#define TZ_Asia_Kabul ("<+0430>-4:30") -#define TZ_Asia_Kamchatka ("<+12>-12") -#define TZ_Asia_Karachi ("PKT-5") -#define TZ_Asia_Kathmandu ("<+0545>-5:45") -#define TZ_Asia_Khandyga ("<+09>-9") -#define TZ_Asia_Kolkata ("IST-5:30") -#define TZ_Asia_Krasnoyarsk ("<+07>-7") -#define TZ_Asia_Kuala_Lumpur ("<+08>-8") -#define TZ_Asia_Kuching ("<+08>-8") -#define TZ_Asia_Kuwait ("<+03>-3") -#define TZ_Asia_Macau ("CST-8") -#define TZ_Asia_Magadan ("<+11>-11") -#define TZ_Asia_Makassar ("WITA-8") -#define TZ_Asia_Manila ("PST-8") -#define TZ_Asia_Muscat ("<+04>-4") -#define TZ_Asia_Nicosia ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Asia_Novokuznetsk ("<+07>-7") -#define TZ_Asia_Novosibirsk ("<+07>-7") -#define TZ_Asia_Omsk ("<+06>-6") -#define TZ_Asia_Oral ("<+05>-5") -#define TZ_Asia_Phnom_Penh ("<+07>-7") -#define TZ_Asia_Pontianak ("WIB-7") -#define TZ_Asia_Pyongyang ("KST-9") -#define TZ_Asia_Qatar ("<+03>-3") -#define TZ_Asia_Qyzylorda ("<+05>-5") -#define TZ_Asia_Riyadh ("<+03>-3") -#define TZ_Asia_Sakhalin ("<+11>-11") -#define TZ_Asia_Samarkand ("<+05>-5") -#define TZ_Asia_Seoul ("KST-9") -#define TZ_Asia_Shanghai ("CST-8") -#define TZ_Asia_Singapore ("<+08>-8") -#define TZ_Asia_Srednekolymsk ("<+11>-11") -#define TZ_Asia_Taipei ("CST-8") -#define TZ_Asia_Tashkent ("<+05>-5") -#define TZ_Asia_Tbilisi ("<+04>-4") -#define TZ_Asia_Tehran ("<+0330>-3:30<+0430>,J79/24,J263/24") -#define TZ_Asia_Thimphu ("<+06>-6") -#define TZ_Asia_Tokyo ("JST-9") -#define TZ_Asia_Tomsk ("<+07>-7") -#define TZ_Asia_Ulaanbaatar ("<+08>-8") -#define TZ_Asia_Urumqi ("<+06>-6") -#define TZ_Asia_UstmNera ("<+10>-10") -#define TZ_Asia_Vientiane ("<+07>-7") -#define TZ_Asia_Vladivostok ("<+10>-10") -#define TZ_Asia_Yakutsk ("<+09>-9") -#define TZ_Asia_Yangon ("<+0630>-6:30") -#define TZ_Asia_Yekaterinburg ("<+05>-5") -#define TZ_Asia_Yerevan ("<+04>-4") -#define TZ_Atlantic_Azores ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") -#define TZ_Atlantic_Bermuda ("AST4ADT,M3.2.0,M11.1.0") -#define TZ_Atlantic_Canary ("WET0WEST,M3.5.0/1,M10.5.0") -#define TZ_Atlantic_Cape_Verde ("<-01>1") -#define TZ_Atlantic_Faroe ("WET0WEST,M3.5.0/1,M10.5.0") -#define TZ_Atlantic_Madeira ("WET0WEST,M3.5.0/1,M10.5.0") -#define TZ_Atlantic_Reykjavik ("GMT0") -#define TZ_Atlantic_South_Georgia ("<-02>2") -#define TZ_Atlantic_Stanley ("<-03>3") -#define TZ_Atlantic_St_Helena ("GMT0") -#define TZ_Australia_Adelaide ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") -#define TZ_Australia_Brisbane ("AEST-10") -#define TZ_Australia_Broken_Hill ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") -#define TZ_Australia_Currie ("AEST-10AEDT,M10.1.0,M4.1.0/3") -#define TZ_Australia_Darwin ("ACST-9:30") -#define TZ_Australia_Eucla ("<+0845>-8:45") -#define TZ_Australia_Hobart ("AEST-10AEDT,M10.1.0,M4.1.0/3") -#define TZ_Australia_Lindeman ("AEST-10") -#define TZ_Australia_Lord_Howe ("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0") -#define TZ_Australia_Melbourne ("AEST-10AEDT,M10.1.0,M4.1.0/3") -#define TZ_Australia_Perth ("AWST-8") -#define TZ_Australia_Sydney ("AEST-10AEDT,M10.1.0,M4.1.0/3") -#define TZ_Europe_Amsterdam ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Andorra ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Astrakhan ("<+04>-4") -#define TZ_Europe_Athens ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Belgrade ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Berlin ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Bratislava ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Brussels ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Bucharest ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Budapest ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Busingen ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Chisinau ("EET-2EEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Copenhagen ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Dublin ("IST-1GMT0,M10.5.0,M3.5.0/1") -#define TZ_Europe_Gibraltar ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Guernsey ("GMT0BST,M3.5.0/1,M10.5.0") -#define TZ_Europe_Helsinki ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Isle_of_Man ("GMT0BST,M3.5.0/1,M10.5.0") -#define TZ_Europe_Istanbul ("<+03>-3") -#define TZ_Europe_Jersey ("GMT0BST,M3.5.0/1,M10.5.0") -#define TZ_Europe_Kaliningrad ("EET-2") -#define TZ_Europe_Kiev ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Kirov ("<+03>-3") -#define TZ_Europe_Lisbon ("WET0WEST,M3.5.0/1,M10.5.0") -#define TZ_Europe_Ljubljana ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_London ("GMT0BST,M3.5.0/1,M10.5.0") -#define TZ_Europe_Luxembourg ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Madrid ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Malta ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Mariehamn ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Minsk ("<+03>-3") -#define TZ_Europe_Monaco ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Moscow ("MSK-3") -#define TZ_Europe_Oslo ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Paris ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Podgorica ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Prague ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Riga ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Rome ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Samara ("<+04>-4") -#define TZ_Europe_San_Marino ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Sarajevo ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Saratov ("<+04>-4") -#define TZ_Europe_Simferopol ("MSK-3") -#define TZ_Europe_Skopje ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Sofia ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Stockholm ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Tallinn ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Tirane ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Ulyanovsk ("<+04>-4") -#define TZ_Europe_Uzhgorod ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Vaduz ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Vatican ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Vienna ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Vilnius ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Volgograd ("<+04>-4") -#define TZ_Europe_Warsaw ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Zagreb ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Europe_Zaporozhye ("EET-2EEST,M3.5.0/3,M10.5.0/4") -#define TZ_Europe_Zurich ("CET-1CEST,M3.5.0,M10.5.0/3") -#define TZ_Indian_Antananarivo ("EAT-3") -#define TZ_Indian_Chagos ("<+06>-6") -#define TZ_Indian_Christmas ("<+07>-7") -#define TZ_Indian_Cocos ("<+0630>-6:30") -#define TZ_Indian_Comoro ("EAT-3") -#define TZ_Indian_Kerguelen ("<+05>-5") -#define TZ_Indian_Mahe ("<+04>-4") -#define TZ_Indian_Maldives ("<+05>-5") -#define TZ_Indian_Mauritius ("<+04>-4") -#define TZ_Indian_Mayotte ("EAT-3") -#define TZ_Indian_Reunion ("<+04>-4") -#define TZ_Pacific_Apia ("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") -#define TZ_Pacific_Auckland ("NZST-12NZDT,M9.5.0,M4.1.0/3") -#define TZ_Pacific_Bougainville ("<+11>-11") -#define TZ_Pacific_Chatham ("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45") -#define TZ_Pacific_Chuuk ("<+10>-10") -#define TZ_Pacific_Easter ("<-06>6<-05>,M9.1.6/22,M4.1.6/22") -#define TZ_Pacific_Efate ("<+11>-11") -#define TZ_Pacific_Enderbury ("<+13>-13") -#define TZ_Pacific_Fakaofo ("<+13>-13") -#define TZ_Pacific_Fiji ("<+12>-12<+13>,M11.2.0,M1.2.3/99") -#define TZ_Pacific_Funafuti ("<+12>-12") -#define TZ_Pacific_Galapagos ("<-06>6") -#define TZ_Pacific_Gambier ("<-09>9") -#define TZ_Pacific_Guadalcanal ("<+11>-11") -#define TZ_Pacific_Guam ("ChST-10") -#define TZ_Pacific_Honolulu ("HST10") -#define TZ_Pacific_Kiritimati ("<+14>-14") -#define TZ_Pacific_Kosrae ("<+11>-11") -#define TZ_Pacific_Kwajalein ("<+12>-12") -#define TZ_Pacific_Majuro ("<+12>-12") -#define TZ_Pacific_Marquesas ("<-0930>9:30") -#define TZ_Pacific_Midway ("SST11") -#define TZ_Pacific_Nauru ("<+12>-12") -#define TZ_Pacific_Niue ("<-11>11") -#define TZ_Pacific_Norfolk ("<+11>-11<+12>,M10.1.0,M4.1.0/3") -#define TZ_Pacific_Noumea ("<+11>-11") -#define TZ_Pacific_Pago_Pago ("SST11") -#define TZ_Pacific_Palau ("<+09>-9") -#define TZ_Pacific_Pitcairn ("<-08>8") -#define TZ_Pacific_Pohnpei ("<+11>-11") -#define TZ_Pacific_Port_Moresby ("<+10>-10") -#define TZ_Pacific_Rarotonga ("<-10>10") -#define TZ_Pacific_Saipan ("ChST-10") -#define TZ_Pacific_Tahiti ("<-10>10") -#define TZ_Pacific_Tarawa ("<+12>-12") -#define TZ_Pacific_Tongatapu ("<+13>-13") -#define TZ_Pacific_Wake ("<+12>-12") -#define TZ_Pacific_Wallis ("<+12>-12") -#define TZ_Etc_GMT ("GMT0") -#define TZ_Etc_GMTm0 ("GMT0") -#define TZ_Etc_GMTm1 ("<+01>-1") -#define TZ_Etc_GMTm2 ("<+02>-2") -#define TZ_Etc_GMTm3 ("<+03>-3") -#define TZ_Etc_GMTm4 ("<+04>-4") -#define TZ_Etc_GMTm5 ("<+05>-5") -#define TZ_Etc_GMTm6 ("<+06>-6") -#define TZ_Etc_GMTm7 ("<+07>-7") -#define TZ_Etc_GMTm8 ("<+08>-8") -#define TZ_Etc_GMTm9 ("<+09>-9") -#define TZ_Etc_GMTm10 ("<+10>-10") -#define TZ_Etc_GMTm11 ("<+11>-11") -#define TZ_Etc_GMTm12 ("<+12>-12") -#define TZ_Etc_GMTm13 ("<+13>-13") -#define TZ_Etc_GMTm14 ("<+14>-14") -#define TZ_Etc_GMT0 ("GMT0") -#define TZ_Etc_GMTp0 ("GMT0") -#define TZ_Etc_GMTp1 ("<-01>1") -#define TZ_Etc_GMTp2 ("<-02>2") -#define TZ_Etc_GMTp3 ("<-03>3") -#define TZ_Etc_GMTp4 ("<-04>4") -#define TZ_Etc_GMTp5 ("<-05>5") -#define TZ_Etc_GMTp6 ("<-06>6") -#define TZ_Etc_GMTp7 ("<-07>7") -#define TZ_Etc_GMTp8 ("<-08>8") -#define TZ_Etc_GMTp9 ("<-09>9") -#define TZ_Etc_GMTp10 ("<-10>10") -#define TZ_Etc_GMTp11 ("<-11>11") -#define TZ_Etc_GMTp12 ("<-12>12") -#define TZ_Etc_UCT ("UTC0") -#define TZ_Etc_UTC ("UTC0") -#define TZ_Etc_Greenwich ("GMT0") -#define TZ_Etc_Universal ("UTC0") -#define TZ_Etc_Zulu ("UTC0") +#define TZ_Africa_Abidjan ("GMT0") +#define TZ_Africa_Accra ("GMT0") +#define TZ_Africa_Addis_Ababa ("EAT-3") +#define TZ_Africa_Algiers ("CET-1") +#define TZ_Africa_Asmara ("EAT-3") +#define TZ_Africa_Bamako ("GMT0") +#define TZ_Africa_Bangui ("WAT-1") +#define TZ_Africa_Banjul ("GMT0") +#define TZ_Africa_Bissau ("GMT0") +#define TZ_Africa_Blantyre ("CAT-2") +#define TZ_Africa_Brazzaville ("WAT-1") +#define TZ_Africa_Bujumbura ("CAT-2") +#define TZ_Africa_Cairo ("EET-2") +#define TZ_Africa_Casablanca ("<+01>-1") +#define TZ_Africa_Ceuta ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Africa_Conakry ("GMT0") +#define TZ_Africa_Dakar ("GMT0") +#define TZ_Africa_Dar_es_Salaam ("EAT-3") +#define TZ_Africa_Djibouti ("EAT-3") +#define TZ_Africa_Douala ("WAT-1") +#define TZ_Africa_El_Aaiun ("<+01>-1") +#define TZ_Africa_Freetown ("GMT0") +#define TZ_Africa_Gaborone ("CAT-2") +#define TZ_Africa_Harare ("CAT-2") +#define TZ_Africa_Johannesburg ("SAST-2") +#define TZ_Africa_Juba ("EAT-3") +#define TZ_Africa_Kampala ("EAT-3") +#define TZ_Africa_Khartoum ("CAT-2") +#define TZ_Africa_Kigali ("CAT-2") +#define TZ_Africa_Kinshasa ("WAT-1") +#define TZ_Africa_Lagos ("WAT-1") +#define TZ_Africa_Libreville ("WAT-1") +#define TZ_Africa_Lome ("GMT0") +#define TZ_Africa_Luanda ("WAT-1") +#define TZ_Africa_Lubumbashi ("CAT-2") +#define TZ_Africa_Lusaka ("CAT-2") +#define TZ_Africa_Malabo ("WAT-1") +#define TZ_Africa_Maputo ("CAT-2") +#define TZ_Africa_Maseru ("SAST-2") +#define TZ_Africa_Mbabane ("SAST-2") +#define TZ_Africa_Mogadishu ("EAT-3") +#define TZ_Africa_Monrovia ("GMT0") +#define TZ_Africa_Nairobi ("EAT-3") +#define TZ_Africa_Ndjamena ("WAT-1") +#define TZ_Africa_Niamey ("WAT-1") +#define TZ_Africa_Nouakchott ("GMT0") +#define TZ_Africa_Ouagadougou ("GMT0") +#define TZ_Africa_PortomNovo ("WAT-1") +#define TZ_Africa_Sao_Tome ("GMT0") +#define TZ_Africa_Tripoli ("EET-2") +#define TZ_Africa_Tunis ("CET-1") +#define TZ_Africa_Windhoek ("CAT-2") +#define TZ_America_Adak ("HST10HDT,M3.2.0,M11.1.0") +#define TZ_America_Anchorage ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Anguilla ("AST4") +#define TZ_America_Antigua ("AST4") +#define TZ_America_Araguaina ("<-03>3") +#define TZ_America_Argentina_Buenos_Aires ("<-03>3") +#define TZ_America_Argentina_Catamarca ("<-03>3") +#define TZ_America_Argentina_Cordoba ("<-03>3") +#define TZ_America_Argentina_Jujuy ("<-03>3") +#define TZ_America_Argentina_La_Rioja ("<-03>3") +#define TZ_America_Argentina_Mendoza ("<-03>3") +#define TZ_America_Argentina_Rio_Gallegos ("<-03>3") +#define TZ_America_Argentina_Salta ("<-03>3") +#define TZ_America_Argentina_San_Juan ("<-03>3") +#define TZ_America_Argentina_San_Luis ("<-03>3") +#define TZ_America_Argentina_Tucuman ("<-03>3") +#define TZ_America_Argentina_Ushuaia ("<-03>3") +#define TZ_America_Aruba ("AST4") +#define TZ_America_Asuncion ("<-04>4<-03>,M10.1.0/0,M3.4.0/0") +#define TZ_America_Atikokan ("EST5") +#define TZ_America_Bahia ("<-03>3") +#define TZ_America_Bahia_Banderas ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Barbados ("AST4") +#define TZ_America_Belem ("<-03>3") +#define TZ_America_Belize ("CST6") +#define TZ_America_BlancmSablon ("AST4") +#define TZ_America_Boa_Vista ("<-04>4") +#define TZ_America_Bogota ("<-05>5") +#define TZ_America_Boise ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Cambridge_Bay ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Campo_Grande ("<-04>4") +#define TZ_America_Cancun ("EST5") +#define TZ_America_Caracas ("<-04>4") +#define TZ_America_Cayenne ("<-03>3") +#define TZ_America_Cayman ("EST5") +#define TZ_America_Chicago ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Chihuahua ("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Costa_Rica ("CST6") +#define TZ_America_Creston ("MST7") +#define TZ_America_Cuiaba ("<-04>4") +#define TZ_America_Curacao ("AST4") +#define TZ_America_Danmarkshavn ("GMT0") +#define TZ_America_Dawson ("MST7") +#define TZ_America_Dawson_Creek ("MST7") +#define TZ_America_Denver ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Detroit ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Dominica ("AST4") +#define TZ_America_Edmonton ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Eirunepe ("<-05>5") +#define TZ_America_El_Salvador ("CST6") +#define TZ_America_Fortaleza ("<-03>3") +#define TZ_America_Fort_Nelson ("MST7") +#define TZ_America_Glace_Bay ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Godthab ("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1") +#define TZ_America_Goose_Bay ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Grand_Turk ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Grenada ("AST4") +#define TZ_America_Guadeloupe ("AST4") +#define TZ_America_Guatemala ("CST6") +#define TZ_America_Guayaquil ("<-05>5") +#define TZ_America_Guyana ("<-04>4") +#define TZ_America_Halifax ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Havana ("CST5CDT,M3.2.0/0,M11.1.0/1") +#define TZ_America_Hermosillo ("MST7") +#define TZ_America_Indiana_Indianapolis ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Knox ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Marengo ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Petersburg ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Tell_City ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vevay ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vincennes ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Winamac ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Inuvik ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Iqaluit ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Jamaica ("EST5") +#define TZ_America_Juneau ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Louisville ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Monticello ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kralendijk ("AST4") +#define TZ_America_La_Paz ("<-04>4") +#define TZ_America_Lima ("<-05>5") +#define TZ_America_Los_Angeles ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Lower_Princes ("AST4") +#define TZ_America_Maceio ("<-03>3") +#define TZ_America_Managua ("CST6") +#define TZ_America_Manaus ("<-04>4") +#define TZ_America_Marigot ("AST4") +#define TZ_America_Martinique ("AST4") +#define TZ_America_Matamoros ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Mazatlan ("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Menominee ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Merida ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Metlakatla ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Mexico_City ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Miquelon ("<-03>3<-02>,M3.2.0,M11.1.0") +#define TZ_America_Moncton ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Monterrey ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Montevideo ("<-03>3") +#define TZ_America_Montreal ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Montserrat ("AST4") +#define TZ_America_Nassau ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_New_York ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nipigon ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nome ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Noronha ("<-02>2") +#define TZ_America_North_Dakota_Beulah ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_Center ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_New_Salem ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Ojinaga ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Panama ("EST5") +#define TZ_America_Pangnirtung ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Paramaribo ("<-03>3") +#define TZ_America_Phoenix ("MST7") +#define TZ_America_PortmaumPrince ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Port_of_Spain ("AST4") +#define TZ_America_Porto_Velho ("<-04>4") +#define TZ_America_Puerto_Rico ("AST4") +#define TZ_America_Punta_Arenas ("<-03>3") +#define TZ_America_Rainy_River ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rankin_Inlet ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Recife ("<-03>3") +#define TZ_America_Regina ("CST6") +#define TZ_America_Resolute ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rio_Branco ("<-05>5") +#define TZ_America_Santarem ("<-03>3") +#define TZ_America_Santiago ("<-04>4<-03>,M9.1.6/24,M4.1.6/24") +#define TZ_America_Santo_Domingo ("AST4") +#define TZ_America_Sao_Paulo ("<-03>3") +#define TZ_America_Scoresbysund ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_America_Sitka ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_St_Barthelemy ("AST4") +#define TZ_America_St_Johns ("NST3:30NDT,M3.2.0,M11.1.0") +#define TZ_America_St_Kitts ("AST4") +#define TZ_America_St_Lucia ("AST4") +#define TZ_America_St_Thomas ("AST4") +#define TZ_America_St_Vincent ("AST4") +#define TZ_America_Swift_Current ("CST6") +#define TZ_America_Tegucigalpa ("CST6") +#define TZ_America_Thule ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Thunder_Bay ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tijuana ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Toronto ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tortola ("AST4") +#define TZ_America_Vancouver ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Whitehorse ("MST7") +#define TZ_America_Winnipeg ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Yakutat ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Yellowknife ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_Antarctica_Casey ("<+11>-11") +#define TZ_Antarctica_Davis ("<+07>-7") +#define TZ_Antarctica_DumontDUrville ("<+10>-10") +#define TZ_Antarctica_Macquarie ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Antarctica_Mawson ("<+05>-5") +#define TZ_Antarctica_McMurdo ("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Antarctica_Palmer ("<-03>3") +#define TZ_Antarctica_Rothera ("<-03>3") +#define TZ_Antarctica_Syowa ("<+03>-3") +#define TZ_Antarctica_Troll ("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3") +#define TZ_Antarctica_Vostok ("<+06>-6") +#define TZ_Arctic_Longyearbyen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Asia_Aden ("<+03>-3") +#define TZ_Asia_Almaty ("<+06>-6") +#define TZ_Asia_Amman ("EET-2EEST,M3.5.4/24,M10.5.5/1") +#define TZ_Asia_Anadyr ("<+12>-12") +#define TZ_Asia_Aqtau ("<+05>-5") +#define TZ_Asia_Aqtobe ("<+05>-5") +#define TZ_Asia_Ashgabat ("<+05>-5") +#define TZ_Asia_Atyrau ("<+05>-5") +#define TZ_Asia_Baghdad ("<+03>-3") +#define TZ_Asia_Bahrain ("<+03>-3") +#define TZ_Asia_Baku ("<+04>-4") +#define TZ_Asia_Bangkok ("<+07>-7") +#define TZ_Asia_Barnaul ("<+07>-7") +#define TZ_Asia_Beirut ("EET-2EEST,M3.5.0/0,M10.5.0/0") +#define TZ_Asia_Bishkek ("<+06>-6") +#define TZ_Asia_Brunei ("<+08>-8") +#define TZ_Asia_Chita ("<+09>-9") +#define TZ_Asia_Choibalsan ("<+08>-8") +#define TZ_Asia_Colombo ("<+0530>-5:30") +#define TZ_Asia_Damascus ("EET-2EEST,M3.5.5/0,M10.5.5/0") +#define TZ_Asia_Dhaka ("<+06>-6") +#define TZ_Asia_Dili ("<+09>-9") +#define TZ_Asia_Dubai ("<+04>-4") +#define TZ_Asia_Dushanbe ("<+05>-5") +#define TZ_Asia_Famagusta ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Gaza ("EET-2EEST,M3.4.4/48,M10.4.4/49") +#define TZ_Asia_Hebron ("EET-2EEST,M3.4.4/48,M10.4.4/49") +#define TZ_Asia_Ho_Chi_Minh ("<+07>-7") +#define TZ_Asia_Hong_Kong ("HKT-8") +#define TZ_Asia_Hovd ("<+07>-7") +#define TZ_Asia_Irkutsk ("<+08>-8") +#define TZ_Asia_Jakarta ("WIB-7") +#define TZ_Asia_Jayapura ("WIT-9") +#define TZ_Asia_Jerusalem ("IST-2IDT,M3.4.4/26,M10.5.0") +#define TZ_Asia_Kabul ("<+0430>-4:30") +#define TZ_Asia_Kamchatka ("<+12>-12") +#define TZ_Asia_Karachi ("PKT-5") +#define TZ_Asia_Kathmandu ("<+0545>-5:45") +#define TZ_Asia_Khandyga ("<+09>-9") +#define TZ_Asia_Kolkata ("IST-5:30") +#define TZ_Asia_Krasnoyarsk ("<+07>-7") +#define TZ_Asia_Kuala_Lumpur ("<+08>-8") +#define TZ_Asia_Kuching ("<+08>-8") +#define TZ_Asia_Kuwait ("<+03>-3") +#define TZ_Asia_Macau ("CST-8") +#define TZ_Asia_Magadan ("<+11>-11") +#define TZ_Asia_Makassar ("WITA-8") +#define TZ_Asia_Manila ("PST-8") +#define TZ_Asia_Muscat ("<+04>-4") +#define TZ_Asia_Nicosia ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Novokuznetsk ("<+07>-7") +#define TZ_Asia_Novosibirsk ("<+07>-7") +#define TZ_Asia_Omsk ("<+06>-6") +#define TZ_Asia_Oral ("<+05>-5") +#define TZ_Asia_Phnom_Penh ("<+07>-7") +#define TZ_Asia_Pontianak ("WIB-7") +#define TZ_Asia_Pyongyang ("KST-9") +#define TZ_Asia_Qatar ("<+03>-3") +#define TZ_Asia_Qyzylorda ("<+05>-5") +#define TZ_Asia_Riyadh ("<+03>-3") +#define TZ_Asia_Sakhalin ("<+11>-11") +#define TZ_Asia_Samarkand ("<+05>-5") +#define TZ_Asia_Seoul ("KST-9") +#define TZ_Asia_Shanghai ("CST-8") +#define TZ_Asia_Singapore ("<+08>-8") +#define TZ_Asia_Srednekolymsk ("<+11>-11") +#define TZ_Asia_Taipei ("CST-8") +#define TZ_Asia_Tashkent ("<+05>-5") +#define TZ_Asia_Tbilisi ("<+04>-4") +#define TZ_Asia_Tehran ("<+0330>-3:30<+0430>,J79/24,J263/24") +#define TZ_Asia_Thimphu ("<+06>-6") +#define TZ_Asia_Tokyo ("JST-9") +#define TZ_Asia_Tomsk ("<+07>-7") +#define TZ_Asia_Ulaanbaatar ("<+08>-8") +#define TZ_Asia_Urumqi ("<+06>-6") +#define TZ_Asia_UstmNera ("<+10>-10") +#define TZ_Asia_Vientiane ("<+07>-7") +#define TZ_Asia_Vladivostok ("<+10>-10") +#define TZ_Asia_Yakutsk ("<+09>-9") +#define TZ_Asia_Yangon ("<+0630>-6:30") +#define TZ_Asia_Yekaterinburg ("<+05>-5") +#define TZ_Asia_Yerevan ("<+04>-4") +#define TZ_Atlantic_Azores ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_Atlantic_Bermuda ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_Atlantic_Canary ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Cape_Verde ("<-01>1") +#define TZ_Atlantic_Faroe ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Madeira ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Reykjavik ("GMT0") +#define TZ_Atlantic_South_Georgia ("<-02>2") +#define TZ_Atlantic_Stanley ("<-03>3") +#define TZ_Atlantic_St_Helena ("GMT0") +#define TZ_Australia_Adelaide ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Brisbane ("AEST-10") +#define TZ_Australia_Broken_Hill ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Currie ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Darwin ("ACST-9:30") +#define TZ_Australia_Eucla ("<+0845>-8:45") +#define TZ_Australia_Hobart ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Lindeman ("AEST-10") +#define TZ_Australia_Lord_Howe ("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0") +#define TZ_Australia_Melbourne ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Perth ("AWST-8") +#define TZ_Australia_Sydney ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Europe_Amsterdam ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Andorra ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Astrakhan ("<+04>-4") +#define TZ_Europe_Athens ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Belgrade ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Berlin ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bratislava ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Brussels ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bucharest ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Budapest ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Busingen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Chisinau ("EET-2EEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Copenhagen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Dublin ("IST-1GMT0,M10.5.0,M3.5.0/1") +#define TZ_Europe_Gibraltar ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Guernsey ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Helsinki ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Isle_of_Man ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Istanbul ("<+03>-3") +#define TZ_Europe_Jersey ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Kaliningrad ("EET-2") +#define TZ_Europe_Kiev ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Kirov ("<+03>-3") +#define TZ_Europe_Lisbon ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Ljubljana ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_London ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Luxembourg ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Madrid ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Malta ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Mariehamn ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Minsk ("<+03>-3") +#define TZ_Europe_Monaco ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Moscow ("MSK-3") +#define TZ_Europe_Oslo ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Paris ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Podgorica ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Prague ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Riga ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Rome ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Samara ("<+04>-4") +#define TZ_Europe_San_Marino ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sarajevo ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Saratov ("<+04>-4") +#define TZ_Europe_Simferopol ("MSK-3") +#define TZ_Europe_Skopje ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sofia ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Stockholm ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Tallinn ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Tirane ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Ulyanovsk ("<+04>-4") +#define TZ_Europe_Uzhgorod ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Vaduz ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vatican ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vienna ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vilnius ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Volgograd ("<+04>-4") +#define TZ_Europe_Warsaw ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zagreb ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zaporozhye ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Zurich ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Indian_Antananarivo ("EAT-3") +#define TZ_Indian_Chagos ("<+06>-6") +#define TZ_Indian_Christmas ("<+07>-7") +#define TZ_Indian_Cocos ("<+0630>-6:30") +#define TZ_Indian_Comoro ("EAT-3") +#define TZ_Indian_Kerguelen ("<+05>-5") +#define TZ_Indian_Mahe ("<+04>-4") +#define TZ_Indian_Maldives ("<+05>-5") +#define TZ_Indian_Mauritius ("<+04>-4") +#define TZ_Indian_Mayotte ("EAT-3") +#define TZ_Indian_Reunion ("<+04>-4") +#define TZ_Pacific_Apia ("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") +#define TZ_Pacific_Auckland ("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Pacific_Bougainville ("<+11>-11") +#define TZ_Pacific_Chatham ("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45") +#define TZ_Pacific_Chuuk ("<+10>-10") +#define TZ_Pacific_Easter ("<-06>6<-05>,M9.1.6/22,M4.1.6/22") +#define TZ_Pacific_Efate ("<+11>-11") +#define TZ_Pacific_Enderbury ("<+13>-13") +#define TZ_Pacific_Fakaofo ("<+13>-13") +#define TZ_Pacific_Fiji ("<+12>-12<+13>,M11.2.0,M1.2.3/99") +#define TZ_Pacific_Funafuti ("<+12>-12") +#define TZ_Pacific_Galapagos ("<-06>6") +#define TZ_Pacific_Gambier ("<-09>9") +#define TZ_Pacific_Guadalcanal ("<+11>-11") +#define TZ_Pacific_Guam ("ChST-10") +#define TZ_Pacific_Honolulu ("HST10") +#define TZ_Pacific_Kiritimati ("<+14>-14") +#define TZ_Pacific_Kosrae ("<+11>-11") +#define TZ_Pacific_Kwajalein ("<+12>-12") +#define TZ_Pacific_Majuro ("<+12>-12") +#define TZ_Pacific_Marquesas ("<-0930>9:30") +#define TZ_Pacific_Midway ("SST11") +#define TZ_Pacific_Nauru ("<+12>-12") +#define TZ_Pacific_Niue ("<-11>11") +#define TZ_Pacific_Norfolk ("<+11>-11<+12>,M10.1.0,M4.1.0/3") +#define TZ_Pacific_Noumea ("<+11>-11") +#define TZ_Pacific_Pago_Pago ("SST11") +#define TZ_Pacific_Palau ("<+09>-9") +#define TZ_Pacific_Pitcairn ("<-08>8") +#define TZ_Pacific_Pohnpei ("<+11>-11") +#define TZ_Pacific_Port_Moresby ("<+10>-10") +#define TZ_Pacific_Rarotonga ("<-10>10") +#define TZ_Pacific_Saipan ("ChST-10") +#define TZ_Pacific_Tahiti ("<-10>10") +#define TZ_Pacific_Tarawa ("<+12>-12") +#define TZ_Pacific_Tongatapu ("<+13>-13") +#define TZ_Pacific_Wake ("<+12>-12") +#define TZ_Pacific_Wallis ("<+12>-12") +#define TZ_Etc_GMT ("GMT0") +#define TZ_Etc_GMTm0 ("GMT0") +#define TZ_Etc_GMTm1 ("<+01>-1") +#define TZ_Etc_GMTm2 ("<+02>-2") +#define TZ_Etc_GMTm3 ("<+03>-3") +#define TZ_Etc_GMTm4 ("<+04>-4") +#define TZ_Etc_GMTm5 ("<+05>-5") +#define TZ_Etc_GMTm6 ("<+06>-6") +#define TZ_Etc_GMTm7 ("<+07>-7") +#define TZ_Etc_GMTm8 ("<+08>-8") +#define TZ_Etc_GMTm9 ("<+09>-9") +#define TZ_Etc_GMTm10 ("<+10>-10") +#define TZ_Etc_GMTm11 ("<+11>-11") +#define TZ_Etc_GMTm12 ("<+12>-12") +#define TZ_Etc_GMTm13 ("<+13>-13") +#define TZ_Etc_GMTm14 ("<+14>-14") +#define TZ_Etc_GMT0 ("GMT0") +#define TZ_Etc_GMTp0 ("GMT0") +#define TZ_Etc_GMTp1 ("<-01>1") +#define TZ_Etc_GMTp2 ("<-02>2") +#define TZ_Etc_GMTp3 ("<-03>3") +#define TZ_Etc_GMTp4 ("<-04>4") +#define TZ_Etc_GMTp5 ("<-05>5") +#define TZ_Etc_GMTp6 ("<-06>6") +#define TZ_Etc_GMTp7 ("<-07>7") +#define TZ_Etc_GMTp8 ("<-08>8") +#define TZ_Etc_GMTp9 ("<-09>9") +#define TZ_Etc_GMTp10 ("<-10>10") +#define TZ_Etc_GMTp11 ("<-11>11") +#define TZ_Etc_GMTp12 ("<-12>12") +#define TZ_Etc_UCT ("UTC0") +#define TZ_Etc_UTC ("UTC0") +#define TZ_Etc_Greenwich ("GMT0") +#define TZ_Etc_Universal ("UTC0") +#define TZ_Etc_Zulu ("UTC0") //////////////////////////////////////////////////////////// @@ -593,8 +593,8 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Africa/Windhoek", //PSTR("CAT-2") #endif - -#if USING_AMERICA + +#if USING_AMERICA "America/Adak", //PSTR("HST10HDT",M3.2.0",M11.1.0") "America/Anchorage", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") "America/Anguilla", //PSTR("AST4") @@ -745,7 +745,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "America/Yellowknife", //PSTR("MST7MDT",M3.2.0",M11.1.0") #endif -#if USING_ANTARCTICA +#if USING_ANTARCTICA "Antarctica/Casey", //PSTR("<+11>-11") "Antarctica/Davis", //PSTR("<+07>-7") "Antarctica/DumontDUrville", //PSTR("<+10>-10") @@ -760,7 +760,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Arctic/Longyearbyen", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") #endif -#if USING_ASIA +#if USING_ASIA "Asia/Aden", //PSTR("<+03>-3") "Asia/Almaty", //PSTR("<+06>-6") "Asia/Amman", //PSTR("EET-2EEST",M3.5.4/24",M10.5.5/1") @@ -846,7 +846,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = #endif -#if USING_ATLANTIC +#if USING_ATLANTIC "Atlantic/Azores", //PSTR("<-01>1<+00>",M3.5.0/0",M10.5.0/1") "Atlantic/Bermuda", //PSTR("AST4ADT",M3.2.0",M11.1.0") "Atlantic/Canary", //PSTR("WET0WEST",M3.5.0/1",M10.5.0") @@ -859,7 +859,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Atlantic/St_Helena", //PSTR("GMT0") #endif -#if USING_AUSTRALIA +#if USING_AUSTRALIA "Australia/Adelaide", //PSTR("ACST-9:30ACDT",M10.1.0",M4.1.0/3") "Australia/Brisbane", //PSTR("AEST-10") "Australia/Broken_Hill", //PSTR("ACST-9:30ACDT",M10.1.0",M4.1.0/3") @@ -937,7 +937,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Europe/Zurich", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") #endif -#if USING_INDIAN +#if USING_INDIAN "Indian/Antananarivo", //PSTR("EAT-3") "Indian/Chagos", //PSTR("<+06>-6") "Indian/Christmas", //PSTR("<+07>-7") @@ -950,8 +950,8 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Indian/Mayotte", //PSTR("EAT-3") "Indian/Reunion", //PSTR("<+04>-4") #endif - -#if USING_PACIFIC + +#if USING_PACIFIC "Pacific/Apia", //PSTR("<+13>-13<+14>",M9.5.0/3",M4.1.0/4") "Pacific/Auckland", //PSTR("NZST-12NZDT",M9.5.0",M4.1.0/3") "Pacific/Bougainville", //PSTR("<+11>-11") @@ -992,7 +992,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Pacific/Wallis", //PSTR("<+12>-12") #endif -#if USING_ETC_GMT +#if USING_ETC_GMT "Etc/GMT", //PSTR("GMT0") "Etc/GMTm0", //PSTR("GMT0") "Etc/GMTm1", //PSTR("<+01>-1") @@ -1028,7 +1028,7 @@ static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = "Etc/Greenwich", //PSTR("GMT0") "Etc/Universal", //PSTR("UTC0") "Etc/Zulu", //PSTR("UTC0") -#endif +#endif }; //////////////////////////////////////////////////////////// @@ -1091,7 +1091,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = #endif -#if USING_AMERICA +#if USING_AMERICA TZ_America_Adak, //PSTR("HST10HDT,M3.2.0,M11.1.0") TZ_America_Anchorage, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") TZ_America_Anguilla, //PSTR("AST4") @@ -1241,8 +1241,8 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_America_Yakutat, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") TZ_America_Yellowknife, //PSTR("MST7MDT,M3.2.0,M11.1.0") #endif - -#if USING_ANTARCTICA + +#if USING_ANTARCTICA TZ_Antarctica_Casey, //PSTR("<+11>-11") TZ_Antarctica_Davis, //PSTR("<+07>-7") TZ_Antarctica_DumontDUrville, //PSTR("<+10>-10") @@ -1258,7 +1258,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = #endif -#if USING_ASIA +#if USING_ASIA TZ_Asia_Aden, //PSTR("<+03>-3") TZ_Asia_Almaty, //PSTR("<+06>-6") TZ_Asia_Amman, //PSTR("EET-2EEST,M3.5.4/24,M10.5.5/1") @@ -1342,8 +1342,8 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Asia_Yekaterinburg, //PSTR("<+05>-5") TZ_Asia_Yerevan, //PSTR("<+04>-4") #endif - -#if USING_ATLANTIC + +#if USING_ATLANTIC TZ_Atlantic_Azores, //PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1") TZ_Atlantic_Bermuda, //PSTR("AST4ADT,M3.2.0,M11.1.0") TZ_Atlantic_Canary, //PSTR("WET0WEST,M3.5.0/1,M10.5.0") @@ -1356,7 +1356,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Atlantic_St_Helena, //PSTR("GMT0") #endif -#if USING_AUSTRALIA +#if USING_AUSTRALIA TZ_Australia_Adelaide, //PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") TZ_Australia_Brisbane, //PSTR("AEST-10") TZ_Australia_Broken_Hill, //PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") @@ -1371,7 +1371,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Australia_Sydney, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") #endif -#if USING_EUROPE +#if USING_EUROPE TZ_Europe_Amsterdam, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") TZ_Europe_Andorra, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") TZ_Europe_Astrakhan, //PSTR("<+04>-4") @@ -1433,8 +1433,8 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Europe_Zaporozhye, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") TZ_Europe_Zurich, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") #endif - -#if USING_INDIAN + +#if USING_INDIAN TZ_Indian_Antananarivo, //PSTR("EAT-3") TZ_Indian_Chagos, //PSTR("<+06>-6") TZ_Indian_Christmas, //PSTR("<+07>-7") @@ -1449,7 +1449,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = #endif -#if USING_PACIFIC +#if USING_PACIFIC TZ_Pacific_Apia, //PSTR("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") TZ_Pacific_Auckland, //PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3") TZ_Pacific_Bougainville, //PSTR("<+11>-11") @@ -1490,7 +1490,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Pacific_Wallis, //PSTR("<+12>-12") #endif -#if USING_ETC_GMT +#if USING_ETC_GMT TZ_Etc_GMT, //PSTR("GMT0") TZ_Etc_GMTm0, //PSTR("GMT0") TZ_Etc_GMTm1, //PSTR("<+01>-1") @@ -1526,7 +1526,7 @@ static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = TZ_Etc_Greenwich, //PSTR("GMT0") TZ_Etc_Universal, //PSTR("UTC0") TZ_Etc_Zulu, //PSTR("UTC0") -#endif +#endif }; #endif // TZDB_H diff --git a/utils/astyle_library.conf b/utils/astyle_library.conf new file mode 100644 index 0000000..8a73bc2 --- /dev/null +++ b/utils/astyle_library.conf @@ -0,0 +1,70 @@ +# Code formatting rules for Arduino libraries, modified from for KH libraries: +# +# https://github.com/arduino/Arduino/blob/master/build/shared/examples_formatter.conf +# + +# astyle --style=allman -s2 -t2 -C -S -xW -Y -M120 -f -p -xg -H -xb -c --xC120 -xL *.h *.cpp *.ino + +--mode=c +--lineend=linux +--style=allman + +# -r or -R +#--recursive + +# -c => Converts tabs into spaces +convert-tabs + +# -s2 => 2 spaces indentation +--indent=spaces=2 + +# -t2 => tab =2 spaces +#--indent=tab=2 + +# -C +--indent-classes + +# -S +--indent-switches + +# -xW +--indent-preproc-block + +# -Y => indent classes, switches (and cases), comments starting at column 1 +--indent-col1-comments + +# -M120 => maximum of 120 spaces to indent a continuation line +--max-continuation-indent=120 + +# -xC120 => max‑code‑length will break a line if the code exceeds # characters +--max-code-length=120 + +# -f => +--break-blocks + +# -p => put a space around operators +--pad-oper + +# -xg => Insert space padding after commas +--pad-comma + +# -H => put a space after if/for/while +pad-header + +# -xb => Break one line headers (e.g. if/for/while) +--break-one-line-headers + +# -c => Converts tabs into spaces +#--convert-tabs + +# if you like one-liners, keep them +#keep-one-line-statements + +# -xV +--attach-closing-while + +#unpad-paren + +# -xp +remove-comment-prefix + diff --git a/utils/restyle.sh b/utils/restyle.sh new file mode 100644 index 0000000..bcd846f --- /dev/null +++ b/utils/restyle.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for dir in . ; do + find $dir -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.ino" \) -exec astyle --suffix=none --options=./utils/astyle_library.conf \{\} \; +done +