master
iotcat 5 years ago
parent 35810b1581
commit 3f902d19e3
  1. 7
      opt/node/node1/.vscode/arduino.json
  2. 10
      opt/node/node1/.vscode/bin/build.options.json
  3. 13
      opt/node/node1/.vscode/bin/core/CDC.cpp.d
  4. BIN
      opt/node/node1/.vscode/bin/core/CDC.cpp.o
  5. 15
      opt/node/node1/.vscode/bin/core/HardwareSerial.cpp.d
  6. BIN
      opt/node/node1/.vscode/bin/core/HardwareSerial.cpp.o
  7. 15
      opt/node/node1/.vscode/bin/core/HardwareSerial0.cpp.d
  8. BIN
      opt/node/node1/.vscode/bin/core/HardwareSerial0.cpp.o
  9. 15
      opt/node/node1/.vscode/bin/core/HardwareSerial1.cpp.d
  10. BIN
      opt/node/node1/.vscode/bin/core/HardwareSerial1.cpp.o
  11. 15
      opt/node/node1/.vscode/bin/core/HardwareSerial2.cpp.d
  12. BIN
      opt/node/node1/.vscode/bin/core/HardwareSerial2.cpp.o
  13. 15
      opt/node/node1/.vscode/bin/core/HardwareSerial3.cpp.d
  14. BIN
      opt/node/node1/.vscode/bin/core/HardwareSerial3.cpp.o
  15. 15
      opt/node/node1/.vscode/bin/core/IPAddress.cpp.d
  16. BIN
      opt/node/node1/.vscode/bin/core/IPAddress.cpp.o
  17. 14
      opt/node/node1/.vscode/bin/core/PluggableUSB.cpp.d
  18. BIN
      opt/node/node1/.vscode/bin/core/PluggableUSB.cpp.o
  19. 13
      opt/node/node1/.vscode/bin/core/Print.cpp.d
  20. BIN
      opt/node/node1/.vscode/bin/core/Print.cpp.o
  21. 13
      opt/node/node1/.vscode/bin/core/Stream.cpp.d
  22. BIN
      opt/node/node1/.vscode/bin/core/Stream.cpp.o
  23. 13
      opt/node/node1/.vscode/bin/core/Tone.cpp.d
  24. BIN
      opt/node/node1/.vscode/bin/core/Tone.cpp.o
  25. 14
      opt/node/node1/.vscode/bin/core/USBCore.cpp.d
  26. BIN
      opt/node/node1/.vscode/bin/core/USBCore.cpp.o
  27. 7
      opt/node/node1/.vscode/bin/core/WInterrupts.c.d
  28. BIN
      opt/node/node1/.vscode/bin/core/WInterrupts.c.o
  29. 2
      opt/node/node1/.vscode/bin/core/WMath.cpp.d
  30. BIN
      opt/node/node1/.vscode/bin/core/WMath.cpp.o
  31. 3
      opt/node/node1/.vscode/bin/core/WString.cpp.d
  32. BIN
      opt/node/node1/.vscode/bin/core/WString.cpp.o
  33. 2
      opt/node/node1/.vscode/bin/core/abi.cpp.d
  34. BIN
      opt/node/node1/.vscode/bin/core/abi.cpp.o
  35. BIN
      opt/node/node1/.vscode/bin/core/core.a
  36. 2
      opt/node/node1/.vscode/bin/core/hooks.c.d
  37. BIN
      opt/node/node1/.vscode/bin/core/hooks.c.o
  38. 14
      opt/node/node1/.vscode/bin/core/main.cpp.d
  39. BIN
      opt/node/node1/.vscode/bin/core/main.cpp.o
  40. 2
      opt/node/node1/.vscode/bin/core/new.cpp.d
  41. BIN
      opt/node/node1/.vscode/bin/core/new.cpp.o
  42. 7
      opt/node/node1/.vscode/bin/core/wiring.c.d
  43. BIN
      opt/node/node1/.vscode/bin/core/wiring.c.o
  44. 7
      opt/node/node1/.vscode/bin/core/wiring_analog.c.d
  45. BIN
      opt/node/node1/.vscode/bin/core/wiring_analog.c.o
  46. 7
      opt/node/node1/.vscode/bin/core/wiring_digital.c.d
  47. BIN
      opt/node/node1/.vscode/bin/core/wiring_digital.c.o
  48. 2
      opt/node/node1/.vscode/bin/core/wiring_pulse.S.d
  49. BIN
      opt/node/node1/.vscode/bin/core/wiring_pulse.S.o
  50. 7
      opt/node/node1/.vscode/bin/core/wiring_pulse.c.d
  51. BIN
      opt/node/node1/.vscode/bin/core/wiring_pulse.c.o
  52. 7
      opt/node/node1/.vscode/bin/core/wiring_shift.c.d
  53. BIN
      opt/node/node1/.vscode/bin/core/wiring_shift.c.o
  54. 37
      opt/node/node1/.vscode/bin/includes.cache
  55. 16
      opt/node/node1/.vscode/bin/libraries/LoRa/LoRa.cpp.d
  56. BIN
      opt/node/node1/.vscode/bin/libraries/LoRa/LoRa.cpp.o
  57. 15
      opt/node/node1/.vscode/bin/libraries/SPI/SPI.cpp.d
  58. BIN
      opt/node/node1/.vscode/bin/libraries/SPI/SPI.cpp.o
  59. 1
      opt/node/node1/.vscode/bin/node1.ino.eep
  60. BIN
      opt/node/node1/.vscode/bin/node1.ino.elf
  61. 770
      opt/node/node1/.vscode/bin/node1.ino.hex
  62. 894
      opt/node/node1/.vscode/bin/node1.ino.with_bootloader.hex
  63. 91
      opt/node/node1/.vscode/bin/preproc/ctags_target_for_gcc_minus_e.cpp
  64. 87
      opt/node/node1/.vscode/bin/sketch/lora-mqtt.h
  65. 289
      opt/node/node1/.vscode/bin/sketch/lora-socket.h
  66. 107
      opt/node/node1/.vscode/bin/sketch/node1.ino.cpp
  67. 20
      opt/node/node1/.vscode/bin/sketch/node1.ino.cpp.d
  68. BIN
      opt/node/node1/.vscode/bin/sketch/node1.ino.cpp.o
  69. 125
      opt/node/node1/.vscode/bin/sketch/ovo.h
  70. 136
      opt/node/node1/.vscode/bin/sketch/socket.hpp
  71. 77
      opt/node/node1/.vscode/bin/sketch/stringVec.h
  72. 269
      opt/node/node1/.vscode/bin/sketch/vector.h
  73. 19
      opt/node/node1/.vscode/c_cpp_properties.json
  74. 10
      opt/node/node1/.vscode/settings.json
  75. 87
      opt/node/node1/lora-mqtt.h
  76. 289
      opt/node/node1/lora-socket.h
  77. 90
      opt/node/node1/node1.ino
  78. 125
      opt/node/node1/ovo.h
  79. 136
      opt/node/node1/socket.hpp
  80. 77
      opt/node/node1/stringVec.h
  81. 269
      opt/node/node1/vector.h
  82. 42
      web/index.html

@ -0,0 +1,7 @@
{
"board": "arduino:avr:nano",
"configuration": "cpu=atmega328",
"port": "COM4",
"sketch": "node1.ino",
"output": "./.vscode/bin"
}

@ -0,0 +1,10 @@
{
"builtInLibrariesFolders": "C:\\Program Files (x86)\\Arduino\\libraries",
"customBuildProperties": "build.path=e:\\git\\smart-farming\\opt\\node\\node1\\.vscode\\bin,build.warn_data_percentage=75,runtime.tools.arduinoOTA.path=C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr,runtime.tools.avrdude.path=C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr,runtime.tools.avr-gcc.path=C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr",
"fqbn": "arduino:avr:nano:cpu=atmega328",
"hardwareFolders": "C:\\Program Files (x86)\\Arduino\\hardware,C:\\Users\\i\\AppData\\Local\\Arduino15\\packages",
"otherLibrariesFolders": "E:\\OneDrive\\pc\\document\\Arduino\\libraries",
"runtime.ide.version": "10805",
"sketchLocation": "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino",
"toolsFolders": "C:\\Program Files (x86)\\Arduino\\tools-builder,C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr,C:\\Users\\i\\AppData\\Local\\Arduino15\\packages"
}

@ -0,0 +1,13 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\CDC.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\CDC.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\HardwareSerial.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\HardwareSerial0.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial0.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\HardwareSerial1.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial1.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\HardwareSerial2.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial2.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\HardwareSerial3.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial3.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\IPAddress.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\IPAddress.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/IPAddress.h

Binary file not shown.

@ -0,0 +1,14 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\PluggableUSB.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\PluggableUSB.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\PluggableUSB.h

@ -0,0 +1,13 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\Print.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,13 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\Stream.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,13 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\Tone.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Tone.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,14 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\USBCore.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBCore.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\PluggableUSB.h

Binary file not shown.

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\WInterrupts.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WInterrupts.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,2 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\WMath.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WMath.cpp

Binary file not shown.

@ -0,0 +1,3 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\WString.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.h

Binary file not shown.

@ -0,0 +1,2 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\abi.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\abi.cpp

Binary file not shown.

Binary file not shown.

@ -0,0 +1,2 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\hooks.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\hooks.c

Binary file not shown.

@ -0,0 +1,14 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\main.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,2 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\new.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\new.cpp

Binary file not shown.

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring_analog.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_analog.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring_digital.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_digital.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

@ -0,0 +1,2 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring_pulse.S.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_pulse.S

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring_pulse.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_pulse.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

@ -0,0 +1,7 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\core\wiring_shift.c.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_shift.c \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_private.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino\binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

@ -0,0 +1,37 @@
[
{
"Sourcefile": "",
"Include": "",
"Includepath": "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino"
},
{
"Sourcefile": "",
"Include": "",
"Includepath": "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\eightanaloginputs"
},
{
"Sourcefile": "e:\\git\\smart-farming\\opt\\node\\node1\\.vscode\\bin\\sketch\\node1.ino.cpp",
"Include": "LoRa.h",
"Includepath": "E:\\OneDrive\\pc\\document\\Arduino\\libraries\\LoRa\\src"
},
{
"Sourcefile": "e:\\git\\smart-farming\\opt\\node\\node1\\.vscode\\bin\\sketch\\node1.ino.cpp",
"Include": "SPI.h",
"Includepath": "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src"
},
{
"Sourcefile": "e:\\git\\smart-farming\\opt\\node\\node1\\.vscode\\bin\\sketch\\node1.ino.cpp",
"Include": "",
"Includepath": ""
},
{
"Sourcefile": "E:\\OneDrive\\pc\\document\\Arduino\\libraries\\LoRa\\src\\LoRa.cpp",
"Include": "",
"Includepath": ""
},
{
"Sourcefile": "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src\\SPI.cpp",
"Include": "",
"Includepath": ""
}
]

@ -0,0 +1,16 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\libraries\LoRa\LoRa.cpp.o: \
E:\OneDrive\pc\document\Arduino\libraries\LoRa\src\LoRa.cpp \
E:\OneDrive\pc\document\Arduino\libraries\LoRa\src/LoRa.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h

@ -0,0 +1,15 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\libraries\SPI\SPI.cpp.o: \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h

Binary file not shown.

@ -0,0 +1,770 @@
:100000000C945E000C94BD040C9496040C94860031
:100010000C9486000C9486000C9486000C94860048
:100020000C9486000C9486000C9486000C94860038
:100030000C9486000C9486000C9486000C94860028
:100040000C944C040C9486000C944C030C942603E2
:100050000C9486000C9486000C9486000C94860008
:100060000C9486000C9486000000000025002800F7
:100070002B0000000008000201000003040700003C
:1000800000000000000000000000240027002A00FB
:10009000010204081020408001020408102001021F
:1000A00004081020040404040404040402020202EC
:1000B0000202030303030303D510310C11241FBEF6
:1000C000CFEFD8E0DEBFCDBF11E0A0E0B1E0E2E0CD
:1000D000FFE202C005900D92AE3FB107D9F723E0D1
:1000E000AEEFB1E001C01D92A333B207E1F710E01B
:1000F000CDE5D0E004C02197FE010E94AD12CC35C1
:10010000D107C9F70E94650C0C9474170C94000079
:10011000CF92DF92EF92FF920F931F93CF93DF93D3
:100120006C017A018B01C0E0D0E0CE15DF0589F0CB
:10013000D8016D918D01D601ED91FC910190F08176
:10014000E02DC6010995892B11F47E0102C021968C
:10015000ECCFC701DF91CF911F910F91FF90EF90EE
:10016000DF90CF900895FC01538D448D252F30E012
:10017000842F90E0821B930B541710F0CF960895B4
:1001800001970895FC01918D828D981761F0828D01
:10019000DF01A80FB11D5D968C91928D9F5F9F73BB
:1001A000928F90E008958FEF9FEF0895FC01918D5D
:1001B000828D981731F0828DE80FF11D858D90E0CA
:1001C00008958FEF9FEF0895FC01918D228D892F67
:1001D00090E0805C9F4F821B91098F73992708954F
:1001E00089E192E00E94E40021E0892B09F420E0FB
:1001F000822F0895FC01848DDF01A80FB11DA35A41
:10020000BF4F2C91848D90E001968F739927848F36
:10021000A689B7892C93A089B1898C9180648C932D
:10022000938D848D981306C00288F389E02D808118
:100230008F7D80830895EF92FF920F931F93CF934A
:10024000DF93EC0181E0888F9B8D8C8D981305C026
:10025000E889F989808185FD24C0F62E0B8D10E098
:100260000F5F1F4F0F731127E02E8C8DE8120CC00B
:100270000FB607FCFACFE889F989808185FFF5CFB1
:10028000CE010E94FA00F1CF8B8DFE01E80FF11D27
:10029000E35AFF4FF0820B8FEA89FB8980818062ED
:1002A00007C0EE89FF896083E889F98980818064CD
:1002B000808381E090E0DF91CF911F910F91FF90BB
:1002C000EF900895CF93DF93EC01888D8823C9F0D8
:1002D000EA89FB89808185FD05C0A889B9898C914F
:1002E00086FD0FC00FB607FCF5CF808185FFF2CFEA
:1002F000A889B9898C9185FFEDCFCE010E94FA00C3
:10030000E7CFDF91CF91089580E090E0892B29F02D
:100310000E94F00081110C94000008958E3008F0C6
:100320008E508770806480937C0080917A00806416
:1003300080937A0080917A0086FDFCCF80917800CE
:100340002091790090E0922B08953FB7F894809126
:10035000030290910402A0910502B091060226B515
:10036000A89B05C02F3F19F00196A11DB11D3FBFED
:10037000BA2FA92F982F8827820F911DA11DB11D7B
:10038000BC01CD0142E0660F771F881F991F4A9577
:10039000D1F7089508950895CF93DF931F92CDB7B5
:1003A000DEB76983DC01ED91FC910280F381E02DE1
:1003B00041E050E0BE016F5F7F4F09950F90DF91E4
:1003C000CF910895089580E090E008950F931F93D2
:1003D000CF93DF93EC0188819981009729F02A81DE
:1003E0003B812617370788F48B016F5F7F4F0E9490
:1003F000E013009761F0998388831B830A832C8123
:100400003D81232B11F4FC01108281E001C080E0CA
:10041000DF91CF911F910F910895EF92FF920F936B
:100420001F93CF93DF93FC01248135816115710502
:1004300011F480E019C041155105A9F07B01EC01D0
:100440008A01020F131FB8010E94E601882389F375
:10045000288139818C819D81B701820F931F0E9471
:10046000CC141D830C8381E0DF91CF911F910F91FC
:10047000FF90EF900895EF92FF920F931F93CF9309
:10048000DF93CDB7DEB728970FB6F894DEBF0FBE67
:10049000CDBF7C01CB014AE08E010F5F1F4FB80139
:1004A0000E949811F80101900020E9F73197AF01FF
:1004B000401B510BB801C7010E940D0228960FB6D0
:1004C000F894DEBF0FBECDBFDF91CF911F910F918A
:1004D000FF90EF9008956115710551F0FB010190B7
:1004E0000020E9F73197AF01461B570B0C940D0222
:1004F00080E00895CF93DF93EC0188819981009784
:1005000011F00E944813198218821D821C821B82DE
:100510001A82DF91CF910895CF93DF93EC01FB0115
:1005200044815581608171810E940D02811103C057
:10053000CE010E947A02CE01DF91CF910895EF9211
:10054000FF920F931F93CF93DF93EC017B018A01FE
:10055000BA010E94E601811104C0CE010E947A0214
:1005600007C01D830C83B701888199810E94CC1438
:10057000CE01DF91CF911F910F91FF90EF900895E1
:10058000CF93DF93EC016115710559F0FB010190E8
:100590000020E9F73197AF01461B570B0E949F02DD
:1005A00002C00E947A02CE01DF91CF910895CF93CD
:1005B000DF93EC01FB018617970761F06081718181
:1005C0006115710529F0448155810E949F0202C086
:1005D0000E947A02CE01DF91CF910895FC018081C3
:1005E00091810C944813FC011182108213821282B3
:1005F000158214820C94D702FC011182108213829E
:100600001282158214826115710551F0FB0101906F
:100610000020E9F73197AF01461B570B0C949F025E
:1006200008956115710579F0FB0101900020E9F74B
:100630003197AF01461B570BDC01ED91FC91028015
:10064000F381E02D099480E090E008951F920F92CD
:100650000FB60F9211242F933F934F935F936F9395
:100660007F938F939F93AF93BF93EF93FF9389E112
:1006700092E00E94FA00FF91EF91BF91AF919F919C
:100680008F917F916F915F914F913F912F910F903B
:100690000FBE0F901F9018951F920F920FB60F92DA
:1006A00011242F938F939F93EF93FF93E09129024F
:1006B000F0912A028081E0912F02F091300282FDB8
:1006C00012C09081809132028F5F8F73209133022C
:1006D000821751F0E0913202F0E0E75EFD4F958F16
:1006E0008093320201C08081FF91EF919F918F91A1
:1006F0002F910F900FBE0F901F90189590E0FC0166
:10070000EE58FF4F3491FC01E057FF4F2491FC015C
:10071000EC55FF4FE491EE2309F43BC0332339F14C
:10072000333091F038F43130A9F0323001F584B52E
:100730008F7D12C0373091F03830A1F03430B9F4E9
:10074000809180008F7D03C0809180008F7780939F
:1007500080000DC084B58F7784BD09C08091B00042
:100760008F7703C08091B0008F7D8093B000F0E060
:10077000EE0FFF1FE859FF4FA591B4918FB7F89482
:10078000EC91611103C020952E2301C02E2B2C93D8
:100790008FBF0895CF93DF9390E0FC01E057FF4FA8
:1007A0002491FC01EC55FF4F8491882361F190E086
:1007B000880F991FFC01EA57FF4FC591D491FC01A6
:1007C000E859FF4FA591B491611109C09FB7F89402
:1007D0008881209582238883EC912E230BC0623080
:1007E00061F49FB7F8943881822F809583238883A2
:1007F000EC912E2B2C939FBF06C08FB7F894E88105
:100800002E2B28838FBFDF91CF9108958F929F92D7
:10081000AF92BF92CF92DF92EF92FF926B017C0179
:100820000E94A5014B015C01C114D104E104F10453
:10083000F1F00E94A501DC01CB0188199909AA09F0
:10084000BB09883E9340A105B10570F321E0C21AAF
:10085000D108E108F10888EE880E83E0981EA11CFB
:10086000B11CC114D104E104F10419F7DDCFFF90EC
:10087000EF90DF90CF90BF90AF909F908F900895B2
:100880002FB7F8946091FF017091000280910102EE
:10089000909102022FBF08951F920F920FB60F92F0
:1008A00011242F933F938F939F93AF93BF93809186
:1008B000FF0190910002A0910102B09102023091DB
:1008C000FE0123E0230F2D3720F40196A11DB11D59
:1008D00005C026E8230F0296A11DB11D2093FE013D
:1008E0008093FF0190930002A0930102B093020253
:1008F0008091030290910402A0910502B09106023A
:100900000196A11DB11D8093030290930402A09350
:100910000502B0930602BF91AF919F918F913F91D5
:100920002F910F900FBE0F901F9018951F920F924E
:100930000FB60F9211242F933F934F935F936F93B2
:100940007F938F939F93AF93BF93EF93FF93E09128
:100950000201F09103010995FF91EF91BF91AF91D1
:100960009F918F917F916F915F914F913F912F91C7
:100970000F900FBE0F901F9018951F920F920FB6F9
:100980000F9211242F933F934F935F936F937F9315
:100990008F939F93AF93BF93EF93FF93E0910001E9
:1009A000F09101010995FF91EF91BF91AF919F9156
:1009B0008F917F916F915F914F913F912F910F9008
:1009C0000FBE0F901F901895EF92FF921F93CF9339
:1009D000DF931F92CDB7DEB77C01162F60E0FC01DC
:1009E000808949830E947E03F701948585859CBD9B
:1009F0008DBD1EBD000049810DB407FEFDCF8EB533
:100A00004EBD00000DB407FEFDCF1EB561E0F7013D
:100A100080890E947E03812F0F90DF91CF911F91DB
:100A2000FF90EF9008956F7740E00C94E404EF920C
:100A3000FF921F93CF93DF931F92CDB7DEB77C0158
:100A4000DC01ED91FC910084F185E02D0995892B65
:100A500099F06DE0C7010E941305482F60E0C701BF
:100A600049830E941305182F49816DE8C7010E9430
:100A7000E404812F90E002C08FEF9FEF0F90DF9191
:100A8000CF911F91FF90EF900895CF93DF93EC01EA
:100A9000E881F9810084F185E02D0995892B59F0D1
:100AA0008A8D9B8D01969B8F8A8F60E0CE010E947C
:100AB000130590E002C08FEF9FEFDF91CF91089573
:100AC000CF93DF93EC0163E10E941305282F30E000
:100AD0008A8D9B8DA901481B590BCA01DF91CF91CB
:100AE00008958F929F92AF92BF92CF92DF92FF9222
:100AF0000F931F93CF93DF931F92CDB7DEB76C0197
:100B0000B62E4A0162E279830E941305F82E90E026
:100B10009C01280D391D79812F3F310531F028F0D6
:100B20002FEF30E04901881A990A0B2D172F580131
:100B3000A80CB91C0A151B0541F0F80141918F0161
:100B400060E8C6010E94E404F5CF482D4F0D62EA2B
:100B5000C6010E94E404C4010F90DF91CF911F9160
:100B60000F91FF90DF90CF90BF90AF909F908F90AC
:100B70000895EF92FF920F931F93CF93DF9377FD2A
:100B800026C0FC01248535856217730704F5EC0146
:100B90008B010F5F1F4F26E0269FC001279F900DFE
:100BA00011248E0F9F1F2C853D857C01F6E0EF0EF2
:100BB000F11C0217130738F4B7010E94D7020F5F28
:100BC0001F4FC701F0CF215031093D872C87DF919E
:100BD000CF911F910F91FF90EF90089522E331E0A4
:100BE000FC013183208382819381009711F00C9462
:100BF00048130895CF93DF93EC010E94EE05CE01D8
:100C0000DF91CF910C9448130F931F93CF93DF93F1
:100C100000D0CDB7DEB78C01DB011496ED91FC91CD
:100C2000159720E030E08BE62E173F0781F0DB01BF
:100C30004D915C914115510529F0DA01A20FB31FC6
:100C40009C9101C090E089272F5F3F4FEDCF6AE173
:100C50000E949A12F8011182108213821282158268
:100C600014829F5999831A82BE016F5F7F4FC8011A
:100C70000E94C002C8010F900F90DF91CF911F9189
:100C80000F9108950E94CE0B45E861E886EB92E053
:100C90000C94E404CF93DF93EC010E94C80B68EC42
:100CA00070E080E090E00E9406040E94070CCE01F4
:100CB0000E941A0CE091B602F091B7024C815D815E
:100CC000688179810280F381E02D86EB92E00995BD
:100CD0000E94DE0B68EC70E080E090E00E94060469
:100CE000DF91CF910C944206EF92FF920F931F93E6
:100CF000CF93DF938C01EB0140E050E06CE7CE0135
:100D00000E94420BAC014F5F5F4F6CE7CE010E9427
:100D1000420BAC014F5F5F4F6CE7CE010E94420B6C
:100D2000AC014F5F5F4F6CE7CE010E94420B019612
:100D30007C01AC016CE7CE010E94420B9C01A70133
:100D4000BE01C8010E94FC0AC801DF91CF911F912A
:100D50000F91FF90EF900895CF92DF92EF92FF9264
:100D60000F931F93CF93DF9300D000D000D0CDB767
:100D7000DEB77C018B0140E050E06CE7C8010E94C7
:100D8000420BAC014F5F5F4F6CE7C8010E94420B02
:100D9000AC014F5F5F4F6CE7C8010E94420B0196A8
:100DA0006C01AC016CE7C8010E94420B9C01A601DA
:100DB000B801CE0101960E94FC0ABE016F5F7F4F11
:100DC000C7010E94F302CE0101960E94EE02C70104
:100DD00026960FB6F894DEBF0FBECDBFDF91CF9140
:100DE0001F910F91FF90EF90DF90CF9008950F9398
:100DF0001F93CF93DF93EC018B0140E050E06CE751
:100E0000C8010E94420B9C0140E050E0B801CE01B5
:100E10000E94FC0ACE01DF91CF911F910F9108959E
:100E2000EF92FF920F931F93CF93DF938C01EB010F
:100E300040E050E06CE7CE010E94420BAC014F5FF6
:100E40005F4F6CE7CE010E94420B01967C01AC0122
:100E50006CE7CE010E94420B9C01A701BE01C801B4
:100E60000E94FC0AC801DF91CF911F910F91FF9062
:100E7000EF900895EF92FF920F931F93CF93DF931C
:100E80008C01EB0140E050E06CE7CE010E94420B88
:100E900001967C01AC016CE7CE010E94420B9C01E3
:100EA000A701BE01C8010E94FC0AC801DF91CF91D1
:100EB0001F910F91FF90EF9008950F931F93CF9381
:100EC000DF9300D000D000D0CDB7DEB78C01CE01CB
:100ED00001960E94F3026AED71E0CE0101960E9434
:100EE000AF0B66E371E00E94AF0B6AED71E00E9408
:100EF000AF0BBC01C8010E94F302CE0101960E9413
:100F0000EE02C80126960FB6F894DEBF0FBECDBF25
:100F1000DF91CF911F910F9108958F929F92AF9281
:100F2000BF92CF92DF92EF92FF920F931F93CF93D6
:100F3000DF93CDB7DEB7AC970FB6F894DEBF0FBE28
:100F4000CDBF5C016B018EE391E00E94F40B62E483
:100F500071E0C5010E945E0B882309F444C1F601CB
:100F600080819181009709F43EC10E947111DC01DA
:100F7000CB01885C9109A109B10984369105A105CD
:100F8000B10508F030C16CEF71E0CE0181960E948E
:100F9000FC026BE471E0CE0181960E94C00280E108
:100FA0000E948E0124E630E0DC010E94A61220E0BF
:100FB00034E040E050E00E941312CA01B9012AE077
:100FC0008E010F5F1F4FA8010E94A311F80101902D
:100FD0000020E9F73197AF01401B510BB801CE015A
:100FE00081960E940D026DE571E0CE0181960E940E
:100FF0006B0281E10E948E0161E070E0C39714F002
:1010000060E070E0CE0181960E943B0263E671E0F1
:10101000CE0181960E946B028FE00E948E012DE727
:10102000AC01249FC001259F900D1124792F770FCB
:10103000770B692FCE0181960E943B0269E671E031
:10104000CE0181960E946B028EE00E948E01BC014F
:10105000CE0181960E943B026FE671E0CE0181963F
:101060000E946B0260E070E0CE0181960E943B021C
:1010700065E771E0CE0181960E946B02F601448122
:10108000558160817181CE0181960E940D026BE7CE
:1010900071E0CE0181960E946B02CE0181960E9482
:1010A0001A0C6DE771E0CE0187960E94FC02BE012A
:1010B000695D7F4FC8010E94F30266E871E0C801D4
:1010C0000E94AF0BBE016F5D7F4F0E948C02BC017E
:1010D000CE014B960E94F302C8010E94EE0268E81E
:1010E00071E0CE0145960E94FC028F8D98A18796F3
:1010F0000E94B3127C01BE01655E7F4FC8010E9451
:10110000F30299808A80BE016B5E7F4FCE010F96FD
:101110000E945D078F929F9288898F938F858F930E
:1011200080E991E09F938F93FF92EF920E94D314F6
:10113000CE010F960E94EE02C8010E94EE02B70196
:10114000CE010F960E94FC02BE01615F7F4FC80175
:101150000E9404068A818F9389818F93FF92EF9278
:101160008AE991E09F938F93FF92EF920E94D314AC
:10117000C8010E94EE02CE010F960E94EE020E946C
:10118000C80B68EC70E080E090E00E9406040E94CA
:10119000070CC7010E94F40BB70186EB92E00E9496
:1011A00011030E94DE0B68EC70E080E090E00E948A
:1011B00006040E944206C7010E944813CE014596CC
:1011C0000E94EE02CE014B960E94EE02CE0187965F
:1011D0000E94EE02CE0181960E94EE020FB6F894B4
:1011E000DEBF0FBECDBF6FE971E0C5010E945E0B8F
:1011F0008823F1F06EE871E0C6010E945E0B88233F
:1012000041F061E084E00E947E0385EB91E00E9462
:10121000F40B6CEB71E0C6010E945E0B882341F079
:1012200060E084E00E947E038EEB91E00E94F40B6C
:1012300068EE73E080E090E00E940604E0E0F0E0F9
:101240000995AC960FB6F894DEBF0FBECDBFDF9107
:10125000CF911F910F91FF90EF90DF90CF90BF90B3
:10126000AF909F908F9008958F929F92AF92BF9270
:10127000CF92DF92EF92FF920F931F93CF93DF9362
:10128000CDB7DEB768970FB6F894DEBF0FBECDBFFF
:101290008C017B016A015901BC0182E093E00E944C
:1012A000D702B7018CEF92E00E94D702B60186EF19
:1012B00092E00E94D702B50180EF92E00E94D7022F
:1012C00080910B02811135C0809007029090080236
:1012D000B501CE0143960E94F302B601CE010D96F0
:1012E0000E94F302B701CE0107960E94F302B801F3
:1012F000CE0101960E94F3029E012D5E3F4FAE018A
:10130000435F5F4FBE01695F7F4FCE010196F401DD
:101310000995CE0101960E94EE02CE0107960E9429
:10132000EE02CE010D960E94EE02CE0143960E947F
:10133000EE0268960FB6F894DEBF0FBECDBFDF9108
:10134000CF911F910F91FF90EF90DF90CF90BF90C2
:10135000AF909F908F900895CF92DF92EF92FF927F
:101360000F931F93CF93DF936B01FC01E484F5840B
:10137000EC0100E010E00E151F0561F0B601CE0192
:101380000E947D0B2696882311F0C80105C00F5FCF
:101390001F4FF1CF8FEF9FEFDF91CF911F910F91F3
:1013A000FF90EF90DF90CF9008950F931F93CF930E
:1013B000DF93CDB7DEB768970FB6F894DEBF0FBEE8
:1013C000CDBF8C0140E050E064E20E94420B8F3FB1
:1013D0002FEF920709F472C09C0140E050E0B80181
:1013E000CE0143960E94FC0A40E050E064E2C8014E
:1013F0000E94420BF80124813581AC014F5F5F4FA1
:10140000B801CE010D960E94FC0A66EC71E0CE0197
:1014100001960E94FC02BE016F5F7F4F82EE92E058
:101420000E94AC09019661F4BE016D5E7F4F82EEB1
:1014300092E00E94AC0911E0019619F410E001C09D
:1014400011E0CE0101960E94EE02112379F1BE0156
:101450006D5E7F4F8CED92E00E94D702BE01635F0C
:101460007F4F86ED92E00E94D70200910902109111
:101470000A02BE01635F7F4FCE0107960E94F3020E
:10148000BE016D5E7F4FCE0101960E94F302BE0148
:10149000695F7F4FCE010196F8010995CE01019653
:1014A0000E94EE02CE0107960E94EE02CE010D963A
:1014B0000E94EE02CE0143960E94EE0268960FB69D
:1014C000F894DEBF0FBECDBFDF91CF911F910F917A
:1014D0000895AF92BF92CF92DF92EF92FF920F9357
:1014E0001F93CF93DF9300D000D000D0CDB7DEB7ED
:1014F0008C016B01FC0184859585029749F5B80143
:10150000CE0101960E94F302F80184859585892B0E
:10151000D9F0C801EE24E394F12CF8012485358537
:101520005C01F6E0AF0EB11CE216F30640F4B50123
:101530000E94D702FFEFEF1AFF0AC501EECF21503C
:101540003109F80135872487CE0101960E94EE0209
:10155000F8012485358546E0429FC001439F900DE8
:101560001124B601800F911F0E94D702F8018485D3
:10157000958501969587848726960FB6F894DEBFE9
:101580000FBECDBFDF91CF911F910F91FF90EF90D4
:10159000DF90CF90BF90AF900895EF92FF920F939E
:1015A0001F93CF93DF93EC016CEF71E00E94FC027C
:1015B0006CEF71E0CE0106960E94FC021D861C862F
:1015C0007E0100E010E08C859D850817190758F40E
:1015D0006CEF71E0C7010E94C0020F5F1F4F86E0F1
:1015E000E80EF11CF0CFDF91CF911F910F91FF908A
:1015F000EF9008950E94AA14BF92CF92DF92EF92CB
:10160000FF920F931F93CF93DF937C016B018A01AD
:10161000E9012417350720F4812F8901C42FD82F21
:101620006CEF71E0C7010E94FC02D60114968D9107
:101630009C91159708171907D0F48C179D0708F48B
:10164000EC01D601ED91FC911197EC0FFD1FB080DC
:1016500010824D915C91BA01600F711FC7010E9409
:10166000C002D601ED91FC91EC0FFD1FB082C701C5
:10167000DF91CF911F910F91FF90EF90DF90CF906E
:10168000BF900895CF93DF93FC01248135814217E9
:10169000530778F4C081D181062E000C770BCE0160
:1016A000840F951F0E94B814009719F08C1B9D0B96
:1016B00002C08FEF9FEFDF91CF910895FC0124814D
:1016C0003581232B31F421E061157105A1F0FB0177
:1016D00008C0FC01808191816115710531F421E020
:1016E000FC018081882339F005C00E94C31421E0E9
:1016F000892B09F020E0822F0895FC012481358197
:10170000FB01448155812417350721F5FC018081B7
:101710009181FB0160817181009719F0611571055C
:10172000A1F46115710549F0232BB1F0FB01808113
:1017300090E09195819591090AC0009769F0232B5B
:1017400059F0FC01808190E002C00E94C31421E0A6
:10175000892B19F020E001C021E0822F0895CF935A
:10176000DF93EC016115710561F0FB010190002030
:10177000E9F73197AF01461B570B0E940D0281110B
:1017800003C0CE010E947A02CE01DF91CF9108956D
:1017900041E861E886EB92E00C94E4041092D302F5
:1017A0001092D2026DE186EB92E00E941305482F61
:1017B0004E7F6DE986EB92E00C94E40443E861E827
:1017C00086EB92E00E94E40462E186EB92E00E94E4
:1017D000130583FFF9CF48E062E986EB92E00E94AF
:1017E000E40481E090E00895CF93DF93BC0189E1A8
:1017F00092E00E941103EC016AEF71E089E192E04E
:101800000E9411038C0F9D1FDF91CF9108950E94BC
:10181000C80B0E94CE0B40E06DE886EB92E00E9480
:10182000E40440E062EA86EB92E00E94E40481E096
:1018300090E00895CF93DF93FC014481558160814E
:10184000718189E192E00E948800EC016AEF71E009
:1018500089E192E00E9411038C0F9D1FDF91CF91CF
:10186000089586ED92E00E94EE028CED92E00E94D7
:10187000EE0288EE92E00E94EE0282EE92E00E947A
:10188000EE0280EF92E00E94EE0286EF92E00E946C
:10189000EE028CEF92E00E94EE0282E093E00E9462
:1018A000EE0288E093E00E94EE0588E193E00E945A
:1018B000EE0282E193E00E94EE0286E293E00E9453
:1018C000EE0280E293E00C94EE02CF93DF93CDB76B
:1018D000DEB7A4970FB6F894DEBF0FBECDBF7894E5
:1018E00084B5826084BD84B5816084BD85B5826025
:1018F00085BD85B5816085BD80916E0081608093D6
:101900006E0010928100809181008260809381003E
:10191000809181008160809381008091800081604E
:10192000809380008091B10084608093B1008091A9
:10193000B00081608093B00080917A0084608093D1
:101940007A0080917A00826080937A0080917A0098
:10195000816080937A0080917A00806880937A0019
:101960001092C100E0912902F0912A0282E0808366
:10197000E0912502F09126021082E0912702F09179
:10198000280280E1808310923102E0912D02F091D3
:101990002E0286E08083E0912B02F0912C02808160
:1019A00080618083E0912B02F0912C02808188601D
:1019B0008083E0912B02F0912C02808180688083EB
:1019C000E0912B02F0912C0280818F7D808361E079
:1019D0008091C6020E94CA0361E08091C6020E9403
:1019E0007E038091C8029091C9028F3F2FEF92072A
:1019F000C9F061E00E94CA0360E08091C8020E94C1
:101A00007E036AE070E080E090E00E94060461E0FE
:101A10008091C8020E947E036AE070E080E090E05E
:101A20000E9406041FB7F89480910C02811127C010
:101A3000EEEAF0E08491EAE9F0E09491E82FF0E03A
:101A4000EE0FFF1FEA57FF4FA591B491EC91E923E8
:101A500021F461E08AE00E947E0361E08AE00E9456
:101A6000CA038CB580618CBD8CB580648CBD61E08F
:101A70008DE00E94CA0361E08BE00E94CA0380915E
:101A80000C028F5F80930C021FBF62E486EB92E032
:101A90000E941305823109F071C340E861E886EBCA
:101AA00092E00E94E40480E49EE0AFECB9E1809310
:101AB000CC029093CD02A093CE02B093CF024CE61D
:101AC00066E886EB92E00E94E40440E467E886EB77
:101AD00092E00E94E40440E068E886EB92E00E9415
:101AE000E40440E06EE886EB92E00E94E40440E00B
:101AF0006FE886EB92E00E94E4046CE086EB92E0F3
:101B00000E941305482F43606CE886EB92E00E9428
:101B1000E40444E066EA86EB92E00E94E4044FE8C5
:101B200069E886EB92E00E94E4040E94C80B60E042
:101B30008EE00E94CA0360E08FE00E94CA0360E06A
:101B400080E10E94CA0360E081E10E94CA0361E073
:101B500084E00E94CA030E94420685ED99E09093BA
:101B600008028093070266EC71E0CE0101960E94A4
:101B7000FC02BE016F5F7F4F82EE92E00E94690A15
:101B8000CE0101960E94EE028DE897E090930A0242
:101B90008093090288EC91E00E94F40BE12CF12C77
:101BA00096E0B92E0E94400461327F4B824091053D
:101BB00010F0F701099562E186EB92E00E941305AF
:101BC000182F0E94CE0B412F62E986EB92E00E9413
:101BD000E40416FF2CC015FD2AC01092D102109209
:101BE000D0028091D2029091D302892B11F062E24F
:101BF00001C063E186EB92E00E941305082F10E01C
:101C000060E186EB92E00E941305482F6DE886EBB9
:101C100092E00E94E4040E94C80B012B09F4F4C175
:101C20006CEF71E0CE014F960E94FC0215C061E09E
:101C300086EB92E00E941305863809F4E5C140E086
:101C40006DE886EB92E00E94E40446E861E886EBEA
:101C500092E00E94E404D8C186EB92E00E94600505
:101C6000892B81F086EB92E00E94450589831A82D8
:101C700041E050E0BE016F5F7F4FCE014F960E9462
:101C80000D02EACF2BA13CA12150310940E050E0E8
:101C9000BE01615E7F4FCE010D960E94FC0ABE011F
:101CA000635F7F4FCE0101960E9404062BA13CA1E9
:101CB000A90141505109BE01615E7F4FCE010796D7
:101CC0000E94FC0ABE016F5F7F4FCE0107960E9403
:101CD0007D0B182FCE0107960E94EE02CE010196D1
:101CE0000E94EE02CE010D960E94EE02112309F42D
:101CF00087C1BE01615E7F4FCE0101960E943A0707
:101D000066E371E0CE0101960E945E0B811115C061
:101D1000BE01615E7F4FCE0107960E943A0768E8D8
:101D200071E0CE0107960E945E0B11E0811110E078
:101D3000CE0107960E94EE0201C010E0CE0101968E
:101D40000E94EE0211115CC1BE01615E7F4FCE01A7
:101D500001960E94F70662ED71E0CE0101960E94A5
:101D60005E0B182FCE0101960E94EE021123C1F1E5
:101D700062ED71E0CE0143960E94FC02BE01615EFD
:101D80007F4FCE010D960E943A07BE01615E7F4FE4
:101D9000CE0107960E941007BE01615E7F4FCE0103
:101DA00001960E94AC069E012D5E3F4FAE01435F3F
:101DB0005F4FBE01695F7F4FCE0101960E943409DB
:101DC000CE0101960E94EE02CE0107960E94EE021D
:101DD000CE010D960E94EE02CE0143960E94EE02C5
:101DE000BE01615E7F4FCE0101960E94F7066DED48
:101DF00071E0CE0101960E945E0B182FCE01019674
:101E00000E94EE02112309F4B0C0BE01615E7F4F53
:101E100082E193E00E94690ABE01615E7F4FCE01BC
:101E200001960E947406BE01615E7F4FCE010D9641
:101E30000E941007BE01635F7F4FCE0107960E948C
:101E40005D0766ED71E0CE0143960E94FC02BE0183
:101E5000695F7F4FCE0143960E948C02BE016F5F87
:101E60007F4F0E948C026AED71E00E94AF0BBC01B3
:101E7000CE0149960E94F302CE0143960E94EE02E3
:101E8000CE0107960E94EE02CE010D960E94EE0250
:101E9000CE0101960E94EE02BE01675E7F4FCE0129
:101EA00001960E9404064D815E8169817A81CE018E
:101EB00049960E940D02CE0101960E94EE02CE01CB
:101EC00049960E944A06CE0149960E94EE02BE0142
:101ED000615E7F4F82E193E00E94AC09019609F0B8
:101EE0008FC06DED71E0CE0143960E94FC02BE01F1
:101EF000615E7F4FCE010D960E943A07BE01615E82
:101F00007F4FCE0107960E941007BE01615E7F4F92
:101F1000CE0101960E94AC069E012D5E3F4FAE01A0
:101F2000435F5F4FBE01695F7F4FCE0101960E9404
:101F30003409CE0101960E94EE02CE0107960E945E
:101F4000EE02CE010D960E94EE02CE0143960E9453
:101F5000EE0280911E0390911F03069734F060E01B
:101F600070E082E193E00E94B905BE01615E7F4F9F
:101F7000CE0101960E94F7066CED71E0CE0101964C
:101F80000E945E0B182FCE0101960E94EE021123D3
:101F9000B9F1BE01615E7F4FCE0107960E94AC068B
:101FA00000E010E080912C0390912D030817190791
:101FB00018F517FD04C0081719070CF4E4C060E217
:101FC00073E0CE0101960E947406BE01695F7F4FE7
:101FD000CE0101960E947D0BD82ECE0101960E9463
:101FE000EE02DD2031F0B80180E293E00E94B905F5
:101FF00003C00F5F1F4FD6CFCE0107960E94EE029F
:10200000CE014F960E94EE028091110281110DC007
:102010000E94400460930D0270930E0280930F02A1
:102020009093100281E0809311020E94400400917D
:102030000D0210910E0220910F0230911002DC016E
:10204000CB01801B910BA20BB30B893E9340A105E2
:10205000B10508F490C0812C912C00E010E0809133
:102060002C0390912D030817190708F07AC017FD6B
:1020700004C0081719070CF48EC080E2C82E83E054
:10208000D82E61EE71E0CE0101960E94FC02B601ED
:10209000CE0101960E948C020E944A06CE01019652
:1020A0000E94EE0280910E0390910F03801791071A
:1020B0003CF0E0910A03F0910B03E80DF91D02C01A
:1020C000E0E1F3E0808191810196918380838091AA
:1020D0000E0390910F03801791073CF0E0910A03E3
:1020E000F0910B03E80DF91D02C0E0E1F3E08081FF
:1020F0009181F80131966F01089770F1B80180E283
:1021000093E00E94B905E0910A03F0910B03E80DFA
:10211000F91D80E090E020910E0330910F03A9019A
:102120004F5F5F4F401B510B8417950734F4A60196
:10213000480F591F241735074CF40C191D09200F9F
:10214000311F30930F0320930E0306C02281338189
:10215000219331930196DFCF8601F2E08F0E911C1F
:102160007ECF0E94400460930D0270930E02809314
:102170000F02909310020E94840114CD84EE91E02E
:102180000E94F40BFFCFB09EB001B19E700D1124E0
:10219000605E7C4F16CFB09EC001B19E900D1124A1
:1021A0009C01205E3C4F69016CCFCF93DF93E9E146
:1021B000F2E01382128288EE93E0A0E0B0E0848324
:1021C0009583A683B7838EE091E09183808385EC2D
:1021D00090E09587848784EC90E09787868780ECF1
:1021E00090E0918B808B81EC90E0938B828B82ECE2
:1021F00090E0958B848B86EC90E0978B868B118E8C
:10220000128E138E148EE6EBF2E01382128280E2BD
:1022100091E09183808380E5848781E085878EE2E9
:1022200093E0978786878AE090E0918B808B89E0A6
:1022300090E0938B828B82E090E0958B848B168A62
:10224000178A108E118E138E128E158E148E178E85
:10225000168E148215821682178280E293E00E9405
:10226000CD0A82E193E00E94CD0AC8E0D3E082E388
:1022700091E09983888380E090E00E94B3129B8371
:102280008A832FEF3FEF3F832E839D838C836CEFF8
:1022900071E082E093E00E94FC026CEF71E08CEF51
:1022A00092E00E94FC026CEF71E086EF92E00E94E7
:1022B000FC026CEF71E080EF92E00E94FC0282EE83
:1022C00092E00E94CD0A6CEF71E08CED92E00E94EA
:1022D000FC026CEF71E086ED92E0DF91CF910C94FF
:1022E000FC021F93FC0199278827BC01E8941191F7
:1022F0001032E9F3193010F01E30C8F31B3251F0E0
:102300001D3249F4689406C00E94B211610F711D1C
:10231000811D911D119110531A30B0F33EF4909528
:102320008095709561957F4F8F4F9F4F1F910895B6
:10233000BB274A3031F4992322F4BDE29095819570
:102340009F4F0C94EA11BB272A3051F4992342F491
:10235000BDE290958095709561957F4F8F4F9F4F0F
:102360000C94C811592F482F372F262F660F771F2F
:10237000881F991F660F771F881F991F620F731F91
:10238000841F951F660F771F881F991F0895BB270D
:10239000FA01A62F6217710581059105330B30FBF9
:1023A00066F0AA27660F771F881F991FAA1FA2171A
:1023B00010F0A21B63953850A9F7A05DAA3308F06E
:1023C000A95DA19336F7B111B1931082CA010C94A3
:1023D0000312BB27FB015527AA27880F991FAA1FA5
:1023E000A41710F0A41B83955051B9F7A05DAA3330
:1023F00008F0A95DA193009779F7B111B1931192FB
:10240000CB010C940312DC01FC01672F719177233F
:10241000E1F7329704C07C916D9370836291AE179F
:10242000BF07C8F30895052E97FB1EF400940E9481
:102430002A1257FD07D00E94691207FC03D04EF400
:102440000C942A1250954095309521953F4F4F4F4F
:102450005F4F089590958095709561957F4F8F4F50
:102460009F4F08952F923F924F925F926F927F926B
:102470008F929F92AF92BF92CF92DF92EF92FF9294
:102480000F931F93CF93DF93CDB7DEB7CA1BDB0B40
:102490000FB6F894DEBF0FBECDBF09942A883988E5
:1024A00048885F846E847D848C849B84AA84B984EC
:1024B000C884DF80EE80FD800C811B81AA81B981F8
:1024C000CE0FD11D0FB6F894DEBF0FBECDBFED010C
:1024D0000895A1E21A2EAA1BBB1BFD010DC0AA1F65
:1024E000BB1FEE1FFF1FA217B307E407F50720F07D
:1024F000A21BB30BE40BF50B661F771F881F991FF8
:102500001A9469F760957095809590959B01AC0140
:10251000BD01CF010895A29FB001B39FC001A39F49
:10252000700D811D1124911DB29F700D811D11240C
:10253000911D0895991B79E004C0991F961708F022
:10254000961B881F7A95C9F7809508950E948B1273
:10255000B7FF0895821B930B0895EE0FFF1F0590A0
:10256000F491E02D0994CF93DF938230910510F41C
:1025700082E090E0E0913103F091320320E030E01E
:10258000C0E0D0E0309711F14081518148175907E0
:10259000C0F04817590761F482819381209719F0A0
:1025A0009B838A832BC0909332038093310326C090
:1025B0002115310519F04217530718F49A01BE018D
:1025C000DF01EF010280F381E02DDCCF2115310521
:1025D00009F1281B390B2430310590F412968D91A6
:1025E0009C9113976115710521F0FB019383828300
:1025F00004C09093320380933103FD01329644C0AE
:10260000FD01E20FF31F81939193225031092D9325
:102610003C933AC020912F0330913003232B41F497
:1026200020910601309107013093300320932F034E
:1026300020910401309105012115310541F42DB798
:102640003EB74091080150910901241B350BE091E0
:102650002F03F0913003E217F307A0F42E1B3F0B7A
:102660002817390778F0AC014E5F5F4F2417350704
:1026700048F04E0F5F1F5093300340932F03819318
:10268000919302C0E0E0F0E0CF01DF91CF91089597
:102690000F931F93CF93DF93009709F48CC0FC0135
:1026A0003297138212820091310310913203011587
:1026B000110581F420813181820F931F20912F0316
:1026C000309130032817390779F5F0933003E09300
:1026D0002F0371C0D80140E050E0AE17BF0750F49F
:1026E00012962D913C911397AD012115310509F1F9
:1026F000D901F3CF9D01DA01338322836081718197
:10270000860F971F8217930769F4EC01288139819E
:10271000260F371F2E5F3F4F318320838A819B8195
:1027200093838283452B29F4F0933203E0933103A2
:1027300042C01396FC93EE931297ED014991599183
:102740009E01240F351FE217F30771F480819181F8
:10275000840F951F029611969C938E93828193818C
:1027600013969C938E931297E0E0F0E0D8011296B6
:102770008D919C911397009719F0F8018C01F6CF79
:102780008D919C9198012E5F3F4F820F931F209156
:102790002F03309130032817390769F4309729F453
:1027A000109232031092310302C0138212821093EE
:1027B000300300932F03DF91CF911F910F91089564
:1027C000A0E0B0E0E6EEF3E10C943612EC010097E5
:1027D00021F4CB010E94B312B8C0FC01E60FF71F31
:1027E0009C0122503109E217F30708F4ACC0D9016B
:1027F0000D911C91119706171707B0F005301105C0
:1028000008F49FC0C80104978617970708F499C079
:1028100002501109061B170B019311936D937C93C2
:10282000CF010E9448138DC05B01A01AB10A4C0170
:10283000800E911EA0913103B091320340E050E030
:10284000E12CF12C109709F44AC0A815B905D1F56F
:102850006D907C901197630182E0C80ED11CCA1460
:10286000DB0480F1A3014A195B096A0182E0C80E0A
:10287000D11C1296BC9012971396AC91B5E0CB1672
:10288000D10440F0B282A38351834083D9016D9378
:102890007C930AC00E5F1F4FC301800F911FF90187
:1028A00091838083EB2DFA2FE114F10431F0D701ED
:1028B0001396FC93EE93129744C0F0933203E09387
:1028C00031033FC08D919C9111974817590708F427
:1028D000AC017D0112960D90BC91A02DB3CF8091DB
:1028E0002F039091300388159905E1F44617570797
:1028F000C8F48091040190910501009741F48DB7CF
:102900009EB74091080150910901841B950BE8176F
:10291000F907C8F4F0933003E0932F03F9017183B2
:1029200060830FC0CB010E94B3127C01009759F065
:10293000A801BE010E94AF14CE010E944813C70136
:1029400004C0CE0102C080E090E0CDB7DEB7EEE07B
:102950000C94521281E090E0F8940C947417FB01EF
:10296000DC0102C001900D9241505040D8F708950B
:10297000FC018191861721F08823D9F799270895C2
:102980003197CF010895FB01DC018D9101908019F1
:102990000110D9F3990B0895FB01DC0101900D9210
:1029A0000020E1F70895AEE0B0E0E9EDF4E10C9429
:1029B00040120D891E8986E08C831A8309838FEF6C
:1029C0009FE79E838D83AE01475E5F4F6F89788D51
:1029D000CE0101960E94F6142F813885F801E20F8E
:1029E000F31F10822E96E4E00C945C12ACE0B0E091
:1029F000ECEFF4E10C9432127C016B018A01FC01D2
:102A000017821682838181FFBDC1CE0101964C01E0
:102A1000F7019381F60193FD859193FF81916F01F9
:102A2000882309F4ABC1853239F493FD859193FF76
:102A300081916F01853229F4B70190E00E94DE1682
:102A4000E7CF512C312C20E02032A0F48B3269F0FA
:102A500030F4803259F0833269F420612CC08D3219
:102A600039F0803339F4216026C02260246023C00D
:102A7000286021C027FD27C030ED380F3A3078F4A8
:102A800026FF06C0FAE05F9E300D1124532E13C0BE
:102A90008AE0389E300D1124332E20620CC08E3215
:102AA00021F426FD6BC1206406C08C3611F4206829
:102AB00002C0883641F4F60193FD859193FF819120
:102AC0006F018111C1CF982F9F7D9554933028F4C9
:102AD0000C5F1F4FFFE3F9830DC0833631F083375E
:102AE00071F0833509F05BC022C0F80180818983D1
:102AF0000E5F1F4F44244394512C540115C03801DC
:102B0000F2E06F0E711CF801A080B18026FF03C0B7
:102B1000652D70E002C06FEF7FEFC5012C870E942A
:102B2000D3162C0183012C852F77222E17C0380154
:102B3000F2E06F0E711CF801A080B18026FF03C087
:102B4000652D70E002C06FEF7FEFC5012C870E94FA
:102B5000C8162C012C852068222E830123FC1BC063
:102B6000832D90E048165906B0F4B70180E290E05A
:102B70000E94DE163A94F4CFF50127FC859127FEDA
:102B800081915F01B70190E00E94DE1631103A9406
:102B9000F1E04F1A51084114510471F7E5C0843631
:102BA00011F0893639F5F80127FF07C0608171817E
:102BB000828193810C5F1F4F08C060817181072E55
:102BC000000C880B990B0E5F1F4F2F76722E97FF0C
:102BD00009C090958095709561957F4F8F4F9F4F5D
:102BE0002068722E2AE030E0A4010E941617A82E59
:102BF000A81844C0853729F42F7EB22E2AE030E091
:102C000025C0F22FF97FBF2E8F36C1F018F488351A
:102C100079F0B4C0803719F0883721F0AFC02F2F7A
:102C20002061B22EB4FE0DC08B2D8460B82E09C079
:102C300024FF0AC09F2F9660B92E06C028E030E01E
:102C400005C020E130E002C020E132E0F801B7FE2B
:102C500007C060817181828193810C5F1F4F06C024
:102C60006081718180E090E00E5F1F4FA4010E949F
:102C70001617A82EA818FB2DFF777F2E76FE0BC007
:102C8000372D3E7FA51450F474FE0AC072FC08C0B4
:102C9000372D3E7E05C0BA2C372D03C0BA2C01C09B
:102CA000B52C34FF0DC0FE01EA0DF11D808180338B
:102CB00011F4397E09C032FF06C0B394B39404C046
:102CC000832F867809F0B39433FD13C030FF06C01C
:102CD0005A2CB31418F4530C5B18B32CB31468F4C7
:102CE000B70180E290E03C870E94DE16B3943C85F9
:102CF000F5CFB31410F43B1801C0312C34FF12C0CF
:102D0000B70180E390E03C870E94DE163C8532FFED
:102D100017C031FD03C088E790E002C088E590E06D
:102D2000B7010CC0832F867859F031FF02C08BE2C7
:102D300001C080E237FD8DE2B70190E00E94DE160F
:102D4000A51438F4B70180E390E00E94DE165A948F
:102D5000F7CFAA94F401EA0DF11D8081B70190E04C
:102D60000E94DE16A110F5CF332009F451CEB70131
:102D700080E290E00E94DE163A94F6CFF701868159
:102D8000978102C08FEF9FEF2C96E2E10C944E12D8
:102D9000FC010590615070400110D8F78095909526
:102DA0008E0F9F1F0895FC0161507040019001102B
:102DB000D8F7809590958E0F9F1F08950F931F93BE
:102DC000CF93DF93FB01238121FD03C08FEF9FEFA2
:102DD00028C022FF16C046815781248135814217C1
:102DE000530744F4A081B1819D012F5F3F4F318390
:102DF00020838C93268137812F5F3F4F3783268333
:102E000010C0EB01092F182F0084F185E02D0995E2
:102E1000892BE1F68E819F8101969F838E83812F7E
:102E2000902FDF91CF911F910F910895FA01AA275A
:102E3000283051F1203181F1E8946F936E7F6E5FFD
:102E40007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0AB
:102E5000670F781F891F9A1FA11D680F791F8A1F8E
:102E6000911DA11D6A0F711D811D911DA11D20D0F5
:102E700009F468943F912AE0269F11243019305DAF
:102E80003193DEF6CF010895462F4770405D4193A0
:102E9000B3E00FD0C9F7F6CF462F4F70405D4A33ED
:102EA00018F0495D31FD4052419302D0A9F7EACFB5
:102EB000B4E0A6959795879577956795BA95C9F7E4
:102EC00000976105710508959B01AC010A2E0694D7
:102ED0005795479537952795BA95C9F7620F731F90
:102EE000841F951FA01D089510E0CDE5D0E004C01B
:102EF000FE010E94AD122196CE35D107C9F7F89494
:022F0000FFCF01
:102F0200CA01CA01000033038000000000001B0157
:102F12008800B3006201E400C200D6000000000095
:102F2200CC017105E301CB016005450517050000E1
:102F32000000EE05FA05312E302E302E3200726579
:102F42007300716F732F73796E63007B2274223A60
:102F5200226E6F646530222C2262223A002C227784
:102F6200223A002C2254223A002C2268223A002CC7
:102F72002273223A002C2271223A007D007265737C
:102F82002F6A736F6E002400302E302E302E3000E8
:102F92007564707C257325737C002573257300632B
:102FA200746C2F6E6F6465312F776174657253771D
:102FB200697463680070756D704F6E0031007075D2
:102FC2006D704F6666002300737461727465642EBF
:102FD2002E0075647000727463707C00727463708A
:102FE200007463005374617274696E67204C6F528F
:0E2FF20061206661696C656421000D0A0000B3
:00000001FF

@ -0,0 +1,894 @@
:100000000C945E000C94BD040C9496040C94860031
:100010000C9486000C9486000C9486000C94860048
:100020000C9486000C9486000C9486000C94860038
:100030000C9486000C9486000C9486000C94860028
:100040000C944C040C9486000C944C030C942603E2
:100050000C9486000C9486000C9486000C94860008
:100060000C9486000C9486000000000025002800F7
:100070002B0000000008000201000003040700003C
:1000800000000000000000000000240027002A00FB
:10009000010204081020408001020408102001021F
:1000A00004081020040404040404040402020202EC
:1000B0000202030303030303D510310C11241FBEF6
:1000C000CFEFD8E0DEBFCDBF11E0A0E0B1E0E2E0CD
:1000D000FFE202C005900D92AE3FB107D9F723E0D1
:1000E000AEEFB1E001C01D92A333B207E1F710E01B
:1000F000CDE5D0E004C02197FE010E94AD12CC35C1
:10010000D107C9F70E94650C0C9474170C94000079
:10011000CF92DF92EF92FF920F931F93CF93DF93D3
:100120006C017A018B01C0E0D0E0CE15DF0589F0CB
:10013000D8016D918D01D601ED91FC910190F08176
:10014000E02DC6010995892B11F47E0102C021968C
:10015000ECCFC701DF91CF911F910F91FF90EF90EE
:10016000DF90CF900895FC01538D448D252F30E012
:10017000842F90E0821B930B541710F0CF960895B4
:1001800001970895FC01918D828D981761F0828D01
:10019000DF01A80FB11D5D968C91928D9F5F9F73BB
:1001A000928F90E008958FEF9FEF0895FC01918D5D
:1001B000828D981731F0828DE80FF11D858D90E0CA
:1001C00008958FEF9FEF0895FC01918D228D892F67
:1001D00090E0805C9F4F821B91098F73992708954F
:1001E00089E192E00E94E40021E0892B09F420E0FB
:1001F000822F0895FC01848DDF01A80FB11DA35A41
:10020000BF4F2C91848D90E001968F739927848F36
:10021000A689B7892C93A089B1898C9180648C932D
:10022000938D848D981306C00288F389E02D808118
:100230008F7D80830895EF92FF920F931F93CF934A
:10024000DF93EC0181E0888F9B8D8C8D981305C026
:10025000E889F989808185FD24C0F62E0B8D10E098
:100260000F5F1F4F0F731127E02E8C8DE8120CC00B
:100270000FB607FCFACFE889F989808185FFF5CFB1
:10028000CE010E94FA00F1CF8B8DFE01E80FF11D27
:10029000E35AFF4FF0820B8FEA89FB8980818062ED
:1002A00007C0EE89FF896083E889F98980818064CD
:1002B000808381E090E0DF91CF911F910F91FF90BB
:1002C000EF900895CF93DF93EC01888D8823C9F0D8
:1002D000EA89FB89808185FD05C0A889B9898C914F
:1002E00086FD0FC00FB607FCF5CF808185FFF2CFEA
:1002F000A889B9898C9185FFEDCFCE010E94FA00C3
:10030000E7CFDF91CF91089580E090E0892B29F02D
:100310000E94F00081110C94000008958E3008F0C6
:100320008E508770806480937C0080917A00806416
:1003300080937A0080917A0086FDFCCF80917800CE
:100340002091790090E0922B08953FB7F894809126
:10035000030290910402A0910502B091060226B515
:10036000A89B05C02F3F19F00196A11DB11D3FBFED
:10037000BA2FA92F982F8827820F911DA11DB11D7B
:10038000BC01CD0142E0660F771F881F991F4A9577
:10039000D1F7089508950895CF93DF931F92CDB7B5
:1003A000DEB76983DC01ED91FC910280F381E02DE1
:1003B00041E050E0BE016F5F7F4F09950F90DF91E4
:1003C000CF910895089580E090E008950F931F93D2
:1003D000CF93DF93EC0188819981009729F02A81DE
:1003E0003B812617370788F48B016F5F7F4F0E9490
:1003F000E013009761F0998388831B830A832C8123
:100400003D81232B11F4FC01108281E001C080E0CA
:10041000DF91CF911F910F910895EF92FF920F936B
:100420001F93CF93DF93FC01248135816115710502
:1004300011F480E019C041155105A9F07B01EC01D0
:100440008A01020F131FB8010E94E601882389F375
:10045000288139818C819D81B701820F931F0E9471
:10046000CC141D830C8381E0DF91CF911F910F91FC
:10047000FF90EF900895EF92FF920F931F93CF9309
:10048000DF93CDB7DEB728970FB6F894DEBF0FBE67
:10049000CDBF7C01CB014AE08E010F5F1F4FB80139
:1004A0000E949811F80101900020E9F73197AF01FF
:1004B000401B510BB801C7010E940D0228960FB6D0
:1004C000F894DEBF0FBECDBFDF91CF911F910F918A
:1004D000FF90EF9008956115710551F0FB010190B7
:1004E0000020E9F73197AF01461B570B0C940D0222
:1004F00080E00895CF93DF93EC0188819981009784
:1005000011F00E944813198218821D821C821B82DE
:100510001A82DF91CF910895CF93DF93EC01FB0115
:1005200044815581608171810E940D02811103C057
:10053000CE010E947A02CE01DF91CF910895EF9211
:10054000FF920F931F93CF93DF93EC017B018A01FE
:10055000BA010E94E601811104C0CE010E947A0214
:1005600007C01D830C83B701888199810E94CC1438
:10057000CE01DF91CF911F910F91FF90EF900895E1
:10058000CF93DF93EC016115710559F0FB010190E8
:100590000020E9F73197AF01461B570B0E949F02DD
:1005A00002C00E947A02CE01DF91CF910895CF93CD
:1005B000DF93EC01FB018617970761F06081718181
:1005C0006115710529F0448155810E949F0202C086
:1005D0000E947A02CE01DF91CF910895FC018081C3
:1005E00091810C944813FC011182108213821282B3
:1005F000158214820C94D702FC011182108213829E
:100600001282158214826115710551F0FB0101906F
:100610000020E9F73197AF01461B570B0C949F025E
:1006200008956115710579F0FB0101900020E9F74B
:100630003197AF01461B570BDC01ED91FC91028015
:10064000F381E02D099480E090E008951F920F92CD
:100650000FB60F9211242F933F934F935F936F9395
:100660007F938F939F93AF93BF93EF93FF9389E112
:1006700092E00E94FA00FF91EF91BF91AF919F919C
:100680008F917F916F915F914F913F912F910F903B
:100690000FBE0F901F9018951F920F920FB60F92DA
:1006A00011242F938F939F93EF93FF93E09129024F
:1006B000F0912A028081E0912F02F091300282FDB8
:1006C00012C09081809132028F5F8F73209133022C
:1006D000821751F0E0913202F0E0E75EFD4F958F16
:1006E0008093320201C08081FF91EF919F918F91A1
:1006F0002F910F900FBE0F901F90189590E0FC0166
:10070000EE58FF4F3491FC01E057FF4F2491FC015C
:10071000EC55FF4FE491EE2309F43BC0332339F14C
:10072000333091F038F43130A9F0323001F584B52E
:100730008F7D12C0373091F03830A1F03430B9F4E9
:10074000809180008F7D03C0809180008F7780939F
:1007500080000DC084B58F7784BD09C08091B00042
:100760008F7703C08091B0008F7D8093B000F0E060
:10077000EE0FFF1FE859FF4FA591B4918FB7F89482
:10078000EC91611103C020952E2301C02E2B2C93D8
:100790008FBF0895CF93DF9390E0FC01E057FF4FA8
:1007A0002491FC01EC55FF4F8491882361F190E086
:1007B000880F991FFC01EA57FF4FC591D491FC01A6
:1007C000E859FF4FA591B491611109C09FB7F89402
:1007D0008881209582238883EC912E230BC0623080
:1007E00061F49FB7F8943881822F809583238883A2
:1007F000EC912E2B2C939FBF06C08FB7F894E88105
:100800002E2B28838FBFDF91CF9108958F929F92D7
:10081000AF92BF92CF92DF92EF92FF926B017C0179
:100820000E94A5014B015C01C114D104E104F10453
:10083000F1F00E94A501DC01CB0188199909AA09F0
:10084000BB09883E9340A105B10570F321E0C21AAF
:10085000D108E108F10888EE880E83E0981EA11CFB
:10086000B11CC114D104E104F10419F7DDCFFF90EC
:10087000EF90DF90CF90BF90AF909F908F900895B2
:100880002FB7F8946091FF017091000280910102EE
:10089000909102022FBF08951F920F920FB60F92F0
:1008A00011242F933F938F939F93AF93BF93809186
:1008B000FF0190910002A0910102B09102023091DB
:1008C000FE0123E0230F2D3720F40196A11DB11D59
:1008D00005C026E8230F0296A11DB11D2093FE013D
:1008E0008093FF0190930002A0930102B093020253
:1008F0008091030290910402A0910502B09106023A
:100900000196A11DB11D8093030290930402A09350
:100910000502B0930602BF91AF919F918F913F91D5
:100920002F910F900FBE0F901F9018951F920F924E
:100930000FB60F9211242F933F934F935F936F93B2
:100940007F938F939F93AF93BF93EF93FF93E09128
:100950000201F09103010995FF91EF91BF91AF91D1
:100960009F918F917F916F915F914F913F912F91C7
:100970000F900FBE0F901F9018951F920F920FB6F9
:100980000F9211242F933F934F935F936F937F9315
:100990008F939F93AF93BF93EF93FF93E0910001E9
:1009A000F09101010995FF91EF91BF91AF919F9156
:1009B0008F917F916F915F914F913F912F910F9008
:1009C0000FBE0F901F901895EF92FF921F93CF9339
:1009D000DF931F92CDB7DEB77C01162F60E0FC01DC
:1009E000808949830E947E03F701948585859CBD9B
:1009F0008DBD1EBD000049810DB407FEFDCF8EB533
:100A00004EBD00000DB407FEFDCF1EB561E0F7013D
:100A100080890E947E03812F0F90DF91CF911F91DB
:100A2000FF90EF9008956F7740E00C94E404EF920C
:100A3000FF921F93CF93DF931F92CDB7DEB77C0158
:100A4000DC01ED91FC910084F185E02D0995892B65
:100A500099F06DE0C7010E941305482F60E0C701BF
:100A600049830E941305182F49816DE8C7010E9430
:100A7000E404812F90E002C08FEF9FEF0F90DF9191
:100A8000CF911F91FF90EF900895CF93DF93EC01EA
:100A9000E881F9810084F185E02D0995892B59F0D1
:100AA0008A8D9B8D01969B8F8A8F60E0CE010E947C
:100AB000130590E002C08FEF9FEFDF91CF91089573
:100AC000CF93DF93EC0163E10E941305282F30E000
:100AD0008A8D9B8DA901481B590BCA01DF91CF91CB
:100AE00008958F929F92AF92BF92CF92DF92FF9222
:100AF0000F931F93CF93DF931F92CDB7DEB76C0197
:100B0000B62E4A0162E279830E941305F82E90E026
:100B10009C01280D391D79812F3F310531F028F0D6
:100B20002FEF30E04901881A990A0B2D172F580131
:100B3000A80CB91C0A151B0541F0F80141918F0161
:100B400060E8C6010E94E404F5CF482D4F0D62EA2B
:100B5000C6010E94E404C4010F90DF91CF911F9160
:100B60000F91FF90DF90CF90BF90AF909F908F90AC
:100B70000895EF92FF920F931F93CF93DF9377FD2A
:100B800026C0FC01248535856217730704F5EC0146
:100B90008B010F5F1F4F26E0269FC001279F900DFE
:100BA00011248E0F9F1F2C853D857C01F6E0EF0EF2
:100BB000F11C0217130738F4B7010E94D7020F5F28
:100BC0001F4FC701F0CF215031093D872C87DF919E
:100BD000CF911F910F91FF90EF90089522E331E0A4
:100BE000FC013183208382819381009711F00C9462
:100BF00048130895CF93DF93EC010E94EE05CE01D8
:100C0000DF91CF910C9448130F931F93CF93DF93F1
:100C100000D0CDB7DEB78C01DB011496ED91FC91CD
:100C2000159720E030E08BE62E173F0781F0DB01BF
:100C30004D915C914115510529F0DA01A20FB31FC6
:100C40009C9101C090E089272F5F3F4FEDCF6AE173
:100C50000E949A12F8011182108213821282158268
:100C600014829F5999831A82BE016F5F7F4FC8011A
:100C70000E94C002C8010F900F90DF91CF911F9189
:100C80000F9108950E94CE0B45E861E886EB92E053
:100C90000C94E404CF93DF93EC010E94C80B68EC42
:100CA00070E080E090E00E9406040E94070CCE01F4
:100CB0000E941A0CE091B602F091B7024C815D815E
:100CC000688179810280F381E02D86EB92E00995BD
:100CD0000E94DE0B68EC70E080E090E00E94060469
:100CE000DF91CF910C944206EF92FF920F931F93E6
:100CF000CF93DF938C01EB0140E050E06CE7CE0135
:100D00000E94420BAC014F5F5F4F6CE7CE010E9427
:100D1000420BAC014F5F5F4F6CE7CE010E94420B6C
:100D2000AC014F5F5F4F6CE7CE010E94420B019612
:100D30007C01AC016CE7CE010E94420B9C01A70133
:100D4000BE01C8010E94FC0AC801DF91CF911F912A
:100D50000F91FF90EF900895CF92DF92EF92FF9264
:100D60000F931F93CF93DF9300D000D000D0CDB767
:100D7000DEB77C018B0140E050E06CE7C8010E94C7
:100D8000420BAC014F5F5F4F6CE7C8010E94420B02
:100D9000AC014F5F5F4F6CE7C8010E94420B0196A8
:100DA0006C01AC016CE7C8010E94420B9C01A601DA
:100DB000B801CE0101960E94FC0ABE016F5F7F4F11
:100DC000C7010E94F302CE0101960E94EE02C70104
:100DD00026960FB6F894DEBF0FBECDBFDF91CF9140
:100DE0001F910F91FF90EF90DF90CF9008950F9398
:100DF0001F93CF93DF93EC018B0140E050E06CE751
:100E0000C8010E94420B9C0140E050E0B801CE01B5
:100E10000E94FC0ACE01DF91CF911F910F9108959E
:100E2000EF92FF920F931F93CF93DF938C01EB010F
:100E300040E050E06CE7CE010E94420BAC014F5FF6
:100E40005F4F6CE7CE010E94420B01967C01AC0122
:100E50006CE7CE010E94420B9C01A701BE01C801B4
:100E60000E94FC0AC801DF91CF911F910F91FF9062
:100E7000EF900895EF92FF920F931F93CF93DF931C
:100E80008C01EB0140E050E06CE7CE010E94420B88
:100E900001967C01AC016CE7CE010E94420B9C01E3
:100EA000A701BE01C8010E94FC0AC801DF91CF91D1
:100EB0001F910F91FF90EF9008950F931F93CF9381
:100EC000DF9300D000D000D0CDB7DEB78C01CE01CB
:100ED00001960E94F3026AED71E0CE0101960E9434
:100EE000AF0B66E371E00E94AF0B6AED71E00E9408
:100EF000AF0BBC01C8010E94F302CE0101960E9413
:100F0000EE02C80126960FB6F894DEBF0FBECDBF25
:100F1000DF91CF911F910F9108958F929F92AF9281
:100F2000BF92CF92DF92EF92FF920F931F93CF93D6
:100F3000DF93CDB7DEB7AC970FB6F894DEBF0FBE28
:100F4000CDBF5C016B018EE391E00E94F40B62E483
:100F500071E0C5010E945E0B882309F444C1F601CB
:100F600080819181009709F43EC10E947111DC01DA
:100F7000CB01885C9109A109B10984369105A105CD
:100F8000B10508F030C16CEF71E0CE0181960E948E
:100F9000FC026BE471E0CE0181960E94C00280E108
:100FA0000E948E0124E630E0DC010E94A61220E0BF
:100FB00034E040E050E00E941312CA01B9012AE077
:100FC0008E010F5F1F4FA8010E94A311F80101902D
:100FD0000020E9F73197AF01401B510BB801CE015A
:100FE00081960E940D026DE571E0CE0181960E940E
:100FF0006B0281E10E948E0161E070E0C39714F002
:1010000060E070E0CE0181960E943B0263E671E0F1
:10101000CE0181960E946B028FE00E948E012DE727
:10102000AC01249FC001259F900D1124792F770FCB
:10103000770B692FCE0181960E943B0269E671E031
:10104000CE0181960E946B028EE00E948E01BC014F
:10105000CE0181960E943B026FE671E0CE0181963F
:101060000E946B0260E070E0CE0181960E943B021C
:1010700065E771E0CE0181960E946B02F601448122
:10108000558160817181CE0181960E940D026BE7CE
:1010900071E0CE0181960E946B02CE0181960E9482
:1010A0001A0C6DE771E0CE0187960E94FC02BE012A
:1010B000695D7F4FC8010E94F30266E871E0C801D4
:1010C0000E94AF0BBE016F5D7F4F0E948C02BC017E
:1010D000CE014B960E94F302C8010E94EE0268E81E
:1010E00071E0CE0145960E94FC028F8D98A18796F3
:1010F0000E94B3127C01BE01655E7F4FC8010E9451
:10110000F30299808A80BE016B5E7F4FCE010F96FD
:101110000E945D078F929F9288898F938F858F930E
:1011200080E991E09F938F93FF92EF920E94D314F6
:10113000CE010F960E94EE02C8010E94EE02B70196
:10114000CE010F960E94FC02BE01615F7F4FC80175
:101150000E9404068A818F9389818F93FF92EF9278
:101160008AE991E09F938F93FF92EF920E94D314AC
:10117000C8010E94EE02CE010F960E94EE020E946C
:10118000C80B68EC70E080E090E00E9406040E94CA
:10119000070CC7010E94F40BB70186EB92E00E9496
:1011A00011030E94DE0B68EC70E080E090E00E948A
:1011B00006040E944206C7010E944813CE014596CC
:1011C0000E94EE02CE014B960E94EE02CE0187965F
:1011D0000E94EE02CE0181960E94EE020FB6F894B4
:1011E000DEBF0FBECDBF6FE971E0C5010E945E0B8F
:1011F0008823F1F06EE871E0C6010E945E0B88233F
:1012000041F061E084E00E947E0385EB91E00E9462
:10121000F40B6CEB71E0C6010E945E0B882341F079
:1012200060E084E00E947E038EEB91E00E94F40B6C
:1012300068EE73E080E090E00E940604E0E0F0E0F9
:101240000995AC960FB6F894DEBF0FBECDBFDF9107
:10125000CF911F910F91FF90EF90DF90CF90BF90B3
:10126000AF909F908F9008958F929F92AF92BF9270
:10127000CF92DF92EF92FF920F931F93CF93DF9362
:10128000CDB7DEB768970FB6F894DEBF0FBECDBFFF
:101290008C017B016A015901BC0182E093E00E944C
:1012A000D702B7018CEF92E00E94D702B60186EF19
:1012B00092E00E94D702B50180EF92E00E94D7022F
:1012C00080910B02811135C0809007029090080236
:1012D000B501CE0143960E94F302B601CE010D96F0
:1012E0000E94F302B701CE0107960E94F302B801F3
:1012F000CE0101960E94F3029E012D5E3F4FAE018A
:10130000435F5F4FBE01695F7F4FCE010196F401DD
:101310000995CE0101960E94EE02CE0107960E9429
:10132000EE02CE010D960E94EE02CE0143960E947F
:10133000EE0268960FB6F894DEBF0FBECDBFDF9108
:10134000CF911F910F91FF90EF90DF90CF90BF90C2
:10135000AF909F908F900895CF92DF92EF92FF927F
:101360000F931F93CF93DF936B01FC01E484F5840B
:10137000EC0100E010E00E151F0561F0B601CE0192
:101380000E947D0B2696882311F0C80105C00F5FCF
:101390001F4FF1CF8FEF9FEFDF91CF911F910F91F3
:1013A000FF90EF90DF90CF9008950F931F93CF930E
:1013B000DF93CDB7DEB768970FB6F894DEBF0FBEE8
:1013C000CDBF8C0140E050E064E20E94420B8F3FB1
:1013D0002FEF920709F472C09C0140E050E0B80181
:1013E000CE0143960E94FC0A40E050E064E2C8014E
:1013F0000E94420BF80124813581AC014F5F5F4FA1
:10140000B801CE010D960E94FC0A66EC71E0CE0197
:1014100001960E94FC02BE016F5F7F4F82EE92E058
:101420000E94AC09019661F4BE016D5E7F4F82EEB1
:1014300092E00E94AC0911E0019619F410E001C09D
:1014400011E0CE0101960E94EE02112379F1BE0156
:101450006D5E7F4F8CED92E00E94D702BE01635F0C
:101460007F4F86ED92E00E94D70200910902109111
:101470000A02BE01635F7F4FCE0107960E94F3020E
:10148000BE016D5E7F4FCE0101960E94F302BE0148
:10149000695F7F4FCE010196F8010995CE01019653
:1014A0000E94EE02CE0107960E94EE02CE010D963A
:1014B0000E94EE02CE0143960E94EE0268960FB69D
:1014C000F894DEBF0FBECDBFDF91CF911F910F917A
:1014D0000895AF92BF92CF92DF92EF92FF920F9357
:1014E0001F93CF93DF9300D000D000D0CDB7DEB7ED
:1014F0008C016B01FC0184859585029749F5B80143
:10150000CE0101960E94F302F80184859585892B0E
:10151000D9F0C801EE24E394F12CF8012485358537
:101520005C01F6E0AF0EB11CE216F30640F4B50123
:101530000E94D702FFEFEF1AFF0AC501EECF21503C
:101540003109F80135872487CE0101960E94EE0209
:10155000F8012485358546E0429FC001439F900DE8
:101560001124B601800F911F0E94D702F8018485D3
:10157000958501969587848726960FB6F894DEBFE9
:101580000FBECDBFDF91CF911F910F91FF90EF90D4
:10159000DF90CF90BF90AF900895EF92FF920F939E
:1015A0001F93CF93DF93EC016CEF71E00E94FC027C
:1015B0006CEF71E0CE0106960E94FC021D861C862F
:1015C0007E0100E010E08C859D850817190758F40E
:1015D0006CEF71E0C7010E94C0020F5F1F4F86E0F1
:1015E000E80EF11CF0CFDF91CF911F910F91FF908A
:1015F000EF9008950E94AA14BF92CF92DF92EF92CB
:10160000FF920F931F93CF93DF937C016B018A01AD
:10161000E9012417350720F4812F8901C42FD82F21
:101620006CEF71E0C7010E94FC02D60114968D9107
:101630009C91159708171907D0F48C179D0708F48B
:10164000EC01D601ED91FC911197EC0FFD1FB080DC
:1016500010824D915C91BA01600F711FC7010E9409
:10166000C002D601ED91FC91EC0FFD1FB082C701C5
:10167000DF91CF911F910F91FF90EF90DF90CF906E
:10168000BF900895CF93DF93FC01248135814217E9
:10169000530778F4C081D181062E000C770BCE0160
:1016A000840F951F0E94B814009719F08C1B9D0B96
:1016B00002C08FEF9FEFDF91CF910895FC0124814D
:1016C0003581232B31F421E061157105A1F0FB0177
:1016D00008C0FC01808191816115710531F421E020
:1016E000FC018081882339F005C00E94C31421E0E9
:1016F000892B09F020E0822F0895FC012481358197
:10170000FB01448155812417350721F5FC018081B7
:101710009181FB0160817181009719F0611571055C
:10172000A1F46115710549F0232BB1F0FB01808113
:1017300090E09195819591090AC0009769F0232B5B
:1017400059F0FC01808190E002C00E94C31421E0A6
:10175000892B19F020E001C021E0822F0895CF935A
:10176000DF93EC016115710561F0FB010190002030
:10177000E9F73197AF01461B570B0E940D0281110B
:1017800003C0CE010E947A02CE01DF91CF9108956D
:1017900041E861E886EB92E00C94E4041092D302F5
:1017A0001092D2026DE186EB92E00E941305482F61
:1017B0004E7F6DE986EB92E00C94E40443E861E827
:1017C00086EB92E00E94E40462E186EB92E00E94E4
:1017D000130583FFF9CF48E062E986EB92E00E94AF
:1017E000E40481E090E00895CF93DF93BC0189E1A8
:1017F00092E00E941103EC016AEF71E089E192E04E
:101800000E9411038C0F9D1FDF91CF9108950E94BC
:10181000C80B0E94CE0B40E06DE886EB92E00E9480
:10182000E40440E062EA86EB92E00E94E40481E096
:1018300090E00895CF93DF93FC014481558160814E
:10184000718189E192E00E948800EC016AEF71E009
:1018500089E192E00E9411038C0F9D1FDF91CF91CF
:10186000089586ED92E00E94EE028CED92E00E94D7
:10187000EE0288EE92E00E94EE0282EE92E00E947A
:10188000EE0280EF92E00E94EE0286EF92E00E946C
:10189000EE028CEF92E00E94EE0282E093E00E9462
:1018A000EE0288E093E00E94EE0588E193E00E945A
:1018B000EE0282E193E00E94EE0286E293E00E9453
:1018C000EE0280E293E00C94EE02CF93DF93CDB76B
:1018D000DEB7A4970FB6F894DEBF0FBECDBF7894E5
:1018E00084B5826084BD84B5816084BD85B5826025
:1018F00085BD85B5816085BD80916E0081608093D6
:101900006E0010928100809181008260809381003E
:10191000809181008160809381008091800081604E
:10192000809380008091B10084608093B1008091A9
:10193000B00081608093B00080917A0084608093D1
:101940007A0080917A00826080937A0080917A0098
:10195000816080937A0080917A00806880937A0019
:101960001092C100E0912902F0912A0282E0808366
:10197000E0912502F09126021082E0912702F09179
:10198000280280E1808310923102E0912D02F091D3
:101990002E0286E08083E0912B02F0912C02808160
:1019A00080618083E0912B02F0912C02808188601D
:1019B0008083E0912B02F0912C02808180688083EB
:1019C000E0912B02F0912C0280818F7D808361E079
:1019D0008091C6020E94CA0361E08091C6020E9403
:1019E0007E038091C8029091C9028F3F2FEF92072A
:1019F000C9F061E00E94CA0360E08091C8020E94C1
:101A00007E036AE070E080E090E00E94060461E0FE
:101A10008091C8020E947E036AE070E080E090E05E
:101A20000E9406041FB7F89480910C02811127C010
:101A3000EEEAF0E08491EAE9F0E09491E82FF0E03A
:101A4000EE0FFF1FEA57FF4FA591B491EC91E923E8
:101A500021F461E08AE00E947E0361E08AE00E9456
:101A6000CA038CB580618CBD8CB580648CBD61E08F
:101A70008DE00E94CA0361E08BE00E94CA0380915E
:101A80000C028F5F80930C021FBF62E486EB92E032
:101A90000E941305823109F071C340E861E886EBCA
:101AA00092E00E94E40480E49EE0AFECB9E1809310
:101AB000CC029093CD02A093CE02B093CF024CE61D
:101AC00066E886EB92E00E94E40440E467E886EB77
:101AD00092E00E94E40440E068E886EB92E00E9415
:101AE000E40440E06EE886EB92E00E94E40440E00B
:101AF0006FE886EB92E00E94E4046CE086EB92E0F3
:101B00000E941305482F43606CE886EB92E00E9428
:101B1000E40444E066EA86EB92E00E94E4044FE8C5
:101B200069E886EB92E00E94E4040E94C80B60E042
:101B30008EE00E94CA0360E08FE00E94CA0360E06A
:101B400080E10E94CA0360E081E10E94CA0361E073
:101B500084E00E94CA030E94420685ED99E09093BA
:101B600008028093070266EC71E0CE0101960E94A4
:101B7000FC02BE016F5F7F4F82EE92E00E94690A15
:101B8000CE0101960E94EE028DE897E090930A0242
:101B90008093090288EC91E00E94F40BE12CF12C77
:101BA00096E0B92E0E94400461327F4B824091053D
:101BB00010F0F701099562E186EB92E00E941305AF
:101BC000182F0E94CE0B412F62E986EB92E00E9413
:101BD000E40416FF2CC015FD2AC01092D102109209
:101BE000D0028091D2029091D302892B11F062E24F
:101BF00001C063E186EB92E00E941305082F10E01C
:101C000060E186EB92E00E941305482F6DE886EBB9
:101C100092E00E94E4040E94C80B012B09F4F4C175
:101C20006CEF71E0CE014F960E94FC0215C061E09E
:101C300086EB92E00E941305863809F4E5C140E086
:101C40006DE886EB92E00E94E40446E861E886EBEA
:101C500092E00E94E404D8C186EB92E00E94600505
:101C6000892B81F086EB92E00E94450589831A82D8
:101C700041E050E0BE016F5F7F4FCE014F960E9462
:101C80000D02EACF2BA13CA12150310940E050E0E8
:101C9000BE01615E7F4FCE010D960E94FC0ABE011F
:101CA000635F7F4FCE0101960E9404062BA13CA1E9
:101CB000A90141505109BE01615E7F4FCE010796D7
:101CC0000E94FC0ABE016F5F7F4FCE0107960E9403
:101CD0007D0B182FCE0107960E94EE02CE010196D1
:101CE0000E94EE02CE010D960E94EE02112309F42D
:101CF00087C1BE01615E7F4FCE0101960E943A0707
:101D000066E371E0CE0101960E945E0B811115C061
:101D1000BE01615E7F4FCE0107960E943A0768E8D8
:101D200071E0CE0107960E945E0B11E0811110E078
:101D3000CE0107960E94EE0201C010E0CE0101968E
:101D40000E94EE0211115CC1BE01615E7F4FCE01A7
:101D500001960E94F70662ED71E0CE0101960E94A5
:101D60005E0B182FCE0101960E94EE021123C1F1E5
:101D700062ED71E0CE0143960E94FC02BE01615EFD
:101D80007F4FCE010D960E943A07BE01615E7F4FE4
:101D9000CE0107960E941007BE01615E7F4FCE0103
:101DA00001960E94AC069E012D5E3F4FAE01435F3F
:101DB0005F4FBE01695F7F4FCE0101960E943409DB
:101DC000CE0101960E94EE02CE0107960E94EE021D
:101DD000CE010D960E94EE02CE0143960E94EE02C5
:101DE000BE01615E7F4FCE0101960E94F7066DED48
:101DF00071E0CE0101960E945E0B182FCE01019674
:101E00000E94EE02112309F4B0C0BE01615E7F4F53
:101E100082E193E00E94690ABE01615E7F4FCE01BC
:101E200001960E947406BE01615E7F4FCE010D9641
:101E30000E941007BE01635F7F4FCE0107960E948C
:101E40005D0766ED71E0CE0143960E94FC02BE0183
:101E5000695F7F4FCE0143960E948C02BE016F5F87
:101E60007F4F0E948C026AED71E00E94AF0BBC01B3
:101E7000CE0149960E94F302CE0143960E94EE02E3
:101E8000CE0107960E94EE02CE010D960E94EE0250
:101E9000CE0101960E94EE02BE01675E7F4FCE0129
:101EA00001960E9404064D815E8169817A81CE018E
:101EB00049960E940D02CE0101960E94EE02CE01CB
:101EC00049960E944A06CE0149960E94EE02BE0142
:101ED000615E7F4F82E193E00E94AC09019609F0B8
:101EE0008FC06DED71E0CE0143960E94FC02BE01F1
:101EF000615E7F4FCE010D960E943A07BE01615E82
:101F00007F4FCE0107960E941007BE01615E7F4F92
:101F1000CE0101960E94AC069E012D5E3F4FAE01A0
:101F2000435F5F4FBE01695F7F4FCE0101960E9404
:101F30003409CE0101960E94EE02CE0107960E945E
:101F4000EE02CE010D960E94EE02CE0143960E9453
:101F5000EE0280911E0390911F03069734F060E01B
:101F600070E082E193E00E94B905BE01615E7F4F9F
:101F7000CE0101960E94F7066CED71E0CE0101964C
:101F80000E945E0B182FCE0101960E94EE021123D3
:101F9000B9F1BE01615E7F4FCE0107960E94AC068B
:101FA00000E010E080912C0390912D030817190791
:101FB00018F517FD04C0081719070CF4E4C060E217
:101FC00073E0CE0101960E947406BE01695F7F4FE7
:101FD000CE0101960E947D0BD82ECE0101960E9463
:101FE000EE02DD2031F0B80180E293E00E94B905F5
:101FF00003C00F5F1F4FD6CFCE0107960E94EE029F
:10200000CE014F960E94EE028091110281110DC007
:102010000E94400460930D0270930E0280930F02A1
:102020009093100281E0809311020E94400400917D
:102030000D0210910E0220910F0230911002DC016E
:10204000CB01801B910BA20BB30B893E9340A105E2
:10205000B10508F490C0812C912C00E010E0809133
:102060002C0390912D030817190708F07AC017FD6B
:1020700004C0081719070CF48EC080E2C82E83E054
:10208000D82E61EE71E0CE0101960E94FC02B601ED
:10209000CE0101960E948C020E944A06CE01019652
:1020A0000E94EE0280910E0390910F03801791071A
:1020B0003CF0E0910A03F0910B03E80DF91D02C01A
:1020C000E0E1F3E0808191810196918380838091AA
:1020D0000E0390910F03801791073CF0E0910A03E3
:1020E000F0910B03E80DF91D02C0E0E1F3E08081FF
:1020F0009181F80131966F01089770F1B80180E283
:1021000093E00E94B905E0910A03F0910B03E80DFA
:10211000F91D80E090E020910E0330910F03A9019A
:102120004F5F5F4F401B510B8417950734F4A60196
:10213000480F591F241735074CF40C191D09200F9F
:10214000311F30930F0320930E0306C02281338189
:10215000219331930196DFCF8601F2E08F0E911C1F
:102160007ECF0E94400460930D0270930E02809314
:102170000F02909310020E94840114CD84EE91E02E
:102180000E94F40BFFCFB09EB001B19E700D1124E0
:10219000605E7C4F16CFB09EC001B19E900D1124A1
:1021A0009C01205E3C4F69016CCFCF93DF93E9E146
:1021B000F2E01382128288EE93E0A0E0B0E0848324
:1021C0009583A683B7838EE091E09183808385EC2D
:1021D00090E09587848784EC90E09787868780ECF1
:1021E00090E0918B808B81EC90E0938B828B82ECE2
:1021F00090E0958B848B86EC90E0978B868B118E8C
:10220000128E138E148EE6EBF2E01382128280E2BD
:1022100091E09183808380E5848781E085878EE2E9
:1022200093E0978786878AE090E0918B808B89E0A6
:1022300090E0938B828B82E090E0958B848B168A62
:10224000178A108E118E138E128E158E148E178E85
:10225000168E148215821682178280E293E00E9405
:10226000CD0A82E193E00E94CD0AC8E0D3E082E388
:1022700091E09983888380E090E00E94B3129B8371
:102280008A832FEF3FEF3F832E839D838C836CEFF8
:1022900071E082E093E00E94FC026CEF71E08CEF51
:1022A00092E00E94FC026CEF71E086EF92E00E94E7
:1022B000FC026CEF71E080EF92E00E94FC0282EE83
:1022C00092E00E94CD0A6CEF71E08CED92E00E94EA
:1022D000FC026CEF71E086ED92E0DF91CF910C94FF
:1022E000FC021F93FC0199278827BC01E8941191F7
:1022F0001032E9F3193010F01E30C8F31B3251F0E0
:102300001D3249F4689406C00E94B211610F711D1C
:10231000811D911D119110531A30B0F33EF4909528
:102320008095709561957F4F8F4F9F4F1F910895B6
:10233000BB274A3031F4992322F4BDE29095819570
:102340009F4F0C94EA11BB272A3051F4992342F491
:10235000BDE290958095709561957F4F8F4F9F4F0F
:102360000C94C811592F482F372F262F660F771F2F
:10237000881F991F660F771F881F991F620F731F91
:10238000841F951F660F771F881F991F0895BB270D
:10239000FA01A62F6217710581059105330B30FBF9
:1023A00066F0AA27660F771F881F991FAA1FA2171A
:1023B00010F0A21B63953850A9F7A05DAA3308F06E
:1023C000A95DA19336F7B111B1931082CA010C94A3
:1023D0000312BB27FB015527AA27880F991FAA1FA5
:1023E000A41710F0A41B83955051B9F7A05DAA3330
:1023F00008F0A95DA193009779F7B111B1931192FB
:10240000CB010C940312DC01FC01672F719177233F
:10241000E1F7329704C07C916D9370836291AE179F
:10242000BF07C8F30895052E97FB1EF400940E9481
:102430002A1257FD07D00E94691207FC03D04EF400
:102440000C942A1250954095309521953F4F4F4F4F
:102450005F4F089590958095709561957F4F8F4F50
:102460009F4F08952F923F924F925F926F927F926B
:102470008F929F92AF92BF92CF92DF92EF92FF9294
:102480000F931F93CF93DF93CDB7DEB7CA1BDB0B40
:102490000FB6F894DEBF0FBECDBF09942A883988E5
:1024A00048885F846E847D848C849B84AA84B984EC
:1024B000C884DF80EE80FD800C811B81AA81B981F8
:1024C000CE0FD11D0FB6F894DEBF0FBECDBFED010C
:1024D0000895A1E21A2EAA1BBB1BFD010DC0AA1F65
:1024E000BB1FEE1FFF1FA217B307E407F50720F07D
:1024F000A21BB30BE40BF50B661F771F881F991FF8
:102500001A9469F760957095809590959B01AC0140
:10251000BD01CF010895A29FB001B39FC001A39F49
:10252000700D811D1124911DB29F700D811D11240C
:10253000911D0895991B79E004C0991F961708F022
:10254000961B881F7A95C9F7809508950E948B1273
:10255000B7FF0895821B930B0895EE0FFF1F0590A0
:10256000F491E02D0994CF93DF938230910510F41C
:1025700082E090E0E0913103F091320320E030E01E
:10258000C0E0D0E0309711F14081518148175907E0
:10259000C0F04817590761F482819381209719F0A0
:1025A0009B838A832BC0909332038093310326C090
:1025B0002115310519F04217530718F49A01BE018D
:1025C000DF01EF010280F381E02DDCCF2115310521
:1025D00009F1281B390B2430310590F412968D91A6
:1025E0009C9113976115710521F0FB019383828300
:1025F00004C09093320380933103FD01329644C0AE
:10260000FD01E20FF31F81939193225031092D9325
:102610003C933AC020912F0330913003232B41F497
:1026200020910601309107013093300320932F034E
:1026300020910401309105012115310541F42DB798
:102640003EB74091080150910901241B350BE091E0
:102650002F03F0913003E217F307A0F42E1B3F0B7A
:102660002817390778F0AC014E5F5F4F2417350704
:1026700048F04E0F5F1F5093300340932F03819318
:10268000919302C0E0E0F0E0CF01DF91CF91089597
:102690000F931F93CF93DF93009709F48CC0FC0135
:1026A0003297138212820091310310913203011587
:1026B000110581F420813181820F931F20912F0316
:1026C000309130032817390779F5F0933003E09300
:1026D0002F0371C0D80140E050E0AE17BF0750F49F
:1026E00012962D913C911397AD012115310509F1F9
:1026F000D901F3CF9D01DA01338322836081718197
:10270000860F971F8217930769F4EC01288139819E
:10271000260F371F2E5F3F4F318320838A819B8195
:1027200093838283452B29F4F0933203E0933103A2
:1027300042C01396FC93EE931297ED014991599183
:102740009E01240F351FE217F30771F480819181F8
:10275000840F951F029611969C938E93828193818C
:1027600013969C938E931297E0E0F0E0D8011296B6
:102770008D919C911397009719F0F8018C01F6CF79
:102780008D919C9198012E5F3F4F820F931F209156
:102790002F03309130032817390769F4309729F453
:1027A000109232031092310302C0138212821093EE
:1027B000300300932F03DF91CF911F910F91089564
:1027C000A0E0B0E0E6EEF3E10C943612EC010097E5
:1027D00021F4CB010E94B312B8C0FC01E60FF71F31
:1027E0009C0122503109E217F30708F4ACC0D9016B
:1027F0000D911C91119706171707B0F005301105C0
:1028000008F49FC0C80104978617970708F499C079
:1028100002501109061B170B019311936D937C93C2
:10282000CF010E9448138DC05B01A01AB10A4C0170
:10283000800E911EA0913103B091320340E050E030
:10284000E12CF12C109709F44AC0A815B905D1F56F
:102850006D907C901197630182E0C80ED11CCA1460
:10286000DB0480F1A3014A195B096A0182E0C80E0A
:10287000D11C1296BC9012971396AC91B5E0CB1672
:10288000D10440F0B282A38351834083D9016D9378
:102890007C930AC00E5F1F4FC301800F911FF90187
:1028A00091838083EB2DFA2FE114F10431F0D701ED
:1028B0001396FC93EE93129744C0F0933203E09387
:1028C00031033FC08D919C9111974817590708F427
:1028D000AC017D0112960D90BC91A02DB3CF8091DB
:1028E0002F039091300388159905E1F44617570797
:1028F000C8F48091040190910501009741F48DB7CF
:102900009EB74091080150910901841B950BE8176F
:10291000F907C8F4F0933003E0932F03F9017183B2
:1029200060830FC0CB010E94B3127C01009759F065
:10293000A801BE010E94AF14CE010E944813C70136
:1029400004C0CE0102C080E090E0CDB7DEB7EEE07B
:102950000C94521281E090E0F8940C947417FB01EF
:10296000DC0102C001900D9241505040D8F708950B
:10297000FC018191861721F08823D9F799270895C2
:102980003197CF010895FB01DC018D9101908019F1
:102990000110D9F3990B0895FB01DC0101900D9210
:1029A0000020E1F70895AEE0B0E0E9EDF4E10C9429
:1029B00040120D891E8986E08C831A8309838FEF6C
:1029C0009FE79E838D83AE01475E5F4F6F89788D51
:1029D000CE0101960E94F6142F813885F801E20F8E
:1029E000F31F10822E96E4E00C945C12ACE0B0E091
:1029F000ECEFF4E10C9432127C016B018A01FC01D2
:102A000017821682838181FFBDC1CE0101964C01E0
:102A1000F7019381F60193FD859193FF81916F01F9
:102A2000882309F4ABC1853239F493FD859193FF76
:102A300081916F01853229F4B70190E00E94DE1682
:102A4000E7CF512C312C20E02032A0F48B3269F0FA
:102A500030F4803259F0833269F420612CC08D3219
:102A600039F0803339F4216026C02260246023C00D
:102A7000286021C027FD27C030ED380F3A3078F4A8
:102A800026FF06C0FAE05F9E300D1124532E13C0BE
:102A90008AE0389E300D1124332E20620CC08E3215
:102AA00021F426FD6BC1206406C08C3611F4206829
:102AB00002C0883641F4F60193FD859193FF819120
:102AC0006F018111C1CF982F9F7D9554933028F4C9
:102AD0000C5F1F4FFFE3F9830DC0833631F083375E
:102AE00071F0833509F05BC022C0F80180818983D1
:102AF0000E5F1F4F44244394512C540115C03801DC
:102B0000F2E06F0E711CF801A080B18026FF03C0B7
:102B1000652D70E002C06FEF7FEFC5012C870E942A
:102B2000D3162C0183012C852F77222E17C0380154
:102B3000F2E06F0E711CF801A080B18026FF03C087
:102B4000652D70E002C06FEF7FEFC5012C870E94FA
:102B5000C8162C012C852068222E830123FC1BC063
:102B6000832D90E048165906B0F4B70180E290E05A
:102B70000E94DE163A94F4CFF50127FC859127FEDA
:102B800081915F01B70190E00E94DE1631103A9406
:102B9000F1E04F1A51084114510471F7E5C0843631
:102BA00011F0893639F5F80127FF07C0608171817E
:102BB000828193810C5F1F4F08C060817181072E55
:102BC000000C880B990B0E5F1F4F2F76722E97FF0C
:102BD00009C090958095709561957F4F8F4F9F4F5D
:102BE0002068722E2AE030E0A4010E941617A82E59
:102BF000A81844C0853729F42F7EB22E2AE030E091
:102C000025C0F22FF97FBF2E8F36C1F018F488351A
:102C100079F0B4C0803719F0883721F0AFC02F2F7A
:102C20002061B22EB4FE0DC08B2D8460B82E09C079
:102C300024FF0AC09F2F9660B92E06C028E030E01E
:102C400005C020E130E002C020E132E0F801B7FE2B
:102C500007C060817181828193810C5F1F4F06C024
:102C60006081718180E090E00E5F1F4FA4010E949F
:102C70001617A82EA818FB2DFF777F2E76FE0BC007
:102C8000372D3E7FA51450F474FE0AC072FC08C0B4
:102C9000372D3E7E05C0BA2C372D03C0BA2C01C09B
:102CA000B52C34FF0DC0FE01EA0DF11D808180338B
:102CB00011F4397E09C032FF06C0B394B39404C046
:102CC000832F867809F0B39433FD13C030FF06C01C
:102CD0005A2CB31418F4530C5B18B32CB31468F4C7
:102CE000B70180E290E03C870E94DE16B3943C85F9
:102CF000F5CFB31410F43B1801C0312C34FF12C0CF
:102D0000B70180E390E03C870E94DE163C8532FFED
:102D100017C031FD03C088E790E002C088E590E06D
:102D2000B7010CC0832F867859F031FF02C08BE2C7
:102D300001C080E237FD8DE2B70190E00E94DE160F
:102D4000A51438F4B70180E390E00E94DE165A948F
:102D5000F7CFAA94F401EA0DF11D8081B70190E04C
:102D60000E94DE16A110F5CF332009F451CEB70131
:102D700080E290E00E94DE163A94F6CFF701868159
:102D8000978102C08FEF9FEF2C96E2E10C944E12D8
:102D9000FC010590615070400110D8F78095909526
:102DA0008E0F9F1F0895FC0161507040019001102B
:102DB000D8F7809590958E0F9F1F08950F931F93BE
:102DC000CF93DF93FB01238121FD03C08FEF9FEFA2
:102DD00028C022FF16C046815781248135814217C1
:102DE000530744F4A081B1819D012F5F3F4F318390
:102DF00020838C93268137812F5F3F4F3783268333
:102E000010C0EB01092F182F0084F185E02D0995E2
:102E1000892BE1F68E819F8101969F838E83812F7E
:102E2000902FDF91CF911F910F910895FA01AA275A
:102E3000283051F1203181F1E8946F936E7F6E5FFD
:102E40007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0AB
:102E5000670F781F891F9A1FA11D680F791F8A1F8E
:102E6000911DA11D6A0F711D811D911DA11D20D0F5
:102E700009F468943F912AE0269F11243019305DAF
:102E80003193DEF6CF010895462F4770405D4193A0
:102E9000B3E00FD0C9F7F6CF462F4F70405D4A33ED
:102EA00018F0495D31FD4052419302D0A9F7EACFB5
:102EB000B4E0A6959795879577956795BA95C9F7E4
:102EC00000976105710508959B01AC010A2E0694D7
:102ED0005795479537952795BA95C9F7620F731F90
:102EE000841F951FA01D089510E0CDE5D0E004C01B
:102EF000FE010E94AD122196CE35D107C9F7F89494
:022F0000FFCF01
:102F0200CA01CA01000033038000000000001B0157
:102F12008800B3006201E400C200D6000000000095
:102F2200CC017105E301CB016005450517050000E1
:102F32000000EE05FA05312E302E302E3200726579
:102F42007300716F732F73796E63007B2274223A60
:102F5200226E6F646530222C2262223A002C227784
:102F6200223A002C2254223A002C2268223A002CC7
:102F72002273223A002C2271223A007D007265737C
:102F82002F6A736F6E002400302E302E302E3000E8
:102F92007564707C257325737C002573257300632B
:102FA200746C2F6E6F6465312F776174657253771D
:102FB200697463680070756D704F6E0031007075D2
:102FC2006D704F6666002300737461727465642EBF
:102FD2002E0075647000727463707C00727463708A
:102FE200007463005374617274696E67204C6F528F
:0E2FF20061206661696C656421000D0A0000B3
:107800000C94343C0C94513C0C94513C0C94513CE1
:107810000C94513C0C94513C0C94513C0C94513CB4
:107820000C94513C0C94513C0C94513C0C94513CA4
:107830000C94513C0C94513C0C94513C0C94513C94
:107840000C94513C0C94513C0C94513C0C94513C84
:107850000C94513C0C94513C0C94513C0C94513C74
:107860000C94513C0C94513C11241FBECFEFD8E036
:10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060
:1078800005900D92A230B107D9F712E0A2E0B1E065
:1078900001C01D92AD30B107E1F70E942D3D0C945F
:1078A000CC3F0C94003C982F959595959595959582
:1078B000905D8F708A307CF0282F295A8091C0000B
:1078C00085FFFCCF9093C6008091C00085FFFCCF60
:1078D0002093C6000895282F205DF0CF982F809127
:1078E000C00085FFFCCF9093C6000895EF92FF92F1
:1078F0000F931F93EE24FF2487018091C00087FD22
:1079000017C00894E11CF11C011D111D81E4E8164B
:1079100082E4F8068FE0080780E0180770F3E09132
:107920000401F091050109958091C00087FFE9CF1E
:107930008091C6001F910F91FF90EF9008950E94D3
:10794000763C982F8091C00085FFFCCF9093C600B5
:1079500091362CF490330CF09053892F089597555D
:10796000892F08951F930E949F3C182F0E949F3CCF
:107970001295107F810F1F9108951F93182F882350
:1079800021F00E94763C1150E1F71F9108951F935A
:10799000182F0E94763C803249F0809103018F5F5E
:1079A000809303018530C1F01F9108958091C0003C
:1079B00085FFFCCF84E18093C6008091C00085FFE5
:1079C000FCCF1093C6008091C00085FFFCCF80E102
:1079D0008093C6001F910895E0910401F091050184
:1079E00009951F9108950E94763C803241F0809164
:1079F00003018F5F80930301853081F008958091AA
:107A0000C00085FFFCCF84E18093C6008091C00058
:107A100085FFFCCF80E18093C6000895E0910401CA
:107A2000F09105010995089540E951E08823A1F0FE
:107A30002D9A28EE33E0FA013197F1F721503040CA
:107A4000D1F72D9828EE33E0FA013197F1F7215064
:107A50003040D1F7815061F708953F924F925F9285
:107A60006F927F928F929F92AF92BF92CF92DF924E
:107A7000EF92FF920F931F93CF93DF93000080E16B
:107A80008093C4001092C50088E18093C10086E015
:107A90008093C2005098589A259A81E00E94143D24
:107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA
:107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50
:107AC000F2E57F2EE0E26E2E79E4572E63E5462E36
:107AD00050E5352E0E94763C8033B1F18133B9F107
:107AE000803409F46FC0813409F476C0823409F41B
:107AF00085C0853409F488C0803531F1823521F1A3
:107B0000813511F1853509F485C0863509F48DC0BC
:107B1000843609F496C0843709F403C1853709F423
:107B200072C1863709F466C0809103018F5F80932C
:107B30000301853079F6E0910401F0910501099582
:107B40000E94763C803351F60E94F33CC3CF0E94E2
:107B5000763C803249F78091C00085FFFCCFF092DF
:107B6000C6008091C00085FFFCCF9092C600809136
:107B7000C00085FFFCCF8092C6008091C00085FFC9
:107B8000FCCF7092C6008091C00085FFFCCF609250
:107B9000C6008091C00085FFFCCF5092C600809146
:107BA000C00085FFFCCF4092C6008091C00085FFD9
:107BB000FCCF3092C6008091C00085FFFCCFB09210
:107BC000C60088CF0E94763C863808F4BDCF0E945C
:107BD000763C0E94F33C7ECF0E94763C803809F4CC
:107BE0009CC0813809F40BC1823809F43CC1883942
:107BF00009F48FC080E00E94C73C6CCF84E10E94F2
:107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3
:107C1000F33C60CF0E94763C809306010E94763C44
:107C2000809307010E94F33C55CF0E94763C80333D
:107C300009F41DC183E00E94BD3C80E00E94C73C66
:107C400049CF0E94763C809309020E94763C809343
:107C5000080280910C028E7F80930C020E94763C79
:107C6000853409F415C18091080290910902892B8D
:107C700089F000E010E00E94763CF801E85FFE4FDA
:107C800080830F5F1F4F80910802909109020817AF
:107C9000190788F30E94763C803209F045CF809125
:107CA0000C0280FF01C16091060170910701660F0F
:107CB000771F7093070160930601A0910802B091AD
:107CC00009021097C9F0E8E0F1E09B01AD014E0F09
:107CD0005F1FF999FECF32BD21BD819180BDFA9A17
:107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B
:107CF00070930701609306018091C00085FFFCCF5F
:107D0000F092C6008091C00085FFFCCFB092C60003
:107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA
:107D2000D9CE0E94763C809309020E94763C8093D3
:107D300008028091060190910701880F991F909386
:107D40000701809306010E94763C853409F4A6C0A1
:107D500080910C028E7F80930C020E94763C8032D0
:107D600009F0B8CE8091C00085FFFCCFF092C6002C
:107D7000609108027091090261157105B9F140E046
:107D800050E080910C02A82FA170B82FB27011C0E2
:107D9000BB2309F45CC0E0910601F0910701319624
:107DA000F0930701E09306014F5F5F4F46175707B7
:107DB000E8F4AA2369F3F999FECF209106013091E6
:107DC000070132BD21BDF89A90B58091C00085FFB2
:107DD000FCCF9093C6002F5F3F4F30930701209355
:107DE00006014F5F5F4F4617570718F38091C00099
:107DF00085FDE5CE8091C00085FFF8CFE0CE81E023
:107E00000E94C73C67CE0E94763C803209F08CCE3F
:107E10008091C00085FFFCCFF092C6008091C00029
:107E200085FFFCCFE092C6008091C00085FFFCCFAB
:107E3000D092C6008091C00085FFFCCFC092C600E2
:107E40008091C00085FFFCCFB092C60043CEE09188
:107E50000601F091070194918091C00085FFFCCF4D
:107E60009093C6009CCF80E10E94C73C33CE0E9415
:107E7000763C0E94763C182F0E94763C112309F430
:107E800083C0113009F484C08FE00E94C73C22CE29
:107E900080910C02816080930C02E5CE80910C02EF
:107EA000816080930C0259CF809107018823880F4D
:107EB000880B8A2180930B02809106019091070123
:107EC000880F991F90930701809306018091080203
:107ED00080FF09C080910802909109020196909359
:107EE000090280930802F894F999FECF1127E091D6
:107EF0000601F0910701C8E0D1E08091080290915D
:107F00000902103091F40091570001700130D9F34B
:107F100003E000935700E89500915700017001308D
:107F2000D9F301E100935700E89509901990009169
:107F3000570001700130D9F301E000935700E89534
:107F40001395103498F011270091570001700130FB
:107F5000D9F305E000935700E895009157000170B0
:107F60000130D9F301E100935700E895329602976A
:107F700009F0C7CF103011F00296E5CF112480919F
:107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19
:0C7F900085E90E94C73C9ECDF894FFCF0D
:027F9C00800063
:040000030000780081
:00000001FF

@ -0,0 +1,91 @@
# 1 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
# 1 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
# 4 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino" 2
LoRaMQTT mqtt;
void(* resetFunc) (void) = 0;
void setup() {
Serial.begin(115200);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
pinMode(A0, 0x0);
pinMode(A1, 0x0);
pinMode(A2, 0x0);
pinMode(A3, 0x0);
pinMode(4, 0x1);
mqtt.ini();
mqtt.subscribe("#");
mqtt.onReceived(mqttRes);
Serial.println("started..");
}
void loop() {
if(millis() > 180000) resetFunc();
mqtt.core();
}
void mqttRes(String subject, String content){
Serial.println("res");
if(subject == "qos/sync" && content.toInt()>=200 && content.toInt()<300){
String s;
getData(s, content);
Serial.println(s);
mqtt.publish("res/json", s);
}
if(subject == "ctl/node1/waterSwitch"){
if(content == "0") pumpOn();
if(content == "1") pumpOff();
}
delay(1000);
resetFunc();
}
void getData(String& s, const String& content){
s = "{\"t\":\"node0\",\"b\":";
s += ((long int)analogRead(A2)*100)/1024;
s += ",\"w\":";
s += (analogRead(A3) > 50) ? 0 : 1;
s += ",\"T\":";
s += (125*analogRead(A1))>>8;
s += ",\"h\":";
s += analogRead(A0);
s += ",\"s\":";
s += 0;
s += ",\"q\":";
s += content;
s += "}";
}
bool pumpOn(){
digitalWrite(4, 0x1);
Serial.println("pumpOn");
return true;
}
bool pumpOff(){
digitalWrite(4, 0x0);
Serial.println("pumpOff");
return true;
}

@ -0,0 +1,87 @@
#ifndef __LORA_MATT_H__
#define __LORA_MATT_H__
#define MAX_STRINGVEC_SIZE 2
#include "lora-socket.h"
class LoRaMQTT{
public:
inline void ini(){
socket.ini();
socket.onReceived(_onReceived);
}
inline void core(){
if(isLoopMode){
if(socket.isNewMsg()){
String msg = "", from = "", to = "", type = "";
socket.getNewMsg(msg, from, to, type);
_onReceived(msg, from, to, type);
}
}
socket.core();
}
inline void publish(const String& subject, const String& content){
String s = subject + "$" + content;
socket.udp(s);
}
inline void subscribe(const String& subject){
this->_subjects.PushBack(subject);
}
inline static void onReceived(void (*f)(String, String)){
_f = f;
}
inline bool isNewMsg(){
isLoopMode = true;
return (newSubject == "") ? false : true;
};
inline void getNewMsg(String& subject, String& content){
subject = newSubject;
content = newContent;
clearNewMsg();
}
private:
static LoRaSocket socket;
static StringVec _subjects;
static void (*_f)(String, String);
static String newSubject, newContent;
static bool isLoopMode;
inline void clearNewMsg(){
newSubject = "";
newContent = "";
};
inline static void _onReceived(String msg, String from, String to, String type){
if(msg.indexOf('$') == -1) return;
String subject = msg.substring(0, msg.indexOf('$'));
String content = msg.substring(msg.indexOf('$') + 1, msg.length());
if(_subjects.Find("#") != -1 || _subjects.Find(subject) != -1){
newSubject = subject;
newContent = content;
if(!isLoopMode) _f(subject, content);
}
};
};
LoRaSocket LoRaMQTT::socket;
StringVec LoRaMQTT::_subjects;
void (*LoRaMQTT::_f)(String, String);
String LoRaMQTT::newSubject = "", LoRaMQTT::newContent = "";
bool LoRaMQTT::isLoopMode = false;
#endif //__LORA_MATT_H__

@ -0,0 +1,289 @@
#ifndef __LORA_SOCKET_H__
#define __LORA_SOCKET_H__
#include <LoRa.h>
#include "vector.h"
#include "stringVec.h"
#ifndef LORA_SOCKET_IP
#define LORA_SOCKET_IP "0.0.0.0"
#endif
#ifndef MAX_RECEIVE_STACK_SIZE
#define MAX_RECEIVE_STACK_SIZE 5
#endif
#ifndef MAX_SEND_STACK_SIZE
#define MAX_SEND_STACK_SIZE 5
#endif
#ifndef MAX_TCP_TRY_TIMES
#define MAX_TCP_TRY_TIMES 8
#endif
class LoRaSocket {
public:
LoRaSocket(){}
static void core();
static void ini();
static void udp(const String& msg, const String& to = "0.0.0.0");
static void tcp(const String& msg, const String& to);
static void rtcp(const String& msg);
inline static void onReceived(void (*f)(String, String, String, String)){
_f = f;
};
inline bool isNewMsg(){
isLoopMode = true;
return (newType == "") ? false : true;
};
inline const String getNewMsg(){
String msg = newMsg;
clearNewMsg();
return msg;
};
inline void getNewMsg(String& msg, String& from, String& to, String& type){
msg = newMsg;
from = newFrom;
to = newTo;
type = newType;
clearNewMsg();
};
private:
static StringVec tcp_sendingStack, tcp_receiveStack;
static Vector<unsigned int> tcp_sendingTryTimes;
static void(*_f)(String, String, String, String);
static String newMsg, newFrom, newTo, newType;
static bool isLoopMode;
inline void clearNewMsg(){
newMsg = "";
newFrom = "";
newTo = "";
newType = "";
};
inline static void _onReceived(const String& msg, const String& from, const String& to, const String& type){
newMsg = msg;
newFrom = from;
newTo = to;
newType = type;
if(!isLoopMode) (*_f)(msg, from, to, type);
};
/* LoRa Functions */
static void LoRa_tx_mode();
static void LoRa_rx_mode();
static void send(const String& s);
static void send(const char *s);
static const String receiveMsg();
/* Package Functions */
inline static const String getIPHeader(const String& to = "0.0.0.0"){
return to + "|" + LORA_SOCKET_IP + "|";
};
inline static bool isGoodPackage(const String& s){
String body = s.substring(0, s.length() - 1);
if(s.substring(s.length() - 1, s.length()) != hash(body)){
return false;
}
return true;
};
inline static const String getToIP(const String& s){
unsigned short left = s.indexOf('|');
unsigned short right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
inline static const String getFromIP(const String& s){
unsigned short left = s.indexOf('|', s.indexOf('|') + 1);
unsigned short right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
inline static const String getType(const String& s){
return s.substring(0, s.indexOf('|'));
};
inline static const String getContent(const String& s){
unsigned short left = s.indexOf('|', s.indexOf('|', s.indexOf('|') + 1) + 1);
unsigned short right = s.indexOf('|', left + 1);
return decode(s.substring(left + 1, right));
};
inline static const String getTcpKey(const String& s){
int left = s.indexOf('|', s.indexOf('|', s.indexOf('|', s.indexOf('|') + 1) + 1) + 1);
int right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
/* receive Functions */
static void getMsg(const String& msg);
/* tcp stack functions */
static void checkSendStack(){
for(unsigned int i = 0; i < tcp_sendingStack.Size(); i ++){
send("tc"+tcp_sendingStack[i]);
tcp_sendingTryTimes[i] += 1;
if(tcp_sendingTryTimes[i] >= MAX_TCP_TRY_TIMES){
tcp_sendingStack.Erase(i);
tcp_sendingTryTimes.Erase(i);
}
}
};
inline static void receiveStackClassify(){
if(tcp_receiveStack.Size() > MAX_RECEIVE_STACK_SIZE) tcp_receiveStack.Erase(0);
};
inline static void sendStackClassify(){
if(tcp_sendingStack.Size() > MAX_SEND_STACK_SIZE) {
tcp_sendingStack.Erase(0);
tcp_sendingTryTimes.Erase(0);
}
};
static void removeByKey(const String& key);
/* tools */
static const String hash(const String& s);
static const String encode(const String& s){
return s;
};
static const String decode(const String& s){
return s;
}
static const String generateRandomKey(){
String o = "";
for(unsigned short i = 0; i < 4; i ++){
o += char(random(26) + 97);
}
return o;
}
/* timer */
static void setInterval(void (*function)(void), const int delay){
static unsigned long startTime = millis();
if(millis() - startTime > delay){
(*function)();
startTime = millis();
}
}
};
void LoRaSocket::getMsg(const String& msg){
if(!isGoodPackage(msg)) return;
if(getToIP(msg) != LORA_SOCKET_IP && getToIP(msg) != "0.0.0.0") return;
if(getType(msg) == "udp") _onReceived(getContent(msg), getFromIP(msg), getToIP(msg), "udp");
if(getType(msg) == "tcp"){
rtcp(msg);
if(tcp_receiveStack.Find(msg) != -1) return;
_onReceived(getContent(msg), getFromIP(msg), getToIP(msg), "tcp");
receiveStackClassify();
}
if(getType(msg) == "rtcp"){
removeByKey(getContent(msg));
}
}
void LoRaSocket::udp(const String& msg, const String& to){
char *c;
c = (char*)malloc((msg.length()+39)*sizeof(char));
sprintf(c, "udp|%s%s|", getIPHeader(to).c_str(), encode(msg).c_str());
sprintf(c, "%s%s", c, hash(c).c_str());
send(c);
free(c);
};
void LoRaSocket::tcp(const String& msg, const String& to){
String fin = "tcp|" + getIPHeader(to) + encode(msg) + "|" + generateRandomKey() + "|";
fin += hash(fin);
tcp_sendingStack.PushBack(fin);
tcp_sendingTryTimes.PushBack(0);
sendStackClassify();
send(fin);
};
void LoRaSocket::rtcp(const String& msg){
tcp_receiveStack.PushBack(msg);
String fin = "rtcp|" + getIPHeader(getFromIP(msg)) + getTcpKey(msg) + "|";
fin += hash(fin);
send(fin);
}
StringVec LoRaSocket::tcp_sendingStack, LoRaSocket::tcp_receiveStack;
Vector<unsigned int> LoRaSocket::tcp_sendingTryTimes;
void (*LoRaSocket::_f)(String, String, String, String);
String LoRaSocket::newMsg = "", LoRaSocket::newFrom = "", LoRaSocket::newTo = "", LoRaSocket::newType = "";
bool LoRaSocket::isLoopMode = false;
void LoRaSocket::ini() {
LoRa_rx_mode();
}
void LoRaSocket::core() {
/* Listen Msg */
if(LoRa.parsePacket()){
getMsg(receiveMsg());
}
/* check tcp stack */
setInterval(checkSendStack, 1000);
}
void LoRaSocket::LoRa_tx_mode(){
LoRa.idle();
}
void LoRaSocket::LoRa_rx_mode(){
LoRa.receive();
}
void LoRaSocket::send(const char *s){
LoRa_tx_mode();
delay(200);
LoRa.beginPacket();Serial.println(s);
LoRa.print(s);
LoRa.endPacket();
delay(200);
LoRa_rx_mode();
}
void LoRaSocket::send(const String& s){
LoRa_tx_mode();
delay(200);
LoRa.beginPacket();Serial.println(s);
LoRa.print(s);
LoRa.endPacket();
delay(200);
LoRa_rx_mode();
}
const String LoRaSocket::receiveMsg(){
String s = "";
while (LoRa.available()) {
s += (char)LoRa.read();
}
return s;
}
const String LoRaSocket::hash(const String& s){
unsigned char hashVal = 'k';
for(unsigned short i = 0; i < s.length(); i ++){
hashVal ^= s.charAt(i);
}
hashVal = hashVal % 26 + 97;
return String((char)hashVal);
}
void LoRaSocket::removeByKey(const String& key){
for(unsigned int i = 0; i < tcp_sendingStack.Size(); i++){
if(getTcpKey(tcp_sendingStack[i]) == key) {
tcp_sendingStack.Erase(i);
return;
}
}
}
#endif //__LORA_SOCKET_H__

@ -0,0 +1,107 @@
#include <Arduino.h>
#line 1 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
#line 1 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
#define LORA_SOCKET_IP "1.0.0.2"
#include "lora-mqtt.h"
LoRaMQTT mqtt;
void(* resetFunc) (void) = 0;
#line 9 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
void setup();
#line 32 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
void loop();
#line 38 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
void mqttRes(String subject, String content);
#line 58 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
void getData(String& s, const String& content);
#line 79 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
bool pumpOn();
#line 85 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
bool pumpOff();
#line 9 "e:\\git\\smart-farming\\opt\\node\\node1\\node1.ino"
void setup() {
Serial.begin(115200);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(4, OUTPUT);
mqtt.ini();
mqtt.subscribe("#");
mqtt.onReceived(mqttRes);
Serial.println("started..");
}
void loop() {
if(millis() > 180000) resetFunc();
mqtt.core();
}
void mqttRes(String subject, String content){
Serial.println("res");
if(subject == "qos/sync" && content.toInt()>=200 && content.toInt()<300){
String s;
getData(s, content);
Serial.println(s);
mqtt.publish("res/json", s);
}
if(subject == "ctl/node1/waterSwitch"){
if(content == "0") pumpOn();
if(content == "1") pumpOff();
}
delay(1000);
resetFunc();
}
void getData(String& s, const String& content){
s = "{\"t\":\"node0\",\"b\":";
s += ((long int)analogRead(A2)*100)/1024;
s += ",\"w\":";
s += (analogRead(A3) > 50) ? 0 : 1;
s += ",\"T\":";
s += (125*analogRead(A1))>>8;
s += ",\"h\":";
s += analogRead(A0);
s += ",\"s\":";
s += 0;
s += ",\"q\":";
s += content;
s += "}";
}
bool pumpOn(){
digitalWrite(4, HIGH);
Serial.println("pumpOn");
return true;
}
bool pumpOff(){
digitalWrite(4, LOW);
Serial.println("pumpOff");
return true;
}

@ -0,0 +1,20 @@
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\node1.ino.cpp.o: \
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\node1.ino.cpp \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WCharacter.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Printable.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/pins_arduino.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs/../standard/pins_arduino.h \
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\lora-mqtt.h \
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\lora-socket.h \
E:\OneDrive\pc\document\Arduino\libraries\LoRa\src/LoRa.h \
C:\Program\ Files\ (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h \
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\vector.h \
e:\git\smart-farming\opt\node\node1\.vscode\bin\sketch\stringVec.h

@ -0,0 +1,125 @@
/**
* ovo-arduino Main File
*
* @category ovo-arduino
* @package ovo.cpp
* @copyright Copyright (c) 2019 EEENeko (https://github.com/eeeneko)
* @license GNU General Public License 2.0
* @version 0.0.1
*/
#ifndef _OVO_H
#define _OVO_H
/**
* Like set Timeout in JS
*
* @Author yimian
* @param auto function (allow Lambda)
* @param int millisecond to dealy
* @return void
*/
void setTimeout(auto function,const int delay)
{
static bool on = 1;
if(on == 1){
static unsigned long startTime = millis();
if(millis() - startTime > delay){
function();
on == 0;
}
}
}
/**
* Like set Interval in JS
*
* @Author yimian
* @param auto function (allow Lambda)
* @param int millisecond of interval
* @return void
*/
void setInterval(auto function, const int delay)
{
static unsigned long startTime = millis();
if(millis() - startTime > delay){
function();
startTime = millis();
}
}
/**
* Switch between function1 and function2 for delay1 and delay2
*
* @Author yimian
* @param auto function1 (allow Lambda)
* @param auto function2 (allow Lambda)
* @param int millisecond of interval
* @param int millisecond of interval
* @return void
*/
void setSwitch(auto function1, auto function2, const int delay1, const int delay2)
{
static unsigned long startTime = millis();
if(millis() - startTime < delay1){
function1();
}else if(millis() - startTime >= delay1 && millis() - startTime < delay1 + delay2){
function2();
}else if(millis() - startTime >= delay1 + delay2){
startTime = millis();
}
}
/**
* Make direct voltage change to gradually change
*
* @author yimian
* @category ovo
* @package ovo
*/
class slowWrite
{
public:
inline void set(int t_pin, unsigned int t_delay){
pin = t_pin;
delay = t_delay;
};
inline void high(){
startTime = millis();
state = 1;
};
inline void low(){
startTime = millis();
state = 0;
};
inline void run(){
if(state == 1 && millis() - startTime < delay){
analogWrite(pin, ((millis() - startTime) * 255 / delay));Serial.println(((millis() - startTime) * 255 / delay));
}else if(state == 0 && millis() - startTime < delay){
analogWrite(pin, 255-((millis() - startTime) * 255 / delay));Serial.println(255-((millis() - startTime) * 255 / delay));
}else{
state = -1;
}
};
private:
unsigned long startTime;
int state;
int pin;
unsigned int delay;
};
#endif

@ -0,0 +1,136 @@
#ifndef __SOCKET_HPP_
#define __SOCKET_HPP_
#include <LoRa.h>
#include <SPI.h>
#include "ovo.h"
#include "vector.h"
#ifndef SS
#define SS 18
#endif
#ifndef RST
#define RST 14
#endif
#ifndef DI0
#define DI0 26
#endif
#ifndef BAND
#define BAND 433E6
#endif
#ifndef SEND_TIMES
#define SEND_TIMES 8
#endif
#ifndef SEND_INTERVAL
#define SEND_INTERVAL 100
#endif
#ifndef TCP_TIMEOUT
#define TCP_TIMEOUT 1000
#endif
#define DEFAULT_SERIAL 115200
class Socket {
public:
Socket(){}
void core();
void ini();
void onReceive(auto handler);
void udp(const String& msg, auto callback);
inline void udp(const String& msg) {
this->udp(msg, [=](int err) {});
};
private:
static Vector<int> udp_sendingStack;
static String cache;
static void (*callback)(const String& msg);
void LoRa_rxMode();
void LoRa_txMode();
void LoRa_sendMessage(const String& message);
static void _received(int size);
};
Vector<int> Socket::udp_sendingStack;
String Socket::cache = "";
void (*Socket::callback)(const String& msg);
void Socket::ini() {
if(!Serial) Serial.begin(DEFAULT_SERIAL);
//LoRa.setPins(SS, RST, DI0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while(true);
}
LoRa.onReceive(this->_received);
}
void Socket::core() {
if(LoRa.parsePacket()){
Serial.println("new msg in");
}
}
void Socket::_received(int size) {
String message = "";
while (LoRa.available()) {
message += (char)LoRa.read();
}
Serial.println(" "+message);
if (message == cache) return;
cache = message;
if (message.length() == 3) {
int pos = udp_sendingStack.Find(message.toInt());
if (pos != -1) {
udp_sendingStack.Erase(pos);
}
return;
}
(*callback)(message.substring(3));
}
void Socket::onReceive(auto handler) {
static auto f = handler;
this->callback = f;
}
void Socket::udp(const String& msg, auto callback) {
int mid = random(100, 1000);
String s = String(mid) + msg;
this->udp_sendingStack.PushBack(mid);
this->LoRa_txMode();
for(int i = 0; i < SEND_TIMES; i ++){
setTimeout([=](){
this->LoRa_sendMessage(s);
if(i == SEND_TIMES - 1){
this->LoRa_rxMode();
callback(0);
}
}, i*SEND_INTERVAL);
}
}
void Socket::LoRa_rxMode(){
LoRa.receive();
}
void Socket::LoRa_txMode(){
LoRa.idle();
}
void Socket::LoRa_sendMessage(const String& message) {
LoRa.beginPacket();
LoRa.print(message);
LoRa.endPacket();
}
#endif //__SOCKET_HPP_

@ -0,0 +1,77 @@
#ifndef __STRINGVEC__
#define __STRINGVEC__
#ifndef MAX_STRINGVEC_SIZE
#define MAX_STRINGVEC_SIZE 2
#endif
class StringVec{
public:
StringVec():_size(0){
this->clear();
};
inline void PushBack(const String& ss){
if(this->Size() == MAX_STRINGVEC_SIZE){
this->shift();
}
this->_s[this->Size()] = ss;
this->_size ++;
}
const int Find(const String& ss){
for(unsigned i = 0; i < this->Size(); i ++){
if(this->_s[i] == ss){
return i;
}
}
return -1;
}
void Erase(const int& pos){
if(pos < 0 || pos >= this->Size()) return;
for(unsigned int i = pos+1; i < this->Size(); i ++){
this->_s[i-1] = this->_s[i];
}
this->_size --;
}
const String shift(){
String s = this->_s[0];
if(this->Size() != 0){
for(unsigned int i = 1; i < this->Size(); i ++){
this->_s[i-1] = this->_s[i];
}
this->_size --;
}
return s;
}
void clear(){
for(unsigned int i = 0; i < this->Size(); i ++){
this->_s[i] = "";
}
}
inline const int Size(){
return this->_size;
}
String& operator[](int i){
if(i < 0 || i >= this->Size()) return this->_s[0];
return this->_s[i];
}
private:
String _s[MAX_STRINGVEC_SIZE];
int _size;
};
#endif //__STRINGVEC__

@ -0,0 +1,269 @@
/*
* Vector.h
*
* Created on: 05/04/2012
* Author: tom
* Purpose: To play the part of a mutable array in the absence of the STL.
*/
#ifndef VECTOR_H
#define VECTOR_H
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#define SWAP(type, a, b) type tmp ## a = a; a = b; b = tmp ## a;
template <class ParameterType> class Predicate
{
public:
virtual void operator() (ParameterType &param) = 0;
};
template <class VectorType> class Vector
{
// The address of the first element of the vector
VectorType *begin;
// The address one after the last allocated entry in the underlying array
VectorType *storage;
// The index of the most recent element put in the underlying array - the head
int head;
public:
// The value that is returned when the caller asks for an element that is out of the bounds of the vector
VectorType OB;
// We can save a few re-sizings if we know how large the array is likely to grow to be
Vector(int initialSize = 0)
{
begin = new VectorType[initialSize]; //points to the beginning of the new array
head = initialSize - 1;
storage = begin + initialSize; //points to the element one outside of the array (such that end - begin = capacity)
}
Vector(Vector &obj)
{
begin = new VectorType[0]; // Points to the beginning of the new array, it's zero but this line keeps malloc from seg faulting should we delete begin before resizing it
head = -1;
storage = begin; //points to the element one outside of the array (such that end - begin = capacity)
*this = obj;
}
// If there's anything in the vector then delete the array, if there's no array then doing will will cause seg faults
virtual ~Vector() { delete[] begin; }
Vector &operator=(Vector &obj)
{
// Reallocate the underlying buffer to the same size as the
Resize(obj.Size());
for(int i = 0; i < obj.Size(); i++)
(*this)[i] = obj[i];
head = obj.head;
return *this;
}
void ForEach(Predicate<VectorType> &functor)
{
for(int i = 0; i < Size(); i++)
functor(begin[i]);
}
// Swaps the underlying array and characteristics of this vector with another of the same type, very quickly
void Swap(Vector &obj)
{
SWAP(int, head, obj.head);
SWAP(VectorType*, begin, obj.begin);
SWAP(VectorType*, storage, obj.storage);
}
// Checks the entire Vector to see whether a matching item exists. Bear in mind that the VectorType might need to implement
// equality operator (operator==) for this to work properly.
bool Contains(VectorType element)
{
for(int i = 0; i < Size(); i++)
if(operator [](i) == element)
return true;
return false;
}
int Find(VectorType element)
{
for(int i = 0; i < Size(); i++)
if(operator [](i) == element)
return i;
return -1;
}
void PushBack(VectorType element) { PushBack(&element, 1); }
void PushBack(const VectorType *elements, int len)
{
// If the length plus this's size is greater than the capacity, reallocate to that size.
if(len + Size() > Capacity())
ReAllocate(MAX(Size() + len, Size() * 2));
int append = MIN(storage - begin - head - 1, len), prepend = len - append;
// memcpy the data starting at the head all the way up to the last element *(storage - 1)
memcpy((begin + head + 1), elements, sizeof(VectorType) * append);
// If there's still data to copy memcpy whatever remains, starting at the first element *(begin) until the end of data. The first step will have ensured
// that we don't crash into the tail during this process.
memcpy(begin,(elements + append), sizeof(VectorType) * prepend);
// Re-recalculate head and size.
head += len;
}
void Erase(unsigned int position) { Erase(position, position + 1); }
// Erase an arbitrary section of the vector from first up to last minus one. Like the stl counterpart, this is pretty labour intensive so go easy on it.
void Erase(int first, int last)
{
// For this we'll set the value of the array at first to the value of the array at last plus one. We'll do that all the way up to toIndex
for(int i = 0; i < (Size() - first); i++)
{
// If by trying to fill in the next element with the ones ahead of it we'll be running off the end of the vector, stop.
if((i + last) > (Size() - 1))
break;
begin[first + i] = begin[last + i];
}
// Adjust the head to reflect the new size
head -= last - first;
}
// Remove the most recent element in the array
void PopBack()
{
if(Size() > 0)
head--;
}
// Empty the vector, or to be precise - forget the fact that there was ever anything in there.
void Clear() { head = -1; }
// Returns a bool indicating whether or not there are any elements in the array
bool Empty() { return head == -1; }
// Returns the oldest element in the array (the one added before any other)
VectorType const &Back() { return *begin; }
// Returns the newest element in the array (the one added after every other)
VectorType const &Front() { return begin[head]; }
// Returns the nth element in the vector
VectorType &operator[](int n)
{
if(n < Size())
return begin[n];
else
return OB;
}
// Returns a pointer such that the vector's data is laid out between ret to ret + size
VectorType *Data() { return begin; }
// Recreates the vector to hold len elements, all being copies of val
void Assign(int len, const VectorType &val)
{
delete[] begin;
// Allocate an array the same size as the one passed in
begin = new VectorType[len];
storage = begin + len;
// Refresh the head and tail, assuming the array is in order, which it really has to be
head = len - 1;
for(int i = 0 ; i < Size(); i++)
begin[i] = val;
}
// Recreates the vector using an external array
void Assign(VectorType *array, int len)
{
delete[] begin;
// Allocate an array the same size as the one passed in
begin = new VectorType[len];
storage = begin + len;
// Refresh the head and tail, assuming the array is in order, which it really has to be
head = len - 1;
// Copy over the memory
memcpy(begin, array, sizeof(VectorType) * len);
}
// Returns the number of elements that the vector will support before needing resizing
int Capacity() { return (storage - begin); }
// Returns the number of elements in vector
int Size() { return head + 1; }
// Requests that the capacity of the allocated storage space for the elements
// of the vector be at least enough to hold size elements.
void Reserve(unsigned int size)
{
if(size > Capacity())
ReAllocate(size);
}
// Resizes the vector
void Resize(unsigned int size)
{
// If necessary, resize the underlying array to fit the new size
if(size > Capacity())
ReAllocate(size);
// Now revise the head and size (tail needn't change) to reflect the new size
head = size - 1;
}
private:
void ReAllocate(unsigned int size)
{
// Just in case we're re-allocating less room than we had before, make sure that we don't overrun the buffer by trying to write more elements than
// are now possible for this vector to hold.
if(Size() > (int)size)
head = size - 1;
// Allocate an array twice the size of that of the old
VectorType *_begin = new VectorType[size];
VectorType *_storage = _begin + size;
int _head = Size() - 1;
// Copy across all the old array's data and rearrange it!
for(int i = 0; i < Size(); i++)
_begin[i] = (*this)[i];
// Free the old memory
delete[] begin;
// Redirect the old array to point to the new one
begin = _begin;
storage = _storage;
head = _head;
}
};
#endif // VECTOR_H

@ -0,0 +1,19 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"C:\\Program Files (x86)\\Arduino\\tools\\**",
"C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\**",
"C:\\Users\\i\\AppData\\Local\\Arduino15\\packages\\esp8266\\tools\\**",
"C:\\Users\\i\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.5.2\\**"
],
"forcedInclude": [
"C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h"
],
"intelliSenseMode": "msvc-x64",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe"
}
],
"version": 4
}

@ -0,0 +1,10 @@
{
"files.associations": {
"initializer_list": "cpp",
"list": "cpp",
"vector": "cpp",
"xhash": "cpp",
"xstring": "cpp",
"xutility": "cpp"
}
}

@ -0,0 +1,87 @@
#ifndef __LORA_MATT_H__
#define __LORA_MATT_H__
#define MAX_STRINGVEC_SIZE 2
#include "lora-socket.h"
class LoRaMQTT{
public:
inline void ini(){
socket.ini();
socket.onReceived(_onReceived);
}
inline void core(){
if(isLoopMode){
if(socket.isNewMsg()){
String msg = "", from = "", to = "", type = "";
socket.getNewMsg(msg, from, to, type);
_onReceived(msg, from, to, type);
}
}
socket.core();
}
inline void publish(const String& subject, const String& content){
String s = subject + "$" + content;
socket.udp(s);
}
inline void subscribe(const String& subject){
this->_subjects.PushBack(subject);
}
inline static void onReceived(void (*f)(String, String)){
_f = f;
}
inline bool isNewMsg(){
isLoopMode = true;
return (newSubject == "") ? false : true;
};
inline void getNewMsg(String& subject, String& content){
subject = newSubject;
content = newContent;
clearNewMsg();
}
private:
static LoRaSocket socket;
static StringVec _subjects;
static void (*_f)(String, String);
static String newSubject, newContent;
static bool isLoopMode;
inline void clearNewMsg(){
newSubject = "";
newContent = "";
};
inline static void _onReceived(String msg, String from, String to, String type){
if(msg.indexOf('$') == -1) return;
String subject = msg.substring(0, msg.indexOf('$'));
String content = msg.substring(msg.indexOf('$') + 1, msg.length());
if(_subjects.Find("#") != -1 || _subjects.Find(subject) != -1){
newSubject = subject;
newContent = content;
if(!isLoopMode) _f(subject, content);
}
};
};
LoRaSocket LoRaMQTT::socket;
StringVec LoRaMQTT::_subjects;
void (*LoRaMQTT::_f)(String, String);
String LoRaMQTT::newSubject = "", LoRaMQTT::newContent = "";
bool LoRaMQTT::isLoopMode = false;
#endif //__LORA_MATT_H__

@ -0,0 +1,289 @@
#ifndef __LORA_SOCKET_H__
#define __LORA_SOCKET_H__
#include <LoRa.h>
#include "vector.h"
#include "stringVec.h"
#ifndef LORA_SOCKET_IP
#define LORA_SOCKET_IP "0.0.0.0"
#endif
#ifndef MAX_RECEIVE_STACK_SIZE
#define MAX_RECEIVE_STACK_SIZE 5
#endif
#ifndef MAX_SEND_STACK_SIZE
#define MAX_SEND_STACK_SIZE 5
#endif
#ifndef MAX_TCP_TRY_TIMES
#define MAX_TCP_TRY_TIMES 8
#endif
class LoRaSocket {
public:
LoRaSocket(){}
static void core();
static void ini();
static void udp(const String& msg, const String& to = "0.0.0.0");
static void tcp(const String& msg, const String& to);
static void rtcp(const String& msg);
inline static void onReceived(void (*f)(String, String, String, String)){
_f = f;
};
inline bool isNewMsg(){
isLoopMode = true;
return (newType == "") ? false : true;
};
inline const String getNewMsg(){
String msg = newMsg;
clearNewMsg();
return msg;
};
inline void getNewMsg(String& msg, String& from, String& to, String& type){
msg = newMsg;
from = newFrom;
to = newTo;
type = newType;
clearNewMsg();
};
private:
static StringVec tcp_sendingStack, tcp_receiveStack;
static Vector<unsigned int> tcp_sendingTryTimes;
static void(*_f)(String, String, String, String);
static String newMsg, newFrom, newTo, newType;
static bool isLoopMode;
inline void clearNewMsg(){
newMsg = "";
newFrom = "";
newTo = "";
newType = "";
};
inline static void _onReceived(const String& msg, const String& from, const String& to, const String& type){
newMsg = msg;
newFrom = from;
newTo = to;
newType = type;
if(!isLoopMode) (*_f)(msg, from, to, type);
};
/* LoRa Functions */
static void LoRa_tx_mode();
static void LoRa_rx_mode();
static void send(const String& s);
static void send(const char *s);
static const String receiveMsg();
/* Package Functions */
inline static const String getIPHeader(const String& to = "0.0.0.0"){
return to + "|" + LORA_SOCKET_IP + "|";
};
inline static bool isGoodPackage(const String& s){
String body = s.substring(0, s.length() - 1);
if(s.substring(s.length() - 1, s.length()) != hash(body)){
return false;
}
return true;
};
inline static const String getToIP(const String& s){
unsigned short left = s.indexOf('|');
unsigned short right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
inline static const String getFromIP(const String& s){
unsigned short left = s.indexOf('|', s.indexOf('|') + 1);
unsigned short right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
inline static const String getType(const String& s){
return s.substring(0, s.indexOf('|'));
};
inline static const String getContent(const String& s){
unsigned short left = s.indexOf('|', s.indexOf('|', s.indexOf('|') + 1) + 1);
unsigned short right = s.indexOf('|', left + 1);
return decode(s.substring(left + 1, right));
};
inline static const String getTcpKey(const String& s){
int left = s.indexOf('|', s.indexOf('|', s.indexOf('|', s.indexOf('|') + 1) + 1) + 1);
int right = s.indexOf('|', left + 1);
return s.substring(left + 1, right);
};
/* receive Functions */
static void getMsg(const String& msg);
/* tcp stack functions */
static void checkSendStack(){
for(unsigned int i = 0; i < tcp_sendingStack.Size(); i ++){
send("tc"+tcp_sendingStack[i]);
tcp_sendingTryTimes[i] += 1;
if(tcp_sendingTryTimes[i] >= MAX_TCP_TRY_TIMES){
tcp_sendingStack.Erase(i);
tcp_sendingTryTimes.Erase(i);
}
}
};
inline static void receiveStackClassify(){
if(tcp_receiveStack.Size() > MAX_RECEIVE_STACK_SIZE) tcp_receiveStack.Erase(0);
};
inline static void sendStackClassify(){
if(tcp_sendingStack.Size() > MAX_SEND_STACK_SIZE) {
tcp_sendingStack.Erase(0);
tcp_sendingTryTimes.Erase(0);
}
};
static void removeByKey(const String& key);
/* tools */
static const String hash(const String& s);
static const String encode(const String& s){
return s;
};
static const String decode(const String& s){
return s;
}
static const String generateRandomKey(){
String o = "";
for(unsigned short i = 0; i < 4; i ++){
o += char(random(26) + 97);
}
return o;
}
/* timer */
static void setInterval(void (*function)(void), const int delay){
static unsigned long startTime = millis();
if(millis() - startTime > delay){
(*function)();
startTime = millis();
}
}
};
void LoRaSocket::getMsg(const String& msg){
if(!isGoodPackage(msg)) return;
if(getToIP(msg) != LORA_SOCKET_IP && getToIP(msg) != "0.0.0.0") return;
if(getType(msg) == "udp") _onReceived(getContent(msg), getFromIP(msg), getToIP(msg), "udp");
if(getType(msg) == "tcp"){
rtcp(msg);
if(tcp_receiveStack.Find(msg) != -1) return;
_onReceived(getContent(msg), getFromIP(msg), getToIP(msg), "tcp");
receiveStackClassify();
}
if(getType(msg) == "rtcp"){
removeByKey(getContent(msg));
}
}
void LoRaSocket::udp(const String& msg, const String& to){
char *c;
c = (char*)malloc((msg.length()+39)*sizeof(char));
sprintf(c, "udp|%s%s|", getIPHeader(to).c_str(), encode(msg).c_str());
sprintf(c, "%s%s", c, hash(c).c_str());
send(c);
free(c);
};
void LoRaSocket::tcp(const String& msg, const String& to){
String fin = "tcp|" + getIPHeader(to) + encode(msg) + "|" + generateRandomKey() + "|";
fin += hash(fin);
tcp_sendingStack.PushBack(fin);
tcp_sendingTryTimes.PushBack(0);
sendStackClassify();
send(fin);
};
void LoRaSocket::rtcp(const String& msg){
tcp_receiveStack.PushBack(msg);
String fin = "rtcp|" + getIPHeader(getFromIP(msg)) + getTcpKey(msg) + "|";
fin += hash(fin);
send(fin);
}
StringVec LoRaSocket::tcp_sendingStack, LoRaSocket::tcp_receiveStack;
Vector<unsigned int> LoRaSocket::tcp_sendingTryTimes;
void (*LoRaSocket::_f)(String, String, String, String);
String LoRaSocket::newMsg = "", LoRaSocket::newFrom = "", LoRaSocket::newTo = "", LoRaSocket::newType = "";
bool LoRaSocket::isLoopMode = false;
void LoRaSocket::ini() {
LoRa_rx_mode();
}
void LoRaSocket::core() {
/* Listen Msg */
if(LoRa.parsePacket()){
getMsg(receiveMsg());
}
/* check tcp stack */
setInterval(checkSendStack, 1000);
}
void LoRaSocket::LoRa_tx_mode(){
LoRa.idle();
}
void LoRaSocket::LoRa_rx_mode(){
LoRa.receive();
}
void LoRaSocket::send(const char *s){
LoRa_tx_mode();
delay(200);
LoRa.beginPacket();Serial.println(s);
LoRa.print(s);
LoRa.endPacket();
delay(200);
LoRa_rx_mode();
}
void LoRaSocket::send(const String& s){
LoRa_tx_mode();
delay(200);
LoRa.beginPacket();Serial.println(s);
LoRa.print(s);
LoRa.endPacket();
delay(200);
LoRa_rx_mode();
}
const String LoRaSocket::receiveMsg(){
String s = "";
while (LoRa.available()) {
s += (char)LoRa.read();
}
return s;
}
const String LoRaSocket::hash(const String& s){
unsigned char hashVal = 'k';
for(unsigned short i = 0; i < s.length(); i ++){
hashVal ^= s.charAt(i);
}
hashVal = hashVal % 26 + 97;
return String((char)hashVal);
}
void LoRaSocket::removeByKey(const String& key){
for(unsigned int i = 0; i < tcp_sendingStack.Size(); i++){
if(getTcpKey(tcp_sendingStack[i]) == key) {
tcp_sendingStack.Erase(i);
return;
}
}
}
#endif //__LORA_SOCKET_H__

@ -0,0 +1,90 @@
#define LORA_SOCKET_IP "1.0.0.2"
#include "lora-mqtt.h"
LoRaMQTT mqtt;
void(* resetFunc) (void) = 0;
void setup() {
Serial.begin(115200);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(4, OUTPUT);
mqtt.ini();
mqtt.subscribe("#");
mqtt.onReceived(mqttRes);
Serial.println("started..");
}
void loop() {
if(millis() > 180000) resetFunc();
mqtt.core();
}
void mqttRes(String subject, String content){
Serial.println("res");
if(subject == "qos/sync" && content.toInt()>=200 && content.toInt()<300){
String s;
getData(s, content);
Serial.println(s);
mqtt.publish("res/json", s);
}
if(subject == "ctl/node1/waterSwitch"){
if(content == "0") pumpOn();
if(content == "1") pumpOff();
}
delay(1000);
resetFunc();
}
void getData(String& s, const String& content){
s = "{\"t\":\"node0\",\"b\":";
s += ((long int)analogRead(A2)*100)/1024;
s += ",\"w\":";
s += (analogRead(A3) > 50) ? 0 : 1;
s += ",\"T\":";
s += (125*analogRead(A1))>>8;
s += ",\"h\":";
s += analogRead(A0);
s += ",\"s\":";
s += 0;
s += ",\"q\":";
s += content;
s += "}";
}
bool pumpOn(){
digitalWrite(4, HIGH);
Serial.println("pumpOn");
return true;
}
bool pumpOff(){
digitalWrite(4, LOW);
Serial.println("pumpOff");
return true;
}

@ -0,0 +1,125 @@
/**
* ovo-arduino Main File
*
* @category ovo-arduino
* @package ovo.cpp
* @copyright Copyright (c) 2019 EEENeko (https://github.com/eeeneko)
* @license GNU General Public License 2.0
* @version 0.0.1
*/
#ifndef _OVO_H
#define _OVO_H
/**
* Like set Timeout in JS
*
* @Author yimian
* @param auto function (allow Lambda)
* @param int millisecond to dealy
* @return void
*/
void setTimeout(auto function,const int delay)
{
static bool on = 1;
if(on == 1){
static unsigned long startTime = millis();
if(millis() - startTime > delay){
function();
on == 0;
}
}
}
/**
* Like set Interval in JS
*
* @Author yimian
* @param auto function (allow Lambda)
* @param int millisecond of interval
* @return void
*/
void setInterval(auto function, const int delay)
{
static unsigned long startTime = millis();
if(millis() - startTime > delay){
function();
startTime = millis();
}
}
/**
* Switch between function1 and function2 for delay1 and delay2
*
* @Author yimian
* @param auto function1 (allow Lambda)
* @param auto function2 (allow Lambda)
* @param int millisecond of interval
* @param int millisecond of interval
* @return void
*/
void setSwitch(auto function1, auto function2, const int delay1, const int delay2)
{
static unsigned long startTime = millis();
if(millis() - startTime < delay1){
function1();
}else if(millis() - startTime >= delay1 && millis() - startTime < delay1 + delay2){
function2();
}else if(millis() - startTime >= delay1 + delay2){
startTime = millis();
}
}
/**
* Make direct voltage change to gradually change
*
* @author yimian
* @category ovo
* @package ovo
*/
class slowWrite
{
public:
inline void set(int t_pin, unsigned int t_delay){
pin = t_pin;
delay = t_delay;
};
inline void high(){
startTime = millis();
state = 1;
};
inline void low(){
startTime = millis();
state = 0;
};
inline void run(){
if(state == 1 && millis() - startTime < delay){
analogWrite(pin, ((millis() - startTime) * 255 / delay));Serial.println(((millis() - startTime) * 255 / delay));
}else if(state == 0 && millis() - startTime < delay){
analogWrite(pin, 255-((millis() - startTime) * 255 / delay));Serial.println(255-((millis() - startTime) * 255 / delay));
}else{
state = -1;
}
};
private:
unsigned long startTime;
int state;
int pin;
unsigned int delay;
};
#endif

@ -0,0 +1,136 @@
#ifndef __SOCKET_HPP_
#define __SOCKET_HPP_
#include <LoRa.h>
#include <SPI.h>
#include "ovo.h"
#include "vector.h"
#ifndef SS
#define SS 18
#endif
#ifndef RST
#define RST 14
#endif
#ifndef DI0
#define DI0 26
#endif
#ifndef BAND
#define BAND 433E6
#endif
#ifndef SEND_TIMES
#define SEND_TIMES 8
#endif
#ifndef SEND_INTERVAL
#define SEND_INTERVAL 100
#endif
#ifndef TCP_TIMEOUT
#define TCP_TIMEOUT 1000
#endif
#define DEFAULT_SERIAL 115200
class Socket {
public:
Socket(){}
void core();
void ini();
void onReceive(auto handler);
void udp(const String& msg, auto callback);
inline void udp(const String& msg) {
this->udp(msg, [=](int err) {});
};
private:
static Vector<int> udp_sendingStack;
static String cache;
static void (*callback)(const String& msg);
void LoRa_rxMode();
void LoRa_txMode();
void LoRa_sendMessage(const String& message);
static void _received(int size);
};
Vector<int> Socket::udp_sendingStack;
String Socket::cache = "";
void (*Socket::callback)(const String& msg);
void Socket::ini() {
if(!Serial) Serial.begin(DEFAULT_SERIAL);
//LoRa.setPins(SS, RST, DI0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while(true);
}
LoRa.onReceive(this->_received);
}
void Socket::core() {
if(LoRa.parsePacket()){
Serial.println("new msg in");
}
}
void Socket::_received(int size) {
String message = "";
while (LoRa.available()) {
message += (char)LoRa.read();
}
Serial.println(" "+message);
if (message == cache) return;
cache = message;
if (message.length() == 3) {
int pos = udp_sendingStack.Find(message.toInt());
if (pos != -1) {
udp_sendingStack.Erase(pos);
}
return;
}
(*callback)(message.substring(3));
}
void Socket::onReceive(auto handler) {
static auto f = handler;
this->callback = f;
}
void Socket::udp(const String& msg, auto callback) {
int mid = random(100, 1000);
String s = String(mid) + msg;
this->udp_sendingStack.PushBack(mid);
this->LoRa_txMode();
for(int i = 0; i < SEND_TIMES; i ++){
setTimeout([=](){
this->LoRa_sendMessage(s);
if(i == SEND_TIMES - 1){
this->LoRa_rxMode();
callback(0);
}
}, i*SEND_INTERVAL);
}
}
void Socket::LoRa_rxMode(){
LoRa.receive();
}
void Socket::LoRa_txMode(){
LoRa.idle();
}
void Socket::LoRa_sendMessage(const String& message) {
LoRa.beginPacket();
LoRa.print(message);
LoRa.endPacket();
}
#endif //__SOCKET_HPP_

@ -0,0 +1,77 @@
#ifndef __STRINGVEC__
#define __STRINGVEC__
#ifndef MAX_STRINGVEC_SIZE
#define MAX_STRINGVEC_SIZE 2
#endif
class StringVec{
public:
StringVec():_size(0){
this->clear();
};
inline void PushBack(const String& ss){
if(this->Size() == MAX_STRINGVEC_SIZE){
this->shift();
}
this->_s[this->Size()] = ss;
this->_size ++;
}
const int Find(const String& ss){
for(unsigned i = 0; i < this->Size(); i ++){
if(this->_s[i] == ss){
return i;
}
}
return -1;
}
void Erase(const int& pos){
if(pos < 0 || pos >= this->Size()) return;
for(unsigned int i = pos+1; i < this->Size(); i ++){
this->_s[i-1] = this->_s[i];
}
this->_size --;
}
const String shift(){
String s = this->_s[0];
if(this->Size() != 0){
for(unsigned int i = 1; i < this->Size(); i ++){
this->_s[i-1] = this->_s[i];
}
this->_size --;
}
return s;
}
void clear(){
for(unsigned int i = 0; i < this->Size(); i ++){
this->_s[i] = "";
}
}
inline const int Size(){
return this->_size;
}
String& operator[](int i){
if(i < 0 || i >= this->Size()) return this->_s[0];
return this->_s[i];
}
private:
String _s[MAX_STRINGVEC_SIZE];
int _size;
};
#endif //__STRINGVEC__

@ -0,0 +1,269 @@
/*
* Vector.h
*
* Created on: 05/04/2012
* Author: tom
* Purpose: To play the part of a mutable array in the absence of the STL.
*/
#ifndef VECTOR_H
#define VECTOR_H
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#define SWAP(type, a, b) type tmp ## a = a; a = b; b = tmp ## a;
template <class ParameterType> class Predicate
{
public:
virtual void operator() (ParameterType &param) = 0;
};
template <class VectorType> class Vector
{
// The address of the first element of the vector
VectorType *begin;
// The address one after the last allocated entry in the underlying array
VectorType *storage;
// The index of the most recent element put in the underlying array - the head
int head;
public:
// The value that is returned when the caller asks for an element that is out of the bounds of the vector
VectorType OB;
// We can save a few re-sizings if we know how large the array is likely to grow to be
Vector(int initialSize = 0)
{
begin = new VectorType[initialSize]; //points to the beginning of the new array
head = initialSize - 1;
storage = begin + initialSize; //points to the element one outside of the array (such that end - begin = capacity)
}
Vector(Vector &obj)
{
begin = new VectorType[0]; // Points to the beginning of the new array, it's zero but this line keeps malloc from seg faulting should we delete begin before resizing it
head = -1;
storage = begin; //points to the element one outside of the array (such that end - begin = capacity)
*this = obj;
}
// If there's anything in the vector then delete the array, if there's no array then doing will will cause seg faults
virtual ~Vector() { delete[] begin; }
Vector &operator=(Vector &obj)
{
// Reallocate the underlying buffer to the same size as the
Resize(obj.Size());
for(int i = 0; i < obj.Size(); i++)
(*this)[i] = obj[i];
head = obj.head;
return *this;
}
void ForEach(Predicate<VectorType> &functor)
{
for(int i = 0; i < Size(); i++)
functor(begin[i]);
}
// Swaps the underlying array and characteristics of this vector with another of the same type, very quickly
void Swap(Vector &obj)
{
SWAP(int, head, obj.head);
SWAP(VectorType*, begin, obj.begin);
SWAP(VectorType*, storage, obj.storage);
}
// Checks the entire Vector to see whether a matching item exists. Bear in mind that the VectorType might need to implement
// equality operator (operator==) for this to work properly.
bool Contains(VectorType element)
{
for(int i = 0; i < Size(); i++)
if(operator [](i) == element)
return true;
return false;
}
int Find(VectorType element)
{
for(int i = 0; i < Size(); i++)
if(operator [](i) == element)
return i;
return -1;
}
void PushBack(VectorType element) { PushBack(&element, 1); }
void PushBack(const VectorType *elements, int len)
{
// If the length plus this's size is greater than the capacity, reallocate to that size.
if(len + Size() > Capacity())
ReAllocate(MAX(Size() + len, Size() * 2));
int append = MIN(storage - begin - head - 1, len), prepend = len - append;
// memcpy the data starting at the head all the way up to the last element *(storage - 1)
memcpy((begin + head + 1), elements, sizeof(VectorType) * append);
// If there's still data to copy memcpy whatever remains, starting at the first element *(begin) until the end of data. The first step will have ensured
// that we don't crash into the tail during this process.
memcpy(begin,(elements + append), sizeof(VectorType) * prepend);
// Re-recalculate head and size.
head += len;
}
void Erase(unsigned int position) { Erase(position, position + 1); }
// Erase an arbitrary section of the vector from first up to last minus one. Like the stl counterpart, this is pretty labour intensive so go easy on it.
void Erase(int first, int last)
{
// For this we'll set the value of the array at first to the value of the array at last plus one. We'll do that all the way up to toIndex
for(int i = 0; i < (Size() - first); i++)
{
// If by trying to fill in the next element with the ones ahead of it we'll be running off the end of the vector, stop.
if((i + last) > (Size() - 1))
break;
begin[first + i] = begin[last + i];
}
// Adjust the head to reflect the new size
head -= last - first;
}
// Remove the most recent element in the array
void PopBack()
{
if(Size() > 0)
head--;
}
// Empty the vector, or to be precise - forget the fact that there was ever anything in there.
void Clear() { head = -1; }
// Returns a bool indicating whether or not there are any elements in the array
bool Empty() { return head == -1; }
// Returns the oldest element in the array (the one added before any other)
VectorType const &Back() { return *begin; }
// Returns the newest element in the array (the one added after every other)
VectorType const &Front() { return begin[head]; }
// Returns the nth element in the vector
VectorType &operator[](int n)
{
if(n < Size())
return begin[n];
else
return OB;
}
// Returns a pointer such that the vector's data is laid out between ret to ret + size
VectorType *Data() { return begin; }
// Recreates the vector to hold len elements, all being copies of val
void Assign(int len, const VectorType &val)
{
delete[] begin;
// Allocate an array the same size as the one passed in
begin = new VectorType[len];
storage = begin + len;
// Refresh the head and tail, assuming the array is in order, which it really has to be
head = len - 1;
for(int i = 0 ; i < Size(); i++)
begin[i] = val;
}
// Recreates the vector using an external array
void Assign(VectorType *array, int len)
{
delete[] begin;
// Allocate an array the same size as the one passed in
begin = new VectorType[len];
storage = begin + len;
// Refresh the head and tail, assuming the array is in order, which it really has to be
head = len - 1;
// Copy over the memory
memcpy(begin, array, sizeof(VectorType) * len);
}
// Returns the number of elements that the vector will support before needing resizing
int Capacity() { return (storage - begin); }
// Returns the number of elements in vector
int Size() { return head + 1; }
// Requests that the capacity of the allocated storage space for the elements
// of the vector be at least enough to hold size elements.
void Reserve(unsigned int size)
{
if(size > Capacity())
ReAllocate(size);
}
// Resizes the vector
void Resize(unsigned int size)
{
// If necessary, resize the underlying array to fit the new size
if(size > Capacity())
ReAllocate(size);
// Now revise the head and size (tail needn't change) to reflect the new size
head = size - 1;
}
private:
void ReAllocate(unsigned int size)
{
// Just in case we're re-allocating less room than we had before, make sure that we don't overrun the buffer by trying to write more elements than
// are now possible for this vector to hold.
if(Size() > (int)size)
head = size - 1;
// Allocate an array twice the size of that of the old
VectorType *_begin = new VectorType[size];
VectorType *_storage = _begin + size;
int _head = Size() - 1;
// Copy across all the old array's data and rearrange it!
for(int i = 0; i < Size(); i++)
_begin[i] = (*this)[i];
// Free the old memory
delete[] begin;
// Redirect the old array to point to the new one
begin = _begin;
storage = _storage;
head = _head;
}
};
#endif // VECTOR_H

@ -18,37 +18,37 @@
</h4><h4>humidity: <span id="sta-humidity"></span>
&nbsp;&nbsp;rainfall: <span id="sta-rainfall"></span> &nbsp;&nbsp;CO: <span id="sta-co"></span>
</h4><h4> NH3: <span id="sta-nh3"></span> &nbsp;&nbsp;airpressure: <span id="sta-airpressure"></span></h4>
<button id="sta-charge">charge battery</button> <button class="refresh station">refresh data</button>
<!--<button id="sta-charge">charge battery</button>--> <button class="refresh station">refresh data</button>
</div>
<HR style="border:1 dashed #987cb9" width="80%" color=#987cb9 SIZE=1></HR>
<div style="margin:auto;">
<h3>Node0 <span id="node0-datetime"></span></h3>
<h4>status: <span id="node0-status"></span> &nbsp;&nbsp;latency: <span id="node0-qos"></span>ms &nbsp;&nbsp;battery: <span id="node0-batterylevel"></span>%</h4>
<h4>switch: <span id="node0-waterswitch"></span> &nbsp;temperature: <span id="node0-temperature"></span> &nbsp;humidity: <span id="node0-humidity"></span></h4>
<button id="node0-swibtn">open switch</button> <button id="node0-charge">charge battery</button> <button class="refresh node0">refresh data</button>
<button id="node0-swibtn">open switch</button> <!--<button id="node0-charge">charge battery</button>--> <button class="refresh node0">refresh data</button>
</div>
<HR style="border:1 dashed #987cb9" width="80%" color=#987cb9 SIZE=1></HR>
<div style="margin:auto;">
<h3>Node1 <span id="node1-datetime"></span></h3>
<h4>status: <span id="node1-status"></span> &nbsp;&nbsp;latency: <span id="node1-qos"></span>ms &nbsp;&nbsp;battery: <span id="node1-batterylevel"></span>%</h4>
<h4>switch: <span id="node1-waterswitch"></span> &nbsp;temperature: <span id="node1-temperature"></span> &nbsp;humidity: <span id="node1-humidity"></span></h4>
<button id="node1-swibtn">open switch</button> <button id="node1-charge">charge battery</button> <button class="refresh node1">refresh data</button>
<button id="node1-swibtn">open switch</button> <!--<button id="node1-charge">charge battery</button>--> <button class="refresh node1">refresh data</button>
</div>
<HR style="border:1 dashed #987cb9" width="80%" color=#987cb9 SIZE=1></HR>
<div style="margin:auto;">
<h3>waterSys <span id="waterSys-datetime"></span></h3>
<h4>status: <span id="waterSys-status"></span> &nbsp;&nbsp;latency: <span id="waterSys-qos"></span>ms</h4>
<h4>pump0: <span id="waterSys-pump0"></span> &nbsp;&nbsp;pump1: <span id="waterSys-pump1"></span></h4>
<button id="waterSys-pump0btn">open pump0</button> <button id="waterSys-pump1btn">open pump1</button> <button class="refresh waterSys">refresh data</button>
<button id="waterSys-pump0btn">open pump0</button> <!--<button id="waterSys-pump1btn">open pump1</button>--> <button class="refresh waterSys">refresh data</button>
</div>
<script>
/* global var */
var page = {
msg: "This is a temporary page! "+
"4 Fake Nodes are working!! "+
"If you want to shutdown the Fake Nodes, Please let me know!! "+
"Next official Page will be pushed out in next week! "+
"Station, Node0 and waterSys are working!! "+
"If you find any bugs, please let me know!! "+
"The official Page is on the way! "+
"Status Code 0 represents ok and open!! "+
"Status Code 1 represents close!! ",
charNum: 40,
@ -84,10 +84,10 @@ setInterval(function(){
else $('#sta-batterylevel').css('color', '#FF0000');
if(res.data[0].status % 8 >= 4){
$('#sta-charge').html('Stop Charging');
$('#sta-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=station&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#sta-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=station&status=0");');
}else{
$('#sta-charge').html('Charge');
$('#sta-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=station&status=4");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#sta-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=station&status=4");');
}
});
@ -106,17 +106,17 @@ setInterval(function(){
else $('#node0-batterylevel').css('color', '#FF0000');
if(res.data[0].status % 8 >= 4){
$('#node0-charge').html('Stop Charging');
$('#node0-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=0&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node0-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=0&status=0");');
}else{
$('#node0-charge').html('Charge');
$('#node0-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=0&status=4");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node0-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=0&status=4");');
}
if(res.data[0].waterswitch == 0){
$('#node0-swibtn').html('close switch');
$('#node0-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=0&status=1");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node0-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=0&status=1");');
}else{
$('#node0-swibtn').html('open switch');
$('#node0-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=0&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node0-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=0&status=0");');
}
});
@ -135,17 +135,17 @@ setInterval(function(){
else $('#node1-batterylevel').css('color', '#FF0000');
if(res.data[0].status % 8 >= 4){
$('#node1-charge').html('Stop Charging');
$('#node1-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=1&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node1-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=1&status=0");');
}else{
$('#node1-charge').html('Charge');
$('#node1-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=1&status=4");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node1-charge').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?type=node&sid=1&status=4");');
}
if(res.data[0].waterswitch == 0){
$('#node1-swibtn').html('close switch');
$('#node1-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=1&status=1");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node1-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=1&status=1");');
}else{
$('#node1-swibtn').html('open switch');
$('#node1-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=1&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#node1-swibtn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?sid=1&status=0");');
}
});
@ -160,17 +160,17 @@ setInterval(function(){
else $('#waterSys-qos').css('color', '#FF0000');
if(res.data[0].pump0 == 0){
$('#waterSys-pump0btn').html('close pump0');
$('#waterSys-pump0btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=0&status=1");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#waterSys-pump0btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=0&status=1");');
}else{
$('#waterSys-pump0btn').html('open pump0');
$('#waterSys-pump0btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=0&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#waterSys-pump0btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=0&status=0");');
}
if(res.data[0].pump1 == 0){
$('#waterSys-pump1btn').html('close pump1');
$('#waterSys-pump1btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=1&status=1");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#waterSys-pump1btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=1&status=1");');
}else{
$('#waterSys-pump1btn').html('open pump1');
$('#waterSys-pump1btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=1&status=0");$.get("https://smartfarm.yimian.xyz/api/refresh");');
$('#waterSys-pump1btn').attr('onClick', '$.get("https://smartfarm.yimian.xyz/api/set?pid=1&status=0");');
}
});
}, 2000);

Loading…
Cancel
Save