esphome 2025.9.0b1__py3-none-any.whl → 2025.9.0b3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. esphome/__main__.py +146 -68
  2. esphome/components/adc/__init__.py +1 -26
  3. esphome/components/adc/sensor.py +20 -0
  4. esphome/components/ade7880/ade7880.cpp +1 -1
  5. esphome/components/api/api_connection.cpp +4 -11
  6. esphome/components/api/api_connection.h +0 -1
  7. esphome/components/api/api_pb2.cpp +0 -8
  8. esphome/components/api/api_pb2.h +0 -4
  9. esphome/components/api/api_pb2_dump.cpp +1 -7
  10. esphome/components/api/api_pb2_service.cpp +0 -14
  11. esphome/components/api/api_pb2_service.h +1 -3
  12. esphome/components/api/client.py +5 -3
  13. esphome/components/bluetooth_proxy/bluetooth_proxy.h +3 -1
  14. esphome/components/captive_portal/captive_index.h +77 -97
  15. esphome/components/esp32_ble/ble_uuid.cpp +30 -9
  16. esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +4 -3
  17. esphome/components/esp32_ble_client/ble_client_base.h +8 -5
  18. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +2 -3
  19. esphome/components/ethernet/__init__.py +11 -0
  20. esphome/components/ethernet/ethernet_component.cpp +52 -2
  21. esphome/components/ethernet/ethernet_component.h +4 -0
  22. esphome/components/factory_reset/button/factory_reset_button.cpp +18 -1
  23. esphome/components/factory_reset/button/factory_reset_button.h +6 -1
  24. esphome/components/factory_reset/switch/factory_reset_switch.cpp +18 -1
  25. esphome/components/factory_reset/switch/factory_reset_switch.h +5 -1
  26. esphome/components/ina2xx_base/__init__.py +4 -2
  27. esphome/components/md5/md5.cpp +3 -2
  28. esphome/components/mqtt/mqtt_client.cpp +1 -1
  29. esphome/components/openthread/openthread.cpp +41 -7
  30. esphome/components/openthread/openthread.h +11 -0
  31. esphome/components/select/select.cpp +3 -3
  32. esphome/components/select/select_call.cpp +1 -1
  33. esphome/components/web_server/server_index_v2.h +149 -149
  34. esphome/components/wifi/wifi_component.cpp +1 -1
  35. esphome/components/wifi_info/wifi_info_text_sensor.h +3 -2
  36. esphome/const.py +2 -1
  37. esphome/core/defines.h +1 -0
  38. esphome/core/helpers.cpp +8 -7
  39. esphome/core/helpers.h +29 -0
  40. esphome/core/scheduler.cpp +4 -4
  41. esphome/core/scheduler.h +1 -1
  42. esphome/dashboard/web_server.py +2 -5
  43. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/METADATA +2 -2
  44. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/RECORD +48 -48
  45. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/WHEEL +0 -0
  46. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/entry_points.txt +0 -0
  47. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/licenses/LICENSE +0 -0
  48. {esphome-2025.9.0b1.dist-info → esphome-2025.9.0b3.dist-info}/top_level.txt +0 -0
@@ -7,103 +7,83 @@ namespace esphome {
7
7
  namespace captive_portal {
8
8
 
9
9
  const uint8_t INDEX_GZ[] PROGMEM = {
10
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdd, 0x58, 0x6d, 0x6f, 0xdb, 0x38, 0x12, 0xfe, 0xde,
11
- 0x5f, 0x31, 0xa7, 0x36, 0x6b, 0x6b, 0x1b, 0x51, 0x22, 0xe5, 0xb7, 0xd8, 0x92, 0x16, 0x69, 0xae, 0x8b, 0x5d, 0xa0,
12
- 0xdd, 0x2d, 0x90, 0x6c, 0xef, 0x43, 0x51, 0x20, 0xb4, 0x34, 0xb2, 0xd8, 0x48, 0xa4, 0x4e, 0xa4, 0x5f, 0x52, 0xc3,
13
- 0xf7, 0xdb, 0x0f, 0x94, 0x6c, 0xc7, 0xe9, 0x35, 0x87, 0xeb, 0xe2, 0x0e, 0x87, 0xdd, 0x18, 0x21, 0x86, 0xe4, 0xcc,
14
- 0x70, 0xe6, 0xf1, 0x0c, 0x67, 0xcc, 0xe8, 0x2f, 0x99, 0x4a, 0xcd, 0x7d, 0x8d, 0x50, 0x98, 0xaa, 0x4c, 0x22, 0x3b,
15
- 0x42, 0xc9, 0xe5, 0x22, 0x46, 0x99, 0x44, 0x05, 0xf2, 0x2c, 0x89, 0x2a, 0x34, 0x1c, 0xd2, 0x82, 0x37, 0x1a, 0x4d,
16
- 0xfc, 0xdb, 0xcd, 0x8f, 0xde, 0x04, 0xfc, 0x24, 0x2a, 0x85, 0xbc, 0x83, 0x06, 0xcb, 0x58, 0xa4, 0x4a, 0x42, 0xd1,
17
- 0x60, 0x1e, 0x67, 0xdc, 0xf0, 0xa9, 0xa8, 0xf8, 0x02, 0x2d, 0x43, 0x2b, 0x26, 0x79, 0x85, 0xf1, 0x4a, 0xe0, 0xba,
18
- 0x56, 0x8d, 0x81, 0x54, 0x49, 0x83, 0xd2, 0xc4, 0xce, 0x5a, 0x64, 0xa6, 0x88, 0x33, 0x5c, 0x89, 0x14, 0xbd, 0x76,
19
- 0x72, 0x2e, 0xa4, 0x30, 0x82, 0x97, 0x9e, 0x4e, 0x79, 0x89, 0x31, 0x3d, 0x5f, 0x6a, 0x6c, 0xda, 0x09, 0x9f, 0x97,
20
- 0x18, 0x4b, 0xe5, 0xf8, 0x49, 0xa4, 0xd3, 0x46, 0xd4, 0x06, 0xac, 0xbd, 0x71, 0xa5, 0xb2, 0x65, 0x89, 0x89, 0xef,
21
- 0x73, 0xad, 0xd1, 0x68, 0x5f, 0xc8, 0x0c, 0x37, 0x64, 0x14, 0x86, 0x29, 0xe3, 0xe3, 0x9c, 0x7c, 0xd2, 0xcf, 0x32,
22
- 0x95, 0x2e, 0x2b, 0x94, 0x86, 0x94, 0x2a, 0xe5, 0x46, 0x28, 0x49, 0x34, 0xf2, 0x26, 0x2d, 0xe2, 0x38, 0x76, 0x7e,
23
- 0xd0, 0x7c, 0x85, 0xce, 0x77, 0xdf, 0xf5, 0x8f, 0x4c, 0x0b, 0x34, 0xaf, 0x4b, 0xb4, 0xa4, 0x7e, 0x75, 0x7f, 0xc3,
24
- 0x17, 0xbf, 0xf0, 0x0a, 0xfb, 0x0e, 0xd7, 0x22, 0x43, 0xc7, 0xfd, 0x10, 0x7c, 0x24, 0xda, 0xdc, 0x97, 0x48, 0x32,
25
- 0xa1, 0xeb, 0x92, 0xdf, 0xc7, 0xce, 0xbc, 0x54, 0xe9, 0x9d, 0xe3, 0xce, 0xf2, 0xa5, 0x4c, 0xad, 0x72, 0xd0, 0x7d,
26
- 0x74, 0xb7, 0x25, 0x1a, 0x30, 0xf1, 0x5b, 0x6e, 0x0a, 0x52, 0xf1, 0x4d, 0xbf, 0x23, 0x84, 0xec, 0xb3, 0xef, 0xfb,
27
- 0xf8, 0x92, 0x06, 0x81, 0x7b, 0xde, 0x0e, 0x81, 0xeb, 0xd3, 0x20, 0x98, 0x35, 0x68, 0x96, 0x8d, 0x04, 0xde, 0xbf,
28
- 0x8d, 0x6a, 0x6e, 0x0a, 0xc8, 0x62, 0xa7, 0xa2, 0x8c, 0x04, 0xc1, 0x04, 0xe8, 0x05, 0x61, 0x43, 0x8f, 0x52, 0x12,
29
- 0x7a, 0x74, 0x98, 0x8e, 0xbd, 0x21, 0xd0, 0x81, 0x37, 0x04, 0xc6, 0xc8, 0x10, 0x82, 0xcf, 0x0e, 0xe4, 0xa2, 0x2c,
30
- 0x63, 0x47, 0x2a, 0x89, 0x0e, 0x68, 0xd3, 0xa8, 0x3b, 0x8c, 0x9d, 0x74, 0xd9, 0x34, 0x28, 0xcd, 0x95, 0x2a, 0x55,
31
- 0xe3, 0xf8, 0xc9, 0x33, 0x78, 0xf4, 0xf7, 0xcd, 0x47, 0x98, 0x86, 0x4b, 0x9d, 0xab, 0xa6, 0x8a, 0x9d, 0xf6, 0x4b,
32
- 0xe9, 0xbf, 0xd8, 0x9a, 0x1d, 0xd8, 0xc1, 0x3d, 0xd9, 0xf4, 0x54, 0x23, 0x16, 0x42, 0xc6, 0x0e, 0x65, 0x40, 0x27,
33
- 0x8e, 0x9f, 0xdc, 0xba, 0xbb, 0x23, 0x26, 0xdc, 0x62, 0xb2, 0xf7, 0x52, 0xf5, 0x3f, 0xdc, 0x46, 0x7a, 0xb5, 0x80,
34
- 0x4d, 0x55, 0x4a, 0x1d, 0x3b, 0x85, 0x31, 0xf5, 0xd4, 0xf7, 0xd7, 0xeb, 0x35, 0x59, 0x87, 0x44, 0x35, 0x0b, 0x9f,
35
- 0x05, 0x41, 0xe0, 0xeb, 0xd5, 0xc2, 0x81, 0x2e, 0x3e, 0x1c, 0x36, 0x70, 0xa0, 0x40, 0xb1, 0x28, 0x4c, 0x4b, 0x27,
36
- 0x2f, 0xb6, 0xb8, 0x8b, 0x2c, 0x47, 0x72, 0xfb, 0xf1, 0xe4, 0x14, 0x71, 0x72, 0x0a, 0xfe, 0x70, 0x82, 0x66, 0xef,
37
- 0xad, 0x35, 0x6a, 0xcc, 0x19, 0x30, 0x08, 0xda, 0x0f, 0xf3, 0x2c, 0xbd, 0x9f, 0x79, 0x5f, 0xcc, 0xe0, 0x64, 0x06,
38
- 0x0c, 0x9e, 0x01, 0xb0, 0x6a, 0xe4, 0x5d, 0x1c, 0xc5, 0xa9, 0xdd, 0x5e, 0xd1, 0xe0, 0x61, 0xc1, 0xca, 0xfc, 0x34,
39
- 0x3a, 0x9d, 0x7b, 0xec, 0xbd, 0x65, 0xb0, 0xd8, 0x1f, 0x85, 0x3c, 0x56, 0xd0, 0xf7, 0x23, 0x3e, 0x84, 0xe1, 0x7e,
40
- 0x65, 0xe8, 0x59, 0xfa, 0x38, 0xb3, 0x27, 0xc1, 0x70, 0xc5, 0x0a, 0x5a, 0x79, 0x23, 0x6f, 0xc8, 0x43, 0x08, 0xf7,
41
- 0x26, 0x85, 0x10, 0xae, 0x58, 0x31, 0x7a, 0x3f, 0x3a, 0x5d, 0xf3, 0xc2, 0xcf, 0x3d, 0x0b, 0xf3, 0xd4, 0x71, 0x1e,
42
- 0x30, 0x50, 0xa7, 0x18, 0x90, 0x4f, 0x4a, 0xc8, 0xbe, 0xe3, 0xb8, 0xbb, 0x1c, 0x4d, 0x5a, 0xf4, 0x1d, 0x3f, 0x55,
43
- 0x32, 0x17, 0x0b, 0xf2, 0x49, 0x2b, 0xe9, 0xb8, 0xc4, 0x14, 0x28, 0xfb, 0x07, 0x51, 0x2b, 0x88, 0xed, 0x4e, 0xff,
44
- 0xcb, 0x1d, 0xe3, 0x6e, 0x8f, 0xf9, 0x61, 0x84, 0x29, 0x31, 0x36, 0xc4, 0x66, 0xf4, 0xf9, 0x71, 0x75, 0xae, 0xb2,
45
- 0xfb, 0x27, 0x52, 0xa7, 0xa0, 0x5d, 0xde, 0x08, 0x29, 0xb1, 0xb9, 0xc1, 0x8d, 0x89, 0x9d, 0xb7, 0x97, 0x57, 0x70,
46
- 0x99, 0x65, 0x0d, 0x6a, 0x3d, 0x05, 0xe7, 0xa5, 0x21, 0x15, 0x4f, 0xff, 0x73, 0x5d, 0xf4, 0x91, 0xae, 0xbf, 0x89,
47
- 0x1f, 0x05, 0xfc, 0x82, 0x66, 0xad, 0x9a, 0xbb, 0xbd, 0x36, 0x6b, 0xda, 0xcc, 0x66, 0x60, 0x13, 0x1b, 0xc2, 0x6b,
48
- 0x4d, 0x74, 0x29, 0x52, 0xec, 0x53, 0x97, 0x54, 0xbc, 0x7e, 0xf0, 0x4a, 0x1e, 0x80, 0xba, 0x8d, 0x32, 0xb1, 0x82,
49
- 0xb4, 0xe4, 0x5a, 0xc7, 0x8e, 0xec, 0x54, 0x39, 0xb0, 0x4f, 0x1b, 0x25, 0xd3, 0x52, 0xa4, 0x77, 0xb1, 0xf3, 0x95,
50
- 0x1b, 0xe2, 0xd5, 0xfd, 0xcf, 0x59, 0xbf, 0xa7, 0xb5, 0xc8, 0x7a, 0x2e, 0x59, 0xf1, 0x72, 0x89, 0x10, 0x83, 0x29,
51
- 0x84, 0x7e, 0x30, 0x70, 0xf6, 0xa4, 0x58, 0xad, 0xef, 0x7a, 0x2e, 0xc9, 0x55, 0xba, 0xd4, 0x7d, 0xd7, 0x39, 0x64,
52
- 0x69, 0xc4, 0xbb, 0x3b, 0xd4, 0x79, 0xee, 0x7c, 0x61, 0x91, 0x57, 0x62, 0x6e, 0x9c, 0x87, 0x6c, 0x7e, 0xb1, 0xd5,
53
- 0x7d, 0x49, 0x1a, 0xad, 0x85, 0xbb, 0x3b, 0x2e, 0x46, 0xba, 0xe6, 0xf2, 0x4b, 0x41, 0x6b, 0xa0, 0x4d, 0x1a, 0x49,
54
- 0x2c, 0x65, 0x33, 0xa7, 0xe6, 0xf2, 0x78, 0xa0, 0xcf, 0x0f, 0xe4, 0x8b, 0xad, 0xe8, 0x4b, 0x7b, 0x4b, 0xde, 0x1d,
55
- 0x35, 0x46, 0x7e, 0x26, 0x56, 0xc9, 0xed, 0xce, 0x7d, 0xf0, 0xe3, 0xef, 0x4b, 0x6c, 0xee, 0xaf, 0xb1, 0xc4, 0xd4,
56
- 0xa8, 0xa6, 0xef, 0x3c, 0x97, 0x68, 0x1c, 0xb7, 0x73, 0xf8, 0xa7, 0x9b, 0xb7, 0x6f, 0x62, 0xd5, 0x6f, 0xdc, 0xf3,
57
- 0xa7, 0xb8, 0x6d, 0xb5, 0xf8, 0xd0, 0x60, 0xf9, 0x8f, 0xb8, 0x67, 0xeb, 0x45, 0xef, 0xa3, 0xe3, 0x92, 0xd6, 0xdf,
58
- 0xdb, 0x87, 0xa2, 0x61, 0x13, 0xfb, 0xe5, 0xa6, 0x2a, 0xcf, 0xad, 0x87, 0xde, 0x68, 0xe8, 0xee, 0x6e, 0x77, 0xee,
59
- 0xce, 0x9d, 0x45, 0x7e, 0x77, 0xef, 0x27, 0x51, 0x7b, 0x05, 0x27, 0xdf, 0x6f, 0xe7, 0x6a, 0xe3, 0x69, 0xf1, 0x59,
60
- 0xc8, 0xc5, 0x54, 0xc8, 0x02, 0x1b, 0x61, 0x76, 0x99, 0x58, 0x9d, 0x0b, 0x59, 0x2f, 0xcd, 0xb6, 0xe6, 0x59, 0x66,
61
- 0x77, 0x86, 0xf5, 0x66, 0x96, 0x2b, 0x69, 0x2c, 0x27, 0x4e, 0x29, 0x56, 0xbb, 0x6e, 0xbf, 0xbd, 0x5b, 0xa6, 0x17,
62
- 0xc3, 0xb3, 0x9d, 0x0d, 0xb8, 0xad, 0xc1, 0x8d, 0xf1, 0x78, 0x29, 0x16, 0x72, 0x9a, 0xa2, 0x34, 0xd8, 0x74, 0x42,
63
- 0x39, 0xaf, 0x44, 0x79, 0x3f, 0xd5, 0x5c, 0x6a, 0x4f, 0x63, 0x23, 0xf2, 0xdd, 0x7c, 0x69, 0x8c, 0x92, 0xdb, 0xb9,
64
- 0x6a, 0x32, 0x6c, 0xa6, 0xc1, 0xac, 0x23, 0xbc, 0x86, 0x67, 0x62, 0xa9, 0xa7, 0x24, 0x6c, 0xb0, 0x9a, 0xcd, 0x79,
65
- 0x7a, 0xb7, 0x68, 0xd4, 0x52, 0x66, 0x5e, 0x6a, 0x6f, 0xe1, 0xe9, 0x73, 0x9a, 0xf3, 0x10, 0xd3, 0xd9, 0x7e, 0x96,
66
- 0xe7, 0xf9, 0xac, 0x14, 0x12, 0xbd, 0xee, 0x56, 0x9b, 0x32, 0x32, 0xb0, 0x62, 0x27, 0x66, 0x12, 0x66, 0x17, 0x3a,
67
- 0x1b, 0x69, 0x10, 0x9c, 0xcd, 0x0e, 0xee, 0x04, 0xb3, 0x74, 0xd9, 0x68, 0xd5, 0x4c, 0x6b, 0x25, 0xac, 0x99, 0xbb,
68
- 0x8a, 0x0b, 0x79, 0x6a, 0xbd, 0x0d, 0x93, 0xd9, 0xbe, 0x3c, 0x4d, 0x85, 0x6c, 0x8f, 0x69, 0x8b, 0xd4, 0xac, 0x12,
69
- 0xb2, 0x2b, 0xb2, 0x53, 0x36, 0x0a, 0xea, 0xcd, 0x8e, 0xec, 0x03, 0x64, 0x7b, 0xe0, 0xce, 0x4b, 0xdc, 0xcc, 0x3e,
70
- 0x2d, 0xb5, 0x11, 0xf9, 0xbd, 0xb7, 0x2f, 0xd2, 0x53, 0x5d, 0xf3, 0x14, 0xbd, 0x39, 0x9a, 0x35, 0xa2, 0x9c, 0xb5,
71
- 0x67, 0x78, 0xc2, 0x60, 0xa5, 0xf7, 0x38, 0x1d, 0xd5, 0xb4, 0x01, 0xfa, 0x58, 0xd7, 0xbf, 0xe3, 0xb6, 0xb1, 0xb8,
72
- 0xad, 0x78, 0xb3, 0x10, 0xd2, 0x9b, 0x2b, 0x63, 0x54, 0x35, 0xf5, 0xc6, 0xf5, 0x66, 0xb6, 0x5f, 0xb2, 0xca, 0xa6,
73
- 0xd4, 0x9a, 0xd9, 0xd6, 0xde, 0x03, 0xde, 0xb4, 0xde, 0x80, 0x56, 0xa5, 0xc8, 0xf6, 0x7c, 0x2d, 0x0b, 0x04, 0x47,
74
- 0x78, 0xe8, 0xb0, 0xde, 0x80, 0x5d, 0x3b, 0x40, 0x3d, 0xc8, 0x27, 0x9c, 0x06, 0x5f, 0xf9, 0x46, 0xb2, 0x3c, 0x67,
75
- 0xf3, 0xfc, 0x88, 0x94, 0x2d, 0xa1, 0x3b, 0xb1, 0x8f, 0x0a, 0x36, 0xa8, 0x37, 0xb3, 0xc3, 0x77, 0x33, 0xa8, 0x37,
76
- 0x3b, 0xd1, 0xa6, 0xc5, 0xf6, 0x44, 0x4b, 0x1b, 0xaa, 0xd3, 0x65, 0x53, 0xf6, 0x9d, 0xaf, 0x84, 0xee, 0x59, 0x78,
77
- 0xf5, 0x50, 0xe2, 0x7a, 0x4f, 0x97, 0xb8, 0x1e, 0xd8, 0xa6, 0xe8, 0x95, 0xda, 0xc4, 0xbd, 0xb6, 0xd8, 0x0c, 0x80,
78
- 0x0d, 0x7a, 0x67, 0xe1, 0xeb, 0xb3, 0xf0, 0xea, 0xbf, 0x52, 0xbb, 0x7e, 0x77, 0xe1, 0xfa, 0x86, 0xaa, 0xf5, 0x8d,
79
- 0x15, 0xab, 0xf3, 0xce, 0x3a, 0x7f, 0x16, 0xbe, 0x76, 0xdc, 0x9d, 0x20, 0x5a, 0x2c, 0xe8, 0xff, 0x02, 0xda, 0x7f,
80
- 0xc5, 0x31, 0xbc, 0xa4, 0x13, 0x72, 0x01, 0xed, 0xd0, 0x41, 0x44, 0xc2, 0x09, 0x8c, 0xaf, 0x06, 0x64, 0x40, 0xc1,
81
- 0xb6, 0x43, 0x23, 0x18, 0x93, 0xc9, 0x05, 0xd0, 0x11, 0x09, 0xc7, 0x40, 0x19, 0x30, 0x4a, 0x86, 0x6f, 0x58, 0x48,
82
- 0x46, 0x43, 0x18, 0x5f, 0xb1, 0x80, 0x84, 0x0c, 0x3a, 0xde, 0x11, 0x61, 0x0c, 0x42, 0xcb, 0x12, 0x56, 0x01, 0xb0,
83
- 0x34, 0x24, 0xc1, 0x18, 0x02, 0x18, 0x91, 0xe0, 0x82, 0x4c, 0x46, 0x30, 0x21, 0x63, 0x0a, 0x8c, 0x0c, 0x86, 0xa5,
84
- 0x37, 0x24, 0x14, 0x46, 0x24, 0x1c, 0xf1, 0x09, 0x19, 0x84, 0xd0, 0x0e, 0x1d, 0x1c, 0x63, 0xc2, 0x98, 0x47, 0x02,
85
- 0xfa, 0x26, 0x24, 0x6c, 0x0c, 0x63, 0x32, 0x18, 0x5c, 0xd2, 0x11, 0xb9, 0x18, 0x40, 0x37, 0x76, 0xf0, 0x52, 0x06,
86
- 0xc3, 0xa7, 0x40, 0x63, 0x7f, 0x5e, 0xd0, 0x42, 0xc2, 0x28, 0x84, 0xe4, 0x62, 0xc2, 0x6d, 0x5f, 0xca, 0xa0, 0x1b,
87
- 0x3b, 0xdc, 0x28, 0x85, 0xe0, 0x77, 0x63, 0x16, 0xfe, 0x79, 0x31, 0xa3, 0x16, 0x01, 0x46, 0x06, 0xe1, 0x25, 0x0d,
88
- 0xc9, 0x08, 0xda, 0xa1, 0x3b, 0x9b, 0x32, 0x98, 0x5c, 0x5d, 0xc0, 0x04, 0x46, 0x64, 0x34, 0x81, 0x0b, 0x18, 0x5a,
89
- 0x74, 0x2f, 0xc8, 0x64, 0xd0, 0x09, 0x79, 0x8c, 0x7c, 0x2b, 0x8c, 0x83, 0x3f, 0x30, 0x8c, 0x4f, 0xf9, 0xf4, 0x07,
90
- 0x76, 0xe9, 0xff, 0x71, 0x05, 0x45, 0x7e, 0xd7, 0x86, 0x45, 0x7e, 0xf7, 0x3c, 0x60, 0xbb, 0xa8, 0x24, 0xb2, 0xdd,
91
- 0x48, 0x12, 0x15, 0x14, 0x44, 0x16, 0x57, 0x3c, 0x4d, 0x4e, 0x5a, 0xfd, 0xc8, 0x2f, 0xe8, 0x61, 0xab, 0xa0, 0xc9,
92
- 0xa3, 0xc6, 0xbd, 0xdb, 0x6b, 0x2b, 0x7d, 0x72, 0x53, 0x20, 0xbc, 0xbe, 0x7e, 0x07, 0x6b, 0x51, 0x96, 0x20, 0xd5,
93
- 0x1a, 0x4c, 0x73, 0x0f, 0x46, 0xd9, 0x57, 0x03, 0x89, 0xa9, 0xb1, 0xa4, 0x29, 0x10, 0xf6, 0x7d, 0x04, 0x21, 0x24,
94
- 0x9a, 0x37, 0xc9, 0xbb, 0x12, 0xb9, 0x46, 0x58, 0x88, 0x15, 0x82, 0x30, 0xa0, 0x55, 0x85, 0x60, 0x84, 0x1d, 0x8e,
95
- 0x82, 0x2d, 0x5f, 0xe4, 0x77, 0x87, 0x74, 0x8d, 0xb2, 0xc8, 0x62, 0x89, 0x26, 0xd9, 0x77, 0xc4, 0x51, 0x11, 0x76,
96
- 0x56, 0x5d, 0xa3, 0x31, 0x42, 0x2e, 0xac, 0x55, 0x61, 0x12, 0xd9, 0x5f, 0xb7, 0xc0, 0xdb, 0xdf, 0x0c, 0xb1, 0xbf,
97
- 0x16, 0xb9, 0xb0, 0x6f, 0x06, 0x49, 0xd4, 0x76, 0x91, 0x56, 0x83, 0x6d, 0x64, 0xba, 0x07, 0x8e, 0x96, 0x2a, 0x51,
98
- 0x2e, 0x4c, 0x11, 0x87, 0x0c, 0xea, 0x92, 0xa7, 0x58, 0xa8, 0x32, 0xc3, 0x26, 0xbe, 0xbe, 0xfe, 0xf9, 0xaf, 0xf6,
99
- 0x35, 0xc4, 0x9a, 0x70, 0x94, 0xac, 0xf5, 0x5d, 0x27, 0x68, 0x89, 0xbd, 0xdc, 0x68, 0xd0, 0xbd, 0x6b, 0xd4, 0x5c,
100
- 0xeb, 0xb5, 0x6a, 0xb2, 0x47, 0x5a, 0xde, 0x1d, 0x16, 0xf7, 0x9a, 0xda, 0xff, 0xb6, 0x1f, 0xed, 0x84, 0xf4, 0x72,
101
- 0x5e, 0x09, 0x93, 0x5c, 0xf3, 0x15, 0x46, 0x7e, 0xb7, 0x91, 0x44, 0xbe, 0x75, 0xa0, 0xe3, 0x2d, 0xf6, 0x32, 0x05,
102
- 0x4d, 0x7e, 0xbd, 0xb9, 0x84, 0xdf, 0xea, 0x8c, 0x1b, 0xec, 0xb0, 0x6f, 0xbd, 0xac, 0xd0, 0x14, 0x2a, 0x8b, 0xdf,
103
- 0xfd, 0x7a, 0x7d, 0x73, 0xf4, 0x78, 0xd9, 0x32, 0x01, 0xca, 0xb4, 0x7b, 0x6f, 0x59, 0x96, 0x46, 0xd4, 0xbc, 0x31,
104
- 0xad, 0x5a, 0xcf, 0x66, 0xc7, 0xc1, 0xa3, 0x76, 0x3f, 0x17, 0x25, 0x76, 0x4e, 0xed, 0x05, 0xfd, 0x04, 0xbe, 0x66,
105
- 0xe3, 0xe1, 0xec, 0x2f, 0xac, 0xf4, 0xbb, 0x00, 0xf2, 0xbb, 0x68, 0xf2, 0xdb, 0xd7, 0xa8, 0x7f, 0x02, 0x14, 0xee,
106
- 0xbc, 0x64, 0x9d, 0x12, 0x00, 0x00};
10
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x95, 0x16, 0x6b, 0x8f, 0xdb, 0x36, 0xf2, 0x7b, 0x7e,
11
+ 0x05, 0x8f, 0x49, 0xbb, 0x52, 0xb3, 0x7a, 0x7a, 0xed, 0x6c, 0x24, 0x51, 0x45, 0x9a, 0xbb, 0xa2, 0x05, 0x9a, 0x36,
12
+ 0xc0, 0x6e, 0x73, 0x1f, 0x82, 0x00, 0x4b, 0x53, 0x23, 0x8b, 0x31, 0x45, 0xea, 0x48, 0xca, 0x8f, 0x18, 0xbe, 0xdf,
13
+ 0x7e, 0xa0, 0x24, 0x7b, 0x9d, 0x45, 0x73, 0xb8, 0xb3, 0x60, 0x61, 0x38, 0xef, 0x19, 0xcd, 0x83, 0xc5, 0xdf, 0x2a,
14
+ 0xc5, 0xec, 0xbe, 0x03, 0xd4, 0xd8, 0x56, 0x94, 0x85, 0x7b, 0x23, 0x41, 0xe5, 0x8a, 0x80, 0x2c, 0x8b, 0x06, 0x68,
15
+ 0x55, 0x16, 0x2d, 0x58, 0x8a, 0x58, 0x43, 0xb5, 0x01, 0x4b, 0xfe, 0xbc, 0xff, 0x39, 0xb8, 0x2d, 0x0b, 0xc1, 0xe5,
16
+ 0x1a, 0x69, 0x10, 0x84, 0x33, 0x25, 0x51, 0xa3, 0xa1, 0x26, 0x15, 0xb5, 0x34, 0xe3, 0x2d, 0x5d, 0xc1, 0x24, 0x22,
17
+ 0x69, 0x0b, 0x64, 0xc3, 0x61, 0xdb, 0x29, 0x6d, 0x11, 0x53, 0xd2, 0x82, 0xb4, 0x04, 0x6f, 0x79, 0x65, 0x1b, 0x52,
18
+ 0xc1, 0x86, 0x33, 0x08, 0x86, 0xc3, 0x35, 0x97, 0xdc, 0x72, 0x2a, 0x02, 0xc3, 0xa8, 0x00, 0x92, 0x5c, 0xf7, 0x06,
19
+ 0xf4, 0x70, 0xa0, 0x4b, 0x01, 0x44, 0x2a, 0x5c, 0x16, 0x86, 0x69, 0xde, 0x59, 0xe4, 0x5c, 0x25, 0xad, 0xaa, 0x7a,
20
+ 0x01, 0x65, 0x14, 0x51, 0x63, 0xc0, 0x9a, 0x88, 0xcb, 0x0a, 0x76, 0xe1, 0x32, 0x66, 0x2c, 0x86, 0xdb, 0xdb, 0xf0,
21
+ 0xb3, 0x79, 0x56, 0x29, 0xd6, 0xb7, 0x20, 0x6d, 0x28, 0x14, 0xa3, 0x96, 0x2b, 0x19, 0x1a, 0xa0, 0x9a, 0x35, 0x84,
22
+ 0x10, 0xfc, 0xa3, 0xa1, 0x1b, 0xc0, 0xdf, 0x7f, 0xef, 0x9d, 0x99, 0x56, 0x60, 0xff, 0x21, 0xc0, 0x81, 0xe6, 0xa7,
23
+ 0xfd, 0x3d, 0x5d, 0xfd, 0x4e, 0x5b, 0xf0, 0x30, 0x35, 0xbc, 0x02, 0xec, 0x7f, 0x8c, 0x3f, 0x85, 0xc6, 0xee, 0x05,
24
+ 0x84, 0x15, 0x37, 0x9d, 0xa0, 0x7b, 0x82, 0x97, 0x42, 0xb1, 0x35, 0xf6, 0xf3, 0xba, 0x97, 0xcc, 0x29, 0x47, 0xc6,
25
+ 0x03, 0xff, 0x20, 0xc0, 0x22, 0x4b, 0xde, 0x51, 0xdb, 0x84, 0x2d, 0xdd, 0x79, 0x23, 0xc0, 0xa5, 0x97, 0xfe, 0xe0,
26
+ 0xc1, 0xcb, 0x24, 0x8e, 0xfd, 0xeb, 0xe1, 0x15, 0xfb, 0x51, 0x12, 0xc7, 0xb9, 0x06, 0xdb, 0x6b, 0x89, 0xa8, 0xf7,
27
+ 0x50, 0x74, 0xd4, 0x36, 0xa8, 0x22, 0xf8, 0x5d, 0x92, 0xa2, 0xe4, 0x75, 0x98, 0xce, 0x7f, 0x0b, 0x5f, 0xa1, 0x9b,
28
+ 0x30, 0x9d, 0xb3, 0x57, 0xc1, 0x1c, 0x25, 0x37, 0xc1, 0x1c, 0xa5, 0x69, 0x38, 0x47, 0xf1, 0x17, 0x8c, 0x6a, 0x2e,
29
+ 0x04, 0xc1, 0x52, 0x49, 0xc0, 0xc8, 0x58, 0xad, 0xd6, 0x40, 0x30, 0xeb, 0xb5, 0x06, 0x69, 0xdf, 0x2a, 0xa1, 0x34,
30
+ 0x8e, 0xca, 0x67, 0xff, 0x97, 0x42, 0xab, 0xa9, 0x34, 0xb5, 0xd2, 0x2d, 0xc1, 0x43, 0xf6, 0xbd, 0x17, 0x07, 0x7b,
31
+ 0x44, 0xee, 0xe5, 0x5f, 0x10, 0x03, 0xa5, 0xf9, 0x8a, 0x4b, 0x82, 0x9d, 0xc6, 0x5b, 0x1c, 0x95, 0x0f, 0xfe, 0xf1,
32
+ 0x1c, 0x3d, 0x75, 0xd1, 0x4f, 0xf1, 0x28, 0xef, 0xe3, 0x43, 0x61, 0x36, 0x2b, 0xb4, 0x6b, 0x85, 0x34, 0x04, 0x37,
33
+ 0xd6, 0x76, 0x59, 0x14, 0x6d, 0xb7, 0xdb, 0x70, 0x3b, 0x0b, 0x95, 0x5e, 0x45, 0x69, 0x1c, 0xc7, 0x91, 0xd9, 0xac,
34
+ 0x30, 0x1a, 0x0b, 0x01, 0xa7, 0x37, 0x18, 0x35, 0xc0, 0x57, 0x8d, 0x1d, 0xe0, 0xf2, 0xc5, 0x01, 0x8e, 0x85, 0xe3,
35
+ 0x28, 0x1f, 0x3e, 0x5d, 0x58, 0xe1, 0x17, 0x56, 0xe0, 0x47, 0xea, 0xe1, 0x53, 0x98, 0x57, 0x43, 0x98, 0xaf, 0x68,
36
+ 0x8a, 0x52, 0x14, 0x0f, 0x4f, 0x1a, 0x38, 0x78, 0x3a, 0x05, 0x4f, 0x4e, 0xe8, 0xe2, 0xe4, 0xa0, 0x76, 0x11, 0xbc,
37
+ 0x3e, 0xcb, 0x26, 0x0e, 0xb3, 0x49, 0xe2, 0x47, 0x84, 0x13, 0xf8, 0x65, 0x71, 0x79, 0x0e, 0xd2, 0x0f, 0x97, 0x0c,
38
+ 0xce, 0x5a, 0x93, 0x7c, 0x58, 0xd0, 0x39, 0x9a, 0x4f, 0x98, 0x79, 0xe0, 0xe0, 0xf3, 0x09, 0xcd, 0x37, 0x69, 0x93,
39
+ 0xb4, 0xc1, 0x22, 0x98, 0xd3, 0x19, 0x9a, 0x4d, 0x8e, 0xcc, 0xd0, 0x6c, 0x93, 0x36, 0x8b, 0x0f, 0x8b, 0x4b, 0x5c,
40
+ 0x30, 0xfb, 0x72, 0x15, 0x95, 0xd8, 0xcf, 0x30, 0x7e, 0x8c, 0x5c, 0x5d, 0x46, 0x1e, 0x7e, 0x56, 0x5c, 0x7a, 0x18,
41
+ 0xfb, 0xc7, 0x1a, 0x2c, 0x6b, 0x3c, 0x1c, 0x31, 0x25, 0x6b, 0xbe, 0x0a, 0x3f, 0x1b, 0x25, 0xb1, 0x1f, 0xda, 0x06,
42
+ 0xa4, 0x77, 0x12, 0x75, 0x82, 0x30, 0x50, 0xbc, 0xa7, 0x14, 0xeb, 0x1f, 0xce, 0xf5, 0x6f, 0xb9, 0x15, 0x40, 0x6c,
43
+ 0xe8, 0x1a, 0xf6, 0xfa, 0x8c, 0x5d, 0xaa, 0x6a, 0xff, 0x8d, 0xd6, 0x68, 0x92, 0xb1, 0x2f, 0xb8, 0x94, 0xa0, 0xef,
44
+ 0x61, 0x67, 0x09, 0x7e, 0xf7, 0xe6, 0x2d, 0x7a, 0x53, 0x55, 0x1a, 0x8c, 0xc9, 0x10, 0x7e, 0x69, 0xc3, 0x96, 0xb2,
45
+ 0xff, 0x5d, 0x57, 0xf2, 0x95, 0xae, 0x7f, 0xf2, 0x9f, 0x39, 0xfa, 0x1d, 0xec, 0x56, 0xe9, 0xf5, 0xa4, 0xcd, 0xb9,
46
+ 0x96, 0xbb, 0x0e, 0xd3, 0xc4, 0x86, 0xb4, 0x33, 0xa1, 0x11, 0x9c, 0x81, 0x97, 0xf8, 0x61, 0x4b, 0xbb, 0xc7, 0xa8,
47
+ 0xe4, 0x29, 0x51, 0x0f, 0x45, 0xc5, 0x37, 0x88, 0x09, 0x6a, 0x0c, 0xc1, 0x72, 0x54, 0x85, 0xd1, 0x33, 0x34, 0xfc,
48
+ 0x94, 0x64, 0x82, 0xb3, 0x35, 0xc1, 0x7f, 0x31, 0x01, 0x7e, 0xda, 0xff, 0x5a, 0x79, 0x57, 0xc6, 0xf0, 0xea, 0xca,
49
+ 0x0f, 0x37, 0x54, 0xf4, 0x80, 0x08, 0xb2, 0x0d, 0x37, 0x8f, 0x0e, 0xe6, 0xdf, 0x14, 0xeb, 0xcc, 0xfa, 0xca, 0x0f,
50
+ 0x6b, 0xc5, 0x7a, 0xe3, 0xf9, 0xb8, 0x9c, 0xcc, 0x15, 0x74, 0x1c, 0x90, 0xf8, 0x39, 0x7e, 0xe2, 0x51, 0x20, 0xa0,
51
+ 0xb6, 0x67, 0x3e, 0x84, 0x5e, 0x1c, 0x8c, 0x27, 0x43, 0x6d, 0x0c, 0xf7, 0x8f, 0x67, 0x64, 0x61, 0x3a, 0x2a, 0x9f,
52
+ 0x0a, 0x3a, 0x07, 0x5d, 0xab, 0xc8, 0xd0, 0x41, 0xae, 0x5f, 0x3a, 0x2a, 0xcf, 0x06, 0x23, 0x7a, 0x02, 0x5f, 0x1c,
53
+ 0xb8, 0x27, 0xdd, 0x14, 0x5c, 0x9f, 0x35, 0x16, 0x51, 0xc5, 0x37, 0xe5, 0xc3, 0xd1, 0x7f, 0x8c, 0xe3, 0x5f, 0x3d,
54
+ 0xe8, 0xfd, 0x1d, 0x08, 0x60, 0x56, 0x69, 0x0f, 0x3f, 0x97, 0x60, 0xb1, 0x3f, 0x06, 0xfc, 0xcb, 0xfd, 0xbb, 0xdf,
55
+ 0x88, 0xf2, 0xb4, 0x7f, 0xfd, 0x2d, 0x6e, 0xb7, 0x0a, 0x3e, 0x6a, 0x10, 0xff, 0x26, 0x57, 0x6e, 0x19, 0x5c, 0x7d,
56
+ 0xc2, 0x7e, 0x38, 0xc4, 0xfb, 0xf0, 0xb8, 0x11, 0x5c, 0x3b, 0xbf, 0xdc, 0xb5, 0xe2, 0xda, 0x45, 0x18, 0x2c, 0xe6,
57
+ 0xfe, 0xf1, 0xe1, 0xe8, 0x1f, 0xfd, 0xbc, 0x88, 0xc6, 0xb9, 0x5e, 0x16, 0xc3, 0x88, 0x2d, 0x7f, 0x38, 0x2c, 0xd5,
58
+ 0x2e, 0x30, 0xfc, 0x0b, 0x97, 0xab, 0x8c, 0xcb, 0x06, 0x34, 0xb7, 0xc7, 0x8a, 0x6f, 0xae, 0xb9, 0xec, 0x7a, 0x7b,
59
+ 0xe8, 0x68, 0x55, 0x39, 0xca, 0xbc, 0xdb, 0xe5, 0xb5, 0x92, 0xd6, 0x71, 0x42, 0x96, 0x40, 0x7b, 0x1c, 0xe9, 0xc3,
60
+ 0x44, 0xc9, 0x5e, 0xcf, 0xbf, 0x3b, 0xba, 0x82, 0x3b, 0x58, 0xd8, 0xd9, 0x80, 0x0a, 0xbe, 0x92, 0x19, 0x03, 0x69,
61
+ 0x41, 0x8f, 0x42, 0x35, 0x6d, 0xb9, 0xd8, 0x67, 0x86, 0x4a, 0x13, 0x18, 0xd0, 0xbc, 0x3e, 0x2e, 0x7b, 0x6b, 0x95,
62
+ 0x3c, 0x2c, 0x95, 0xae, 0x40, 0x67, 0x71, 0x3e, 0x02, 0x81, 0xa6, 0x15, 0xef, 0x4d, 0x16, 0xce, 0x34, 0xb4, 0xf9,
63
+ 0x92, 0xb2, 0xf5, 0x4a, 0xab, 0x5e, 0x56, 0x01, 0x73, 0x93, 0x36, 0x7b, 0x9e, 0xd4, 0x74, 0x06, 0x2c, 0x9f, 0x4e,
64
+ 0x75, 0x5d, 0xe7, 0x82, 0x4b, 0x08, 0xc6, 0x59, 0x96, 0xa5, 0xe1, 0x8d, 0x13, 0xbb, 0x70, 0x33, 0x4c, 0x1d, 0x62,
65
+ 0xf4, 0x31, 0x89, 0xe3, 0xef, 0xf2, 0x53, 0x38, 0x71, 0xce, 0x7a, 0x6d, 0x94, 0xce, 0x3a, 0xc5, 0x9d, 0x9b, 0xc7,
66
+ 0x96, 0x72, 0x79, 0xe9, 0xbd, 0x2b, 0x93, 0x7c, 0x5a, 0x3f, 0x19, 0x97, 0x83, 0x99, 0x61, 0x09, 0xe5, 0x2d, 0x97,
67
+ 0xe3, 0x0e, 0xcd, 0xd2, 0x45, 0xdc, 0xed, 0x8e, 0xe1, 0x54, 0x20, 0x87, 0x13, 0x77, 0x2d, 0x60, 0x97, 0x7f, 0xee,
68
+ 0x8d, 0xe5, 0xf5, 0x3e, 0x98, 0x76, 0x70, 0x66, 0x3a, 0xca, 0x20, 0x58, 0x82, 0xdd, 0x02, 0xc8, 0x7c, 0xb0, 0x11,
69
+ 0x70, 0x0b, 0xad, 0x99, 0xf2, 0x74, 0x56, 0x33, 0x14, 0xe8, 0xd7, 0xba, 0xfe, 0x1b, 0xb7, 0xab, 0xc5, 0x43, 0x4b,
70
+ 0xf5, 0x8a, 0xcb, 0x60, 0xa9, 0xac, 0x55, 0x6d, 0x16, 0xbc, 0xea, 0x76, 0xf9, 0x84, 0x72, 0xca, 0xb2, 0xc4, 0xb9,
71
+ 0x39, 0xec, 0xd6, 0x53, 0xbe, 0x93, 0x6e, 0x87, 0x8c, 0x12, 0xbc, 0x9a, 0xf8, 0x06, 0x16, 0x14, 0x9f, 0xd3, 0x93,
72
+ 0xcc, 0xbb, 0x1d, 0x72, 0xb8, 0x53, 0xaa, 0x6f, 0xea, 0x5b, 0x9a, 0xc4, 0x7f, 0xf1, 0x45, 0xaa, 0xba, 0x4e, 0x97,
73
+ 0xf5, 0x39, 0x53, 0x6e, 0x4d, 0xba, 0xd6, 0x18, 0x4a, 0xab, 0x88, 0xc6, 0xdb, 0x8c, 0xab, 0x8c, 0xb2, 0x70, 0x19,
74
+ 0x2e, 0x8b, 0x26, 0x41, 0xbc, 0x22, 0x2d, 0x65, 0xe5, 0xc5, 0xf8, 0x2a, 0xa2, 0x26, 0x39, 0x91, 0x9a, 0xa4, 0xfc,
75
+ 0x6a, 0x18, 0x8d, 0xb4, 0xc1, 0xfb, 0xf2, 0xad, 0x92, 0x12, 0x98, 0xe5, 0x72, 0x85, 0xac, 0x42, 0x53, 0x0a, 0xc2,
76
+ 0x30, 0x2c, 0x96, 0xba, 0x7c, 0x2f, 0x80, 0x1a, 0x40, 0x5b, 0xca, 0x6d, 0x58, 0x44, 0x23, 0xff, 0xd8, 0xc7, 0xbc,
77
+ 0x22, 0x12, 0x6c, 0x39, 0x35, 0x6c, 0xd1, 0xcc, 0x46, 0x03, 0x77, 0x60, 0x9d, 0x26, 0x67, 0x60, 0x56, 0x16, 0x6e,
78
+ 0xe5, 0x22, 0x3a, 0x8c, 0x34, 0x12, 0x6d, 0x79, 0xcd, 0xdd, 0x95, 0xa5, 0x2c, 0x86, 0x22, 0x77, 0x1a, 0x5c, 0x9e,
79
+ 0xc7, 0xeb, 0xd5, 0x00, 0x09, 0x90, 0x2b, 0xdb, 0x90, 0x59, 0x8a, 0x3a, 0x41, 0x19, 0x34, 0x4a, 0x54, 0xa0, 0xc9,
80
+ 0xdd, 0xdd, 0xaf, 0x7f, 0x2f, 0x9d, 0x33, 0x8f, 0x72, 0x9d, 0x59, 0x8f, 0x62, 0x0e, 0x98, 0xa4, 0x16, 0x37, 0xe3,
81
+ 0xa5, 0xaa, 0xa3, 0xc6, 0x6c, 0x95, 0xae, 0xbe, 0xd2, 0xf1, 0x7e, 0x42, 0x8e, 0x7a, 0x86, 0xff, 0xd0, 0x2a, 0xe5,
82
+ 0x1d, 0xdd, 0x40, 0x11, 0x4d, 0x87, 0x22, 0x72, 0x0e, 0x8f, 0xf4, 0x66, 0xe2, 0x6b, 0x92, 0xf2, 0x8f, 0xfb, 0x37,
83
+ 0xe8, 0xcf, 0xae, 0xa2, 0x16, 0xc6, 0xb4, 0x0d, 0x51, 0xb5, 0x60, 0x1b, 0x55, 0x91, 0xf7, 0x7f, 0xdc, 0xdd, 0x9f,
84
+ 0x23, 0xec, 0x07, 0x26, 0x04, 0x92, 0x8d, 0xd7, 0xbb, 0x5e, 0x58, 0xde, 0x51, 0x6d, 0x07, 0xb5, 0x81, 0x9b, 0x22,
85
+ 0xa7, 0x18, 0x06, 0x7a, 0xcd, 0x05, 0x8c, 0x61, 0x8c, 0x82, 0x25, 0x3a, 0x79, 0x75, 0xb2, 0xf6, 0xc4, 0xaf, 0x68,
86
+ 0xfc, 0xda, 0xd1, 0xf8, 0xe9, 0xa3, 0xe1, 0xa6, 0xfb, 0x1f, 0x53, 0x58, 0x46, 0xb2, 0xf9, 0x0a, 0x00, 0x00};
107
87
 
108
88
  } // namespace captive_portal
109
89
  } // namespace esphome
@@ -7,6 +7,7 @@
7
7
  #include <cstdio>
8
8
  #include <cinttypes>
9
9
  #include "esphome/core/log.h"
10
+ #include "esphome/core/helpers.h"
10
11
 
11
12
  namespace esphome::esp32_ble {
12
13
 
@@ -169,22 +170,42 @@ bool ESPBTUUID::operator==(const ESPBTUUID &uuid) const {
169
170
  }
170
171
  esp_bt_uuid_t ESPBTUUID::get_uuid() const { return this->uuid_; }
171
172
  std::string ESPBTUUID::to_string() const {
173
+ char buf[40]; // Enough for 128-bit UUID with dashes
174
+ char *pos = buf;
175
+
172
176
  switch (this->uuid_.len) {
173
177
  case ESP_UUID_LEN_16:
174
- return str_snprintf("0x%02X%02X", 6, this->uuid_.uuid.uuid16 >> 8, this->uuid_.uuid.uuid16 & 0xff);
178
+ *pos++ = '0';
179
+ *pos++ = 'x';
180
+ *pos++ = format_hex_pretty_char(this->uuid_.uuid.uuid16 >> 12);
181
+ *pos++ = format_hex_pretty_char((this->uuid_.uuid.uuid16 >> 8) & 0x0F);
182
+ *pos++ = format_hex_pretty_char((this->uuid_.uuid.uuid16 >> 4) & 0x0F);
183
+ *pos++ = format_hex_pretty_char(this->uuid_.uuid.uuid16 & 0x0F);
184
+ *pos = '\0';
185
+ return std::string(buf);
186
+
175
187
  case ESP_UUID_LEN_32:
176
- return str_snprintf("0x%02" PRIX32 "%02" PRIX32 "%02" PRIX32 "%02" PRIX32, 10, (this->uuid_.uuid.uuid32 >> 24),
177
- (this->uuid_.uuid.uuid32 >> 16 & 0xff), (this->uuid_.uuid.uuid32 >> 8 & 0xff),
178
- this->uuid_.uuid.uuid32 & 0xff);
188
+ *pos++ = '0';
189
+ *pos++ = 'x';
190
+ for (int shift = 28; shift >= 0; shift -= 4) {
191
+ *pos++ = format_hex_pretty_char((this->uuid_.uuid.uuid32 >> shift) & 0x0F);
192
+ }
193
+ *pos = '\0';
194
+ return std::string(buf);
195
+
179
196
  default:
180
197
  case ESP_UUID_LEN_128:
181
- std::string buf;
198
+ // Format: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
182
199
  for (int8_t i = 15; i >= 0; i--) {
183
- buf += str_snprintf("%02X", 2, this->uuid_.uuid.uuid128[i]);
184
- if (i == 6 || i == 8 || i == 10 || i == 12)
185
- buf += "-";
200
+ uint8_t byte = this->uuid_.uuid.uuid128[i];
201
+ *pos++ = format_hex_pretty_char(byte >> 4);
202
+ *pos++ = format_hex_pretty_char(byte & 0x0F);
203
+ if (i == 12 || i == 10 || i == 8 || i == 6) {
204
+ *pos++ = '-';
205
+ }
186
206
  }
187
- return buf;
207
+ *pos = '\0';
208
+ return std::string(buf);
188
209
  }
189
210
  return "";
190
211
  }
@@ -31,12 +31,13 @@ void ESP32BLEBeacon::dump_config() {
31
31
  char uuid[37];
32
32
  char *bpos = uuid;
33
33
  for (int8_t ii = 0; ii < 16; ++ii) {
34
- bpos += sprintf(bpos, "%02X", this->uuid_[ii]);
34
+ *bpos++ = format_hex_pretty_char(this->uuid_[ii] >> 4);
35
+ *bpos++ = format_hex_pretty_char(this->uuid_[ii] & 0x0F);
35
36
  if (ii == 3 || ii == 5 || ii == 7 || ii == 9) {
36
- bpos += sprintf(bpos, "-");
37
+ *bpos++ = '-';
37
38
  }
38
39
  }
39
- uuid[36] = '\0';
40
+ *bpos = '\0';
40
41
  ESP_LOGCONFIG(TAG,
41
42
  " UUID: %s, Major: %u, Minor: %u, Min Interval: %ums, Max Interval: %ums, Measured Power: %d"
42
43
  ", TX Power: %ddBm",
@@ -60,11 +60,14 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
60
60
  if (address == 0) {
61
61
  this->address_str_ = "";
62
62
  } else {
63
- this->address_str_ =
64
- str_snprintf("%02X:%02X:%02X:%02X:%02X:%02X", 17, (uint8_t) (this->address_ >> 40) & 0xff,
65
- (uint8_t) (this->address_ >> 32) & 0xff, (uint8_t) (this->address_ >> 24) & 0xff,
66
- (uint8_t) (this->address_ >> 16) & 0xff, (uint8_t) (this->address_ >> 8) & 0xff,
67
- (uint8_t) (this->address_ >> 0) & 0xff);
63
+ char buf[18];
64
+ uint8_t mac[6] = {
65
+ (uint8_t) ((this->address_ >> 40) & 0xff), (uint8_t) ((this->address_ >> 32) & 0xff),
66
+ (uint8_t) ((this->address_ >> 24) & 0xff), (uint8_t) ((this->address_ >> 16) & 0xff),
67
+ (uint8_t) ((this->address_ >> 8) & 0xff), (uint8_t) ((this->address_ >> 0) & 0xff),
68
+ };
69
+ format_mac_addr_upper(mac, buf);
70
+ this->address_str_ = buf;
68
71
  }
69
72
  }
70
73
  const std::string &address_str() const { return this->address_str_; }
@@ -607,9 +607,8 @@ void ESPBTDevice::parse_adv_(const uint8_t *payload, uint8_t len) {
607
607
  }
608
608
 
609
609
  std::string ESPBTDevice::address_str() const {
610
- char mac[24];
611
- snprintf(mac, sizeof(mac), "%02X:%02X:%02X:%02X:%02X:%02X", this->address_[0], this->address_[1], this->address_[2],
612
- this->address_[3], this->address_[4], this->address_[5]);
610
+ char mac[18];
611
+ format_mac_addr_upper(this->address_, mac);
613
612
  return mac;
614
613
  }
615
614
 
@@ -77,6 +77,13 @@ ETHERNET_TYPES = {
77
77
  "DM9051": EthernetType.ETHERNET_TYPE_DM9051,
78
78
  }
79
79
 
80
+ # PHY types that need compile-time defines for conditional compilation
81
+ _PHY_TYPE_TO_DEFINE = {
82
+ "KSZ8081": "USE_ETHERNET_KSZ8081",
83
+ "KSZ8081RNA": "USE_ETHERNET_KSZ8081",
84
+ # Add other PHY types here only if they need conditional compilation
85
+ }
86
+
80
87
  SPI_ETHERNET_TYPES = ["W5500", "DM9051"]
81
88
  SPI_ETHERNET_DEFAULT_POLLING_INTERVAL = TimePeriodMilliseconds(milliseconds=10)
82
89
 
@@ -345,6 +352,10 @@ async def to_code(config):
345
352
  if CONF_MANUAL_IP in config:
346
353
  cg.add(var.set_manual_ip(manual_ip(config[CONF_MANUAL_IP])))
347
354
 
355
+ # Add compile-time define for PHY types with specific code
356
+ if phy_define := _PHY_TYPE_TO_DEFINE.get(config[CONF_TYPE]):
357
+ cg.add_define(phy_define)
358
+
348
359
  cg.add_define("USE_ETHERNET")
349
360
 
350
361
  # Disable WiFi when using Ethernet to save memory
@@ -229,10 +229,12 @@ void EthernetComponent::setup() {
229
229
  ESPHL_ERROR_CHECK(err, "ETH driver install error");
230
230
 
231
231
  #ifndef USE_ETHERNET_SPI
232
+ #ifdef USE_ETHERNET_KSZ8081
232
233
  if (this->type_ == ETHERNET_TYPE_KSZ8081RNA && this->clk_mode_ == EMAC_CLK_OUT) {
233
234
  // KSZ8081RNA default is incorrect. It expects a 25MHz clock instead of the 50MHz we provide.
234
235
  this->ksz8081_set_clock_reference_(mac);
235
236
  }
237
+ #endif // USE_ETHERNET_KSZ8081
236
238
 
237
239
  for (const auto &phy_register : this->phy_registers_) {
238
240
  this->write_phy_register_(mac, phy_register);
@@ -300,6 +302,7 @@ void EthernetComponent::loop() {
300
302
  this->state_ = EthernetComponentState::CONNECTING;
301
303
  this->start_connect_();
302
304
  } else {
305
+ this->finish_connect_();
303
306
  // When connected and stable, disable the loop to save CPU cycles
304
307
  this->disable_loop();
305
308
  }
@@ -486,10 +489,35 @@ void EthernetComponent::got_ip6_event_handler(void *arg, esp_event_base_t event_
486
489
  }
487
490
  #endif /* USE_NETWORK_IPV6 */
488
491
 
492
+ void EthernetComponent::finish_connect_() {
493
+ #if USE_NETWORK_IPV6
494
+ // Retry IPv6 link-local setup if it failed during initial connect
495
+ // This handles the case where min_ipv6_addr_count is NOT set (or is 0),
496
+ // allowing us to reach CONNECTED state with just IPv4.
497
+ // If IPv6 setup failed in start_connect_() because the interface wasn't ready:
498
+ // - Bootup timing issues (#10281)
499
+ // - Cable unplugged/network interruption (#10705)
500
+ // We can now retry since we're in CONNECTED state and the interface is definitely up.
501
+ if (!this->ipv6_setup_done_) {
502
+ esp_err_t err = esp_netif_create_ip6_linklocal(this->eth_netif_);
503
+ if (err == ESP_OK) {
504
+ ESP_LOGD(TAG, "IPv6 link-local address created (retry succeeded)");
505
+ }
506
+ // Always set the flag to prevent continuous retries
507
+ // If IPv6 setup fails here with the interface up and stable, it's
508
+ // likely a persistent issue (IPv6 disabled at router, hardware
509
+ // limitation, etc.) that won't be resolved by further retries.
510
+ // The device continues to work with IPv4.
511
+ this->ipv6_setup_done_ = true;
512
+ }
513
+ #endif /* USE_NETWORK_IPV6 */
514
+ }
515
+
489
516
  void EthernetComponent::start_connect_() {
490
517
  global_eth_component->got_ipv4_address_ = false;
491
518
  #if USE_NETWORK_IPV6
492
519
  global_eth_component->ipv6_count_ = 0;
520
+ this->ipv6_setup_done_ = false;
493
521
  #endif /* USE_NETWORK_IPV6 */
494
522
  this->connect_begin_ = millis();
495
523
  this->status_set_warning(LOG_STR("waiting for IP configuration"));
@@ -545,9 +573,27 @@ void EthernetComponent::start_connect_() {
545
573
  }
546
574
  }
547
575
  #if USE_NETWORK_IPV6
576
+ // Attempt to create IPv6 link-local address
577
+ // We MUST attempt this here, not just in finish_connect_(), because with
578
+ // min_ipv6_addr_count set, the component won't reach CONNECTED state without IPv6.
579
+ // However, this may fail with ESP_FAIL if the interface is not up yet:
580
+ // - At bootup when link isn't ready (#10281)
581
+ // - After disconnection/cable unplugged (#10705)
582
+ // We'll retry in finish_connect_() if it fails here.
548
583
  err = esp_netif_create_ip6_linklocal(this->eth_netif_);
549
584
  if (err != ESP_OK) {
550
- ESPHL_ERROR_CHECK(err, "Enable IPv6 link local failed");
585
+ if (err == ESP_ERR_ESP_NETIF_INVALID_PARAMS) {
586
+ // This is a programming error, not a transient failure
587
+ ESPHL_ERROR_CHECK(err, "esp_netif_create_ip6_linklocal invalid parameters");
588
+ } else {
589
+ // ESP_FAIL means the interface isn't up yet
590
+ // This is expected and non-fatal, happens in multiple scenarios:
591
+ // - During reconnection after network interruptions (#10705)
592
+ // - At bootup when the link isn't ready yet (#10281)
593
+ // We'll retry once we reach CONNECTED state and the interface is up
594
+ ESP_LOGW(TAG, "esp_netif_create_ip6_linklocal failed: %s", esp_err_to_name(err));
595
+ // Don't mark component as failed - this is a transient error
596
+ }
551
597
  }
552
598
  #endif /* USE_NETWORK_IPV6 */
553
599
 
@@ -638,7 +684,9 @@ void EthernetComponent::get_eth_mac_address_raw(uint8_t *mac) {
638
684
  std::string EthernetComponent::get_eth_mac_address_pretty() {
639
685
  uint8_t mac[6];
640
686
  get_eth_mac_address_raw(mac);
641
- return str_snprintf("%02X:%02X:%02X:%02X:%02X:%02X", 17, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
687
+ char buf[18];
688
+ format_mac_addr_upper(mac, buf);
689
+ return std::string(buf);
642
690
  }
643
691
 
644
692
  eth_duplex_t EthernetComponent::get_duplex_mode() {
@@ -675,6 +723,7 @@ bool EthernetComponent::powerdown() {
675
723
 
676
724
  #ifndef USE_ETHERNET_SPI
677
725
 
726
+ #ifdef USE_ETHERNET_KSZ8081
678
727
  constexpr uint8_t KSZ80XX_PC2R_REG_ADDR = 0x1F;
679
728
 
680
729
  void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
@@ -703,6 +752,7 @@ void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
703
752
  ESP_LOGVV(TAG, "KSZ8081 PHY Control 2: %s", format_hex_pretty((u_int8_t *) &phy_control_2, 2).c_str());
704
753
  }
705
754
  }
755
+ #endif // USE_ETHERNET_KSZ8081
706
756
 
707
757
  void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister register_data) {
708
758
  esp_err_t err;
@@ -102,9 +102,12 @@ class EthernetComponent : public Component {
102
102
  #endif /* LWIP_IPV6 */
103
103
 
104
104
  void start_connect_();
105
+ void finish_connect_();
105
106
  void dump_connect_params_();
107
+ #ifdef USE_ETHERNET_KSZ8081
106
108
  /// @brief Set `RMII Reference Clock Select` bit for KSZ8081.
107
109
  void ksz8081_set_clock_reference_(esp_eth_mac_t *mac);
110
+ #endif
108
111
  /// @brief Set arbitratry PHY registers from config.
109
112
  void write_phy_register_(esp_eth_mac_t *mac, PHYRegister register_data);
110
113
 
@@ -144,6 +147,7 @@ class EthernetComponent : public Component {
144
147
  bool got_ipv4_address_{false};
145
148
  #if LWIP_IPV6
146
149
  uint8_t ipv6_count_{0};
150
+ bool ipv6_setup_done_{false};
147
151
  #endif /* LWIP_IPV6 */
148
152
 
149
153
  // Pointers at the end (naturally aligned)
@@ -1,7 +1,13 @@
1
1
  #include "factory_reset_button.h"
2
+
3
+ #include "esphome/core/defines.h"
4
+
5
+ #ifdef USE_OPENTHREAD
6
+ #include "esphome/components/openthread/openthread.h"
7
+ #endif
8
+ #include "esphome/core/application.h"
2
9
  #include "esphome/core/hal.h"
3
10
  #include "esphome/core/log.h"
4
- #include "esphome/core/application.h"
5
11
 
6
12
  namespace esphome {
7
13
  namespace factory_reset {
@@ -13,9 +19,20 @@ void FactoryResetButton::press_action() {
13
19
  ESP_LOGI(TAG, "Resetting");
14
20
  // Let MQTT settle a bit
15
21
  delay(100); // NOLINT
22
+ #ifdef USE_OPENTHREAD
23
+ openthread::global_openthread_component->on_factory_reset(FactoryResetButton::factory_reset_callback);
24
+ #else
25
+ global_preferences->reset();
26
+ App.safe_reboot();
27
+ #endif
28
+ }
29
+
30
+ #ifdef USE_OPENTHREAD
31
+ void FactoryResetButton::factory_reset_callback() {
16
32
  global_preferences->reset();
17
33
  App.safe_reboot();
18
34
  }
35
+ #endif
19
36
 
20
37
  } // namespace factory_reset
21
38
  } // namespace esphome
@@ -1,7 +1,9 @@
1
1
  #pragma once
2
2
 
3
- #include "esphome/core/component.h"
3
+ #include "esphome/core/defines.h"
4
+
4
5
  #include "esphome/components/button/button.h"
6
+ #include "esphome/core/component.h"
5
7
 
6
8
  namespace esphome {
7
9
  namespace factory_reset {
@@ -9,6 +11,9 @@ namespace factory_reset {
9
11
  class FactoryResetButton : public button::Button, public Component {
10
12
  public:
11
13
  void dump_config() override;
14
+ #ifdef USE_OPENTHREAD
15
+ static void factory_reset_callback();
16
+ #endif
12
17
 
13
18
  protected:
14
19
  void press_action() override;
@@ -1,7 +1,13 @@
1
1
  #include "factory_reset_switch.h"
2
+
3
+ #include "esphome/core/defines.h"
4
+
5
+ #ifdef USE_OPENTHREAD
6
+ #include "esphome/components/openthread/openthread.h"
7
+ #endif
8
+ #include "esphome/core/application.h"
2
9
  #include "esphome/core/hal.h"
3
10
  #include "esphome/core/log.h"
4
- #include "esphome/core/application.h"
5
11
 
6
12
  namespace esphome {
7
13
  namespace factory_reset {
@@ -17,10 +23,21 @@ void FactoryResetSwitch::write_state(bool state) {
17
23
  ESP_LOGI(TAG, "Resetting");
18
24
  // Let MQTT settle a bit
19
25
  delay(100); // NOLINT
26
+ #ifdef USE_OPENTHREAD
27
+ openthread::global_openthread_component->on_factory_reset(FactoryResetSwitch::factory_reset_callback);
28
+ #else
20
29
  global_preferences->reset();
21
30
  App.safe_reboot();
31
+ #endif
22
32
  }
23
33
  }
24
34
 
35
+ #ifdef USE_OPENTHREAD
36
+ void FactoryResetSwitch::factory_reset_callback() {
37
+ global_preferences->reset();
38
+ App.safe_reboot();
39
+ }
40
+ #endif
41
+
25
42
  } // namespace factory_reset
26
43
  } // namespace esphome