diff --git a/.circleci/config.yml b/.circleci/config.yml index e623ab32c6..df8574ea58 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -66,7 +66,7 @@ jobs: sudo ldconfig - run: name: Install global dependencies - command: 'sudo npm install typescript node-gyp npm@latest -g' + command: "sudo npm install typescript node-gyp npm@latest -g" - restore_cache: # special step to restore the dependency cache # Read about caching dependencies: https://circleci.com/docs/2.0/caching/ key: dependency-cache-{{ checksum "server/package.json" }}-node-12 @@ -126,7 +126,7 @@ jobs: - checkout - run: name: Build Front - command: 'cd front && npm install && npm run build' + command: "cd front && npm install && npm run build" - persist_to_workspace: root: ~/gladys-build paths: diff --git a/front/src/assets/integrations/cover/arduino.jpg b/front/src/assets/integrations/cover/arduino.jpg new file mode 100644 index 0000000000..59fb99cdfd Binary files /dev/null and b/front/src/assets/integrations/cover/arduino.jpg differ diff --git a/front/src/components/app.jsx b/front/src/components/app.jsx index 8a32990cb5..6bc32974da 100644 --- a/front/src/components/app.jsx +++ b/front/src/components/app.jsx @@ -68,6 +68,8 @@ import ZwaveEditPage from '../routes/integration/all/zwave/edit-page'; import RtspCameraPage from '../routes/integration/all/rtsp-camera'; import XiaomiPage from '../routes/integration/all/xiaomi'; import EditXiaomiPage from '../routes/integration/all/xiaomi/edit-page'; +import ArduinoDevicePage from '../routes/integration/all/arduino/device-page'; +import ArduinoSetupPage from '../routes/integration/all/arduino/setup-page'; // MQTT integration import MqttDevicePage from '../routes/integration/all/mqtt/device-page'; @@ -167,6 +169,11 @@ const AppRouter = connect( + + + + + diff --git a/front/src/components/boxs/device-in-room/DeviceRow.jsx b/front/src/components/boxs/device-in-room/DeviceRow.jsx index 9a56b7de71..7e480287e1 100644 --- a/front/src/components/boxs/device-in-room/DeviceRow.jsx +++ b/front/src/components/boxs/device-in-room/DeviceRow.jsx @@ -1,4 +1,5 @@ import BinaryDeviceFeature from './device-features/BinaryDeviceFeature'; +import ButtonDeviceFeature from './device-features/ButtonDeviceFeature'; import SensorDeviceFeature from './device-features/SensorDeviceFeature'; import MultilevelDeviceFeature from './device-features/MultiLevelDeviceFeature'; @@ -23,6 +24,19 @@ const DeviceRow = ({ children, ...props }) => { updateValue={props.updateValue} /> ); + } else if (props.deviceFeature.type === 'push') { + return ( + + ); } if (props.deviceFeature.type === 'dimmer') { return ( diff --git a/front/src/components/boxs/device-in-room/device-features/ButtonDeviceFeature.jsx b/front/src/components/boxs/device-in-room/device-features/ButtonDeviceFeature.jsx new file mode 100644 index 0000000000..9a3883c2bb --- /dev/null +++ b/front/src/components/boxs/device-in-room/device-features/ButtonDeviceFeature.jsx @@ -0,0 +1,37 @@ +const ButtonDeviceType = ({ children, ...props }) => { + function updateValue() { + props.updateValue( + props.x, + props.y, + props.device, + props.deviceFeature, + props.deviceIndex, + props.deviceFeatureIndex, + props.deviceFeature.last_value === 0 ? 1 : 0 + ); + } + + return ( + + + + + {props.device.name} + + + + + ); +}; + +export default ButtonDeviceType; diff --git a/front/src/config/demo.json b/front/src/config/demo.json index 3fe42328f7..5108a4fe1a 100644 --- a/front/src/config/demo.json +++ b/front/src/config/demo.json @@ -1395,6 +1395,172 @@ ] } ], + "get /api/v1/service/arduino": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "name": "Arduino", + "selector": "arduino" + }, + "get /api/v1/service/arduino/device": [ + { + "id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "null", + "name": "Arduino Mega", + "selector": "arduino-mega", + "model": "card", + "external_id": "51bc71ad-816c-4682-9bc2-6840a5036b74", + "createdAt": "2020-05-25T17: 25: 45.129Z", + "updatedAt": "2020-05-25T17: 25: 45.129Z", + "features": [], + "params": [ + { + "id": "5b6c5d6f-8756-46af-bfca-f40bb74a14b4", + "device_id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "name": "ARDUINO_PATH", + "value": "/dev/ttyACM0", + "createdAt": "2020-05-25T17: 25: 45.168Z", + "updatedAt": "2020-05-25T17: 25: 45.168Z" + }, + { + "id": "371e873b-b39e-4b84-a87e-e401ce3678ec", + "device_id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "name": "ARDUINO_MODEL", + "value": "mega", + "createdAt": "2020-05-25T17: 25: 45.169Z", + "updatedAt": "2020-05-25T17: 25: 45.169Z" + } + ], + "room": "null", + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } + }, + { + "id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "cecc52c7-3e67-4b75-9b13-9a8867b0443d", + "name": "Lampe Salon", + "selector": "lampe-salon", + "model": "null", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "should_poll": "false", + "poll_frequency": "null", + "createdAt": "2020-05-26T18: 17: 50.969Z", + "updatedAt": "2020-05-26T18: 17: 50.969Z", + "features": [ + { + "id": "4412eb0f-e705-444c-aa83-b4d76d634673", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "Lampe Salon", + "selector": "lampe-salon", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "category": "light", + "type": "binary", + "read_only": "false", + "keep_history": "false", + "has_feedback": "false", + "unit": "null", + "min": "0", + "max": "1", + "last_value": "0", + "last_value_string": "null", + "last_value_changed": "2020-05-27T01: 44: 03.922Z", + "createdAt": "2020-05-26T18: 17: 50.989Z", + "updatedAt": "2020-05-27T01: 37: 15.610Z" + } + ], + "params": [ + { + "id": "8e316fbc-1386-4774-b7a4-90e88233c7dc", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "DATA_PIN", + "value": "4", + "createdAt": "2020-05-26T18: 17: 51.007Z", + "updatedAt": "2020-05-26T18: 17: 51.007Z" + }, + { + "id": "dabb2541-2e5f-4c8e-a95d-0efd90850ea9", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "FUNCTION", + "value": "emit_433_chacon", + "createdAt": "2020-05-26T18: 17: 51.009Z", + "updatedAt": "2020-05-26T18: 17: 51.009Z" + }, + { + "id": "2e6b89f6-396b-412d-bd9f-7477cdf3c9c4", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-26T18: 17: 51.011Z", + "updatedAt": "2020-05-26T18: 17: 51.011Z" + }, + { + "id": "5fdf8a00-575c-4136-ad7b-27330aea47a6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.013Z", + "updatedAt": "2020-05-26T18: 17: 51.013Z" + }, + { + "id": "6e53cd3e-618b-42c4-8c74-7a42e429ebb1", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_ON", + "value": "1536116368", + "createdAt": "2020-05-26T18: 17: 51.015Z", + "updatedAt": "2020-05-26T18: 17: 51.015Z" + }, + { + "id": "cdbea6fc-0a49-4d82-83c4-b1849281f478", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_OFF", + "value": "1536116352", + "createdAt": "2020-05-26T18: 17: 51.017Z", + "updatedAt": "2020-05-26T18: 17: 51.017Z" + }, + { + "id": "42258fdb-0f3c-4cef-889d-385f39d166d6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "BIT_LENGTH", + "value": "24", + "createdAt": "2020-05-26T18: 17: 51.019Z", + "updatedAt": "2020-05-26T18: 17: 51.019Z" + }, + { + "id": "2614bb79-be14-42c9-a47d-cfab5e8f126d", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "PULSE_LENGTH", + "value": "3", + "createdAt": "2020-05-26T18: 17: 51.021Z", + "updatedAt": "2020-05-26T18: 17: 51.021Z" + } + ], + "room": { + "id": "cecc52c7-3e67-4b75-9b13-9a8867b0443d", + "name": "Living Room", + "selector": "living-room" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } + } + ], "get /api/v1/service/xiaomi": { "id": "70cb1e17-3b17-4886-83ab-45b00a9e03b1", "name": "Xiaomi", diff --git a/front/src/config/i18n/en.json b/front/src/config/i18n/en.json index d665228a7e..41ad584cc0 100644 --- a/front/src/config/i18n/en.json +++ b/front/src/config/i18n/en.json @@ -522,6 +522,87 @@ "disconnected": "Disconnected from MQTT broker." } }, + "arduino": { + "title": "Arduino", + "description": "Control your Arduino devices.", + "deviceTab": "Devices", + "setupTab": "Setup", + "codeInstruction2": "In order to use this service, you need to use an Arduino card with the code written for. You can download this code here.", + "codeInstruction": "In order to use this service, you need to use an Arduino card with the code written for. Please upload the code with the Upload button.", + "status": { + "notConfigured": "Arduino service is not configured, please go to ", + "notConnected": "Arduino card is not connected, please connect a card.", + "setupPageLink": "Arduino configuration page" + }, + "device": { + "title": "Arduino Devices", + "arduinoDescription": "List of Arduino devices currently connected or which have been connected to Gladys.", + "search": "Search devices", + "noDevices": "No devices configured yet. Please configure your devices with the New button.", + "arduinoConnected": "Arduino connected", + "arduinoNotConnected": "Arduino card is not connected, please connect a card in the Setup page.", + "noNameLabel": "No name", + "nameLabel": "Name", + "roomLabel": "Room", + "featuresLabel": "Features", + "noFeatures": "No features", + "refreshButton": "Refresh Arduino", + "saveButton": "Save", + "deleteButton": "Delete", + "returnButton": "Return back", + "editButton": "Edit details", + "notFound": "Requested device not found.", + "backToList": "Back to device list", + "saveError": "Error saving or deleting device", + "saveConflictError": "Conflict: Are you sure all device feature external IDs are unique ?", + "functionLabel": "Function", + "dataPinLabel": "Data pin", + "arduinoLinkedLabel": "Arduino linked", + "codeLabel": "Code", + "codeOnLabel": "Code ON", + "codeOffLabel": "Code OFF", + "bitLengthLabel": "Length of the code", + "pulseLengthLabel": "Pulse length" + }, + "setup": { + "title": "Arduino Settings", + "arduinoDescription": "To use this service, you need to connect an Arduino card.", + "refreshButton": "Refresh Arduino list", + "nameLabel": "Name of the card", + "arduinoModelLabel": "Select the model of your Arduino", + "arduinoUsbDriverPathLabel": "Select the USB port where your Arduino is connected", + "error": "No Arduino device added yet.", + "connecting": "Connection", + "connected": "Arduino connected.", + "connectionError": "Error while connecting, please check your configuration.", + "notConnected": "Arduino card is not connected, please connect a card.", + "noDevices": "No Arduino devices added yet. Please configure your devices with the New button.", + "flashing": "Flashing card...", + "flashingSuccess": "Flashing done !", + "flashingError": "Flashing failed !", + "connectButton": "Save", + "disconnectButton": "Delete", + "uploadButton": "Upload code" + }, + "function": { + "recv433": "Receive in 433 MHz", + "emit433": "Emit in 433 MHz", + "emit433Chacon": "Emit in 433 MHz for Chacon outlets", + "emitIR": "Emit in IR", + "dhtTemperature": "Temperature through DHT11", + "dhtHumidity": "Humidity through DHT11" + }, + "features": { + "lightButton": "Light", + "switchButton": "Switch", + "pushButton": "Push button", + "radioSensor": "433 MHz sensor", + "temperatureSensor": "Temperature sensor", + "humiditySensor": "Humidity sensor", + "motionSensor": "Motion sensor", + "openingSensor": "Opening sensor" + } + }, "xiaomi": { "title": "Xiaomi Home", "description": "Display Xiaomi home devices.", diff --git a/front/src/config/i18n/fr.json b/front/src/config/i18n/fr.json index 7d3f424a9e..a7062c1f17 100644 --- a/front/src/config/i18n/fr.json +++ b/front/src/config/i18n/fr.json @@ -630,6 +630,87 @@ "disconnected": "Déconnecté du broker MQTT." } }, + "arduino": { + "title": "Arduino", + "description": "Contrôlez vos appareils Arduino.", + "deviceTab": "Périphériques", + "setupTab": "Configuration", + "codeInstruction2": "Pour utiliser ce service, il vous faut une carte Arduino avec le code écrit dans ce but. Vous pouvez télécharger ce code ici.", + "codeInstruction": "Pour utiliser ce service, il vous faut une carte Arduino avec le code écrit dans ce but. Veillez donc à téléverser le code en cliquant sur le bouton Téléverser.", + "status": { + "notConfigured": "Arduino service is not configured, please go to ", + "notConnected": "Arduino card is not connected, please connect a card.", + "setupPageLink": "Arduino configuration page" + }, + "device": { + "title": "Périphériques Arduino", + "arduinoDescription": "Liste des périphériques Arduino actuellement connecté ou qui ont été connectés to Gladys.", + "search": "Chercher un appareil", + "noDevices": "Aucun appareil n'a été configuré. Veuillez commencer la configuration avec le bouton Nouveau.", + "arduinoConnected": "Arduino connecté", + "arduinoNotConnected": "Aucune carte Arduino n'est connectée, veuillez en configurer une dans la page de Configuration.", + "noNameLabel": "Pas de nom", + "nameLabel": "Nom", + "roomLabel": "Pièce", + "featuresLabel": "Fonctionnalités", + "noFeatures": "Aucune fonctionnalité", + "refreshButton": "Rafraichir", + "saveButton": "Sauvegarder", + "deleteButton": "Supprimer", + "returnButton": "Retour", + "editButton": "Editer les détails", + "notFound": "Appareil recherché introuvable.", + "backToList": "Retour à la liste des appareils", + "saveError": "Erreur de sauvegarde ou de suppression de l'appareil", + "saveConflictError": "Conflit : êtes-vous sûr que tous les IDs externes des fonctionnalités de l'appareil sont uniques ?", + "functionLabel": "Fonction", + "dataPinLabel": "Pin de données", + "arduinoLinkedLabel": "Arduino lié", + "codeLabel": "Code", + "codeOnLabel": "Code ON", + "codeOffLabel": "Code OFF", + "bitLengthLabel": "Longueur du code", + "pulseLengthLabel": "Nombre d'impulsions" + }, + "setup": { + "title": "Configuration Arduino", + "arduinoDescription": "Pour utiliser ce service, veuillez connecter une carte Arduino.", + "refreshButton": "Rafraichir", + "nameLabel": "Nom de la carte", + "arduinoModelLabel": "Selectionnez le modèle de votre Arduino", + "arduinoUsbDriverPathLabel": "Selectionnez le port USB sur lequel votre carte est connectée", + "error": "Aucun Arduino connecté.", + "connecting": "Connexion", + "connected": "Arduino connecté.", + "connectionError": "Erreur lors de la tentative de connexion, veuillez bérifier votre configuration.", + "notConnected": "Aucune carte Arduino n'est connectée, veuillez en brancher une.", + "noDevices": "Aucun Arduino connecté. Veuillez configurer vos périphériques avec le bouton Nouveau.", + "flashing": "Téléversement...", + "flashingSuccess": "Téléversement terminé !", + "flashingError": "Echec du téléversement !", + "connectButton": "Sauvegarder", + "disconnectButton": "Supprimer", + "uploadButton": "Téléverser" + }, + "function": { + "recv433": "Réception 433 MHz", + "emit433": "Emision 433 MHz", + "emit433Chacon": "Emission 433 MHz pour prises Chacon", + "emitIR": "Emission IR", + "dhtTemperature": "Température via DHT11", + "dhtHumidity": "Humidité via DHT11" + }, + "features": { + "lightButton": "Lumière", + "switchButton": "Interrupteur", + "pushButton": "Bouton", + "radioSensor": "Capteur 433 MHz", + "temperatureSensor": "Capteur de température", + "humiditySensor": "Capteur d'humidité", + "motionSensor": "Capteur de mouvement", + "openingSensor": "Capteur d'ouverture de portes" + } + }, "xiaomi": { "title": "Xiaomi Home", "description": "Gérez les appareils Xiaomi.", diff --git a/front/src/config/integrations/device.en.json b/front/src/config/integrations/device.en.json new file mode 100644 index 0000000000..bf21d21eb5 --- /dev/null +++ b/front/src/config/integrations/device.en.json @@ -0,0 +1,44 @@ +[ + { + "key": "arduino", + "name": "Arduino", + "description": "Control your Arduino devices.", + "img": "/assets/integrations/cover/arduino.jpg" + }, + { + "key": "zwave", + "name": "Z-Wave", + "description": "Control your Z-Wave devices.", + "img": "/assets/integrations/cover/zwave.jpg" + }, + { + "key": "rtsp-camera", + "name": "Camera", + "description": "HTTP/RTSP cameras in Gladys.", + "img": "/assets/integrations/cover/rtsp-camera.jpg" + }, + { + "key": "xiaomi", + "name": "Xiaomi Home", + "description": "Display Xiaomi home devices.", + "img": "/assets/integrations/cover/xiaomi.jpg" + }, + { + "key": "mqtt", + "name": "MQTT", + "description": "Connect to MQTT server.", + "img": "/assets/integrations/cover/mqtt.jpg" + }, + { + "key": "philips-hue", + "name": "Philips Hue", + "description": "Control Philips Hue Lights.", + "img": "/assets/integrations/cover/philips-hue.jpg" + }, + { + "key": "tasmota", + "name": "Tasmota", + "description": "Control your Tasmota devices.", + "img": "/assets/integrations/cover/tasmota.jpg" + } +] diff --git a/front/src/config/integrations/devices.json b/front/src/config/integrations/devices.json index f14a2b715e..e5f804574f 100644 --- a/front/src/config/integrations/devices.json +++ b/front/src/config/integrations/devices.json @@ -1,4 +1,9 @@ [ + { + "key": "arduino", + "link": "arduino", + "img": "/assets/integrations/cover/arduino.jpg" + }, { "key": "zwave", "img": "/assets/integrations/cover/zwave.jpg" diff --git a/front/src/routes/integration/all/arduino/ArduinoPage.js b/front/src/routes/integration/all/arduino/ArduinoPage.js new file mode 100644 index 0000000000..b75cff05b0 --- /dev/null +++ b/front/src/routes/integration/all/arduino/ArduinoPage.js @@ -0,0 +1,49 @@ +import { Text } from 'preact-i18n'; +import { Link } from 'preact-router/match'; + +const DashboardSettings = ({ children, ...props }) => ( +
+
+
+
+
+
+

+ +

+
+
+ + + + + + + + + + + + + +
+
+
+ +
{children}
+
+
+
+
+
+); + +export default DashboardSettings; diff --git a/front/src/routes/integration/all/arduino/device-page/Device.jsx b/front/src/routes/integration/all/arduino/device-page/Device.jsx new file mode 100644 index 0000000000..a240caa14b --- /dev/null +++ b/front/src/routes/integration/all/arduino/device-page/Device.jsx @@ -0,0 +1,449 @@ +import { Text, Localizer } from 'preact-i18n'; +import { Component } from 'preact'; +import cx from 'classnames'; +import { RequestStatus } from '../../../../../utils/consts'; +import { + DEVICE_FUNCTION, + DEVICE_FEATURE_CATEGORIES, + DEVICE_FEATURE_TYPES +} from '../../../../../../../server/utils/constants'; + +class ArduinoDeviceBox extends Component { + saveDevice = async () => { + this.setState({ + loading: true + }); + try { + await this.props.saveDevice(this.props.deviceIndex); + } catch (e) { + this.setState({ + error: RequestStatus.Error + }); + } + this.setState({ + loading: false + }); + }; + + deleteDevice = async () => { + this.setState({ + loading: true + }); + try { + await this.props.deleteDevice(this.props.deviceIndex); + } catch (e) { + this.setState({ + error: RequestStatus.Error + }); + } + this.setState({ + loading: false + }); + }; + + updateName = e => { + this.props.updateName(this.props.deviceIndex, e.target.value); + }; + + updateDataPin = e => { + this.props.updateDataPin(this.props.deviceIndex, e.target.value); + }; + + updateBitLength = e => { + this.props.updateBitLength(this.props.deviceIndex, e.target.value); + }; + + updatePulseLength = e => { + this.props.updatePulseLength(this.props.deviceIndex, e.target.value); + }; + + updateFunction = e => { + this.props.updateFunction(this.props.deviceIndex, e.target.value); + switch (e.target.value) { + case DEVICE_FUNCTION.RECV_433: + //this.props.updateFeature(this.props.deviceIndex, 0, 'category', DEVICE_FEATURE_CATEGORIES.SWITCH); + //this.props.updateFeature(this.props.deviceIndex, 0, 'type', DEVICE_FEATURE_TYPES.SENSOR.PUSH); + break; + case DEVICE_FUNCTION.EMIT_433: + //this.props.updateFeature(this.props.deviceIndex, 0, 'category', DEVICE_FEATURE_CATEGORIES.SWITCH); + //this.props.updateFeature(this.props.deviceIndex, 0, 'type', DEVICE_FEATURE_TYPES.SENSOR.PUSH); + this.props.updateBitLength(this.props.deviceIndex, '24'); + break; + case DEVICE_FUNCTION.EMIT_433_CHACON: + //this.props.updateFeature(this.props.deviceIndex, 0, 'category', DEVICE_FEATURE_CATEGORIES.SWITCH); + //this.props.updateFeature(this.props.deviceIndex, 0, 'type', DEVICE_FEATURE_TYPES.SWITCH.BINARY); + break; + case DEVICE_FUNCTION.EMIT_IR: + //this.props.updateFeature(this.props.deviceIndex, 0, 'category', DEVICE_FEATURE_CATEGORIES.SWITCH); + //this.props.updateFeature(this.props.deviceIndex, 0, 'type', DEVICE_FEATURE_TYPES.SENSOR.PUSH); + this.props.updateBitLength(this.props.deviceIndex, '32'); + break; + } + }; + + updateFeature = e => { + this.props.updateFeature(this.props.deviceIndex, 0, 'category', e.target.value.split(',')[0]); + this.props.updateFeature(this.props.deviceIndex, 0, 'type', e.target.value.split(',')[1]); + this.props.updateFeature(this.props.deviceIndex, 0, 'min', e.target.value.split(',')[2]); + this.props.updateFeature(this.props.deviceIndex, 0, 'max', e.target.value.split(',')[3]); + }; + + updateArduino = e => { + this.props.updateArduino(this.props.deviceIndex, e.target.value); + }; + + updateRoom = e => { + this.props.updateDeviceProperty(this.props.deviceIndex, 'room_id', e.target.value); + }; + + updateCode = e => { + this.props.updateCode(this.props.deviceIndex, e.target.value); + }; + + updateCodeOn = e => { + this.props.updateCodeOn(this.props.deviceIndex, e.target.value); + }; + + updateCodeOff = e => { + this.props.updateCodeOff(this.props.deviceIndex, e.target.value); + }; + + render(props, { loading }) { + return ( +
+
+
{props.device.name || }
+
+
+
+
+
+
+ + + } + /> + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+ + +
+ {props.device.params.find(e => e.name === 'FUNCTION').value !== DEVICE_FUNCTION.RECV_433 && ( +
+ + + e.name === 'DATA_PIN').value} + onInput={this.updateDataPin} + class="form-control" + placeholder={} + /> + +
+ )} +
+
+ +
+ + +
+ + {(props.device.features[0].type === DEVICE_FEATURE_TYPES.SENSOR.PUSH || + (props.device.params.find(e => e.name === 'FUNCTION').value === DEVICE_FUNCTION.RECV_433 && + (props.device.features[0].category === DEVICE_FEATURE_CATEGORIES.OPENING_SENSOR || + props.device.features[0].category === DEVICE_FEATURE_CATEGORIES.MOTION_SENSOR))) && ( +
+
+
+ + + e.name === 'CODE').value} + onInput={this.updateCode} + class="form-control" + placeholder={} + /> + +
+
+ + + e.name === 'BIT_LENGTH').value} + onInput={this.updateBitLength} + class="form-control" + placeholder={} + /> + +
+
+ + + e.name === 'PULSE_LENGTH').value} + onInput={this.updatePulseLength} + class="form-control" + placeholder={} + /> + +
+ )} + + {props.device.features[0].type === DEVICE_FEATURE_TYPES.SWITCH.BINARY && + props.device.features[0].category !== DEVICE_FEATURE_CATEGORIES.OPENING_SENSOR && + props.device.features[0].category !== DEVICE_FEATURE_CATEGORIES.MOTION_SENSOR && ( +
+
+
+ + + e.name === 'CODE_ON').value} + onInput={this.updateCodeOn} + class="form-control" + placeholder={} + /> + +
+ +
+ + + e.name === 'CODE_OFF').value} + onInput={this.updateCodeOff} + class="form-control" + placeholder={} + /> + +
+
+ + + + e.name === 'BIT_LENGTH').value} + onInput={this.updateBitLength} + class="form-control" + placeholder={} + /> + + + + + e.name === 'PULSE_LENGTH').value} + onInput={this.updatePulseLength} + class="form-control" + placeholder={} + /> + +
+ )} +
+
+ + +
+
+
+
+
+
+ ); + } +} + +export default ArduinoDeviceBox; diff --git a/front/src/routes/integration/all/arduino/device-page/DeviceTab.jsx b/front/src/routes/integration/all/arduino/device-page/DeviceTab.jsx new file mode 100644 index 0000000000..efda85b1a4 --- /dev/null +++ b/front/src/routes/integration/all/arduino/device-page/DeviceTab.jsx @@ -0,0 +1,108 @@ +import { Text, Localizer } from 'preact-i18n'; +import cx from 'classnames'; + +import style from './style.css'; +import { RequestStatus } from '../../../../../utils/consts'; +import Device from './Device'; + +const DeviceTab = ({ children, ...props }) => ( +
+
+

+ +

+
+ +
+ + + + + } + onInput={props.debouncedSearch} + /> + +
+
+ +
+ {props.arduinoDevices && props.arduinoDevices.length > 0 && ( + + )} +
+
+
+
+
+
+ {props.arduinoDevices && props.arduinoDevices.length > 0 && ( +

+ +

+ )} + {props.arduinoDevices && props.arduinoDevices.length === 0 && ( +

+ +

+ )} + {props.arduinoDevices && props.arduinoDevices.length > 0 && props.devices.length === 0 && ( +
+ +
+ )} + {props.getArduinoDevicesStatus === RequestStatus.Getting &&
} +
+ {props.arduinoDevices && + props.devices && + props.devices.map((device, index) => ( + + ))} + {props.arduinoDevices && props.arduinoDevices.length > 0 && props.devices.length === 0 && ( +
+ +
+ )} +
+
+
+
+
+); + +export default DeviceTab; diff --git a/front/src/routes/integration/all/arduino/device-page/actions.js b/front/src/routes/integration/all/arduino/device-page/actions.js new file mode 100644 index 0000000000..4d734e9376 --- /dev/null +++ b/front/src/routes/integration/all/arduino/device-page/actions.js @@ -0,0 +1,386 @@ +import { RequestStatus } from '../../../../../utils/consts'; +import update from 'immutability-helper'; +import uuid from 'uuid'; +import createActionsHouse from '../../../../../actions/house'; +import createActionsIntegration from '../../../../../actions/integration'; +import debounce from 'debounce'; +import { + DEVICE_FUNCTION, + DEVICE_FEATURE_CATEGORIES, + DEVICE_FEATURE_TYPES, + DEVICE_FEATURE_UNITS +} from '../../../../../../../server/utils/constants'; + +const actions = store => { + const houseActions = createActionsHouse(store); + const integrationActions = createActionsIntegration(store); + const actions = { + async getUsbPorts(state) { + store.setState({ + getArduinoUsbPortStatus: RequestStatus.Getting + }); + try { + const usbPorts = await state.httpClient.get('/api/v1/service/usb/port'); + store.setState({ + usbPorts, + getArduinoUsbPortStatus: RequestStatus.Success + }); + } catch (e) { + store.setState({ + getArduinoUsbPortStatus: RequestStatus.Error + }); + } + }, + async getArduinoDevices(state) { + store.setState({ + getArduinoDevicesStatus: RequestStatus.Getting + }); + try { + const options = { + order_dir: state.getArduinoDevicesOrderDir || 'asc' + }; + if (state.arduinoDevicesSearch && state.arduinoDevicesSearch.length) { + options.search = state.arduinoDevicesSearch; + } + const list = await state.httpClient.get('/api/v1/service/arduino/device', options); + + let arduinoDevices = []; + list.forEach(element => { + if (element.model === 'card') { + arduinoDevices.push(element); + } + }); + + store.setState({ + arduinoDevices, + getArduinoDevicesStatus: RequestStatus.Success + }); + } catch (e) { + store.setState({ + getArduinoDevices: RequestStatus.Error + }); + } + }, + async getDevices(state) { + store.setState({ + getDevicesStatus: RequestStatus.Getting + }); + try { + const options = { + order_dir: state.getDevicesOrderDir || 'asc' + }; + if (state.devicesSearch && state.devicesSearch.length) { + options.search = state.devicesSearch; + } + const list = await state.httpClient.get('/api/v1/service/arduino/device', options); + + let devices = []; + list.forEach(element => { + if (element.model !== 'card') { + devices.push(element); + } + }); + + store.setState({ + devices, + getDevicesStatus: RequestStatus.Success + }); + } catch (e) { + store.setState({ + getDevicesStatus: RequestStatus.Error + }); + } + }, + async addDevice(state) { + const uniqueId = uuid.v4(); + await integrationActions.getIntegrationByName(state, 'arduino'); + const devices = update(state.devices, { + $push: [ + { + name: null, + selector: null, + external_id: uniqueId, + service_id: store.getState().currentIntegration.id, + room_id: null, + features: [ + { + name: null, + selector: null, + external_id: uniqueId, + category: DEVICE_FEATURE_CATEGORIES.SWITCH, + type: DEVICE_FEATURE_TYPES.SWITCH.BINARY, + read_only: false, + keep_history: false, + has_feedback: false, + min: 0, + max: 1 + } + ], + params: [ + { + name: 'DATA_PIN', + value: '0' + }, + { + name: 'FUNCTION', + value: null + }, + { + name: 'ARDUINO_LINKED', + value: null + }, + { + name: 'CODE', + value: '0' + }, + { + name: 'CODE_ON', + value: '0' + }, + { + name: 'CODE_OFF', + value: '0' + }, + { + name: 'BIT_LENGTH', + value: '24' + }, + { + name: 'PULSE_LENGTH', + value: '1' + } + ] + } + ] + }); + store.setState({ + devices + }); + }, + updateDeviceProperty(state, index, property, value) { + const newState = update(state, { + devices: { + [index]: { + [property]: { + $set: value + } + } + } + }); + store.setState(newState); + }, + updateName(state, index, value) { + const devices = update(state.devices, { + [index]: { + name: { + $set: value + } + } + }); + store.setState({ + devices + }); + }, + updateDataPin(state, index, value) { + let arduinoDataPinIndex = state.devices[index].params.findIndex(param => param.name === 'DATA_PIN'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoDataPinIndex]: { + value: { + $set: value + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateFunction(state, index, newValue) { + let arduinoFunctionIndex = state.devices[index].params.findIndex(param => param.name === 'FUNCTION'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoFunctionIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateArduino(state, index, newValue) { + let arduinoLinkedIndex = state.devices[index].params.findIndex(param => param.name === 'ARDUINO_LINKED'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoLinkedIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateCode(state, index, newValue) { + let arduinoCodeIndex = state.devices[index].params.findIndex(param => param.name === 'CODE'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoCodeIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateCodeOn(state, index, newValue) { + let arduinoCodeIndex = state.devices[index].params.findIndex(param => param.name === 'CODE_ON'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoCodeIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateCodeOff(state, index, newValue) { + let arduinoCodeIndex = state.devices[index].params.findIndex(param => param.name === 'CODE_OFF'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoCodeIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateBitLength(state, index, newValue) { + let arduinoBitLengthIndex = state.devices[index].params.findIndex(param => param.name === 'BIT_LENGTH'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoBitLengthIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updatePulseLength(state, index, newValue) { + let arduinoBitLengthIndex = state.devices[index].params.findIndex(param => param.name === 'PULSE_LENGTH'); + const devices = update(state.devices, { + [index]: { + params: { + [arduinoBitLengthIndex]: { + value: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + updateFeature(state, index, featureIndex, property, newValue) { + const devices = update(state.devices, { + [index]: { + features: { + [featureIndex]: { + [property]: { + $set: newValue + } + } + } + } + }); + store.setState({ + devices + }); + }, + async search(state, e) { + store.setState({ + devicesSearch: e.target.value + }); + await actions.getDevices(store.getState()); + }, + async changeOrderDir(state, e) { + store.setState({ + getDevicesOrderDir: e.target.value + }); + await actions.getDevices(store.getState()); + }, + async saveDevice(state, index) { + const device = state.devices[index]; + device.features[0].name = device.name; + if (device.params.find(param => param.name === 'FUNCTION').value === DEVICE_FUNCTION.RECV_433) { + device.features[0].read_only = true; + } else if (device.params.find(param => param.name === 'FUNCTION').value === DEVICE_FUNCTION.DHT_TEMPERATURE) { + device.features[0].read_only = true; + device.features[0].unit = DEVICE_FEATURE_UNITS.CELSIUS; + await state.httpClient.post(`/api/v1/service/arduino/configure`, device); + } else if (device.params.find(param => param.name === 'FUNCTION').value === DEVICE_FUNCTION.DHT_HUMIDITY) { + device.features[0].read_only = true; + device.features[0].unit = DEVICE_FEATURE_UNITS.PERCENT; + await state.httpClient.post(`/api/v1/service/arduino/configure`, device); + } + + await state.httpClient.post(`/api/v1/device`, device); + const arduino = await state.httpClient.get( + `/api/v1/device/${device.params.find(e => e.name === 'ARDUINO_LINKED').value}` + ); + await state.httpClient.post(`/api/v1/service/arduino/listen`, arduino); + }, + async deleteDevice(state, index) { + const device = state.devices[index]; + if (device.createdAt) { + await state.httpClient.delete(`/api/v1/device/${device.selector}`); + } + const devices = update(state.devices, { + $splice: [[index, 1]] + }); + store.setState({ + devices + }); + } + }; + actions.debouncedSearch = debounce(actions.search, 200); + return Object.assign({}, houseActions, integrationActions, actions); +}; + +export default actions; diff --git a/front/src/routes/integration/all/arduino/device-page/index.js b/front/src/routes/integration/all/arduino/device-page/index.js new file mode 100644 index 0000000000..a66f960dde --- /dev/null +++ b/front/src/routes/integration/all/arduino/device-page/index.js @@ -0,0 +1,25 @@ +import { Component } from 'preact'; +import { connect } from 'unistore/preact'; +import actions from './actions'; +import ArduinoPage from '../ArduinoPage'; +import DeviceTab from './DeviceTab'; + +@connect('session,user,devices,arduinoDevices,houses,arduinoConnected,usbPorts', actions) +class ArduinoDevicePage extends Component { + componentWillMount() { + this.props.getDevices(); + this.props.getArduinoDevices(); + this.props.getHouses(); + this.props.getIntegrationByName('arduino'); + } + + render(props, {}) { + return ( + + + + ); + } +} + +export default ArduinoDevicePage; diff --git a/front/src/routes/integration/all/arduino/device-page/style.css b/front/src/routes/integration/all/arduino/device-page/style.css new file mode 100644 index 0000000000..1b4343b7c4 --- /dev/null +++ b/front/src/routes/integration/all/arduino/device-page/style.css @@ -0,0 +1,3 @@ +.emptyDiv { + min-height: 200px; +} diff --git a/front/src/routes/integration/all/arduino/setup-page/SetupDevice.jsx b/front/src/routes/integration/all/arduino/setup-page/SetupDevice.jsx new file mode 100644 index 0000000000..d91dfd0450 --- /dev/null +++ b/front/src/routes/integration/all/arduino/setup-page/SetupDevice.jsx @@ -0,0 +1,201 @@ +import { Text, Localizer } from 'preact-i18n'; +import { Component } from 'preact'; +import cx from 'classnames'; +import { RequestStatus } from '../../../../../utils/consts'; +import { ARDUINO_MODEL } from '../../../../../../../server/utils/constants'; + +class SetupDevice extends Component { + saveDevice = async () => { + this.setState({ + loading: true + }); + try { + await this.props.saveDevice(this.props.deviceIndex); + } catch (e) { + this.setState({ + saveError: RequestStatus.Error + }); + } + this.setState({ + loading: false + }); + }; + + deleteDevice = async () => { + this.setState({ + loading: true + }); + try { + await this.props.deleteDevice(this.props.deviceIndex); + } catch (e) { + this.setState({ + error: RequestStatus.Error + }); + } + this.setState({ + loading: false + }); + }; + + uploadCode = async () => { + this.setState({ + loading: true, + uploadingCode: RequestStatus.Getting + }); + try { + await this.props.uploadCode(this.props.deviceIndex); + this.setState({ + uploadingCode: RequestStatus.Success + }); + } catch (e) { + this.setState({ + error: RequestStatus.Error, + uploadingCode: RequestStatus.Error + }); + } + this.setState({ + loading: false + }); + }; + + updateArduinoName = e => { + this.props.updateArduinoName(this.props.deviceIndex, e.target.value); + }; + + updateArduinoPath = e => { + this.props.updateArduinoPath( + this.props.deviceIndex, + e.target.value.split(',')[0], + e.target.value.split(',')[1], + e.target.value.split(',')[2], + e.target.value.split(',')[3] + ); + }; + + updateArduinoManufacturer = e => { + this.props.updateArduinoManufacturer(this.props.deviceIndex, e.target.value); + }; + + updateArduinoModel = e => { + this.props.updateArduinoModel(this.props.deviceIndex, e.target.value); + }; + + componentWillMount() {} + + render(props, { loading, uploadingCode }) { + return ( +
+
+
+
+ {uploadingCode === RequestStatus.Getting && ( +

+ +

+ )} + {uploadingCode === RequestStatus.Success && ( +

+ +

+ )} + {uploadingCode === RequestStatus.Error && ( +

+ +

+ )} + {props.arduinoConnected === RequestStatus.Success && ( +

+ +

+ )} + {props.arduinoConnected === RequestStatus.Error && ( +

+ +

+ )} + +
+
+
+ + + } + /> + +
+
+ + +
+
+ + +
+ + + + +
+
+
+
+
+ ); + } +} + +export default SetupDevice; diff --git a/front/src/routes/integration/all/arduino/setup-page/SetupTab.jsx b/front/src/routes/integration/all/arduino/setup-page/SetupTab.jsx new file mode 100644 index 0000000000..d5927da163 --- /dev/null +++ b/front/src/routes/integration/all/arduino/setup-page/SetupTab.jsx @@ -0,0 +1,73 @@ +import { Text, MarkupText } from 'preact-i18n'; +import cx from 'classnames'; +import { RequestStatus } from '../../../../../utils/consts'; +import SetupDevice from './SetupDevice'; + +const SetupTab = ({ children, ...props }) => { + return ( +
+
+

+ +

+
+ +
+ +
+
+
+
+
+

+ +

+ {/*props.arduinoConnected && ( +

+ : {props.arduinoModel} +

+ )*/} + {!props.arduinoDevices || + (props.arduinoDevices.length === 0 && ( +

+ +

+ ))} +

+ +

+
+ {props.arduinoDevices && + props.arduinoDevices.map((arduinoDevice, index) => ( + + ))} +
+
+
+
+
+ ); +}; + +export default SetupTab; diff --git a/front/src/routes/integration/all/arduino/setup-page/actions.js b/front/src/routes/integration/all/arduino/setup-page/actions.js new file mode 100644 index 0000000000..71149414fc --- /dev/null +++ b/front/src/routes/integration/all/arduino/setup-page/actions.js @@ -0,0 +1,239 @@ +import { RequestStatus } from '../../../../../utils/consts'; +import uuid from 'uuid'; +import update from 'immutability-helper'; +import createActionsIntegration from '../../../../../actions/integration'; +import debounce from 'debounce'; +import { DEVICE_POLL_FREQUENCIES } from '../../../../../../../server/utils/constants'; + +const actions = store => { + const integrationActions = createActionsIntegration(store); + const actions = { + async getArduinoDevices(state) { + store.setState({ + getArduinoDevicesStatus: RequestStatus.Getting + }); + try { + const options = { + order_dir: state.getArduinoDevicesOrderDir || 'asc' + }; + if (state.arduinoDevicesSearch && state.arduinoDevicesSearch.length) { + options.search = state.arduinoDevicesSearch; + } + const list = await state.httpClient.get('/api/v1/service/arduino/device', options); + + let arduinoDevices = []; + list.forEach(element => { + if (element.model === 'card') { + arduinoDevices.push(element); + } + }); + + store.setState({ + arduinoDevices, + getArduinoDevicesStatus: RequestStatus.Success + }); + } catch (e) { + store.setState({ + getArduinoDevices: RequestStatus.Error + }); + } + }, + async getUsbPorts(state) { + store.setState({ + getArduinoUsbPortStatus: RequestStatus.Getting + }); + try { + const usbPorts = await state.httpClient.get('/api/v1/service/usb/port'); + store.setState({ + usbPorts, + getArduinoUsbPortStatus: RequestStatus.Success + }); + } catch (e) { + store.setState({ + getArduinoUsbPortStatus: RequestStatus.Error + }); + } + }, + getManufacturers(state) { + store.setState({ + arduinoManufacturersList: ['arduino', '1a86', 'qinheng', 'silicon_labs', 'Arduino (www.arduino.cc)'] + }); + }, + async addDevice(state) { + const uniqueId = uuid.v4(); + await integrationActions.getIntegrationByName(state, 'arduino'); + const arduinoDevices = update(state.arduinoDevices, { + $push: [ + { + name: null, + selector: null, + external_id: uniqueId, + service_id: store.getState().currentIntegration.id, + room_id: null, + model: 'card', + should_poll: false, + poll_frequency: DEVICE_POLL_FREQUENCIES.EVERY_30_SECONDS, + params: [ + { + name: 'ARDUINO_PATH', + value: null + }, + { + name: 'ARDUINO_MODEL', + value: null + }, + { + name: 'ARDUINO_SERIAL_NUMBER', + value: null + }, + { + name: 'ARDUINO_PRODUCT_ID', + value: null + }, + { + name: 'ARDUINO_VENDOR_ID', + value: null + } + ] + } + ] + }); + store.setState({ + arduinoDevices + }); + }, + updateArduinoPath(state, index, path, serialNumber, productId, vendorId) { + let arduinoPathIndex = state.arduinoDevices[index].params.findIndex(param => param.name === 'ARDUINO_PATH'); + let arduinoSerialNumberIndex = state.arduinoDevices[index].params.findIndex( + param => param.name === 'ARDUINO_SERIAL_NUMBER' + ); + let arduinoProductIdIndex = state.arduinoDevices[index].params.findIndex( + param => param.name === 'ARDUINO_PRODUCT_ID' + ); + let arduinoVendorIdIndex = state.arduinoDevices[index].params.findIndex( + param => param.name === 'ARDUINO_VENDOR_ID' + ); + const arduinoDevices = update(state.arduinoDevices, { + [index]: { + params: { + [arduinoPathIndex]: { + value: { + $set: path + } + }, + [arduinoSerialNumberIndex]: { + value: { + $set: serialNumber + } + }, + [arduinoProductIdIndex]: { + value: { + $set: productId + } + }, + [arduinoVendorIdIndex]: { + value: { + $set: vendorId + } + } + } + } + }); + store.setState({ + arduinoDevices + }); + }, + updateArduinoManufacturer(state, index, value) { + let arduinoManufacturerIndex = state.arduinoDevices[index].params.findIndex( + param => param.name === 'ARDUINO_MANUFACTURER' + ); + const arduinoDevices = update(state.arduinoDevices, { + [index]: { + params: { + [arduinoManufacturerIndex]: { + value: { + $set: value + } + } + } + } + }); + store.setState({ + arduinoDevices + }); + }, + updateArduinoModel(state, index, value) { + let arduinoModelIndex = state.arduinoDevices[index].params.findIndex(param => param.name === 'ARDUINO_MODEL'); + const arduinoDevices = update(state.arduinoDevices, { + [index]: { + params: { + [arduinoModelIndex]: { + value: { + $set: value + } + } + } + } + }); + store.setState({ + arduinoDevices + }); + }, + updateArduinoName(state, index, value) { + const arduinoDevices = update(state.arduinoDevices, { + [index]: { + name: { + $set: value + } + } + }); + store.setState({ + arduinoDevices + }); + }, + async saveDevice(state, index) { + const arduino = state.arduinoDevices[index]; + await state.httpClient.post(`/api/v1/device`, arduino); + await state.httpClient.post(`/api/v1/service/arduino/listen`, arduino); + }, + async deleteDevice(state, index) { + const device = state.arduinoDevices[index]; + if (device.createdAt) { + await state.httpClient.delete(`/api/v1/device/${device.selector}`); + } + const arduinoDevices = update(state.arduinoDevices, { + $splice: [[index, 1]] + }); + store.setState({ + arduinoDevices + }); + }, + async uploadCode(state, index) { + store.setState({ + uploadingCode: RequestStatus.Getting + }); + try { + const device = state.arduinoDevices[index]; + const res = await state.httpClient.post(`/api/v1/service/arduino/setup`, device); + if (res.success) { + store.setState({ + uploadingCode: RequestStatus.Success + }); + } else { + store.setState({ + uploadingCode: RequestStatus.Error + }); + } + } catch (e) { + store.setState({ + uploadingCode: RequestStatus.Error + }); + } + } + }; + actions.debouncedSearch = debounce(actions.search, 200); + + return Object.assign({}, integrationActions, actions); +}; + +export default actions; diff --git a/front/src/routes/integration/all/arduino/setup-page/index.js b/front/src/routes/integration/all/arduino/setup-page/index.js new file mode 100644 index 0000000000..ee62379fbc --- /dev/null +++ b/front/src/routes/integration/all/arduino/setup-page/index.js @@ -0,0 +1,26 @@ +import { Component } from 'preact'; +import { connect } from 'unistore/preact'; +import actions from './actions'; +import ArduinoPage from '../ArduinoPage'; +import SetupTab from './SetupTab'; + +@connect('user,session,usbPorts,arduinoDevices,arduinoManufacturersList,uploadingCode', actions) +class ArduinoSetupPage extends Component { + componentWillMount() { + this.props.getArduinoDevices(); + this.props.getManufacturers(); + this.props.getUsbPorts(); + } + + componentWillUnmount() {} + + render(props, {}) { + return ( + + + + ); + } +} + +export default ArduinoSetupPage; diff --git a/front/src/utils/consts.js b/front/src/utils/consts.js index 581ba8f0ed..a032563d74 100644 --- a/front/src/utils/consts.js +++ b/front/src/utils/consts.js @@ -122,6 +122,9 @@ export const DeviceFeatureCategoriesIcon = { [DEVICE_FEATURE_TYPES.LIGHT.EFFECT_MODE]: 'play', [DEVICE_FEATURE_TYPES.LIGHT.EFFECT_SPEED]: 'activity' }, + [DEVICE_FEATURE_CATEGORIES.RADIO_SENSOR]: { + [DEVICE_FEATURE_TYPES.SENSOR.INTEGER]: 'wifi' + }, [DEVICE_FEATURE_CATEGORIES.TEMPERATURE_SENSOR]: { [DEVICE_FEATURE_TYPES.SENSOR.DECIMAL]: 'thermometer' }, diff --git a/server/lib/device/light/light.getLightsInRoom.js b/server/lib/device/light/light.getLightsInRoom.js index 97a29d2258..656eb8cfd1 100644 --- a/server/lib/device/light/light.getLightsInRoom.js +++ b/server/lib/device/light/light.getLightsInRoom.js @@ -25,6 +25,10 @@ async function getLightsInRoom(roomId) { model: db.Service, as: 'service', }, + { + model: db.DeviceParam, + as: 'params', + }, ], where: { room_id: roomId, diff --git a/server/services/arduino/api/arduino.controller.js b/server/services/arduino/api/arduino.controller.js new file mode 100644 index 0000000000..e282b39b34 --- /dev/null +++ b/server/services/arduino/api/arduino.controller.js @@ -0,0 +1,52 @@ +const asyncMiddleware = require('../../../api/middlewares/asyncMiddleware'); + +module.exports = function ArduinoController(arduinoManager) { + /** + * @api {post} /api/v1/service/arduin/listen Listen + * @apiName listen + * @apiGroup Arduino + */ + async function listen(req, res) { + arduinoManager.listen(req.body); + res.json({ + success: true, + }); + } + + /** + * @api {post} /api/v1/service/arduin/configure Configure + * @apiName configure + * @apiGroup Arduino + */ + async function configure(req, res) { + arduinoManager.configure(req.body); + res.json({ + success: true, + }); + } + + /** + * @api {post} /api/v1/service/arduin/setup Setup + * @apiName setup + * @apiGroup Arduino + */ + async function setup(req, res) { + const status = arduinoManager.setup(req.body); + res.json(status); + } + + return { + 'post /api/v1/service/arduino/listen': { + authenticated: true, + controller: asyncMiddleware(listen), + }, + 'post /api/v1/service/arduino/configure': { + authenticated: true, + controller: asyncMiddleware(configure), + }, + 'post /api/v1/service/arduino/setup': { + authenticated: true, + controller: asyncMiddleware(setup), + }, + }; +}; diff --git a/server/services/arduino/arduino-code/arduino-code.ino b/server/services/arduino/arduino-code/arduino-code.ino new file mode 100644 index 0000000000..0056fc529c --- /dev/null +++ b/server/services/arduino/arduino-code/arduino-code.ino @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include + +unsigned long previousMillis = 0; +const long interval = 20000; + +dht DHT; + +IRsend ir_send; // Crée une instance pour controler les led (pin 3 par défaut) +RCSwitch mySwitch = RCSwitch(); // Crée une instance pour la réception 433 MHz (pin 2) + +decode_results results; // Variable contenant le résultat des réceptions IR + +bool recv433 = true; +bool recvIR = false; +bool dhtEnabled = false; + +int dht_pin; + +Servo myServo; // SERVO + +const unsigned int THIGH = 220, TSHORT = 350, TLONG = 1400; // Temps des états (nécessaire à l'envoi de signaux Chacon) + +// Serial buffer +String command = ""; + +// End of command marker +char endMarker = '%'; + +/* + Functions that will be called by Gladys +*/ + +void emit_ir(unsigned long code, int bit_length, int data_pin) { // Fonction à appeler pour envoyer un code IR au ruban LED + ir_send.changePin(data_pin); + ir_send.sendNEC(code, bit_length); +} + +void emit_433(long code, int bit_length, int data_pin) { // Fonction à appeler pour envoyer un code en 433 MHz + mySwitch.enableTransmit(data_pin); + mySwitch.send(code, bit_length); + mySwitch.disableTransmit(); +} + +void emit_433_chacon(unsigned long code, int data_pin) { // Fonction à appeler pour envoyer un code Chacon + for (int i = 0; i < 5; i++) { // Emission du code 5 fois + emit(code, data_pin); + } +} + +void set_servo(int angle, int data_pin) { + // set the servo position + myServo.attach(data_pin); // attaches the servo on pin 9 to the servo object + myServo.write(angle); +} + +void recv_433(bool isEnabled, int data_pin) { + mySwitch.enableReceive(data_pin); + recv433 = isEnabled; +} + +void recv_dht(bool enabled, int data_pin) { + dhtEnabled = enabled; + dht_pin = data_pin; +} + +/* + Fonction permettant d'envoyer un signal radio Chacon +*/ + +void emit(unsigned long code, int data_pin) { + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(2675); + for (int i = 0; i < 32; i++) { + if (code & 0x80000000L) { + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(TLONG); + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(TSHORT); + } else { + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(TSHORT); + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(TLONG); + } + code <<= 1; + } + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + digitalWrite(data_pin, LOW); + delayMicroseconds(10600); + digitalWrite(data_pin, HIGH); + delayMicroseconds(THIGH); + + //Remise à 0 pour ne pas interférer avec les télécommandes + digitalWrite(data_pin, LOW); +} + +/* + Execute the right function +*/ + +void executeFunction(String json_data) { + StaticJsonDocument<400> jsonBuffer; + DeserializationError error = deserializeJson(jsonBuffer, json_data); + if (error) { + Serial.println(error.c_str()); + return; + } + JsonObject v = jsonBuffer.as(); + + //on décompose la chaine de caractère + if ( v["function_name"] == String("emit_433") ) { + emit_433(v["parameters"]["code"], v["parameters"]["bit_length"], v["parameters"]["data_pin"]); + } + else if ( v["function_name"] == String("emit_433_chacon") ) { + emit_433_chacon(v["parameters"]["code"], v["parameters"]["data_pin"]); + } + else if ( v["function_name"] == String("emit_ir") ) { + emit_ir(v["parameters"]["code"], v["parameters"]["bit_length"], v["parameters"]["data_pin"]); + } + else if ( v["function_name"] == String("set_servo") ) { + set_servo(v["parameters"]["angle"], v["parameters"]["data_pin"]); + } + else if ( v["function_name"] == String("recv_433") ) { + recv_433(v["parameters"]["enable"], v["parameters"]["data_pin"]); + } + else if ( v["function_name"] == String("recv_dht") ) { + recv_dht(v["parameters"]["enable"], v["parameters"]["data_pin"]); + } +} + +/** + This function is automatically called when data is received on serial port +*/ +void serialEvent() { + //lit toutes les données (vide le buffer de réception) + char last_readed_char = Serial.read(); + if ( last_readed_char == endMarker ) { + executeFunction(command); + command = ""; + } else { + command += last_readed_char; + } +} + +void setup() { + + // Open serial communications and wait for port to open: + Serial.begin(9600); + + recv_433(true, 0); + recv_dht(true, 8); + +} + +void loop() { + unsigned long currentMillis = millis(); + + if (dhtEnabled) { // Partie réception température/humidité via DHT11 + if (currentMillis - previousMillis >= interval) { + previousMillis = currentMillis; + int chk = DHT.read11(dht_pin); + for (int i = 0; i < 3; i++) { + Serial.print("{\"function_name\":\"dht_temperature\",\"parameters\":{\"value\":"); + Serial.print(DHT.temperature); + Serial.println("}}"); + + Serial.print("{\"function_name\":\"dht_humidity\",\"parameters\":{\"value\":"); + Serial.print(DHT.humidity); + Serial.println("}}"); + delay(100); + } + } + } + + if (recv433) { // Partie réception 433 MHz + if (mySwitch.available()) { + int value = mySwitch.getReceivedValue(); + if (value == 0) { + Serial.print("Unknown encoding"); + } else { + /*if (mySwitch.getReceivedValue() >= 999000 && mySwitch.getReceivedValue() <= 999100) { + Serial.print("{\"function_name\":\"dht_temperature\",\"parameters\":{\"value\":"); + Serial.print(mySwitch.getReceivedValue() - 999000); + Serial.println("}}"); + } else if (mySwitch.getReceivedValue() >= 888000 && mySwitch.getReceivedValue() <= 888100) { + Serial.print("{\"function_name\":\"dht_humidity\",\"parameters\":{\"value\":"); + Serial.print(mySwitch.getReceivedValue() - 888000); + Serial.println("}}"); + } else {*/ + Serial.print("{\"function_name\":\"recv_433\",\"parameters\":{\"value\":"); + Serial.print( mySwitch.getReceivedValue() ); + Serial.println("}}"); + } + //} + delay(200); + mySwitch.resetAvailable(); + } + } +} diff --git a/server/services/arduino/arduino-code/libraries/Arduino-IRremote-master.zip b/server/services/arduino/arduino-code/libraries/Arduino-IRremote-master.zip new file mode 100644 index 0000000000..847bbc5998 Binary files /dev/null and b/server/services/arduino/arduino-code/libraries/Arduino-IRremote-master.zip differ diff --git a/server/services/arduino/arduino-code/libraries/DHTLib.zip b/server/services/arduino/arduino-code/libraries/DHTLib.zip new file mode 100644 index 0000000000..9a5944e567 Binary files /dev/null and b/server/services/arduino/arduino-code/libraries/DHTLib.zip differ diff --git a/server/services/arduino/arduino-code/mega/arduino-code.ino.hex b/server/services/arduino/arduino-code/mega/arduino-code.ino.hex new file mode 100644 index 0000000000..9414c283b1 --- /dev/null +++ b/server/services/arduino/arduino-code/mega/arduino-code.ino.hex @@ -0,0 +1,1054 @@ +:100000001EC100000C94AA160C947F160C94541672 +:100010000C9429160C94FE150C94D3150C94A81569 +:100020000C947D153DC100003BC1000039C10000AA +:1000300037C100000C948D1733C1000031C100009E +:100040002FC100000C945F172BC1000029C10000D4 +:1000500027C1000025C1000023C100000C94331506 +:100060001FC100000C94FD140C94D31419C100009E +:1000700017C1000015C1000013C1000011C100002C +:100080000C9431170DC100000BC1000009C1000024 +:1000900007C1000005C1000003C1000001C100004C +:1000A000FFC00000FDC000000C940317F9C0000061 +:1000B000F7C00000F5C00000F3C000000C94D51696 +:1000C000EFC00000EDC00000EBC00000E9C0000080 +:1000D000E7C00000E5C00000E3C00000E1C0000090 +:1000E000DFC0000000002100240027002A002D00AE +:1000F0003000330001010000040107010A01000083 +:100100002200250028002B002E00310034000201BF +:100110000000050108010B0100000A0B02090C0D8B +:100120000E080703040100000000000000000000AA +:1001300000000000000000000000000000000000BF +:10014000000000001211100000000000000000007C +:10015000000000000000000000000000000000009F +:1001600020002300260029002C002F00320000016F +:10017000000003010601090105050505070508083A +:100180000808020202020A0A080804040404010121 +:100190000101010101010303030303030303040736 +:1001A00007070C0C0C0C0C0C0C0C020202020606CD +:1001B0000606060606060B0B0B0B0B0B0B0B0102C0 +:1001C0001020200808102040102040800201020169 +:1001D0000804020101020408102040808040201021 +:1001E000080402018004020180402010080402017A +:1001F00008040201010204081020408001020408E2 +:10020000102040805E01011F01030301008A0201EA +:100210000A010202010064001E47040B0906007C6B +:100220000101060103030100F401060E01020201AF +:1002300000C201170101020201016E18071B1124FF +:100240001FBECFEFD1E2DEBFCDBF00E00CBF13E099 +:10025000A0E0B2E0E6ECFFE300E00BBF02C00790D5 +:100260000D92AE3FB107D9F726E0AEEFB3E001C083 +:100270001D92A03DB207E1F711E0CEE1D1E000E030 +:1002800006C021970109802FFE010E94B01DCD31CB +:10029000D10780E00807A9F70E94FC180C94D21F30 +:1002A000AFCEE091E805F091E905EF3FFE0709F4D4 +:1002B00066C01092DB051092DC051092DD051092ED +:1002C000DE05E83008F05BC0DF01BB27AA0FBB1FCB +:1002D000AF5FBD4F85EA98E011969C938E93E150F5 +:1002E000E73070F5F0E08827E758FE4F8F4F0C9409 +:1002F000B01DA8018001880190019801B001B801EA +:10030000809169008C7F816080936900E89A0895EC +:1003100080916900837F846080936900E99A0895E1 +:10032000809169008F7C806180936900EA9A0895CA +:10033000809169008F73806480936900EB9A0895BF +:1003400080916A008C7F816080936A00EC9A0895A6 +:1003500080916A00837F846080936A00ED9A08959B +:1003600080916A008F7C806180936A00EE9A089584 +:1003700080916A008F73806480936A00EF9A089579 +:100380008230910538F0880F991F880F991F0597C3 +:100390000197F1F70895AF92BF92CF92DF92EF925B +:1003A000FF920F931F93CF93DF936C017B018B011F +:1003B000040F151FEB015E01AE18BF08C017D1076F +:1003C00059F06991D601ED91FC910190F081E02DF9 +:1003D000C6011995892B79F7C501DF91CF911F913E +:1003E0000F91FF90EF90DF90CF90BF90AF90089566 +:1003F000FC01538D448D252F30E0842F90E0821B2B +:10040000930B541710F0CF96089501970895FC01AF +:10041000918D828D981761F0A28DAE0FBF2FB11D07 +:100420005D968C91928D9F5F9F73928F90E008955F +:100430008FEF9FEF0895FC01918D828D981731F019 +:10044000828DE80FF11D858D90E008958FEF9FEF6D +:100450000895FC01918D228D892F90E0805C9F4F43 +:10046000821B91098F73992708958DEA94E0F1DF3B +:1004700021E0892B09F420E0822F0895FC01A48D4E +:10048000A80FB92FB11DA35ABF4F2C91848D90E0B6 +:1004900001968F739927848FA689B7892C93A08999 +:1004A000B1898C91837080648C93938D848D981323 +:1004B00006C00288F389E02D80818F7D80830895B6 +:1004C000EF92FF920F931F93CF93DF93EC0181E0A4 +:1004D000888F9B8D8C8D98131AC0E889F98980814B +:1004E00085FF15C09FB7F894EE89FF896083E8897E +:1004F000F98980818370806480839FBF81E090E070 +:10050000DF91CF911F910F91FF90EF900895F62EFC +:100510000B8D10E00F5F1F4F0F731127E02E8C8D96 +:100520008E110BC00FB607FCFACFE889F9898081DC +:1005300085FFF5CFCE01A2DFF2CFEB8DEC0FFD2FC3 +:10054000F11DE35AFF4FF0829FB7F8940B8FEA89B1 +:10055000FB8980818062D0CFCF93DF93EC01888DBF +:100560008823B1F0AA89BB89E889F9898C9185FD36 +:1005700003C0808186FD0CC00FB607FCF7CF8C91BD +:1005800085FFF2CF808185FFEDCFCE0177DFEACF07 +:10059000DF91CF9108958150823108F05AC0E82F41 +:1005A000F0E08827E952FD4F8F4F0C94B01DF70201 +:1005B000FB02E902EF02F3022903FE02040308032F +:1005C0000E03120316031C032003290324032A032A +:1005D0002E03809180008F77809380000895809112 +:1005E00080008F7DF9CF80918000877FF5CF84B523 +:1005F0008F7784BD089584B58F7DFBCF8091B00047 +:100600008F778093B00008958091B0008F7DF9CFEF +:10061000809190008F778093900008958091900052 +:100620008F7DF9CF80919000877FF5CF8091A000DA +:100630008F778093A00008958091A0008F7DF9CFDF +:100640008091A000877FF5CF809120018F778093E4 +:1006500020010895809120018F7DF9CF80912001A4 +:10066000877FF5CF1F93CF93DF93282F30E0F901D9 +:10067000E85EFE4F8491F901E254FE4FD491F901F6 +:10068000E858FE4FC491CC23A1F0162F811183DFCF +:10069000EC2FF0E0EE0FFF1FE250FF4FA591B49159 +:1006A0008FB7F894EC91111108C0D095DE23DC933C +:1006B0008FBFDF91CF911F910895DE2BF8CFCF939D +:1006C000DF93EC018091C90660E0CCDFCE01DF91C1 +:1006D000CF9156CE1F93CF93DF93182FD92F8091B0 +:1006E000F60560E0C1E0811102C061E0C0E08091E8 +:1006F000EA05B8DF8091EE059091EF059C01129F0D +:10070000C001139F900D11243BDE6C2F8091EA05F0 +:10071000A9DF8091EE059091EF059C01D29FC00169 +:10072000D39F900D1124DF91CF911F9129CECF93AC +:10073000DF9390E0FC01E254FE4F249188589E4FD5 +:10074000FC0184918823D1F090E0880F991FFC016F +:10075000EC51FF4FA591B491FC01E250FF4FC591C0 +:10076000D49161110EC09FB7F8948C91E22FE0955F +:100770008E238C932881E223E8839FBFDF91CF9162 +:1007800008958FB7F894EC91E22BEC938FBFF6CFDE +:100790003FB7F8948091910490919204A0919304B2 +:1007A000B091940426B5A89B05C02F3F19F001967F +:1007B000A11DB11D3FBFBA2FA92F982F8827BC01BB +:1007C000CD01620F711D811D911D42E0660F771FE3 +:1007D000881F991F4A95D1F708958F929F92AF92E3 +:1007E000BF92CF92DF92EF92FF926C01D1DF4B016B +:1007F0005C010D2C000CEE08FF08CADF68197909AE +:100800008A099B096C157D058E059F0598F48091DA +:10081000C90661E027DF8091CA069091CB06B0DD62 +:100820008091C90660E01EDF8091CA069091CB06D8 +:10083000A7DDE3CFFF90EF90DF90CF90BF90AF9018 +:100840009F908F9008958F929F92AF92BF92CF9278 +:10085000DF92EF92FF926B017C019ADF4B015C010A +:10086000C114D104E104F104B1F092DF68197909EF +:100870008A099B09683E73408105910588F321E050 +:10088000C21AD108E108F10888EE880E83E0981EAC +:10089000A11CB11CE5CFFF90EF90DF90CF90BF90EF +:1008A000AF909F908F9008950895AF92BF92CF928E +:1008B000DF92EF92FF920F931F93CF93DF936B0121 +:1008C0007A01EC01C457DB4F28813CE0389F80015E +:1008D000399F100D1124A090DA05B12C27FF1FC0FD +:1008E000FB011182108288818F5F88838881980143 +:1008F000280F311D87FD3A95F6012A153B051CF49A +:1009000088818C30BCF180819181049680349C492F +:1009100008F471C0F6018081918104966EC08881CF +:100920009801280F311D87FD3A952A153B05DCF605 +:100930008881A801480F511D87FD5A95FA01EE0FD5 +:10094000FF1FE40FF51FE65BFA4F808186FFCBCFD8 +:100950008881F801E80FF11D87FDFA95CF01EE0FB0 +:10096000FF1FE80FF91FE65BFA4F808160E08F738D +:1009700079DEB9CF808191812881A801420F511D74 +:1009800027FD5A959A01FA01EE0FFF1FE20FF31FA0 +:10099000E65BFA4F21813281820F931FF701918329 +:1009A000808388819801280F311D87FD3A95F901D0 +:1009B000EE0FFF1FE20FF31FE65BFA4F808186FF09 +:1009C00021C08881080F111D87FD1A95F801EE0FCF +:1009D000FF1FE00FF11FE65BFA4F808161E08F732C +:1009E000DF91CF911F910F91FF90EF90DF90CF900B +:1009F000BF90AF9037CE80E49CE9F701918380836C +:100A00008FEF8883DF91CF911F910F91FF90EF902F +:100A1000DF90CF90BF90AF9008954F925F926F920A +:100A20007F928F929F92AF92BF92DF92EF92FF924E +:100A30000F931F93CF93DF938C01EB0188818B324F +:100A4000D1F18D32C9F52196EE24E394888190EDA1 +:100A5000980F9A3010F08E3289F560E070E0CB018B +:100A6000FE012191A0ED8A2E820E39E0381508F49E +:100A700040C06A3929E97207820729E1920708F024 +:100A80004DC0AAE0B0E09B01AC010E94491C912C32 +:100A9000B12CA12C240135014094509460947094A1 +:100AA0004616570668067906C8F1680D791D8A1D35 +:100AB0009B1DEF01D5CF2196E12CC8CFF801108204 +:100AC0001182128213821482158216821782108676 +:100AD000C801DF91CF911F910F91FF90EF90DF90B0 +:100AE000BF90AF909F908F907F906F905F904F904E +:100AF0000895211113C0F801608371838283938369 +:100B00000E94181BF80164837583868397838AE0AB +:100B1000E11001C088E0F8018087DACFF12CEAE02B +:100B20008E2E912CA12CB12C61157105F0E88F0748 +:100B3000910540F0A50194010E94591CCA01B90118 +:100B4000F394F2CFFE01299130ED320F3A3010F4D8 +:100B5000F394F8CF2E32F1F4EF012196FE012196A5 +:100B6000208150EDD52ED20E29E02D1598F06C3C49 +:100B70003CEC73073CE08307910580F7AAE0B0E006 +:100B80009B01AC010E94491C6D0D711D811D911DC1 +:100B9000FA94E4CF20812F7DD0E0C0E0253409F025 +:100BA0004FC021812D32A9F53296BB24B394DF01C9 +:100BB000D0E0C0E02F2D0F2C000C330B4AE0A42E08 +:100BC000FD01DD9040ED4D0D4A30A8F5AC9EA00131 +:100BD000AD9E500D1124CD2DDD0CDD0BE097C40F23 +:100BE000D51FAE01420F531F473251054CF3BB20B6 +:100BF000B9F080E090E0A0E0B0E8E11003C080E050 +:100C000090E0DC01F80184839583A683B7838CE0B0 +:100C100083CF2B3219F03196B12CC9CF3296FCCF4D +:100C200080E090E0A0E8BFEFE110ECCF80E090E042 +:100C3000A0E8BFE7E7CFBB2019F0D195C195D10956 +:100C4000208121113BCFCF0DD11DF7FCDA950E94F9 +:100C5000181B1C161D06E4F4F12CC0FF0CC024E088 +:100C6000F29EF0011124E35CFD4F2081318142812D +:100C700053810E94791BD595C795F394209769F706 +:100C8000E1109058F8016483758386839783BFCF02 +:100C9000D195C195D109F12C209791F3C0FF0CC0DB +:100CA00024E0F29EF0011124EB5DFD4F20813181A3 +:100CB000428153810E94791BD595C795F394ECCF5F +:100CC00080339CF08A3324F08F3524F08B3724F462 +:100CD00081E0089581344CF08B35D4F393ED980F77 +:100CE00081E09230B0F380E008958B32B9F7F0CF15 +:100CF000FC018185811114C0A481B5818681978111 +:100D00002FEF3FEFA817B90730F4CD010196958377 +:100D100084832C9130E037FD20E0208781E08187BB +:100D2000808508951F93CF93DF93EC01162FE0DFAA +:100D3000811306C0198681E0DF91CF911F9108953C +:100D400080E0FACFCF93DF93EC01CE01D1DF8B307F +:100D50003CF489304CF4882349F090E080E008C0EE +:100D60008D3011F08032C9F71986EFCF81E090E025 +:100D7000DF91CF910895CF92DF92EF92FF92CF93C0 +:100D8000DF9300D000D000D0CDB7DEB7FC01892BB7 +:100D900039F094819F77963081F030F49430F0F4FC +:100DA00060E070E0CB010DC0983039F09C30C1F7A5 +:100DB000C080D180E280F3801FC060817181828118 +:100DC000938129960FB6F894DEBF0FBECDBFDF9199 +:100DD000CF91FF90EF90DF90CF9008956081718167 +:100DE000CE0101961ADE89858830F9F08C30C1F683 +:100DF000CD80DE80EF80F88420E030E0A901C701DB +:100E0000B6010E94881D87FDCBCF20E030E040E88E +:100E10005FE4C701B6010E94141B18160CF4C0CF82 +:100E2000C701B6010E945C1DCCCF69817A818B819C +:100E30009C81C7CFCF92DF92EF92FF92CF93DF9347 +:100E400000D000D000D0CDB7DEB7FC01892B39F03F +:100E500094819F77963069F028F4943080F570E0A3 +:100E600060E01FC09A3081F09C3009F458C098307F +:100E7000B1F780819181A281B381BC018115904835 +:100E8000A105B10570F0EBCF80819181A281B38182 +:100E900066277727681B790B81309048A105B1053B +:100EA000F0F6CB0129960FB6F894DEBF0FBECDBF8A +:100EB000DF91CF91FF90EF90DF90CF900895608108 +:100EC0007181CE010196A9DD89819A81AB81BC81B6 +:100ED00029852A30E9F22C3021F0283009F0BFCFE3 +:100EE000CCCFCD80DE80EF80F88420E030E040E0A1 +:100EF00057ECC701B6010E94881D87FDB0CF20E0E6 +:100F00003EEF4FEF56E4C701B6010E94141B1816BE +:100F10000CF4A5CFC701B6010E94571DC2CFC080F7 +:100F2000D180E280F380E1CFCF93FC01892B91F057 +:100F300094819F77983029F078F4992359F096306E +:100F400079F4C1E080819181A281B381892B8A2BC0 +:100F50008B2B39F4C0E005C09A3099F39C3021F016 +:100F6000C1E08C2FCF910895C1E020E030E0A901CD +:100F700060817181828193810E94141B8111F1CF64 +:100F8000E9CFFC0184819581009799F0228133811A +:100F9000468157812417350718F015821482089569 +:100FA000A9014F5F5F4F53834283820F931FFC0160 +:100FB00060830895FF920F931F93CF93DF9300D028 +:100FC00000D01F921F92CDB7DEB78C01DC011296C4 +:100FD000ED91FC9122813381848195819383828379 +:100FE000FA83E9831C821B823E832D83821B930B31 +:100FF00098878F83C8017CDEF82EF8011186C8011E +:1010000077DED80119961C92F816B9F1811110C03B +:1010100061E070E080E090E028960FB6F894DEBFC3 +:101020000FBECDBFDF91CF911F910F91FF9008951B +:101030008C35F1F4C8015CDE882351F3853729F43F +:1010400064E070E080E090E0E7CFE7E6F2E09081D6 +:10105000992329F0891308C08181811107C062E0BA +:1010600070E080E090E0D8CF3296F1CFF8011186A1 +:10107000682FCE01019685DFC2CF60E0CE010196D8 +:1010800080DF8D819E81892B79F0E981FA818B81C6 +:101090009C812F813885AC01421B530B8281938147 +:1010A000840F951F938382832D813E8163E070E0DE +:1010B00080E090E02115310509F4AECF60E070E0EA +:1010C000CB01C901A9CFFC0180819181892B21F439 +:1010D00060E070E0CB01089561E778E090E080E0A7 +:1010E00008950895CF93DF93DC01EB01EC81FD813E +:1010F0008A819B810896E817F90730F4F0E0E0E078 +:10110000CF01DF91CF9108953897FD83EC8330971D +:10111000A9F31296CD91DC911397209791F0CF010E +:101120008C1B9D0B23E0959587952A95E1F78D8380 +:101130001396FC93EE9312971582148217821682EF +:10114000DFCF1196FC93EE93F3CF2F923F924F9205 +:101150005F926F927F928F929F92AF92BF92CF9247 +:10116000DF92EF92FF920F931F93CF93DF93CDB750 +:10117000DEB761970FB6F894DEBF0FBECDBF08DBB8 +:101180006B017C0180918804909189043601681A72 +:10119000790A2DEC621620E1720608F4D1C0809124 +:1011A000020490910304D301A81BB90BCD01B7FF32 +:1011B00003C0919581959109883C91050CF0BCC0C4 +:1011C0008091000490910104019690930104809312 +:1011D0000004029709F0B0C004E012E04090FE0362 +:1011E0005090FF0349E050E0B801CE0101960E9403 +:1011F0000B1B8B816C81681708F4682F70E080915D +:101200000204909103040E949C1D9B0140911102D5 +:1012100050911202649FC001659F900D749F900DC4 +:10122000112464E670E00E949C1D898541E050E035 +:10123000882311F042E050E08D81829FF001839F6E +:10124000F00D1124FB87EA878E81829FD001839F56 +:10125000B00D1124BD87AC878F81829FF001839FE1 +:10126000F00D1124FF87EE878885829F1001839FF0 +:10127000300C1124FA01EE0FFF1FEE5FFB4F812CA3 +:10128000912C5401920121503109398B288B888986 +:1012900099894817590708F03FC0880C991CAA1C67 +:1012A000BB1C808191819C01AA85BB852A1B3B0BBD +:1012B00037FF03C03195219531092617370770F4A0 +:1012C00022813381AC85BD852A1B3B0B37FF03C0D0 +:1012D00031952195310926173707D0F02E853F85A6 +:1012E000821B930B97FF03C09195819591098617F7 +:1012F0009707B8F4828193818219930997FF03C0FD +:101300009195819591098617970758F4689480F80C +:101310004E5F5F4F3496BBCF38E04316510408F060 +:1013200051C0075F1F4F82E00A33180709F056CFFC +:1013300010920104109200041092FF031092FE0319 +:101340008091FE039091FF038334910540F0109249 +:10135000FF031092FE03109201041092000480918A +:10136000FE039091FF039C012F5F3F4F3093FF03DB +:101370002093FE03880F991FFC01EE5FFB4F7182E3 +:101380006082C0928804D0928904E0928A04F0922C +:101390008B0461960FB6F894DEBF0FBECDBFDF9110 +:1013A000CF911F910F91FF90EF90DF90CF90BF9062 +:1013B000AF909F908F907F906F905F904F903F90F5 +:1013C0002F9008958092DB059092DC05A092DD05B8 +:1013D000B092DE05ADCFFC0101900020E9F7319716 +:1013E000AF01481B590BBC018DEA94E00C94CB0172 +:1013F0008F929F92AF92BF920F931F93CF93DF93E1 +:10140000CDB7DEB7A1970FB6F894DEBF0FBECDBF44 +:1014100019A2423008F44AE08E010F5D1F4F842E5E +:10142000912CB12CA12CA50194010E94591CE62FEE +:10143000B901CA01EA30ECF4E05DD801EE938D0108 +:10144000232B242B252B79F790E080E0109711F0C7 +:10145000CD01C1DFA1960FB6F894DEBF0FBECDBFA0 +:10146000DF91CF911F910F91BF90AF909F908F9080 +:101470000895E95CE2CFCF93DF93D0E0C0E000971E +:1014800011F0A9DFEC0188E792E0A5DF8C0F9D1F2A +:10149000DF91CF9108954F925F926F927F928F92DA +:1014A0009F92AF92BF92CF92DF92EF92FF920F93F3 +:1014B0001F93CF936B017C01742EAC019B010E94A2 +:1014C0008C1D882391F08BE792E0CF911F910F91B3 +:1014D000FF90EF90DF90CF90BF90AF909F908F9054 +:1014E0007F906F905F904F9076CF46015701E894C0 +:1014F000B7F82FEF3FEF4FE75FE7C501B4010E9458 +:101500008C1D81110DC02FEF3FEF4FE75FE7C50145 +:10151000B4010E94141B18161CF48FE792E0D5CF7B +:101520002FEF3FEF4FE75FE4C701B6010E94881D30 +:1015300018161CF483E892E0C8CF2FEF3FEF4FE777 +:101540005FECC701B6010E94141B87FDF3CF20E0BA +:1015500030E0A901C701B6010E94141B10E000E0B1 +:1015600087FF0AC06DE28DEA94E00E9460028C0160 +:10157000F7FAF094F7F8F094C0E060E070E080E0F3 +:101580009FE37C1641F020E030E040E251E40E940D +:10159000EF1CCF5FF6CFA70196010E948B1C2B0199 +:1015A0003C010E945C1D4B015C014AE021DF7C0193 +:1015B000E00EF11ECC23B9F1C501B4010E94181B45 +:1015C0009B01AC01C301B2010E948A1C4B015C016A +:1015D0006EE28DEA94E00E946002E80EF91EC150AE +:1015E00010F120E030E040E251E4C501B4010E9476 +:1015F000791B2B013C010E945C1D4B01B12CA12CDD +:101600004AE0C501B401F4DEE80EF91EC501B401DB +:101610000E94181B9B01AC01C301B2010E948A1CED +:101620004B015C01DCCFC701CF911F910F91FF905F +:10163000EF90DF90CF90BF90AF909F908F907F9072 +:101640006F905F904F900895FC0180819181009789 +:1016500011F00C94541E08950F931F93CF93DF93B2 +:10166000EC0188819981009759F02A813B812617E6 +:10167000370730F081E0DF91CF911F910F910895EE +:101680008B016F5F7F4F0E94DD1E009759F0998399 +:1016900088831B830A832C813D81232B59F7FC010E +:1016A0001082E8CF80E0E7CFEF92FF920F931F9375 +:1016B000CF93DF93EC017B018A01BA01CDDF288152 +:1016C0003981811114C02115310519F0C9010E9419 +:1016D000541E198218821D821C821B821A82CE011E +:1016E000DF91CF911F910F91FF90EF9008951D838F +:1016F0000C83B701C9010E94CB1FF1CFCF93DF93B9 +:10170000EC01FB018617970741F06081718161153B +:10171000710539F044815581C7DFCE01DF91CF914A +:10172000089588819981009711F00E94541E1982B2 +:1017300018821D821C821B821A82EFCFFC0111824B +:1017400010821382128215821482FB010190002004 +:10175000E9F73197AF01461B570BA6CF0F931F93A5 +:10176000CF93DF938B01EC012097E1F06E817F81B5 +:1017700060177107B9F00115110541F06115710588 +:1017800029F0C8010E94C21F892B61F08D81882336 +:1017900039F028E08202C0011124C80FD91FE4CF1C +:1017A000D0E0C0E0CE01DF91CF911F910F9108955D +:1017B0008F929F92AF92BF92CF92DF92EF92FF9261 +:1017C0000F931F93CF93DF93CDB7DEB7CB54D109DF +:1017D0000FB6F894DEBF0FBECDBF8C017B01D42EB7 +:1017E000B1DA2C969FAF8EAF2C97CE01865B9F4FC0 +:1017F0006ADC672B09F0A4C080FDA2C0C80178DABA +:10180000873209F493C1FCF4823209F48FC1C80114 +:101810006FDAC82EFE0131964F01D12C5F018C2D5D +:101820004FDA882309F49EC1FFE3DF1609F49AC159 +:10183000D80119961C92D394F401C1924F01C801AA +:1018400057DAC82EECCF8B3509F494C08B37F9F6F4 +:10185000F7018481807880628483118210821382F0 +:101860001282DD2009F460C1D80119961C92C801CA +:1018700069DA23969FAF8EAF2397CE018F5B9F4F80 +:1018800022DC672B09F0ECC080FDEAC06DE7C801DF +:1018900049DA8111BDC0DA94C8012ADA873209F425 +:1018A000C0C0823209F4BDC0D8011296ED91FC91FE +:1018B000228133818481958193838283FA83E983B2 +:1018C0001C821B823E832D83821B930B98878F8300 +:1018D000C8010EDAA82EF4D922E030E0882369F19D +:1018E000F80111866A2DCE0101964BDBC80100DAA2 +:1018F000A82EE6D98111F4CF60E0CE01019641DB3C +:101900008D819E81892B79F0E981FA818B819C817F +:101910002F813885AC01421B530B82819381840F48 +:10192000951F938382838D819E8123E030E0009711 +:1019300021F0B82EC92E30E020E09B2CAC2C78C0D2 +:101940002B968FAD2B972C969FAD2C97C55BDF4FB9 +:101950000FB6F894DEBF0FBECDBFDF91CF911F91C0 +:101960000F91FF90EF90DF90CF90BF90AF909F903E +:101970008F900895D70114968C9114978078806485 +:1019800014968C93149711961C921E9213961C9287 +:101990001E921297DD2009F4C7C0F8011186C80114 +:1019A000D1D99A838983CE0101968DDB672B31F5DE +:1019B00080FD24C06DE5C801B5D9811129C0DA9434 +:1019C000D8016D917C91C7018DDB009709F4A9C006 +:1019D0004D2DBC01C801ECDE9A838983CE010196AE +:1019E00072DB672B59F480FD09C0C801ABD99A831B +:1019F0008983CE01019667DB672B19F089819A8173 +:101A0000A5CF80FDFBCF6DE5C8018CD9882311F0EF +:101A100080E088C06CE2C80185D98111D1CF82E015 +:101A200081C0C801C7DA9B019B2CAC2CB82EC92EF3 +:101A300023963FAF2EAF2397CE018F5B9F4F43DBA3 +:101A4000672B71F480FD0CC0C8017CD923969FAF31 +:101A50008EAF2397CE018F5B9F4F35DB672B39F01D +:101A600022968FAD229723969FAD23976FCF80FD4F +:101A7000F7CF6AE3C80156D9882389F26B2D7C2DF4 +:101A8000D7018D919C916ADEBC01892B79F4F80114 +:101A900060817181C70126DBFC01892B09F441C0FB +:101AA000848180688483B682C782BF014D2DC801BE +:101AB0007FDE23969FAF8EAF2397CE018F5B9F4F24 +:101AC00002DB672B69F680FDCBCFC8013BD923969B +:101AD0009FAF8EAF2397CE018F5B9F4FF4DA672BBA +:101AE00009F0BECF80FDBCCF6DE7C8011BD98111C5 +:101AF0008FCF6CE2C80116D9882309F490CFC801B2 +:101B000021D923969FAF8EAF2397CE018F5B9F4F36 +:101B1000DADA672B09F0A4CF80FDA2CFB92CCA2C4A +:101B2000BBCE83E090E012CF85E0FCCFC80142DA63 +:101B300069837A838B839C83CE010196C4DA672BF9 +:101B400009F05CCF80FD5ACF2B813C81D7011496E0 +:101B50008C9114978078856014968C9314972D93AC +:101B60003C9356CFF501ED0DF11D1082898184372C +:101B7000B9F4D70114968C911497807886601496E6 +:101B80008C9381E090E0A0E0B0E0F7018083918346 +:101B9000A283B38390E0F4E0DF12D8CE80E0D6CE0B +:101BA000863689F4D70114968C91149780788660D4 +:101BB00014968C93F701108211821282138281E0B5 +:101BC00090E0F5E0E9CF8E3631F481E090E024E05A +:101BD000D212BCCEE3CFB501CE018F5B9F4F0E94E6 +:101BE0000D0525964CAD5DAD6EAD7FAD25972A9662 +:101BF0008FAD2A978A3061F08C30C1F0883009F0BF +:101C00000ECFD70114968C9114978078886006C007 +:101C1000D70114968C91149780788A6014968C93CF +:101C2000F7014083518362837383F2CE29964CADD2 +:101C30005DAD6EAD7FAD2997D70114968C91149749 +:101C400080788C6014968C93F70140835183628373 +:101C50007383DECE009721F0FC01808191817ECDDF +:101C600090E080E00895EF92FF920F931F93CF933F +:101C7000DF93CDB7DEB72E970FB6F894DEBF0FBE59 +:101C8000CDBFFC0101811281E580F6801A8619869C +:101C90001C861B861E861D86CE0109962FDD1A82A4 +:101CA00019821C821B821E821D82BE01675F7F4FCC +:101CB000CE01019623DD81E090E098878F83CE01ED +:101CC0000996C2DCB701C801C5DFFC01892B31F1DF +:101CD00094819F77963029F0D0F49230F8F09430C8 +:101CE00058F50F811885CE010196AEDC81E0012BFD +:101CF00009F080E02E960FB6F894DEBF0FBECDBF80 +:101D0000DF91CF911F910F91FF90EF9008959C303C +:101D100041F368F4983029F39A3019F381E090E0A8 +:101D200029813A81232BC9F490E080E016C09032DB +:101D3000C1F2903499F7D5CF6081718189819A8100 +:101D40006817790769F0009771F06115710571F0F6 +:101D50000E94C21F91958195910998878F83C1CF69 +:101D600090E080E0F7CF8FEF9FEFF4CF81E090E03D +:101D7000F1CFFC01248125FF03C080819181EECC4D +:101D800090E080E008952F923F924F925F926F9281 +:101D90007F928F929F92AF92BF92CF92DF92EF92FB +:101DA000FF920F931F93CF93DF93CDB7DEB7C25B44 +:101DB000D1400FB6F894DEBF0FBECDBFFC01CE01FF +:101DC0000E969A8389839C838B834EE951E04C0F56 +:101DD0005D1F5E834D8358874F839D8590789D87D7 +:101DE0002081318184819581820F931F4D5951400B +:101DF0007A01C256DE4F59834883CE59D140C0562E +:101E0000DE4F59834883C05AD140CE55DE4F3983C7 +:101E10002883C25AD140CC55DE4F99838883C45A57 +:101E2000D140C955DE4F1882C75AD1405E0159E0F2 +:101E3000A50EB11C4AE0B501CE0182569E4FB8DC1A +:101E4000C855DE4F99838883C85AD140CE01885542 +:101E50009E4F39D9672BC9F480FD17C0CA55DE4F94 +:101E60008881C65AD140882381F08D85982F9F772D +:101E70009C3019F08D77883041F482E090E0C855AD +:101E8000DE4F99838883C85AD140C855DE4F0881F8 +:101E90001981C85AD140C255DE4F19830883CE5AE2 +:101EA000D140CE0182559E4F0ED9672B09F001C15A +:101EB0006C0121E0C222DD2480FDFBC08D858501FF +:101EC00085FD02C000E010E06BE872E0CE018855AD +:101ED0009E4F34DCC156DE4F0883CF59D140C056E7 +:101EE000DE4F1883C05AD140CF55DE4FF982E882C9 +:101EF000C15AD14034E9A32E32E0B32ECD55DE4F86 +:101F0000B982A882C35AD140BE0168557E4FCE0126 +:101F100082569E4FA8DE982ECE0188559E4F94DBA8 +:101F20009110EEC066EC72E0CE0188559E4F06DC43 +:101F3000C156DE4F0883CF59D140C056DE4F1883BB +:101F4000C05AD140CF55DE4FF982E882C15AD14004 +:101F5000CD55DE4FB982A882C35AD140BE01685523 +:101F60007E4FCE0182569E4F7EDED82ECE01885502 +:101F70009E4F6ADBDD2009F417C262EA72E0C801F5 +:101F800069DE009719F06DEA72E0F3DE0E941A072D +:101F9000382E62EA72E0C8015DDE009719F061EC4C +:101FA00072E0E7DE0E94BB06C055DE4F6883C05B6F +:101FB000D140CF54DE4F7883C15BD140282ECE5420 +:101FC000DE4F9883C25BD140F5E0EF2EF12C0BE69B +:101FD00013E0A3E78A2EA5E09A2EBBEDAB2EB5E168 +:101FE000BB2E61E0832D0E943203C8010197F1F7F7 +:101FF00060E0832D0E94320387EC99E20197F1F7AC +:10200000C055DE4F4880C05BD140CF54DE4F588072 +:10201000C15BD140622CCE54DE4F7880C25BD14090 +:10202000E0E2CE2ED12C61E0832D77FEA4C10E9488 +:102030003203C8010197F1F760E0832D0E9432035B +:10204000C5010197F1F761E0832D0E943203C801B9 +:102050000197F1F760E0832D0E943203C4010197DC +:10206000F1F7440C551C661C771C41E0C41AD108DA +:10207000D1F661E0832D0E943203C8010197F1F788 +:1020800060E0832D0E9432038BE995EA0197F1F716 +:1020900061E0832D0E943203C8010197F1F760E0EF +:1020A000832D0E94320351E0E51AF10809F099CF1F +:1020B0000DC087E892E00630110538F4000F111FBB +:1020C000F801E75EFD4F80819181D5D9CE54DE4F76 +:1020D0000FB6F894DEBF0FBECDBFDF91CF911F9139 +:1020E0000F91FF90EF90DF90CF90BF90AF909F90B7 +:1020F0008F907F906F905F904F903F902F900895BA +:1021000062EA72E0C801A6DD009719F06DEA72E09C +:1021100030DE0E941A07F82EE92E62EA72E0C8014A +:1021200099DD009719F066EB72E023DE0E941A0732 +:102130001C0162EA72E0C8018DDD009721F4412C98 +:10214000512C32014CC061EC72E013DEFC01892B92 +:10215000B1F394819F77963039F1F8F4943078F3A5 +:1021600060817181CE0182569E4F0E940D05C2563C +:10217000DE4F488059806A807B80CE59D140CA5555 +:10218000DE4F8881C65AD1408A3009F457C08C305E +:1021900009F45DC0883099F60BC09A3061F09C302C +:1021A00009F479C0983059F640805180628073807C +:1021B00077FE15C0C4CF408051806280738041E0BB +:1021C00044165104610440E8740608F0B8CF7094D6 +:1021D000609450944094411C511C611C711CF092FD +:1021E000EA05E092EB0561E08F2D0E949703809154 +:1021F000EA059091EB05019609F4B6C00091E80557 +:102200001091E9050F3F100709F45AC0083008F093 +:1022100051C098013327EFEFE00FE73008F084C09A +:10222000F0E08827E95EFE4E8F4F0C94B01D9611AA +:1022300050118E119011921198119A1151E045167A +:102240005104610450E8750608F079CFC0CFCE552F +:10225000DE4F88809980AA80BB80C25AD14020E09E +:1022600030E040E05FECC501B4010E94881D87FDAD +:1022700066CF20E030E040E05FE4C501B4010E9499 +:10228000141B18160CF45BCFC501B4010E94571D36 +:102290002B013C01A4CF80809180A280B380DFCF4E +:1022A000E898220F331FF901EF5FFD4F84E594E0BA +:1022B000918380838FEF9FEF9093E9058093E805EA +:1022C000812C912C540183948091EC059091ED0523 +:1022D000C816D9060CF03FC0710151E0E51AF108AB +:1022E000F7FC2FC0D501C4010E2C04C0880F991F24 +:1022F000AA1FBB1F0A94D2F784219521A621B721DA +:10230000892B8A2B8B2BC1F08091F4059091F505D8 +:102310000E946A0381E0E81AF108E2CFE998C1CF90 +:10232000EA98BFCFEB98BDCFEC98BBCFED98B9CF73 +:10233000EE98B7CFEF98B5CF8091F2059091F30565 +:10234000E7CF8091F0059091F1050E946A039FEF1D +:10235000C91AD90AB9CF0F3F100731F01093E90518 +:102360000093E8050E9451018FEF9FEF9093EB05DA +:102370008093EA05ABCE0E943203C8010197F1F7C2 +:1023800060E0832D0E943203C4010197F1F761E000 +:10239000832D0E943203C8010197F1F760E0832D7D +:1023A0000E943203C5015BCE66ED72E0CE01885516 +:1023B0009E4FC4D9C156DE4F0883CF59D140C05675 +:1023C000DE4F1883C05AD140CF55DE4FF982E882E4 +:1023D000C15AD140CD55DE4FB982A882C35AD140EF +:1023E000BE0168557E4FCE0182569E4F3CDCD82EF2 +:1023F000CE0188559E4F28D9DD2009F478C062EAC5 +:1024000072E0C80127DC009719F06DEA72E0B1DCD8 +:102410000E941A07D82E62EA72E0C8011BDC0097FE +:1024200019F066EB72E0A5DC0E941A077C0162EAF3 +:1024300072E0C8010FDC009719F061EC72E099DCE2 +:102440000E94BB064B015C01D092C9068DE090E072 +:102450009093CB068093CA068091C90661E00E94E2 +:1024600097038091C90660E00E94320388E293E2FC +:102470000E94ED0384E991E10E945F03C701019787 +:10248000C12CD12C7601C39404C0CC0CDD1CEE1CF5 +:10249000FF1C8A95D2F7C114D104E104F104F1F0D4 +:1024A000D501C4018C219D21AE21BF21892B8A2B0E +:1024B0008B2B69F080E392E00E94ED038AE996E0BD +:1024C0000E945F03F694E794D794C794E4CF80E327 +:1024D00092E00E94ED0380E392E0F2CF80E392E08D +:1024E0000E94ED0390E080E00E945F03EFCD6EED6F +:1024F00072E0CE0188559E4F21D9C156DE4F088328 +:10250000CF59D140C056DE4F1883C05AD140CF5565 +:10251000DE4FF982E882C15AD140CD55DE4FB982F3 +:10252000A882C35AD140BE0168557E4FCE01825663 +:102530009E4F99DBD82ECE0188559E4F85D8DD2041 +:1025400009F416C162EA72E0C80184DB009719F051 +:102550006DEA72E00EDC0E941A07F82E62EA72E061 +:10256000C80178DB009719F068EE72E002DC0E9487 +:102570001A078C018091E505803308F054C061E0B2 +:102580008F2D0E9497038091E505282F30E0F901F7 +:10259000EE0FFF1FE20FF31FE65BFA4F2F2D2F7395 +:1025A0009081907C922B90831092E6051092E70523 +:1025B0002CE0622F0E94901D829FB001112430E018 +:1025C00020E0AB01420F531FFA01EE0FFF1FE40F93 +:1025D000F51FE65BFA4F908196FD17C02F5F3F4FC6 +:1025E0002C30310571F7813009F096C010928000CF +:1025F00082E0809381001092850010928400B19A4D +:1026000080916F00826080936F00E091E5058E2FCE +:1026100090E0FC01EE0FFF1FE80FF91FE65BFA4F99 +:10262000808180648083F090E505003282E01807A5 +:102630000CF03DC08091E605E8E88E2E912C881ABA +:10264000910887FD9394880C991C880C991C092C7F +:10265000000CAA08BB088091E70528E532E0281B9A +:10266000310987FD3395220F331F220F331F032EAD +:10267000000C440B550B281939094A095B09D8018C +:10268000053B110514F0A4EBB0E0B7FF02C0B0E0C9 +:10269000A0E00E94531C24EB30E040E050E00E9498 +:1026A0002D1C89019A01080D191D2A1D3B1D9FE251 +:1026B0009F1508F40BCD2091E60588E890E0821B79 +:1026C000910927FD9395880F991F880F991F081767 +:1026D000190784F02091E70588E592E0821B9109B3 +:1026E00027FD9395880F991F880F991F08171907C1 +:1026F0000CF4C8010297880F991F4FB7F8942F2D3B +:1027000030E0F901EE0FFF1FE20FF31FE65BFA4F17 +:10271000928381834FBFDACC823061F410929000B3 +:1027200080939100109295001092940088BB809342 +:1027300071006BCF833069F41092A00082E0809327 +:10274000A1001092A5001092A40089BB8093720092 +:102750005CCF81115ACF1092200182E08093210139 +:1027600010922501109224018ABB809373004DCFF3 +:102770006EEE72E0CE0188559E4F0E949E0BC156B0 +:10278000DE4F0883CF59D140C056DE4F1883C05A60 +:10279000D140CF55DE4FF982E882C15AD140CD55A4 +:1027A000DE4FB982A882C35AD140BE0168557E4F20 +:1027B000CE0182569E4F57DAD82ECE0188559E4FB5 +:1027C0000E94240BDD2009F162EA72E0C80142DABE +:1027D000009719F06DEA72E0CCDA0E941A077C01CA +:1027E00062EA72E0C80136DA009719F067EF72E02A +:1027F000C0DA0E949407182FF092E905E092E805EC +:102800000E9451011093000261CC6EEF72E0CE0184 +:1028100088559E4F0E949E0BC156DE4F0883CF59AC +:10282000D140C056DE4F1883C05AD140CF55DE4F3D +:10283000F982E882C15AD140CD55DE4FB982A882D3 +:10284000C35AD140BE0168557E4FCE0182569E4F7D +:102850000ADAF82ECE0188559E4F0E94240BFF20E5 +:1028600009F434CC62EA72E0C801F4D9009719F097 +:102870006DEA72E07EDA0E941A077C0162EA72E079 +:10288000C801E8D9009719F067EF72E072DA0E9488 +:1028900094078093AC04F092A704E092A60416CCAF +:1028A0000F931F93CF93DF9300D000D0CDB7DEB747 +:1028B0008DEA94E00E940702853231F51A8219826E +:1028C0001C821B821E821D826FED75E0CE01019677 +:1028D0000E947E0BCE01019656DACE0101960E942F +:1028E000240B50E040E067E772E08FED95E00E9436 +:1028F000540B26960FB6F894DEBF0FBECDBFDF9106 +:10290000CF911F910F91089589831A820091E30559 +:102910001091E4050F5F1F4FB8018FED95E00E9405 +:102920002C0B882331F32091DF053091E005809155 +:10293000E3059091E405BE016F5F7F4F820F931F07 +:102940000E94CB1F1093E4050093E305D2CF0E94B1 +:1029500035028111A5DF80E090E0892B49F080E00D +:1029600090E0892B29F00E94000081110E94000054 +:1029700080E090E0892B49F080E090E0892B29F0FD +:102980000E94000081110E94000080E090E0892BED +:1029900049F080E090E0892B29F00E94000081112D +:1029A0000C94000008951F920F920FB60F921124FD +:1029B0000BB60F922F933F934F935F936F937F9339 +:1029C0008F939F93AF93BF93EF93FF938DEA94E020 +:1029D0000E943E02FF91EF91BF91AF919F918F9125 +:1029E0007F916F915F914F913F912F910F900BBE0F +:1029F0000F900FBE0F901F9018951F920F920FB659 +:102A00000F9211240BB60F922F938F939F93EF93F6 +:102A1000FF93E091BD04F091BE048081E091C30476 +:102A2000F091C40482FD1DC090818091C6048F5F27 +:102A30008F732091C704821741F0E091C604F0E043 +:102A4000E355FB4F958F8093C604FF91EF919F91C3 +:102A50008F912F910F900BBE0F900FBE0F901F9074 +:102A600018958081F2CF1F920F920FB60F9211240A +:102A70002F933F938F939F93AF93BF938091950430 +:102A800090919604A0919704B0919804309190048D +:102A900023E0230F2D3758F50196A11DB11D20937A +:102AA00090048093950490939604A0939704B09318 +:102AB00098048091910490919204A0919304B09114 +:102AC00094040196A11DB11D8093910490939204EA +:102AD000A0939304B0939404BF91AF919F918F9171 +:102AE0003F912F910F900FBE0F901F90189526E8E1 +:102AF000230F0296A11DB11DD2CF1F920F920FB6C8 +:102B00000F9211240BB60F922F933F934F935F9325 +:102B10006F937F938F939F93AF93BF93EF93FF93A5 +:102B2000E0910F02F09110021995FF91EF91BF9182 +:102B3000AF919F918F917F916F915F914F913F9155 +:102B40002F910F900BBE0F900FBE0F901F901895F6 +:102B50001F920F920FB60F9211240BB60F922F9364 +:102B60003F934F935F936F937F938F939F93AF9315 +:102B7000BF93EF93FF93E0910D02F0910E02199530 +:102B8000FF91EF91BF91AF919F918F917F916F9145 +:102B90005F914F913F912F910F900BBE0F900FBE01 +:102BA0000F901F9018951F920F920FB60F9211243D +:102BB0000BB60F922F933F934F935F936F937F9337 +:102BC0008F939F93AF93BF93EF93FF93E091030293 +:102BD000F09104021995FF91EF91BF91AF919F91F0 +:102BE0008F917F916F915F914F913F912F910F90B6 +:102BF0000BBE0F900FBE0F901F9018951F920F9253 +:102C00000FB60F9211240BB60F922F933F934F9351 +:102C10005F936F937F938F939F93AF93BF93EF9344 +:102C2000FF93E0910102F09102021995FF91EF915B +:102C3000BF91AF919F918F917F916F915F914F91D4 +:102C40003F912F910F900BBE0F900FBE0F901F90D2 +:102C500018951F920F920FB60F9211240BB60F9278 +:102C60002F933F934F935F936F937F938F939F9394 +:102C7000AF93BF93EF93FF93E0910B02F0910C029F +:102C80001995FF91EF91BF91AF919F918F917F9196 +:102C90006F915F914F913F912F910F900BBE0F90CD +:102CA0000FBE0F901F9018951F920F920FB60F92A4 +:102CB00011240BB60F922F933F934F935F936F9313 +:102CC0007F938F939F93AF93BF93EF93FF93E09185 +:102CD0000902F0910A021995FF91EF91BF91AF910E +:102CE0009F918F917F916F915F914F913F912F9124 +:102CF0000F900BBE0F900FBE0F901F9018951F9254 +:102D00000F920FB60F9211240BB60F922F933F9391 +:102D10004F935F936F937F938F939F93AF93BF93E3 +:102D2000EF93FF93E0910702F09108021995FF914C +:102D3000EF91BF91AF919F918F917F916F915F9133 +:102D40004F913F912F910F900BBE0F900FBE0F90A0 +:102D50001F9018951F920F920FB60F9211240BB669 +:102D60000F922F933F934F935F936F937F938F9324 +:102D70009F93AF93BF93EF93FF93E0910502F09180 +:102D800006021995FF91EF91BF91AF919F918F919D +:102D90007F916F915F914F913F912F910F900BBE5B +:102DA0000F900FBE0F901F9018951F920F920FB6A5 +:102DB0000F9211240BB60F922F933F934F935F9373 +:102DC0006F937F938F939F93AF93BF93EF93FF93F3 +:102DD00048E251E064E271E090E080E00E94550436 +:102DE000FF91EF91BF91AF919F918F917F916F91E3 +:102DF0005F914F913F912F910F900BBE0F900FBE9F +:102E00000F901F9018951F920F920FB60F921124DA +:102E10000BB60F922F933F934F935F936F937F93D4 +:102E20008F939F93AF93BF93EF93FF9348EA50E044 +:102E300064EA70E083E090E00E945504FF91EF9116 +:102E4000BF91AF919F918F917F916F915F914F91C2 +:102E50003F912F910F900BBE0F900FBE0F901F90C0 +:102E600018951F920F920FB60F9211240BB60F9266 +:102E70002F933F934F935F936F937F938F939F9382 +:102E8000AF93BF93EF93FF9348E950E064E970E09C +:102E900082E090E00E945504FF91EF91BF91AF91C5 +:102EA0009F918F917F916F915F914F913F912F9162 +:102EB0000F900BBE0F900FBE0F901F9018951F9292 +:102EC0000F920FB60F9211240BB60F922F933F93D0 +:102ED0004F935F936F937F938F939F93AF93BF9322 +:102EE000EF93FF9348E850E064E870E081E090E001 +:102EF0000E945504FF91EF91BF91AF919F918F91E7 +:102F00007F916F915F914F913F912F910F900BBEE9 +:102F10000F900FBE0F901F9018951F920F920FB633 +:102F20000F9211240BB60F922F933F934F935F9301 +:102F30006F937F938F939F93AF93BF93CF93DF93C1 +:102F4000EF93FF932091F80530E0F901E85EFE4F22 +:102F50008491F901E254FE4FD491F901E858FE4FF3 +:102F6000C491CC2379F081110E94CB02EC2FF0E0C8 +:102F7000EE0FFF1FE25AFE4FA591B491EC91ED23A5 +:102F800081E009F480E02091FC053091FD052F5F80 +:102F90003F4F3093FD052093FC059091FB0595363E +:102FA00018F096E09093F7059091F705943009F4A6 +:102FB00066C0B8F49230F1F0933009F444C09091B7 +:102FC000FA05992309F46BC081117EC08091F9053F +:102FD000882309F463C08091F90561E00E943203FF +:102FE0005EC0953009F457C0963049F791E0909350 +:102FF000C8064FC08111E3CF2091FC053091FD053B +:103000002436310528F41092FD051092FC05D7CF27 +:103010001092C8061092FB05E091FB0591E09E0F0F +:103020009093FB05F0E02091FC053091FD05EE0F3B +:10303000FF1FE950FA4F308727831092FD05109249 +:10304000FC0593E019C0813009F0B9CFE091FB0590 +:1030500091E09E0F9093FB05F0E02091FC053091EC +:10306000FD05EE0FFF1FE950FA4F308727831092BE +:10307000FD051092FC0594E09093F705A0CF8823FE +:1030800059F22091FC053091FD052536310508F4F3 +:1030900096CF95E0F1CF811192CFB5CF2F9AFF91C6 +:1030A000EF91DF91CF91BF91AF919F918F917F91E0 +:1030B0006F915F914F913F912F910F900BBE0F90A9 +:1030C0000FBE0F901F9018958091F905882321F06D +:1030D0008091F90560E082CF2F98E1CFCF93DF9305 +:1030E0001092B0041092AF0488EE93E0A0E0B0E03C +:1030F0008093B1049093B204A093B304B093B4044A +:1031000089E592E09093AE048093AD0485EC90E065 +:103110009093BA048093B90484EC90E09093BC043B +:103120008093BB0480EC90E09093BE048093BD0438 +:1031300081EC90E09093C0048093BF0482EC90E017 +:103140009093C2048093C10486EC90E09093C404F1 +:103150008093C3041092C6041092C7041092C8044E +:103160001092C90483E08093C906CFEFDFEFD093BC +:10317000EB05C093EA058AE090E09093ED0580931B +:10318000EC0549E050E064E072E08EEE95E043D259 +:10319000D093E905C093E8058CE390E09093120288 +:1031A000809311021092DB051092DC051092DD0570 +:1031B0001092DE058091DA058033D0F491E0980F0B +:1031C0009093DA058093E50590E0FC01EE0FFF1F78 +:1031D000E80FF91FE65BFA4F88EB9BE0928381834F +:1031E00067E772E08FED95E0DF91CF910C949E0B35 +:1031F0008FEF8093E505F4CF789484B5826084BD29 +:1032000084B5816084BD85B5826085BD85B58160EA +:1032100085BD80916E00816080936E001092810068 +:103220008091810082608093810080918100816023 +:1032300080938100809180008160809380008091E4 +:10324000B10084608093B1008091B0008160809370 +:10325000B0008091910082608093910080919100F4 +:1032600081608093910080919000816080939000B4 +:103270008091A10082608093A1008091A100816073 +:103280008093A1008091A00081608093A000809134 +:1032900021018260809321018091210181608093CE +:1032A00021018091200181608093200180917A002A +:1032B000846080937A0080917A00826080937A00A3 +:1032C00080917A00816080937A0080917A00806892 +:1032D00080937A001092C100E091BD04F091BE0489 +:1032E00082E08083E091B904F091BA041082E09109 +:1032F000BB04F091BC048FEC80831092C504E09174 +:10330000C104F091C20486E08083E091BF04F09193 +:10331000C004808180618083E091BF04F091C0048B +:10332000808188608083E091BF04F091C004808137 +:1033300080688083E091BF04F091C00480818F7D1C +:1033400080831092E9051092E8050E94510181E006 +:10335000809300028093AC0488E090E09093A704EF +:103360008093A6044BE9E42EF12C412C50EC552E11 +:1033700059E7652E54EC752E2FB7F894809195047B +:1033800090919604A0919704B09198042FBF20913A +:10339000AC04222309F401C14091A8045091A9046E +:1033A0006091AA047091AB048C019D01041B150B64 +:1033B000260B370BB901A80140325E446105710547 +:1033C00008F4EBC08093A8049093A904A093AA04E6 +:1033D000B093AB04C091A604D091A704CE01992765 +:1033E000FC01E254FE4FD490FC01E858FE4FE491FA +:1033F000F0E0EE0FFF1FE25AFE4F0591149110927C +:10340000A1041092A2041092A3041092A40410929A +:10341000A50461E08C2F0E94970360E08C2F0E942E +:10342000320362E170E080E090E00E94230461E0FA +:103430008C2F0E943203C7010197F1F760E08C2FB7 +:103440000E94970380E991E0F80120812D2199F4F1 +:103450000197D1F74092990450929A0460929B048C +:1034600070929C0440929D0450929E0460929F042E +:103470007092A00462C080E991E0F80120812D21C2 +:1034800019F00197D1F7E6CF98E2392E20E8C22E45 +:10349000212C80E991E0F80120812D2119F4019778 +:1034A000D1F7D8CF0E94C8034B015C0180E991E0BD +:1034B000F80120812D2119F00197D1F7CBCF0E947F +:1034C000C803681979098A099B0969327105810560 +:1034D000910538F0E22DF0E0E756FB4F80858C290E +:1034E0008087C69419F4239480E8C82E3A9431104A +:1034F000D0CF61E08C2F0E94970361E08C2F0E9457 +:1035000032036091A10470E090E080E091D060937C +:10351000990470939A0480939B0490939C04609107 +:10352000A30470E090E080E083D060939D047093EA +:103530009E0480939F049093A004C3E0D0E087E0B2 +:1035400093E00E94EB0960919D0470919E0480912C +:103550009F049091A00442E00E944B0A81E493E012 +:103560000E943B0A84E493E00E94EB096091990475 +:1035700070919A0480919B0490919C0442E00E9477 +:103580004B0A81E493E00E943B0A64E670E080E02D +:1035900090E00E942304219791F6809100028823F5 +:1035A00001F18091DB059091DC05A091DD05B091E2 +:1035B000DE050097A105B105A1F0892BA1F48BE7E9 +:1035C00093E00E94EB0968EC70E080E090E00E94DC +:1035D00023041092DB051092DC051092DD05109299 +:1035E000DE05B5D9C9CE8CE893E00E94EB09609165 +:1035F000DB057091DC058091DD059091DE054AE0E8 +:103600000E94F80981E493E00E943B0ADCCF8FED31 +:1036100095E00C94240BFB01DC0102C005900D9297 +:1036200041505040D8F7089540D008F481E0089503 +:10363000E89409C097FB3EF490958095709561954C +:103640007F4F8F4F9F4F9923A9F0F92F96E9BB2702 +:103650009395F695879577956795B795F111F8CF7E +:10366000FAF4BB0F11F460FF1BC06F5F7F4F8F4FE9 +:103670009F4F16C0882311F096E911C0772321F0DF +:103680009EE8872F762F05C0662371F096E8862F77 +:1036900070E060E02AF09A95660F771F881FDAF7CE +:1036A000880F9695879597F90895990F0008550FFB +:1036B000AA0BE0E8FEEF16161706E807F907C0F0B8 +:1036C00012161306E407F50798F0621B730B840BC0 +:1036D000950B39F40A2661F0232B242B252B21F49A +:1036E00008950A2609F4A140A6958FEF811D811D3A +:1036F00008950BD078C069D028F06ED018F09523CB +:1037000009F05AC05FC01124A2C07ED0A0F3959FDB +:10371000D1F3950F50E0551F629FF001729FBB27B8 +:10372000F00DB11D639FAA27F00DB11DAA1F649F64 +:103730006627B00DA11D661F829F2227B00DA11D17 +:10374000621F739FB00DA11D621F839FA00D611D9D +:10375000221F749F3327A00D611D231F849F600DBE +:10376000211D822F762F6A2F11249F5750408AF0F7 +:10377000E1F088234AF0EE0FFF1FBB1F661F771F83 +:10378000881F91505040A9F79E3F510570F014C01A +:103790005EC05F3FECF3983EDCF3869577956795C6 +:1037A000B795F795E7959F5FC1F7FE2B880F911DA1 +:1037B0009695879597F9089597F99F6780E870E047 +:1037C00060E008959FEF80EC089500240A94161697 +:1037D000170618060906089500240A9412161306FF +:1037E000140605060895092E0394000C11F488238D +:1037F00052F0BB0F40F4BF2B11F460FF04C06F5FA9 +:103800007F4F8F4F9F4F089557FD9058440F551F7E +:1038100059F05F3F71F04795880F97FB991F61F052 +:103820009F3F79F087950895121613061406551FC9 +:10383000F2CF4695F1DF08C0161617061806991F35 +:10384000F1CF86957105610508940895E894BB272A +:1038500066277727CB0197F90895052E97FB16F475 +:1038600000940FD057FD05D024D007FC02D046F4B9 +:1038700008C050954095309521953F4F4F4F5F4F71 +:10388000089590958095709561957F4F8F4F9F4FCC +:10389000089531D0A59F900DB49F900DA49F800DE9 +:1038A000911D11240895B7FFF4CFF3DF821B930B12 +:1038B0000895A1E21A2EAA1BBB1BFD010DC0AA1F71 +:1038C000BB1FEE1FFF1FA217B307E407F50720F089 +:1038D000A21BB30BE40BF50B661F771F881F991F04 +:1038E0001A9469F760957095809590959B01AC014D +:1038F000BD01CF010895A29FB001B39FC001A39F56 +:10390000700D811D1124911DB29F700D811D112418 +:10391000911D08955058BB27AA270ED064CF55DFBC +:1039200030F05ADF20F031F49F3F11F41EF44ACFFB +:103930000EF4E095E7FB40CFE92F66DF80F3BA177E +:10394000620773078407950718F071F49EF57ECF20 +:103950000EF4E0950B2EBA2FA02D0B01B9019001AA +:103960000C01CA01A0011124FF27591B99F0593FEE +:1039700050F4503E68F11A16F040A22F232F342F36 +:103980004427585FF3CF469537952795A795F04084 +:103990005395C9F77EF41F16BA0B620B730B840B99 +:1039A000BAF09150A1F0FF0FBB1F661F771F881F51 +:1039B000C2F70EC0BA0F621F731F841F48F48795A9 +:1039C00077956795B795F7959E3F08F0B3CF939598 +:1039D000880F08F09927EE0F9795879508950CD0DA +:1039E00002CFFADE40F0F1DE30F021F45F3F19F053 +:1039F000E3CE51112CCFE6CE07DF98F39923C9F31C +:103A00005523B1F3951B550BBB27AA2762177307E4 +:103A1000840738F09F5F5F4F220F331F441FAA1F98 +:103A2000A9F333D00E2E3AF0E0E830D09150504058 +:103A3000E695001CCAF729D0FE2F27D0660F771F06 +:103A4000881FBB1F261737074807AB07B0E809F0E8 +:103A5000BB0B802DBF01FF2793585F4F2AF09E3F7D +:103A6000510568F0A9CEF3CE5F3FECF3983EDCF34E +:103A7000869577956795B795F7959F5FC9F7880FF6 +:103A8000911D9695879597F90895E1E0660F771F48 +:103A9000881FBB1F621773078407BA0720F0621BD9 +:103AA000730B840BBA0BEE1F88F7E095089504D0D2 +:103AB0006894B111CCCE0895AFDE88F09F5790F096 +:103AC000B92F9927B751A0F0D1F0660F771F881F43 +:103AD000991F1AF0BA95C9F712C0B13081F0B6DE5D +:103AE000B1E00895B3CE672F782F8827B85F39F0FB +:103AF000B93FCCF3869577956795B395D9F73EF4A2 +:103B000090958095709561957F4F8F4F9F4F089549 +:103B1000CCDD08F48FEF0895C8DD880B990B08956C +:103B2000991B79E004C0991F961708F0961B881F0F +:103B30007A95C9F780950895AA1BBB1B51E107C070 +:103B4000AA1FBB1FA617B70710F0A61BB70B881F2D +:103B5000991F5A95A9F780959095BC01CD010895BC +:103B6000EE0FFF1F881F8BBF0790F691E02D199471 +:103B70000F931F93CF93DF938230910510F482E06F +:103B800090E0E091CE06F091CF0630E020E0B0E08A +:103B9000A0E0309799F42115310509F44AC0281B9B +:103BA000390B24303105D8F58A819B816115710567 +:103BB00089F1FB0193838283FE0111C04081518111 +:103BC0000281138148175907E0F04817590799F403 +:103BD000109761F012960C93129713961C933296DD +:103BE000CF01DF91CF911F910F9108950093CE06E1 +:103BF0001093CF06F4CF2115310551F0421753072A +:103C000038F0A901DB019A01BD01DF01F801C1CF44 +:103C1000EF01F9CF9093CF068093CE06CDCFFE0172 +:103C2000E20FF31F81939193225031093983288346 +:103C3000D7CF2091CC063091CD06232B41F4209193 +:103C40001502309116023093CD062093CC062091B8 +:103C50001302309114022115310541F42DB73EB7FE +:103C60004091170250911802241B350BE091CC06AD +:103C7000F091CD06E217F307A0F42E1B3F0B281797 +:103C8000390778F0AC014E5F5F4F2417350748F0D5 +:103C90004E0F5F1F5093CD064093CC0681939193B6 +:103CA0009FCFF0E0E0E09CCFCF93DF930097E9F067 +:103CB000FC01329713821282A091CE06B091CF06FA +:103CC000ED0130E020E01097A1F420813181820FD6 +:103CD000931F2091CC063091CD062817390709F0A3 +:103CE00061C0F093CD06E093CC06DF91CF910895AB +:103CF000EA01CE17DF07E8F54A815B819E01411595 +:103D00005105B1F7E901FB83EA8349915991C40F49 +:103D1000D51FEC17FD0761F4808191810296840F15 +:103D2000951FE90199838883828193819B838A838C +:103D3000F0E0E0E012968D919C9113970097B9F511 +:103D40002D913C911197CD010296820F931F2091E6 +:103D5000CC063091CD062817390739F6309751F542 +:103D60001092CF061092CE06B093CD06A093CC064B +:103D7000BCCFD383C28340815181840F951FC81764 +:103D8000D90761F44E5F5F4F88819981480F591FB1 +:103D9000518340838A819B819383828321153105DE +:103DA00009F0B0CFF093CF06E093CE069ECFFD0191 +:103DB000DC01C0CF13821282D7CF4F925F926F92F5 +:103DC0007F928F929F92AF92BF92CF92DF92EF92AB +:103DD000FF920F931F93CF93DF938C01009791F481 +:103DE000CB01DF91CF911F910F91FF90EF90DF906A +:103DF000CF90BF90AF909F908F907F906F905F908B +:103E00004F90B6CEFC01E60FF71F9C0122503109FE +:103E1000E217F30708F4AAC0D901CD91DC911197FC +:103E2000C617D70718F1C530D10570F0CE01049739 +:103E30008617970748F0C61BD70B2297C193D193DB +:103E40006D937C93CF0130DFC801DF91CF911F913B +:103E50000F91FF90EF90DF90CF90BF90AF909F9029 +:103E60008F907F906F905F904F9008955B01AC1A98 +:103E7000BD0A4C018C0E9D1EA091CE06B091CF06BE +:103E8000512C412CF12CE12C109731F58091CC066E +:103E90009091CD068815990509F05CC04616570625 +:103EA00008F058C08091130290911402009741F4D9 +:103EB0008DB79EB74091170250911802841B950B45 +:103EC000E817F90708F052C0F093CD06E093CC064E +:103ED000F90171836083B8CF8D919C9111971296EF +:103EE0006C90129713967C901397A815B90559F505 +:103EF0006C0142E0C40ED11CCA14DB0420F1AC01F9 +:103F00004A195B09DA011296159780F06282738272 +:103F100051834083D9016D937C93E114F10471F0D6 +:103F2000D7011396FC93EE9312978ECF22968C0FA7 +:103F30009D1FF90191838083F301EFCFF093CF06AA +:103F4000E093CE0681CF4816590608F42C017D0176 +:103F5000D3019ACFCB010CDE7C01009739F0AE0182 +:103F6000B80107D0C801A0DE87016ECF10E000E0E5 +:103F70006BCFFB01DC0102C001900D92415050401B +:103F8000D8F70895FB01DC018D9101908019011093 +:103F9000D9F3990B0895FB01DC0101900D920020EB +:103FA000E1F7089511E0CEE1D1E000E005C0802FF7 +:103FB000FE01D6DD2196011DCF31D10780E0080733 +:063FC000B1F7F894FFCFF9 +:103FC600015404540454045404540454045404542E +:103FD600043C000000D0068000BF03C203D203DF0A +:103FE60003E803F503CDCCCC3D0AD7233C17B7D164 +:103FF6003877CC2B329595E6241FB14F0A00002066 +:10400600410000C84200401C4620BCBE4CCA1B0EE4 +:104016005AAEC59D74000000006002CB01F801ACE9 +:1040260002290207021B022F2F22225C5C6208660D +:104036000C6E0A720D7409000D0A006E616E00693D +:104046006E66006F7666003F3F3F00656D69745F80 +:104056003433330066756E6374696F6E5F6E616DBF +:104066006500706172616D65746572730064617478 +:10407600615F70696E006269745F6C656E67746813 +:1040860000636F646500656D69745F3433335F6325 +:104096006861636F6E00656D69745F697200736550 +:1040A600745F736572766F00616E676C650072652A +:1040B60063765F34333300656E61626C65007265EA +:1040C60063765F646874007B2266756E6374696FDD +:1040D6006E5F6E616D65223A226468745F74656D09 +:1040E6007065726174757265222C22706172616DE1 +:1040F6006574657273223A7B2276616C7565223A25 +:10410600007D7D007B2266756E6374696F6E5F6EDF +:10411600616D65223A226468745F68756D696469C9 +:104126007479222C22706172616D657465727322D6 +:104136003A7B2276616C7565223A00556E6B6E6F1E +:10414600776E20656E636F64696E67007B226675A5 +:104156006E6374696F6E5F6E616D65223A22726579 +:1041660063765F343333222C22706172616D65741D +:10417600657273223A7B2276616C7565223A004F2E +:104186006B00496E636F6D706C657465496E707512 +:104196007400496E76616C6964496E707574004E80 +:1041A6006F4D656D6F7279004E6F74537570706FD9 +:0E41B6007274656400546F6F4465657000009C +:00000001FF diff --git a/server/services/arduino/arduino-code/mega/arduino-code.ino.with_bootloader.hex b/server/services/arduino/arduino-code/mega/arduino-code.ino.with_bootloader.hex new file mode 100644 index 0000000000..f009e7552c --- /dev/null +++ b/server/services/arduino/arduino-code/mega/arduino-code.ino.with_bootloader.hex @@ -0,0 +1,1522 @@ +:100000001EC100000C94AA160C947F160C94541672 +:100010000C9429160C94FE150C94D3150C94A81569 +:100020000C947D153DC100003BC1000039C10000AA +:1000300037C100000C948D1733C1000031C100009E +:100040002FC100000C945F172BC1000029C10000D4 +:1000500027C1000025C1000023C100000C94331506 +:100060001FC100000C94FD140C94D31419C100009E +:1000700017C1000015C1000013C1000011C100002C +:100080000C9431170DC100000BC1000009C1000024 +:1000900007C1000005C1000003C1000001C100004C +:1000A000FFC00000FDC000000C940317F9C0000061 +:1000B000F7C00000F5C00000F3C000000C94D51696 +:1000C000EFC00000EDC00000EBC00000E9C0000080 +:1000D000E7C00000E5C00000E3C00000E1C0000090 +:1000E000DFC0000000002100240027002A002D00AE +:1000F0003000330001010000040107010A01000083 +:100100002200250028002B002E00310034000201BF +:100110000000050108010B0100000A0B02090C0D8B +:100120000E080703040100000000000000000000AA +:1001300000000000000000000000000000000000BF +:10014000000000001211100000000000000000007C +:10015000000000000000000000000000000000009F +:1001600020002300260029002C002F00320000016F +:10017000000003010601090105050505070508083A +:100180000808020202020A0A080804040404010121 +:100190000101010101010303030303030303040736 +:1001A00007070C0C0C0C0C0C0C0C020202020606CD +:1001B0000606060606060B0B0B0B0B0B0B0B0102C0 +:1001C0001020200808102040102040800201020169 +:1001D0000804020101020408102040808040201021 +:1001E000080402018004020180402010080402017A +:1001F00008040201010204081020408001020408E2 +:10020000102040805E01011F01030301008A0201EA +:100210000A010202010064001E47040B0906007C6B +:100220000101060103030100F401060E01020201AF +:1002300000C201170101020201016E18071B1124FF +:100240001FBECFEFD1E2DEBFCDBF00E00CBF13E099 +:10025000A0E0B2E0E6ECFFE300E00BBF02C00790D5 +:100260000D92AE3FB107D9F726E0AEEFB3E001C083 +:100270001D92A03DB207E1F711E0CEE1D1E000E030 +:1002800006C021970109802FFE010E94B01DCD31CB +:10029000D10780E00807A9F70E94FC180C94D21F30 +:1002A000AFCEE091E805F091E905EF3FFE0709F4D4 +:1002B00066C01092DB051092DC051092DD051092ED +:1002C000DE05E83008F05BC0DF01BB27AA0FBB1FCB +:1002D000AF5FBD4F85EA98E011969C938E93E150F5 +:1002E000E73070F5F0E08827E758FE4F8F4F0C9409 +:1002F000B01DA8018001880190019801B001B801EA +:10030000809169008C7F816080936900E89A0895EC +:1003100080916900837F846080936900E99A0895E1 +:10032000809169008F7C806180936900EA9A0895CA +:10033000809169008F73806480936900EB9A0895BF +:1003400080916A008C7F816080936A00EC9A0895A6 +:1003500080916A00837F846080936A00ED9A08959B +:1003600080916A008F7C806180936A00EE9A089584 +:1003700080916A008F73806480936A00EF9A089579 +:100380008230910538F0880F991F880F991F0597C3 +:100390000197F1F70895AF92BF92CF92DF92EF925B +:1003A000FF920F931F93CF93DF936C017B018B011F +:1003B000040F151FEB015E01AE18BF08C017D1076F +:1003C00059F06991D601ED91FC910190F081E02DF9 +:1003D000C6011995892B79F7C501DF91CF911F913E +:1003E0000F91FF90EF90DF90CF90BF90AF90089566 +:1003F000FC01538D448D252F30E0842F90E0821B2B +:10040000930B541710F0CF96089501970895FC01AF +:10041000918D828D981761F0A28DAE0FBF2FB11D07 +:100420005D968C91928D9F5F9F73928F90E008955F +:100430008FEF9FEF0895FC01918D828D981731F019 +:10044000828DE80FF11D858D90E008958FEF9FEF6D +:100450000895FC01918D228D892F90E0805C9F4F43 +:10046000821B91098F73992708958DEA94E0F1DF3B +:1004700021E0892B09F420E0822F0895FC01A48D4E +:10048000A80FB92FB11DA35ABF4F2C91848D90E0B6 +:1004900001968F739927848FA689B7892C93A08999 +:1004A000B1898C91837080648C93938D848D981323 +:1004B00006C00288F389E02D80818F7D80830895B6 +:1004C000EF92FF920F931F93CF93DF93EC0181E0A4 +:1004D000888F9B8D8C8D98131AC0E889F98980814B +:1004E00085FF15C09FB7F894EE89FF896083E8897E +:1004F000F98980818370806480839FBF81E090E070 +:10050000DF91CF911F910F91FF90EF900895F62EFC +:100510000B8D10E00F5F1F4F0F731127E02E8C8D96 +:100520008E110BC00FB607FCFACFE889F9898081DC +:1005300085FFF5CFCE01A2DFF2CFEB8DEC0FFD2FC3 +:10054000F11DE35AFF4FF0829FB7F8940B8FEA89B1 +:10055000FB8980818062D0CFCF93DF93EC01888DBF +:100560008823B1F0AA89BB89E889F9898C9185FD36 +:1005700003C0808186FD0CC00FB607FCF7CF8C91BD +:1005800085FFF2CF808185FFEDCFCE0177DFEACF07 +:10059000DF91CF9108958150823108F05AC0E82F41 +:1005A000F0E08827E952FD4F8F4F0C94B01DF70201 +:1005B000FB02E902EF02F3022903FE02040308032F +:1005C0000E03120316031C032003290324032A032A +:1005D0002E03809180008F77809380000895809112 +:1005E00080008F7DF9CF80918000877FF5CF84B523 +:1005F0008F7784BD089584B58F7DFBCF8091B00047 +:100600008F778093B00008958091B0008F7DF9CFEF +:10061000809190008F778093900008958091900052 +:100620008F7DF9CF80919000877FF5CF8091A000DA +:100630008F778093A00008958091A0008F7DF9CFDF +:100640008091A000877FF5CF809120018F778093E4 +:1006500020010895809120018F7DF9CF80912001A4 +:10066000877FF5CF1F93CF93DF93282F30E0F901D9 +:10067000E85EFE4F8491F901E254FE4FD491F901F6 +:10068000E858FE4FC491CC23A1F0162F811183DFCF +:10069000EC2FF0E0EE0FFF1FE250FF4FA591B49159 +:1006A0008FB7F894EC91111108C0D095DE23DC933C +:1006B0008FBFDF91CF911F910895DE2BF8CFCF939D +:1006C000DF93EC018091C90660E0CCDFCE01DF91C1 +:1006D000CF9156CE1F93CF93DF93182FD92F8091B0 +:1006E000F60560E0C1E0811102C061E0C0E08091E8 +:1006F000EA05B8DF8091EE059091EF059C01129F0D +:10070000C001139F900D11243BDE6C2F8091EA05F0 +:10071000A9DF8091EE059091EF059C01D29FC00169 +:10072000D39F900D1124DF91CF911F9129CECF93AC +:10073000DF9390E0FC01E254FE4F249188589E4FD5 +:10074000FC0184918823D1F090E0880F991FFC016F +:10075000EC51FF4FA591B491FC01E250FF4FC591C0 +:10076000D49161110EC09FB7F8948C91E22FE0955F +:100770008E238C932881E223E8839FBFDF91CF9162 +:1007800008958FB7F894EC91E22BEC938FBFF6CFDE +:100790003FB7F8948091910490919204A0919304B2 +:1007A000B091940426B5A89B05C02F3F19F001967F +:1007B000A11DB11D3FBFBA2FA92F982F8827BC01BB +:1007C000CD01620F711D811D911D42E0660F771FE3 +:1007D000881F991F4A95D1F708958F929F92AF92E3 +:1007E000BF92CF92DF92EF92FF926C01D1DF4B016B +:1007F0005C010D2C000CEE08FF08CADF68197909AE +:100800008A099B096C157D058E059F0598F48091DA +:10081000C90661E027DF8091CA069091CB06B0DD62 +:100820008091C90660E01EDF8091CA069091CB06D8 +:10083000A7DDE3CFFF90EF90DF90CF90BF90AF9018 +:100840009F908F9008958F929F92AF92BF92CF9278 +:10085000DF92EF92FF926B017C019ADF4B015C010A +:10086000C114D104E104F104B1F092DF68197909EF +:100870008A099B09683E73408105910588F321E050 +:10088000C21AD108E108F10888EE880E83E0981EAC +:10089000A11CB11CE5CFFF90EF90DF90CF90BF90EF +:1008A000AF909F908F9008950895AF92BF92CF928E +:1008B000DF92EF92FF920F931F93CF93DF936B0121 +:1008C0007A01EC01C457DB4F28813CE0389F80015E +:1008D000399F100D1124A090DA05B12C27FF1FC0FD +:1008E000FB011182108288818F5F88838881980143 +:1008F000280F311D87FD3A95F6012A153B051CF49A +:1009000088818C30BCF180819181049680349C492F +:1009100008F471C0F6018081918104966EC08881CF +:100920009801280F311D87FD3A952A153B05DCF605 +:100930008881A801480F511D87FD5A95FA01EE0FD5 +:10094000FF1FE40FF51FE65BFA4F808186FFCBCFD8 +:100950008881F801E80FF11D87FDFA95CF01EE0FB0 +:10096000FF1FE80FF91FE65BFA4F808160E08F738D +:1009700079DEB9CF808191812881A801420F511D74 +:1009800027FD5A959A01FA01EE0FFF1FE20FF31FA0 +:10099000E65BFA4F21813281820F931FF701918329 +:1009A000808388819801280F311D87FD3A95F901D0 +:1009B000EE0FFF1FE20FF31FE65BFA4F808186FF09 +:1009C00021C08881080F111D87FD1A95F801EE0FCF +:1009D000FF1FE00FF11FE65BFA4F808161E08F732C +:1009E000DF91CF911F910F91FF90EF90DF90CF900B +:1009F000BF90AF9037CE80E49CE9F701918380836C +:100A00008FEF8883DF91CF911F910F91FF90EF902F +:100A1000DF90CF90BF90AF9008954F925F926F920A +:100A20007F928F929F92AF92BF92DF92EF92FF924E +:100A30000F931F93CF93DF938C01EB0188818B324F +:100A4000D1F18D32C9F52196EE24E394888190EDA1 +:100A5000980F9A3010F08E3289F560E070E0CB018B +:100A6000FE012191A0ED8A2E820E39E0381508F49E +:100A700040C06A3929E97207820729E1920708F024 +:100A80004DC0AAE0B0E09B01AC010E94491C912C32 +:100A9000B12CA12C240135014094509460947094A1 +:100AA0004616570668067906C8F1680D791D8A1D35 +:100AB0009B1DEF01D5CF2196E12CC8CFF801108204 +:100AC0001182128213821482158216821782108676 +:100AD000C801DF91CF911F910F91FF90EF90DF90B0 +:100AE000BF90AF909F908F907F906F905F904F904E +:100AF0000895211113C0F801608371838283938369 +:100B00000E94181BF80164837583868397838AE0AB +:100B1000E11001C088E0F8018087DACFF12CEAE02B +:100B20008E2E912CA12CB12C61157105F0E88F0748 +:100B3000910540F0A50194010E94591CCA01B90118 +:100B4000F394F2CFFE01299130ED320F3A3010F4D8 +:100B5000F394F8CF2E32F1F4EF012196FE012196A5 +:100B6000208150EDD52ED20E29E02D1598F06C3C49 +:100B70003CEC73073CE08307910580F7AAE0B0E006 +:100B80009B01AC010E94491C6D0D711D811D911DC1 +:100B9000FA94E4CF20812F7DD0E0C0E0253409F025 +:100BA0004FC021812D32A9F53296BB24B394DF01C9 +:100BB000D0E0C0E02F2D0F2C000C330B4AE0A42E08 +:100BC000FD01DD9040ED4D0D4A30A8F5AC9EA00131 +:100BD000AD9E500D1124CD2DDD0CDD0BE097C40F23 +:100BE000D51FAE01420F531F473251054CF3BB20B6 +:100BF000B9F080E090E0A0E0B0E8E11003C080E050 +:100C000090E0DC01F80184839583A683B7838CE0B0 +:100C100083CF2B3219F03196B12CC9CF3296FCCF4D +:100C200080E090E0A0E8BFEFE110ECCF80E090E042 +:100C3000A0E8BFE7E7CFBB2019F0D195C195D10956 +:100C4000208121113BCFCF0DD11DF7FCDA950E94F9 +:100C5000181B1C161D06E4F4F12CC0FF0CC024E088 +:100C6000F29EF0011124E35CFD4F2081318142812D +:100C700053810E94791BD595C795F394209769F706 +:100C8000E1109058F8016483758386839783BFCF02 +:100C9000D195C195D109F12C209791F3C0FF0CC0DB +:100CA00024E0F29EF0011124EB5DFD4F20813181A3 +:100CB000428153810E94791BD595C795F394ECCF5F +:100CC00080339CF08A3324F08F3524F08B3724F462 +:100CD00081E0089581344CF08B35D4F393ED980F77 +:100CE00081E09230B0F380E008958B32B9F7F0CF15 +:100CF000FC018185811114C0A481B5818681978111 +:100D00002FEF3FEFA817B90730F4CD010196958377 +:100D100084832C9130E037FD20E0208781E08187BB +:100D2000808508951F93CF93DF93EC01162FE0DFAA +:100D3000811306C0198681E0DF91CF911F9108953C +:100D400080E0FACFCF93DF93EC01CE01D1DF8B307F +:100D50003CF489304CF4882349F090E080E008C0EE +:100D60008D3011F08032C9F71986EFCF81E090E025 +:100D7000DF91CF910895CF92DF92EF92FF92CF93C0 +:100D8000DF9300D000D000D0CDB7DEB7FC01892BB7 +:100D900039F094819F77963081F030F49430F0F4FC +:100DA00060E070E0CB010DC0983039F09C30C1F7A5 +:100DB000C080D180E280F3801FC060817181828118 +:100DC000938129960FB6F894DEBF0FBECDBFDF9199 +:100DD000CF91FF90EF90DF90CF9008956081718167 +:100DE000CE0101961ADE89858830F9F08C30C1F683 +:100DF000CD80DE80EF80F88420E030E0A901C701DB +:100E0000B6010E94881D87FDCBCF20E030E040E88E +:100E10005FE4C701B6010E94141B18160CF4C0CF82 +:100E2000C701B6010E945C1DCCCF69817A818B819C +:100E30009C81C7CFCF92DF92EF92FF92CF93DF9347 +:100E400000D000D000D0CDB7DEB7FC01892B39F03F +:100E500094819F77963069F028F4943080F570E0A3 +:100E600060E01FC09A3081F09C3009F458C098307F +:100E7000B1F780819181A281B381BC018115904835 +:100E8000A105B10570F0EBCF80819181A281B38182 +:100E900066277727681B790B81309048A105B1053B +:100EA000F0F6CB0129960FB6F894DEBF0FBECDBF8A +:100EB000DF91CF91FF90EF90DF90CF900895608108 +:100EC0007181CE010196A9DD89819A81AB81BC81B6 +:100ED00029852A30E9F22C3021F0283009F0BFCFE3 +:100EE000CCCFCD80DE80EF80F88420E030E040E0A1 +:100EF00057ECC701B6010E94881D87FDB0CF20E0E6 +:100F00003EEF4FEF56E4C701B6010E94141B1816BE +:100F10000CF4A5CFC701B6010E94571DC2CFC080F7 +:100F2000D180E280F380E1CFCF93FC01892B91F057 +:100F300094819F77983029F078F4992359F096306E +:100F400079F4C1E080819181A281B381892B8A2BC0 +:100F50008B2B39F4C0E005C09A3099F39C3021F016 +:100F6000C1E08C2FCF910895C1E020E030E0A901CD +:100F700060817181828193810E94141B8111F1CF64 +:100F8000E9CFFC0184819581009799F0228133811A +:100F9000468157812417350718F015821482089569 +:100FA000A9014F5F5F4F53834283820F931FFC0160 +:100FB00060830895FF920F931F93CF93DF9300D028 +:100FC00000D01F921F92CDB7DEB78C01DC011296C4 +:100FD000ED91FC9122813381848195819383828379 +:100FE000FA83E9831C821B823E832D83821B930B31 +:100FF00098878F83C8017CDEF82EF8011186C8011E +:1010000077DED80119961C92F816B9F1811110C03B +:1010100061E070E080E090E028960FB6F894DEBFC3 +:101020000FBECDBFDF91CF911F910F91FF9008951B +:101030008C35F1F4C8015CDE882351F3853729F43F +:1010400064E070E080E090E0E7CFE7E6F2E09081D6 +:10105000992329F0891308C08181811107C062E0BA +:1010600070E080E090E0D8CF3296F1CFF8011186A1 +:10107000682FCE01019685DFC2CF60E0CE010196D8 +:1010800080DF8D819E81892B79F0E981FA818B81C6 +:101090009C812F813885AC01421B530B8281938147 +:1010A000840F951F938382832D813E8163E070E0DE +:1010B00080E090E02115310509F4AECF60E070E0EA +:1010C000CB01C901A9CFFC0180819181892B21F439 +:1010D00060E070E0CB01089561E778E090E080E0A7 +:1010E00008950895CF93DF93DC01EB01EC81FD813E +:1010F0008A819B810896E817F90730F4F0E0E0E078 +:10110000CF01DF91CF9108953897FD83EC8330971D +:10111000A9F31296CD91DC911397209791F0CF010E +:101120008C1B9D0B23E0959587952A95E1F78D8380 +:101130001396FC93EE9312971582148217821682EF +:10114000DFCF1196FC93EE93F3CF2F923F924F9205 +:101150005F926F927F928F929F92AF92BF92CF9247 +:10116000DF92EF92FF920F931F93CF93DF93CDB750 +:10117000DEB761970FB6F894DEBF0FBECDBF08DBB8 +:101180006B017C0180918804909189043601681A72 +:10119000790A2DEC621620E1720608F4D1C0809124 +:1011A000020490910304D301A81BB90BCD01B7FF32 +:1011B00003C0919581959109883C91050CF0BCC0C4 +:1011C0008091000490910104019690930104809312 +:1011D0000004029709F0B0C004E012E04090FE0362 +:1011E0005090FF0349E050E0B801CE0101960E9403 +:1011F0000B1B8B816C81681708F4682F70E080915D +:101200000204909103040E949C1D9B0140911102D5 +:1012100050911202649FC001659F900D749F900DC4 +:10122000112464E670E00E949C1D898541E050E035 +:10123000882311F042E050E08D81829FF001839F6E +:10124000F00D1124FB87EA878E81829FD001839F56 +:10125000B00D1124BD87AC878F81829FF001839FE1 +:10126000F00D1124FF87EE878885829F1001839FF0 +:10127000300C1124FA01EE0FFF1FEE5FFB4F812CA3 +:10128000912C5401920121503109398B288B888986 +:1012900099894817590708F03FC0880C991CAA1C67 +:1012A000BB1C808191819C01AA85BB852A1B3B0BBD +:1012B00037FF03C03195219531092617370770F4A0 +:1012C00022813381AC85BD852A1B3B0B37FF03C0D0 +:1012D00031952195310926173707D0F02E853F85A6 +:1012E000821B930B97FF03C09195819591098617F7 +:1012F0009707B8F4828193818219930997FF03C0FD +:101300009195819591098617970758F4689480F80C +:101310004E5F5F4F3496BBCF38E04316510408F060 +:1013200051C0075F1F4F82E00A33180709F056CFFC +:1013300010920104109200041092FF031092FE0319 +:101340008091FE039091FF038334910540F0109249 +:10135000FF031092FE03109201041092000480918A +:10136000FE039091FF039C012F5F3F4F3093FF03DB +:101370002093FE03880F991FFC01EE5FFB4F7182E3 +:101380006082C0928804D0928904E0928A04F0922C +:101390008B0461960FB6F894DEBF0FBECDBFDF9110 +:1013A000CF911F910F91FF90EF90DF90CF90BF9062 +:1013B000AF909F908F907F906F905F904F903F90F5 +:1013C0002F9008958092DB059092DC05A092DD05B8 +:1013D000B092DE05ADCFFC0101900020E9F7319716 +:1013E000AF01481B590BBC018DEA94E00C94CB0172 +:1013F0008F929F92AF92BF920F931F93CF93DF93E1 +:10140000CDB7DEB7A1970FB6F894DEBF0FBECDBF44 +:1014100019A2423008F44AE08E010F5D1F4F842E5E +:10142000912CB12CA12CA50194010E94591CE62FEE +:10143000B901CA01EA30ECF4E05DD801EE938D0108 +:10144000232B242B252B79F790E080E0109711F0C7 +:10145000CD01C1DFA1960FB6F894DEBF0FBECDBFA0 +:10146000DF91CF911F910F91BF90AF909F908F9080 +:101470000895E95CE2CFCF93DF93D0E0C0E000971E +:1014800011F0A9DFEC0188E792E0A5DF8C0F9D1F2A +:10149000DF91CF9108954F925F926F927F928F92DA +:1014A0009F92AF92BF92CF92DF92EF92FF920F93F3 +:1014B0001F93CF936B017C01742EAC019B010E94A2 +:1014C0008C1D882391F08BE792E0CF911F910F91B3 +:1014D000FF90EF90DF90CF90BF90AF909F908F9054 +:1014E0007F906F905F904F9076CF46015701E894C0 +:1014F000B7F82FEF3FEF4FE75FE7C501B4010E9458 +:101500008C1D81110DC02FEF3FEF4FE75FE7C50145 +:10151000B4010E94141B18161CF48FE792E0D5CF7B +:101520002FEF3FEF4FE75FE4C701B6010E94881D30 +:1015300018161CF483E892E0C8CF2FEF3FEF4FE777 +:101540005FECC701B6010E94141B87FDF3CF20E0BA +:1015500030E0A901C701B6010E94141B10E000E0B1 +:1015600087FF0AC06DE28DEA94E00E9460028C0160 +:10157000F7FAF094F7F8F094C0E060E070E080E0F3 +:101580009FE37C1641F020E030E040E251E40E940D +:10159000EF1CCF5FF6CFA70196010E948B1C2B0199 +:1015A0003C010E945C1D4B015C014AE021DF7C0193 +:1015B000E00EF11ECC23B9F1C501B4010E94181B45 +:1015C0009B01AC01C301B2010E948A1C4B015C016A +:1015D0006EE28DEA94E00E946002E80EF91EC150AE +:1015E00010F120E030E040E251E4C501B4010E9476 +:1015F000791B2B013C010E945C1D4B01B12CA12CDD +:101600004AE0C501B401F4DEE80EF91EC501B401DB +:101610000E94181B9B01AC01C301B2010E948A1CED +:101620004B015C01DCCFC701CF911F910F91FF905F +:10163000EF90DF90CF90BF90AF909F908F907F9072 +:101640006F905F904F900895FC0180819181009789 +:1016500011F00C94541E08950F931F93CF93DF93B2 +:10166000EC0188819981009759F02A813B812617E6 +:10167000370730F081E0DF91CF911F910F910895EE +:101680008B016F5F7F4F0E94DD1E009759F0998399 +:1016900088831B830A832C813D81232B59F7FC010E +:1016A0001082E8CF80E0E7CFEF92FF920F931F9375 +:1016B000CF93DF93EC017B018A01BA01CDDF288152 +:1016C0003981811114C02115310519F0C9010E9419 +:1016D000541E198218821D821C821B821A82CE011E +:1016E000DF91CF911F910F91FF90EF9008951D838F +:1016F0000C83B701C9010E94CB1FF1CFCF93DF93B9 +:10170000EC01FB018617970741F06081718161153B +:10171000710539F044815581C7DFCE01DF91CF914A +:10172000089588819981009711F00E94541E1982B2 +:1017300018821D821C821B821A82EFCFFC0111824B +:1017400010821382128215821482FB010190002004 +:10175000E9F73197AF01461B570BA6CF0F931F93A5 +:10176000CF93DF938B01EC012097E1F06E817F81B5 +:1017700060177107B9F00115110541F06115710588 +:1017800029F0C8010E94C21F892B61F08D81882336 +:1017900039F028E08202C0011124C80FD91FE4CF1C +:1017A000D0E0C0E0CE01DF91CF911F910F9108955D +:1017B0008F929F92AF92BF92CF92DF92EF92FF9261 +:1017C0000F931F93CF93DF93CDB7DEB7CB54D109DF +:1017D0000FB6F894DEBF0FBECDBF8C017B01D42EB7 +:1017E000B1DA2C969FAF8EAF2C97CE01865B9F4FC0 +:1017F0006ADC672B09F0A4C080FDA2C0C80178DABA +:10180000873209F493C1FCF4823209F48FC1C80114 +:101810006FDAC82EFE0131964F01D12C5F018C2D5D +:101820004FDA882309F49EC1FFE3DF1609F49AC159 +:10183000D80119961C92D394F401C1924F01C801AA +:1018400057DAC82EECCF8B3509F494C08B37F9F6F4 +:10185000F7018481807880628483118210821382F0 +:101860001282DD2009F460C1D80119961C92C801CA +:1018700069DA23969FAF8EAF2397CE018F5B9F4F80 +:1018800022DC672B09F0ECC080FDEAC06DE7C801DF +:1018900049DA8111BDC0DA94C8012ADA873209F425 +:1018A000C0C0823209F4BDC0D8011296ED91FC91FE +:1018B000228133818481958193838283FA83E983B2 +:1018C0001C821B823E832D83821B930B98878F8300 +:1018D000C8010EDAA82EF4D922E030E0882369F19D +:1018E000F80111866A2DCE0101964BDBC80100DAA2 +:1018F000A82EE6D98111F4CF60E0CE01019641DB3C +:101900008D819E81892B79F0E981FA818B819C817F +:101910002F813885AC01421B530B82819381840F48 +:10192000951F938382838D819E8123E030E0009711 +:1019300021F0B82EC92E30E020E09B2CAC2C78C0D2 +:101940002B968FAD2B972C969FAD2C97C55BDF4FB9 +:101950000FB6F894DEBF0FBECDBFDF91CF911F91C0 +:101960000F91FF90EF90DF90CF90BF90AF909F903E +:101970008F900895D70114968C9114978078806485 +:1019800014968C93149711961C921E9213961C9287 +:101990001E921297DD2009F4C7C0F8011186C80114 +:1019A000D1D99A838983CE0101968DDB672B31F5DE +:1019B00080FD24C06DE5C801B5D9811129C0DA9434 +:1019C000D8016D917C91C7018DDB009709F4A9C006 +:1019D0004D2DBC01C801ECDE9A838983CE010196AE +:1019E00072DB672B59F480FD09C0C801ABD99A831B +:1019F0008983CE01019667DB672B19F089819A8173 +:101A0000A5CF80FDFBCF6DE5C8018CD9882311F0EF +:101A100080E088C06CE2C80185D98111D1CF82E015 +:101A200081C0C801C7DA9B019B2CAC2CB82EC92EF3 +:101A300023963FAF2EAF2397CE018F5B9F4F43DBA3 +:101A4000672B71F480FD0CC0C8017CD923969FAF31 +:101A50008EAF2397CE018F5B9F4F35DB672B39F01D +:101A600022968FAD229723969FAD23976FCF80FD4F +:101A7000F7CF6AE3C80156D9882389F26B2D7C2DF4 +:101A8000D7018D919C916ADEBC01892B79F4F80114 +:101A900060817181C70126DBFC01892B09F441C0FB +:101AA000848180688483B682C782BF014D2DC801BE +:101AB0007FDE23969FAF8EAF2397CE018F5B9F4F24 +:101AC00002DB672B69F680FDCBCFC8013BD923969B +:101AD0009FAF8EAF2397CE018F5B9F4FF4DA672BBA +:101AE00009F0BECF80FDBCCF6DE7C8011BD98111C5 +:101AF0008FCF6CE2C80116D9882309F490CFC801B2 +:101B000021D923969FAF8EAF2397CE018F5B9F4F36 +:101B1000DADA672B09F0A4CF80FDA2CFB92CCA2C4A +:101B2000BBCE83E090E012CF85E0FCCFC80142DA63 +:101B300069837A838B839C83CE010196C4DA672BF9 +:101B400009F05CCF80FD5ACF2B813C81D7011496E0 +:101B50008C9114978078856014968C9314972D93AC +:101B60003C9356CFF501ED0DF11D1082898184372C +:101B7000B9F4D70114968C911497807886601496E6 +:101B80008C9381E090E0A0E0B0E0F7018083918346 +:101B9000A283B38390E0F4E0DF12D8CE80E0D6CE0B +:101BA000863689F4D70114968C91149780788660D4 +:101BB00014968C93F701108211821282138281E0B5 +:101BC00090E0F5E0E9CF8E3631F481E090E024E05A +:101BD000D212BCCEE3CFB501CE018F5B9F4F0E94E6 +:101BE0000D0525964CAD5DAD6EAD7FAD25972A9662 +:101BF0008FAD2A978A3061F08C30C1F0883009F0BF +:101C00000ECFD70114968C9114978078886006C007 +:101C1000D70114968C91149780788A6014968C93CF +:101C2000F7014083518362837383F2CE29964CADD2 +:101C30005DAD6EAD7FAD2997D70114968C91149749 +:101C400080788C6014968C93F70140835183628373 +:101C50007383DECE009721F0FC01808191817ECDDF +:101C600090E080E00895EF92FF920F931F93CF933F +:101C7000DF93CDB7DEB72E970FB6F894DEBF0FBE59 +:101C8000CDBFFC0101811281E580F6801A8619869C +:101C90001C861B861E861D86CE0109962FDD1A82A4 +:101CA00019821C821B821E821D82BE01675F7F4FCC +:101CB000CE01019623DD81E090E098878F83CE01ED +:101CC0000996C2DCB701C801C5DFFC01892B31F1DF +:101CD00094819F77963029F0D0F49230F8F09430C8 +:101CE00058F50F811885CE010196AEDC81E0012BFD +:101CF00009F080E02E960FB6F894DEBF0FBECDBF80 +:101D0000DF91CF911F910F91FF90EF9008959C303C +:101D100041F368F4983029F39A3019F381E090E0A8 +:101D200029813A81232BC9F490E080E016C09032DB +:101D3000C1F2903499F7D5CF6081718189819A8100 +:101D40006817790769F0009771F06115710571F0F6 +:101D50000E94C21F91958195910998878F83C1CF69 +:101D600090E080E0F7CF8FEF9FEFF4CF81E090E03D +:101D7000F1CFFC01248125FF03C080819181EECC4D +:101D800090E080E008952F923F924F925F926F9281 +:101D90007F928F929F92AF92BF92CF92DF92EF92FB +:101DA000FF920F931F93CF93DF93CDB7DEB7C25B44 +:101DB000D1400FB6F894DEBF0FBECDBFFC01CE01FF +:101DC0000E969A8389839C838B834EE951E04C0F56 +:101DD0005D1F5E834D8358874F839D8590789D87D7 +:101DE0002081318184819581820F931F4D5951400B +:101DF0007A01C256DE4F59834883CE59D140C0562E +:101E0000DE4F59834883C05AD140CE55DE4F3983C7 +:101E10002883C25AD140CC55DE4F99838883C45A57 +:101E2000D140C955DE4F1882C75AD1405E0159E0F2 +:101E3000A50EB11C4AE0B501CE0182569E4FB8DC1A +:101E4000C855DE4F99838883C85AD140CE01885542 +:101E50009E4F39D9672BC9F480FD17C0CA55DE4F94 +:101E60008881C65AD140882381F08D85982F9F772D +:101E70009C3019F08D77883041F482E090E0C855AD +:101E8000DE4F99838883C85AD140C855DE4F0881F8 +:101E90001981C85AD140C255DE4F19830883CE5AE2 +:101EA000D140CE0182559E4F0ED9672B09F001C15A +:101EB0006C0121E0C222DD2480FDFBC08D858501FF +:101EC00085FD02C000E010E06BE872E0CE018855AD +:101ED0009E4F34DCC156DE4F0883CF59D140C056E7 +:101EE000DE4F1883C05AD140CF55DE4FF982E882C9 +:101EF000C15AD14034E9A32E32E0B32ECD55DE4F86 +:101F0000B982A882C35AD140BE0168557E4FCE0126 +:101F100082569E4FA8DE982ECE0188559E4F94DBA8 +:101F20009110EEC066EC72E0CE0188559E4F06DC43 +:101F3000C156DE4F0883CF59D140C056DE4F1883BB +:101F4000C05AD140CF55DE4FF982E882C15AD14004 +:101F5000CD55DE4FB982A882C35AD140BE01685523 +:101F60007E4FCE0182569E4F7EDED82ECE01885502 +:101F70009E4F6ADBDD2009F417C262EA72E0C801F5 +:101F800069DE009719F06DEA72E0F3DE0E941A072D +:101F9000382E62EA72E0C8015DDE009719F061EC4C +:101FA00072E0E7DE0E94BB06C055DE4F6883C05B6F +:101FB000D140CF54DE4F7883C15BD140282ECE5420 +:101FC000DE4F9883C25BD140F5E0EF2EF12C0BE69B +:101FD00013E0A3E78A2EA5E09A2EBBEDAB2EB5E168 +:101FE000BB2E61E0832D0E943203C8010197F1F7F7 +:101FF00060E0832D0E94320387EC99E20197F1F7AC +:10200000C055DE4F4880C05BD140CF54DE4F588072 +:10201000C15BD140622CCE54DE4F7880C25BD14090 +:10202000E0E2CE2ED12C61E0832D77FEA4C10E9488 +:102030003203C8010197F1F760E0832D0E9432035B +:10204000C5010197F1F761E0832D0E943203C801B9 +:102050000197F1F760E0832D0E943203C4010197DC +:10206000F1F7440C551C661C771C41E0C41AD108DA +:10207000D1F661E0832D0E943203C8010197F1F788 +:1020800060E0832D0E9432038BE995EA0197F1F716 +:1020900061E0832D0E943203C8010197F1F760E0EF +:1020A000832D0E94320351E0E51AF10809F099CF1F +:1020B0000DC087E892E00630110538F4000F111FBB +:1020C000F801E75EFD4F80819181D5D9CE54DE4F76 +:1020D0000FB6F894DEBF0FBECDBFDF91CF911F9139 +:1020E0000F91FF90EF90DF90CF90BF90AF909F90B7 +:1020F0008F907F906F905F904F903F902F900895BA +:1021000062EA72E0C801A6DD009719F06DEA72E09C +:1021100030DE0E941A07F82EE92E62EA72E0C8014A +:1021200099DD009719F066EB72E023DE0E941A0732 +:102130001C0162EA72E0C8018DDD009721F4412C98 +:10214000512C32014CC061EC72E013DEFC01892B92 +:10215000B1F394819F77963039F1F8F4943078F3A5 +:1021600060817181CE0182569E4F0E940D05C2563C +:10217000DE4F488059806A807B80CE59D140CA5555 +:10218000DE4F8881C65AD1408A3009F457C08C305E +:1021900009F45DC0883099F60BC09A3061F09C302C +:1021A00009F479C0983059F640805180628073807C +:1021B00077FE15C0C4CF408051806280738041E0BB +:1021C00044165104610440E8740608F0B8CF7094D6 +:1021D000609450944094411C511C611C711CF092FD +:1021E000EA05E092EB0561E08F2D0E949703809154 +:1021F000EA059091EB05019609F4B6C00091E80557 +:102200001091E9050F3F100709F45AC0083008F093 +:1022100051C098013327EFEFE00FE73008F084C09A +:10222000F0E08827E95EFE4E8F4F0C94B01D9611AA +:1022300050118E119011921198119A1151E045167A +:102240005104610450E8750608F079CFC0CFCE552F +:10225000DE4F88809980AA80BB80C25AD14020E09E +:1022600030E040E05FECC501B4010E94881D87FDAD +:1022700066CF20E030E040E05FE4C501B4010E9499 +:10228000141B18160CF45BCFC501B4010E94571D36 +:102290002B013C01A4CF80809180A280B380DFCF4E +:1022A000E898220F331FF901EF5FFD4F84E594E0BA +:1022B000918380838FEF9FEF9093E9058093E805EA +:1022C000812C912C540183948091EC059091ED0523 +:1022D000C816D9060CF03FC0710151E0E51AF108AB +:1022E000F7FC2FC0D501C4010E2C04C0880F991F24 +:1022F000AA1FBB1F0A94D2F784219521A621B721DA +:10230000892B8A2B8B2BC1F08091F4059091F505D8 +:102310000E946A0381E0E81AF108E2CFE998C1CF90 +:10232000EA98BFCFEB98BDCFEC98BBCFED98B9CF73 +:10233000EE98B7CFEF98B5CF8091F2059091F30565 +:10234000E7CF8091F0059091F1050E946A039FEF1D +:10235000C91AD90AB9CF0F3F100731F01093E90518 +:102360000093E8050E9451018FEF9FEF9093EB05DA +:102370008093EA05ABCE0E943203C8010197F1F7C2 +:1023800060E0832D0E943203C4010197F1F761E000 +:10239000832D0E943203C8010197F1F760E0832D7D +:1023A0000E943203C5015BCE66ED72E0CE01885516 +:1023B0009E4FC4D9C156DE4F0883CF59D140C05675 +:1023C000DE4F1883C05AD140CF55DE4FF982E882E4 +:1023D000C15AD140CD55DE4FB982A882C35AD140EF +:1023E000BE0168557E4FCE0182569E4F3CDCD82EF2 +:1023F000CE0188559E4F28D9DD2009F478C062EAC5 +:1024000072E0C80127DC009719F06DEA72E0B1DCD8 +:102410000E941A07D82E62EA72E0C8011BDC0097FE +:1024200019F066EB72E0A5DC0E941A077C0162EAF3 +:1024300072E0C8010FDC009719F061EC72E099DCE2 +:102440000E94BB064B015C01D092C9068DE090E072 +:102450009093CB068093CA068091C90661E00E94E2 +:1024600097038091C90660E00E94320388E293E2FC +:102470000E94ED0384E991E10E945F03C701019787 +:10248000C12CD12C7601C39404C0CC0CDD1CEE1CF5 +:10249000FF1C8A95D2F7C114D104E104F104F1F0D4 +:1024A000D501C4018C219D21AE21BF21892B8A2B0E +:1024B0008B2B69F080E392E00E94ED038AE996E0BD +:1024C0000E945F03F694E794D794C794E4CF80E327 +:1024D00092E00E94ED0380E392E0F2CF80E392E08D +:1024E0000E94ED0390E080E00E945F03EFCD6EED6F +:1024F00072E0CE0188559E4F21D9C156DE4F088328 +:10250000CF59D140C056DE4F1883C05AD140CF5565 +:10251000DE4FF982E882C15AD140CD55DE4FB982F3 +:10252000A882C35AD140BE0168557E4FCE01825663 +:102530009E4F99DBD82ECE0188559E4F85D8DD2041 +:1025400009F416C162EA72E0C80184DB009719F051 +:102550006DEA72E00EDC0E941A07F82E62EA72E061 +:10256000C80178DB009719F068EE72E002DC0E9487 +:102570001A078C018091E505803308F054C061E0B2 +:102580008F2D0E9497038091E505282F30E0F901F7 +:10259000EE0FFF1FE20FF31FE65BFA4F2F2D2F7395 +:1025A0009081907C922B90831092E6051092E70523 +:1025B0002CE0622F0E94901D829FB001112430E018 +:1025C00020E0AB01420F531FFA01EE0FFF1FE40F93 +:1025D000F51FE65BFA4F908196FD17C02F5F3F4FC6 +:1025E0002C30310571F7813009F096C010928000CF +:1025F00082E0809381001092850010928400B19A4D +:1026000080916F00826080936F00E091E5058E2FCE +:1026100090E0FC01EE0FFF1FE80FF91FE65BFA4F99 +:10262000808180648083F090E505003282E01807A5 +:102630000CF03DC08091E605E8E88E2E912C881ABA +:10264000910887FD9394880C991C880C991C092C7F +:10265000000CAA08BB088091E70528E532E0281B9A +:10266000310987FD3395220F331F220F331F032EAD +:10267000000C440B550B281939094A095B09D8018C +:10268000053B110514F0A4EBB0E0B7FF02C0B0E0C9 +:10269000A0E00E94531C24EB30E040E050E00E9498 +:1026A0002D1C89019A01080D191D2A1D3B1D9FE251 +:1026B0009F1508F40BCD2091E60588E890E0821B79 +:1026C000910927FD9395880F991F880F991F081767 +:1026D000190784F02091E70588E592E0821B9109B3 +:1026E00027FD9395880F991F880F991F08171907C1 +:1026F0000CF4C8010297880F991F4FB7F8942F2D3B +:1027000030E0F901EE0FFF1FE20FF31FE65BFA4F17 +:10271000928381834FBFDACC823061F410929000B3 +:1027200080939100109295001092940088BB809342 +:1027300071006BCF833069F41092A00082E0809327 +:10274000A1001092A5001092A40089BB8093720092 +:102750005CCF81115ACF1092200182E08093210139 +:1027600010922501109224018ABB809373004DCFF3 +:102770006EEE72E0CE0188559E4F0E949E0BC156B0 +:10278000DE4F0883CF59D140C056DE4F1883C05A60 +:10279000D140CF55DE4FF982E882C15AD140CD55A4 +:1027A000DE4FB982A882C35AD140BE0168557E4F20 +:1027B000CE0182569E4F57DAD82ECE0188559E4FB5 +:1027C0000E94240BDD2009F162EA72E0C80142DABE +:1027D000009719F06DEA72E0CCDA0E941A077C01CA +:1027E00062EA72E0C80136DA009719F067EF72E02A +:1027F000C0DA0E949407182FF092E905E092E805EC +:102800000E9451011093000261CC6EEF72E0CE0184 +:1028100088559E4F0E949E0BC156DE4F0883CF59AC +:10282000D140C056DE4F1883C05AD140CF55DE4F3D +:10283000F982E882C15AD140CD55DE4FB982A882D3 +:10284000C35AD140BE0168557E4FCE0182569E4F7D +:102850000ADAF82ECE0188559E4F0E94240BFF20E5 +:1028600009F434CC62EA72E0C801F4D9009719F097 +:102870006DEA72E07EDA0E941A077C0162EA72E079 +:10288000C801E8D9009719F067EF72E072DA0E9488 +:1028900094078093AC04F092A704E092A60416CCAF +:1028A0000F931F93CF93DF9300D000D0CDB7DEB747 +:1028B0008DEA94E00E940702853231F51A8219826E +:1028C0001C821B821E821D826FED75E0CE01019677 +:1028D0000E947E0BCE01019656DACE0101960E942F +:1028E000240B50E040E067E772E08FED95E00E9436 +:1028F000540B26960FB6F894DEBF0FBECDBFDF9106 +:10290000CF911F910F91089589831A820091E30559 +:102910001091E4050F5F1F4FB8018FED95E00E9405 +:102920002C0B882331F32091DF053091E005809155 +:10293000E3059091E405BE016F5F7F4F820F931F07 +:102940000E94CB1F1093E4050093E305D2CF0E94B1 +:1029500035028111A5DF80E090E0892B49F080E00D +:1029600090E0892B29F00E94000081110E94000054 +:1029700080E090E0892B49F080E090E0892B29F0FD +:102980000E94000081110E94000080E090E0892BED +:1029900049F080E090E0892B29F00E94000081112D +:1029A0000C94000008951F920F920FB60F921124FD +:1029B0000BB60F922F933F934F935F936F937F9339 +:1029C0008F939F93AF93BF93EF93FF938DEA94E020 +:1029D0000E943E02FF91EF91BF91AF919F918F9125 +:1029E0007F916F915F914F913F912F910F900BBE0F +:1029F0000F900FBE0F901F9018951F920F920FB659 +:102A00000F9211240BB60F922F938F939F93EF93F6 +:102A1000FF93E091BD04F091BE048081E091C30476 +:102A2000F091C40482FD1DC090818091C6048F5F27 +:102A30008F732091C704821741F0E091C604F0E043 +:102A4000E355FB4F958F8093C604FF91EF919F91C3 +:102A50008F912F910F900BBE0F900FBE0F901F9074 +:102A600018958081F2CF1F920F920FB60F9211240A +:102A70002F933F938F939F93AF93BF938091950430 +:102A800090919604A0919704B0919804309190048D +:102A900023E0230F2D3758F50196A11DB11D20937A +:102AA00090048093950490939604A0939704B09318 +:102AB00098048091910490919204A0919304B09114 +:102AC00094040196A11DB11D8093910490939204EA +:102AD000A0939304B0939404BF91AF919F918F9171 +:102AE0003F912F910F900FBE0F901F90189526E8E1 +:102AF000230F0296A11DB11DD2CF1F920F920FB6C8 +:102B00000F9211240BB60F922F933F934F935F9325 +:102B10006F937F938F939F93AF93BF93EF93FF93A5 +:102B2000E0910F02F09110021995FF91EF91BF9182 +:102B3000AF919F918F917F916F915F914F913F9155 +:102B40002F910F900BBE0F900FBE0F901F901895F6 +:102B50001F920F920FB60F9211240BB60F922F9364 +:102B60003F934F935F936F937F938F939F93AF9315 +:102B7000BF93EF93FF93E0910D02F0910E02199530 +:102B8000FF91EF91BF91AF919F918F917F916F9145 +:102B90005F914F913F912F910F900BBE0F900FBE01 +:102BA0000F901F9018951F920F920FB60F9211243D +:102BB0000BB60F922F933F934F935F936F937F9337 +:102BC0008F939F93AF93BF93EF93FF93E091030293 +:102BD000F09104021995FF91EF91BF91AF919F91F0 +:102BE0008F917F916F915F914F913F912F910F90B6 +:102BF0000BBE0F900FBE0F901F9018951F920F9253 +:102C00000FB60F9211240BB60F922F933F934F9351 +:102C10005F936F937F938F939F93AF93BF93EF9344 +:102C2000FF93E0910102F09102021995FF91EF915B +:102C3000BF91AF919F918F917F916F915F914F91D4 +:102C40003F912F910F900BBE0F900FBE0F901F90D2 +:102C500018951F920F920FB60F9211240BB60F9278 +:102C60002F933F934F935F936F937F938F939F9394 +:102C7000AF93BF93EF93FF93E0910B02F0910C029F +:102C80001995FF91EF91BF91AF919F918F917F9196 +:102C90006F915F914F913F912F910F900BBE0F90CD +:102CA0000FBE0F901F9018951F920F920FB60F92A4 +:102CB00011240BB60F922F933F934F935F936F9313 +:102CC0007F938F939F93AF93BF93EF93FF93E09185 +:102CD0000902F0910A021995FF91EF91BF91AF910E +:102CE0009F918F917F916F915F914F913F912F9124 +:102CF0000F900BBE0F900FBE0F901F9018951F9254 +:102D00000F920FB60F9211240BB60F922F933F9391 +:102D10004F935F936F937F938F939F93AF93BF93E3 +:102D2000EF93FF93E0910702F09108021995FF914C +:102D3000EF91BF91AF919F918F917F916F915F9133 +:102D40004F913F912F910F900BBE0F900FBE0F90A0 +:102D50001F9018951F920F920FB60F9211240BB669 +:102D60000F922F933F934F935F936F937F938F9324 +:102D70009F93AF93BF93EF93FF93E0910502F09180 +:102D800006021995FF91EF91BF91AF919F918F919D +:102D90007F916F915F914F913F912F910F900BBE5B +:102DA0000F900FBE0F901F9018951F920F920FB6A5 +:102DB0000F9211240BB60F922F933F934F935F9373 +:102DC0006F937F938F939F93AF93BF93EF93FF93F3 +:102DD00048E251E064E271E090E080E00E94550436 +:102DE000FF91EF91BF91AF919F918F917F916F91E3 +:102DF0005F914F913F912F910F900BBE0F900FBE9F +:102E00000F901F9018951F920F920FB60F921124DA +:102E10000BB60F922F933F934F935F936F937F93D4 +:102E20008F939F93AF93BF93EF93FF9348EA50E044 +:102E300064EA70E083E090E00E945504FF91EF9116 +:102E4000BF91AF919F918F917F916F915F914F91C2 +:102E50003F912F910F900BBE0F900FBE0F901F90C0 +:102E600018951F920F920FB60F9211240BB60F9266 +:102E70002F933F934F935F936F937F938F939F9382 +:102E8000AF93BF93EF93FF9348E950E064E970E09C +:102E900082E090E00E945504FF91EF91BF91AF91C5 +:102EA0009F918F917F916F915F914F913F912F9162 +:102EB0000F900BBE0F900FBE0F901F9018951F9292 +:102EC0000F920FB60F9211240BB60F922F933F93D0 +:102ED0004F935F936F937F938F939F93AF93BF9322 +:102EE000EF93FF9348E850E064E870E081E090E001 +:102EF0000E945504FF91EF91BF91AF919F918F91E7 +:102F00007F916F915F914F913F912F910F900BBEE9 +:102F10000F900FBE0F901F9018951F920F920FB633 +:102F20000F9211240BB60F922F933F934F935F9301 +:102F30006F937F938F939F93AF93BF93CF93DF93C1 +:102F4000EF93FF932091F80530E0F901E85EFE4F22 +:102F50008491F901E254FE4FD491F901E858FE4FF3 +:102F6000C491CC2379F081110E94CB02EC2FF0E0C8 +:102F7000EE0FFF1FE25AFE4FA591B491EC91ED23A5 +:102F800081E009F480E02091FC053091FD052F5F80 +:102F90003F4F3093FD052093FC059091FB0595363E +:102FA00018F096E09093F7059091F705943009F4A6 +:102FB00066C0B8F49230F1F0933009F444C09091B7 +:102FC000FA05992309F46BC081117EC08091F9053F +:102FD000882309F463C08091F90561E00E943203FF +:102FE0005EC0953009F457C0963049F791E0909350 +:102FF000C8064FC08111E3CF2091FC053091FD053B +:103000002436310528F41092FD051092FC05D7CF27 +:103010001092C8061092FB05E091FB0591E09E0F0F +:103020009093FB05F0E02091FC053091FD05EE0F3B +:10303000FF1FE950FA4F308727831092FD05109249 +:10304000FC0593E019C0813009F0B9CFE091FB0590 +:1030500091E09E0F9093FB05F0E02091FC053091EC +:10306000FD05EE0FFF1FE950FA4F308727831092BE +:10307000FD051092FC0594E09093F705A0CF8823FE +:1030800059F22091FC053091FD052536310508F4F3 +:1030900096CF95E0F1CF811192CFB5CF2F9AFF91C6 +:1030A000EF91DF91CF91BF91AF919F918F917F91E0 +:1030B0006F915F914F913F912F910F900BBE0F90A9 +:1030C0000FBE0F901F9018958091F905882321F06D +:1030D0008091F90560E082CF2F98E1CFCF93DF9305 +:1030E0001092B0041092AF0488EE93E0A0E0B0E03C +:1030F0008093B1049093B204A093B304B093B4044A +:1031000089E592E09093AE048093AD0485EC90E065 +:103110009093BA048093B90484EC90E09093BC043B +:103120008093BB0480EC90E09093BE048093BD0438 +:1031300081EC90E09093C0048093BF0482EC90E017 +:103140009093C2048093C10486EC90E09093C404F1 +:103150008093C3041092C6041092C7041092C8044E +:103160001092C90483E08093C906CFEFDFEFD093BC +:10317000EB05C093EA058AE090E09093ED0580931B +:10318000EC0549E050E064E072E08EEE95E043D259 +:10319000D093E905C093E8058CE390E09093120288 +:1031A000809311021092DB051092DC051092DD0570 +:1031B0001092DE058091DA058033D0F491E0980F0B +:1031C0009093DA058093E50590E0FC01EE0FFF1F78 +:1031D000E80FF91FE65BFA4F88EB9BE0928381834F +:1031E00067E772E08FED95E0DF91CF910C949E0B35 +:1031F0008FEF8093E505F4CF789484B5826084BD29 +:1032000084B5816084BD85B5826085BD85B58160EA +:1032100085BD80916E00816080936E001092810068 +:103220008091810082608093810080918100816023 +:1032300080938100809180008160809380008091E4 +:10324000B10084608093B1008091B0008160809370 +:10325000B0008091910082608093910080919100F4 +:1032600081608093910080919000816080939000B4 +:103270008091A10082608093A1008091A100816073 +:103280008093A1008091A00081608093A000809134 +:1032900021018260809321018091210181608093CE +:1032A00021018091200181608093200180917A002A +:1032B000846080937A0080917A00826080937A00A3 +:1032C00080917A00816080937A0080917A00806892 +:1032D00080937A001092C100E091BD04F091BE0489 +:1032E00082E08083E091B904F091BA041082E09109 +:1032F000BB04F091BC048FEC80831092C504E09174 +:10330000C104F091C20486E08083E091BF04F09193 +:10331000C004808180618083E091BF04F091C0048B +:10332000808188608083E091BF04F091C004808137 +:1033300080688083E091BF04F091C00480818F7D1C +:1033400080831092E9051092E8050E94510181E006 +:10335000809300028093AC0488E090E09093A704EF +:103360008093A6044BE9E42EF12C412C50EC552E11 +:1033700059E7652E54EC752E2FB7F894809195047B +:1033800090919604A0919704B09198042FBF20913A +:10339000AC04222309F401C14091A8045091A9046E +:1033A0006091AA047091AB048C019D01041B150B64 +:1033B000260B370BB901A80140325E446105710547 +:1033C00008F4EBC08093A8049093A904A093AA04E6 +:1033D000B093AB04C091A604D091A704CE01992765 +:1033E000FC01E254FE4FD490FC01E858FE4FE491FA +:1033F000F0E0EE0FFF1FE25AFE4F0591149110927C +:10340000A1041092A2041092A3041092A40410929A +:10341000A50461E08C2F0E94970360E08C2F0E942E +:10342000320362E170E080E090E00E94230461E0FA +:103430008C2F0E943203C7010197F1F760E08C2FB7 +:103440000E94970380E991E0F80120812D2199F4F1 +:103450000197D1F74092990450929A0460929B048C +:1034600070929C0440929D0450929E0460929F042E +:103470007092A00462C080E991E0F80120812D21C2 +:1034800019F00197D1F7E6CF98E2392E20E8C22E45 +:10349000212C80E991E0F80120812D2119F4019778 +:1034A000D1F7D8CF0E94C8034B015C0180E991E0BD +:1034B000F80120812D2119F00197D1F7CBCF0E947F +:1034C000C803681979098A099B0969327105810560 +:1034D000910538F0E22DF0E0E756FB4F80858C290E +:1034E0008087C69419F4239480E8C82E3A9431104A +:1034F000D0CF61E08C2F0E94970361E08C2F0E9457 +:1035000032036091A10470E090E080E091D060937C +:10351000990470939A0480939B0490939C04609107 +:10352000A30470E090E080E083D060939D047093EA +:103530009E0480939F049093A004C3E0D0E087E0B2 +:1035400093E00E94EB0960919D0470919E0480912C +:103550009F049091A00442E00E944B0A81E493E012 +:103560000E943B0A84E493E00E94EB096091990475 +:1035700070919A0480919B0490919C0442E00E9477 +:103580004B0A81E493E00E943B0A64E670E080E02D +:1035900090E00E942304219791F6809100028823F5 +:1035A00001F18091DB059091DC05A091DD05B091E2 +:1035B000DE050097A105B105A1F0892BA1F48BE7E9 +:1035C00093E00E94EB0968EC70E080E090E00E94DC +:1035D00023041092DB051092DC051092DD05109299 +:1035E000DE05B5D9C9CE8CE893E00E94EB09609165 +:1035F000DB057091DC058091DD059091DE054AE0E8 +:103600000E94F80981E493E00E943B0ADCCF8FED31 +:1036100095E00C94240BFB01DC0102C005900D9297 +:1036200041505040D8F7089540D008F481E0089503 +:10363000E89409C097FB3EF490958095709561954C +:103640007F4F8F4F9F4F9923A9F0F92F96E9BB2702 +:103650009395F695879577956795B795F111F8CF7E +:10366000FAF4BB0F11F460FF1BC06F5F7F4F8F4FE9 +:103670009F4F16C0882311F096E911C0772321F0DF +:103680009EE8872F762F05C0662371F096E8862F77 +:1036900070E060E02AF09A95660F771F881FDAF7CE +:1036A000880F9695879597F90895990F0008550FFB +:1036B000AA0BE0E8FEEF16161706E807F907C0F0B8 +:1036C00012161306E407F50798F0621B730B840BC0 +:1036D000950B39F40A2661F0232B242B252B21F49A +:1036E00008950A2609F4A140A6958FEF811D811D3A +:1036F00008950BD078C069D028F06ED018F09523CB +:1037000009F05AC05FC01124A2C07ED0A0F3959FDB +:10371000D1F3950F50E0551F629FF001729FBB27B8 +:10372000F00DB11D639FAA27F00DB11DAA1F649F64 +:103730006627B00DA11D661F829F2227B00DA11D17 +:10374000621F739FB00DA11D621F839FA00D611D9D +:10375000221F749F3327A00D611D231F849F600DBE +:10376000211D822F762F6A2F11249F5750408AF0F7 +:10377000E1F088234AF0EE0FFF1FBB1F661F771F83 +:10378000881F91505040A9F79E3F510570F014C01A +:103790005EC05F3FECF3983EDCF3869577956795C6 +:1037A000B795F795E7959F5FC1F7FE2B880F911DA1 +:1037B0009695879597F9089597F99F6780E870E047 +:1037C00060E008959FEF80EC089500240A94161697 +:1037D000170618060906089500240A9412161306FF +:1037E000140605060895092E0394000C11F488238D +:1037F00052F0BB0F40F4BF2B11F460FF04C06F5FA9 +:103800007F4F8F4F9F4F089557FD9058440F551F7E +:1038100059F05F3F71F04795880F97FB991F61F052 +:103820009F3F79F087950895121613061406551FC9 +:10383000F2CF4695F1DF08C0161617061806991F35 +:10384000F1CF86957105610508940895E894BB272A +:1038500066277727CB0197F90895052E97FB16F475 +:1038600000940FD057FD05D024D007FC02D046F4B9 +:1038700008C050954095309521953F4F4F4F5F4F71 +:10388000089590958095709561957F4F8F4F9F4FCC +:10389000089531D0A59F900DB49F900DA49F800DE9 +:1038A000911D11240895B7FFF4CFF3DF821B930B12 +:1038B0000895A1E21A2EAA1BBB1BFD010DC0AA1F71 +:1038C000BB1FEE1FFF1FA217B307E407F50720F089 +:1038D000A21BB30BE40BF50B661F771F881F991F04 +:1038E0001A9469F760957095809590959B01AC014D +:1038F000BD01CF010895A29FB001B39FC001A39F56 +:10390000700D811D1124911DB29F700D811D112418 +:10391000911D08955058BB27AA270ED064CF55DFBC +:1039200030F05ADF20F031F49F3F11F41EF44ACFFB +:103930000EF4E095E7FB40CFE92F66DF80F3BA177E +:10394000620773078407950718F071F49EF57ECF20 +:103950000EF4E0950B2EBA2FA02D0B01B9019001AA +:103960000C01CA01A0011124FF27591B99F0593FEE +:1039700050F4503E68F11A16F040A22F232F342F36 +:103980004427585FF3CF469537952795A795F04084 +:103990005395C9F77EF41F16BA0B620B730B840B99 +:1039A000BAF09150A1F0FF0FBB1F661F771F881F51 +:1039B000C2F70EC0BA0F621F731F841F48F48795A9 +:1039C00077956795B795F7959E3F08F0B3CF939598 +:1039D000880F08F09927EE0F9795879508950CD0DA +:1039E00002CFFADE40F0F1DE30F021F45F3F19F053 +:1039F000E3CE51112CCFE6CE07DF98F39923C9F31C +:103A00005523B1F3951B550BBB27AA2762177307E4 +:103A1000840738F09F5F5F4F220F331F441FAA1F98 +:103A2000A9F333D00E2E3AF0E0E830D09150504058 +:103A3000E695001CCAF729D0FE2F27D0660F771F06 +:103A4000881FBB1F261737074807AB07B0E809F0E8 +:103A5000BB0B802DBF01FF2793585F4F2AF09E3F7D +:103A6000510568F0A9CEF3CE5F3FECF3983EDCF34E +:103A7000869577956795B795F7959F5FC9F7880FF6 +:103A8000911D9695879597F90895E1E0660F771F48 +:103A9000881FBB1F621773078407BA0720F0621BD9 +:103AA000730B840BBA0BEE1F88F7E095089504D0D2 +:103AB0006894B111CCCE0895AFDE88F09F5790F096 +:103AC000B92F9927B751A0F0D1F0660F771F881F43 +:103AD000991F1AF0BA95C9F712C0B13081F0B6DE5D +:103AE000B1E00895B3CE672F782F8827B85F39F0FB +:103AF000B93FCCF3869577956795B395D9F73EF4A2 +:103B000090958095709561957F4F8F4F9F4F089549 +:103B1000CCDD08F48FEF0895C8DD880B990B08956C +:103B2000991B79E004C0991F961708F0961B881F0F +:103B30007A95C9F780950895AA1BBB1B51E107C070 +:103B4000AA1FBB1FA617B70710F0A61BB70B881F2D +:103B5000991F5A95A9F780959095BC01CD010895BC +:103B6000EE0FFF1F881F8BBF0790F691E02D199471 +:103B70000F931F93CF93DF938230910510F482E06F +:103B800090E0E091CE06F091CF0630E020E0B0E08A +:103B9000A0E0309799F42115310509F44AC0281B9B +:103BA000390B24303105D8F58A819B816115710567 +:103BB00089F1FB0193838283FE0111C04081518111 +:103BC0000281138148175907E0F04817590799F403 +:103BD000109761F012960C93129713961C933296DD +:103BE000CF01DF91CF911F910F9108950093CE06E1 +:103BF0001093CF06F4CF2115310551F0421753072A +:103C000038F0A901DB019A01BD01DF01F801C1CF44 +:103C1000EF01F9CF9093CF068093CE06CDCFFE0172 +:103C2000E20FF31F81939193225031093983288346 +:103C3000D7CF2091CC063091CD06232B41F4209193 +:103C40001502309116023093CD062093CC062091B8 +:103C50001302309114022115310541F42DB73EB7FE +:103C60004091170250911802241B350BE091CC06AD +:103C7000F091CD06E217F307A0F42E1B3F0B281797 +:103C8000390778F0AC014E5F5F4F2417350748F0D5 +:103C90004E0F5F1F5093CD064093CC0681939193B6 +:103CA0009FCFF0E0E0E09CCFCF93DF930097E9F067 +:103CB000FC01329713821282A091CE06B091CF06FA +:103CC000ED0130E020E01097A1F420813181820FD6 +:103CD000931F2091CC063091CD062817390709F0A3 +:103CE00061C0F093CD06E093CC06DF91CF910895AB +:103CF000EA01CE17DF07E8F54A815B819E01411595 +:103D00005105B1F7E901FB83EA8349915991C40F49 +:103D1000D51FEC17FD0761F4808191810296840F15 +:103D2000951FE90199838883828193819B838A838C +:103D3000F0E0E0E012968D919C9113970097B9F511 +:103D40002D913C911197CD010296820F931F2091E6 +:103D5000CC063091CD062817390739F6309751F542 +:103D60001092CF061092CE06B093CD06A093CC064B +:103D7000BCCFD383C28340815181840F951FC81764 +:103D8000D90761F44E5F5F4F88819981480F591FB1 +:103D9000518340838A819B819383828321153105DE +:103DA00009F0B0CFF093CF06E093CE069ECFFD0191 +:103DB000DC01C0CF13821282D7CF4F925F926F92F5 +:103DC0007F928F929F92AF92BF92CF92DF92EF92AB +:103DD000FF920F931F93CF93DF938C01009791F481 +:103DE000CB01DF91CF911F910F91FF90EF90DF906A +:103DF000CF90BF90AF909F908F907F906F905F908B +:103E00004F90B6CEFC01E60FF71F9C0122503109FE +:103E1000E217F30708F4AAC0D901CD91DC911197FC +:103E2000C617D70718F1C530D10570F0CE01049739 +:103E30008617970748F0C61BD70B2297C193D193DB +:103E40006D937C93CF0130DFC801DF91CF911F913B +:103E50000F91FF90EF90DF90CF90BF90AF909F9029 +:103E60008F907F906F905F904F9008955B01AC1A98 +:103E7000BD0A4C018C0E9D1EA091CE06B091CF06BE +:103E8000512C412CF12CE12C109731F58091CC066E +:103E90009091CD068815990509F05CC04616570625 +:103EA00008F058C08091130290911402009741F4D9 +:103EB0008DB79EB74091170250911802841B950B45 +:103EC000E817F90708F052C0F093CD06E093CC064E +:103ED000F90171836083B8CF8D919C9111971296EF +:103EE0006C90129713967C901397A815B90559F505 +:103EF0006C0142E0C40ED11CCA14DB0420F1AC01F9 +:103F00004A195B09DA011296159780F06282738272 +:103F100051834083D9016D937C93E114F10471F0D6 +:103F2000D7011396FC93EE9312978ECF22968C0FA7 +:103F30009D1FF90191838083F301EFCFF093CF06AA +:103F4000E093CE0681CF4816590608F42C017D0176 +:103F5000D3019ACFCB010CDE7C01009739F0AE0182 +:103F6000B80107D0C801A0DE87016ECF10E000E0E5 +:103F70006BCFFB01DC0102C001900D92415050401B +:103F8000D8F70895FB01DC018D9101908019011093 +:103F9000D9F3990B0895FB01DC0101900D920020EB +:103FA000E1F7089511E0CEE1D1E000E005C0802FF7 +:103FB000FE01D6DD2196011DCF31D10780E0080733 +:063FC000B1F7F894FFCFF9 +:103FC600015404540454045404540454045404542E +:103FD600043C000000D0068000BF03C203D203DF0A +:103FE60003E803F503CDCCCC3D0AD7233C17B7D164 +:103FF6003877CC2B329595E6241FB14F0A00002066 +:10400600410000C84200401C4620BCBE4CCA1B0EE4 +:104016005AAEC59D74000000006002CB01F801ACE9 +:1040260002290207021B022F2F22225C5C6208660D +:104036000C6E0A720D7409000D0A006E616E00693D +:104046006E66006F7666003F3F3F00656D69745F80 +:104056003433330066756E6374696F6E5F6E616DBF +:104066006500706172616D65746572730064617478 +:10407600615F70696E006269745F6C656E67746813 +:1040860000636F646500656D69745F3433335F6325 +:104096006861636F6E00656D69745F697200736550 +:1040A600745F736572766F00616E676C650072652A +:1040B60063765F34333300656E61626C65007265EA +:1040C60063765F646874007B2266756E6374696FDD +:1040D6006E5F6E616D65223A226468745F74656D09 +:1040E6007065726174757265222C22706172616DE1 +:1040F6006574657273223A7B2276616C7565223A25 +:10410600007D7D007B2266756E6374696F6E5F6EDF +:10411600616D65223A226468745F68756D696469C9 +:104126007479222C22706172616D657465727322D6 +:104136003A7B2276616C7565223A00556E6B6E6F1E +:10414600776E20656E636F64696E67007B226675A5 +:104156006E6374696F6E5F6E616D65223A22726579 +:1041660063765F343333222C22706172616D65741D +:10417600657273223A7B2276616C7565223A004F2E +:104186006B00496E636F6D706C657465496E707512 +:104196007400496E76616C6964496E707574004E80 +:1041A6006F4D656D6F7279004E6F74537570706FD9 +:0E41B6007274656400546F6F4465657000009C +:020000023000CC +:10E000000D9489F10D94B2F10D94B2F10D94B2F129 +:10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 +:10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 +:10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 +:10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 +:10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 +:10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 +:10E070000D94B2F10D94B2F10D94B2F10D94B2F190 +:10E080000D94B2F10D94B2F10D94B2F10D94B2F180 +:10E090000D94B2F10D94B2F10D94B2F10D94B2F170 +:10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 +:10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 +:10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 +:10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 +:10E0E0000D94B2F141546D656761323536300041AF +:10E0F000726475696E6F206578706C6F72657220DE +:10E1000073746B3530305632206279204D4C530099 +:10E11000426F6F746C6F616465723E004875683F52 +:10E1200000436F6D70696C6564206F6E203D200048 +:10E130004350552054797065202020203D20005FF9 +:10E140005F4156525F415243485F5F3D2000415658 +:10E1500052204C696243205665723D20004743437C +:10E160002056657273696F6E203D20004350552024 +:10E1700049442020202020203D20004C6F7720663D +:10E18000757365202020203D20004869676820665F +:10E190007573652020203D200045787420667573D6 +:10E1A00065202020203D20004C6F636B2066757336 +:10E1B000652020203D20004D617220203720323024 +:10E1C000313300312E362E3800342E332E350056A2 +:10E1D00023202020414444522020206F7020636F70 +:10E1E00064652020202020696E73747275637469E1 +:10E1F0006F6E2061646472202020496E74657272B3 +:10E20000757074006E6F20766563746F7200726A49 +:10E210006D702020006A6D70200057686174207056 +:10E220006F72743A00506F7274206E6F7420737541 +:10E2300070706F72746564004D7573742062652030 +:10E2400061206C6574746572002000577269747483 +:10E25000696E672045450052656164696E672045B7 +:10E26000450045452065727220636E743D00504F35 +:10E27000525400303D5A65726F2061646472003FF1 +:10E280003D43505520737461747300403D454550C3 +:10E29000524F4D207465737400423D426C696E6B41 +:10E2A000204C454400453D44756D70204545505215 +:10E2B0004F4D00463D44756D7020464C415348001B +:10E2C000483D48656C70004C3D4C69737420492F83 +:10E2D0004F20506F72747300513D51756974005234 +:10E2E0003D44756D702052414D00563D73686F7707 +:10E2F00020696E7465727275707420566563746FF0 +:10E30000727300593D506F727420626C696E6B00BD +:10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 +:10E320000CBF12E0A0E0B2E0EEE1FDEF03E00BBFB6 +:10E3300002C007900D92A030B107D9F712E0A0E01B +:10E34000B2E001C01D92AE30B107E1F70F9460F367 +:10E350000D948DFE01E20EBF0FEF0DBF11241FBE05 +:10E360000D9460F30D9400F020E030E040ED57E0B4 +:10E3700005C0FA013197F1F72F5F3F4F2817390792 +:10E38000C0F308959C01260F311DC901A0E0B0E043 +:10E390002F5F3F4FABBFFC018791882361F08093D3 +:10E3A000C6008091C00086FFFCCF8091C0008064D1 +:10E3B0008093C000EACF08958DE08093C6008091DD +:10E3C000C00086FFFCCF8091C00080648093C000B5 +:10E3D0008AE08093C6008091C00086FFFCCF8091C8 +:10E3E000C00080648093C00008950F94C2F10F9420 +:10E3F000DCF10895FC019081992359F09093C600B7 +:10E400008091C00086FFFCCF8091C0008064809323 +:10E41000C0003196992379F70895282F982F929567 +:10E420009F70892F805D8A3308F0895F8093C600D2 +:10E430008091C00086FFFCCF8091C00080648093F3 +:10E44000C000822F8F70982F905D9A3308F0995FEB +:10E450009093C6008091C00086FFFCCF8091C000E1 +:10E4600080648093C00008959C01FB01853691056E +:10E470001CF46330710594F0C90164E670E00F94F8 +:10E480002EFE605D7F4F6093C6008091C00086FFC6 +:10E49000FCCF8091C00080648093C0002B30310598 +:10E4A00014F43297B4F0C90164E670E00F942EFEC4 +:10E4B0006AE070E00F942EFE605D7F4F6093C600AF +:10E4C0008091C00086FFFCCF8091C0008064809363 +:10E4D000C000C9016AE070E00F942EFEC0968093E0 +:10E4E000C6008091C00086FFFCCF8091C000806490 +:10E4F0008093C00008951F93182F8EE692EE60E07F +:10E500000F94C2F11093C6008091C00086FFFCCF2B +:10E510008091C00080648093C0000F94DCF11F9153 +:10E5200008952F923F924F925F926F927F928F92B7 +:10E530009F92AF92BF92CF92DF92EF92FF920F9392 +:10E540001F93DF93CF93CDB7DEB762970FB6F894E2 +:10E55000DEBF0FBECDBF382E622ECA01DB015C01CB +:10E560006D01772420E2222E2E010894411C511CBB +:10E570008BC081E0A81680E0B80681E0C80680E084 +:10E58000D80628F0C601AA27BB270F940DF2BB2797 +:10E59000AD2D9C2D8B2D0F940DF28A2D0F940DF225 +:10E5A0002092C6008091C00086FFFCCF8091C00001 +:10E5B00080648093C0009DE29093C6008091C0006B +:10E5C00086FFFCCF8091C00080648093C0002092C1 +:10E5D000C6008091C00086FFFCCF8091C00080649F +:10E5E0008093C00019828601750188249924A1E0D6 +:10E5F0003A1651F03A1620F0B2E03B1661F409C029 +:10E600000BBFF701779007C0C7010F9477FE782EF4 +:10E6100002C0F7017080872D0F940DF22092C60082 +:10E620008091C00086FFFCCF8091C0008064809301 +:10E63000C000872D8052F401EF70F0708F3520F408 +:10E64000E40DF51D708204C0E40DF51D8EE280839B +:10E650000894E11CF11C011D111D0894811C911CE2 +:10E6600090E18916910409F0C2CF80E190E0A0E02A +:10E67000B0E0A80EB91ECA1EDB1E198AC2010F9493 +:10E68000FAF10F94DCF16A94662009F072CF629679 +:10E690000FB6F894DEBF0FBECDBFCF91DF911F91B3 +:10E6A0000F91FF90EF90DF90CF90BF90AF909F9031 +:10E6B0008F907F906F905F904F903F902F90089534 +:10E6C0002F923F924F925F926F927F928F929F9282 +:10E6D000AF92BF92CF92DF92EF92FF920F931F9370 +:10E6E000DF93CF93CDB7DEB7CD53D1400FB6F894BB +:10E6F000DEBF0FBECDBF01E20EBF0FEF0DBF94B75F +:10E70000F894A89514BE80916000886180936000A1 +:10E7100010926000789493FF05C0E0910002F091A0 +:10E7200001021995279A2F9A8091C00082608093E8 +:10E73000C00080E18093C40088E18093C1000000A4 +:10E74000EE24FF24870144E0A42EB12CCC24DD2448 +:10E7500024C0C5010197F1F70894E11CF11C011DCB +:10E76000111D21E2E2162EE4F20620E0020720E06D +:10E77000120718F031E0C32ED12CC801B70127ECE5 +:10E780003BE140E050E00F9441FE611571058105C9 +:10E79000910519F485B1805885B98091C00087FD35 +:10E7A00003C0C114D104A9F2A6014F5F5F4FC25E3E +:10E7B000DE4F59834883CE51D140C25EDE4F8881FF +:10E7C0009981CE51D140019711F00D9410FEC05D9A +:10E7D000DE4F19821882C053D14060E0C15DDE4F28 +:10E7E0001882CF52D14088249924C35DDE4F19820C +:10E7F0001882CD52D140C05EDE4F188219821A8233 +:10E800001B82C052D140CE5CDE4F188219821A8220 +:10E810001B82C253D140EE24FF2487010BBFF701B6 +:10E8200007911691C45CDE4F19830883CC53D14005 +:10E830000D940BFEC25EDE4F28813981CE51D1404E +:10E840002130310509F52091C600C25EDE4F1982E4 +:10E850001882CE51D14022C02F5F3F4F4F4F5F4FA4 +:10E86000213082E138078AE7480780E0580780F0C6 +:10E87000C45CDE4FE881F981CC53D140EF5FFF4F9C +:10E8800019F0EE27FF27099420E030E040E050E047 +:10E890008091C00087FFE0CF2091C600C35DDE4FAE +:10E8A00048815981CD52D1404F5F5F4FC35DDE4FEC +:10E8B00059834883CD52D140213209F063C64A3092 +:10E8C000510508F05FC60894811C911C53E0851621 +:10E8D000910409F059C600E010E018C081E280936D +:10E8E000C6008091C00086FFFCCF8091C00080648C +:10E8F0008093C0002F5F3F4F2931310579F70F9486 +:10E90000DCF10F5F1F4F0530110519F020E030E0FA +:10E91000E5CF10920A0210920B0210920C02109294 +:10E920000D02109206021092070210920802109235 +:10E930000902109202021092030210920402109235 +:10E9400005028FEE90EE60E00F94F5F180E191EE1C +:10E9500060E00F94C2F18091C00087FFFCCF9091DE +:10E96000C600903608F09F759032B8F09093C600BC +:10E970008091C00086FFFCCF8091C00080648093AE +:10E98000C000A0E2A093C6008091C00086FFFCCF2B +:10E990008091C00080648093C000983409F4D7C18E +:10E9A0009934B8F4923409F459C1933458F490333B +:10E9B00019F1903308F4E3C59F33A1F1903409F0C5 +:10E9C000DEC5BDC0953409F470C1963409F0D7C5D1 +:10E9D00098C1923509F42BC2933538F49C3409F46C +:10E9E000F5C1913509F0CBC518C2963509F445C279 +:10E9F000993509F0C4C567C483E792EE62E00F94CD +:10EA0000F5F110920602109207021092080210927D +:10EA1000090210920A0210920B0210920C0210923C +:10EA20000D0213C18FE792EE62E00F94F5F18FEEC5 +:10EA300090EE60E00F94F5F181E291EE60E00F94CA +:10EA4000C2F187EB91EE60E00F94F5F180E391EE77 +:10EA500060E00F94C2F184EE90EE60E00F94F5F167 +:10EA60008FE391EE60E00F94C2F186E090E061E008 +:10EA700070E00F9434F20F94DCF18DE591EE60E0DC +:10EA80000F94C2F189EC91EE60E00F94F5F18EE401 +:10EA900091EE60E00F94C2F183EC91EE60E00F9490 +:10EAA000F5F18CE691EE60E00F94C2F18EE10F94E7 +:10EAB0000DF288E90F940DF281E00F940DF20F949E +:10EAC000DCF18BE791EE60E00F94C2F119E0E0E039 +:10EAD000F0E010935700E4918E2F0F940DF20F94F5 +:10EAE000DCF18AE891EE60E00F94C2F1E3E0F0E03F +:10EAF00010935700E4918E2F0F940DF20F94DCF1D8 +:10EB000089E991EE60E00F94C2F1E2E0F0E0109349 +:10EB10005700E4918E2F0F940DF20F94DCF188EAE8 +:10EB200091EE60E00F94C2F1E1E0F0E01093570045 +:10EB30001491812F0F940DF20F94DCF107CF8BE825 +:10EB400092EE62E00F94F5F18BE492EE60E00F94A8 +:10EB5000F5F10F94DCF100E010E019C0C8016F2D51 +:10EB60000F947FFEFF2031F489E492EE60E00F9471 +:10EB7000C2F10BC0F092C6008091C00086FFFCCFAE +:10EB80008091C00080648093C0000F5F1F4FC80158 +:10EB900081519F41A0E0B0E0ABBFFC01F790BAE229 +:10EBA000FB1621F0E2E000301E07C1F60F94DCF105 +:10EBB0000F94DCF187E592EE60E00F94F5F10F948D +:10EBC000DCF1CC24DD2400E010E01EC0C8010F946D +:10EBD00077FEF82E882331F489E492EE60E00F94FA +:10EBE000C2F10BC08093C6008091C00086FFFCCFAD +:10EBF0008091C00080648093C000FE1419F00894D6 +:10EC0000C11CD11C0F5F1F4FC80181519F41A0E063 +:10EC1000B0E0ABBFFC01E790FAE2EF1621F022E092 +:10EC20000030120799F60F94DCF10F94DCF182E6C4 +:10EC300092EE60E00F94C2F1C60161E070E00F94C3 +:10EC400034F20F94DCF10F94DCF110920202109276 +:10EC50000302109204021092050278CE89E992EE26 +:10EC600062E00F94F5F1279A2F9A16C02F9880E052 +:10EC700090E0E0EDF7E03197F1F7019684369105E9 +:10EC8000C1F72F9A80E090E0E0EDF7E03197F1F7DF +:10EC9000019684369105C1F78091C00087FFE6CFC9 +:10ECA0008091C00087FFFCCF64C485EA92EE62E0E9 +:10ECB0000F94F5F140910202509103026091040219 +:10ECC0007091050281E020E10F9491F2809102029F +:10ECD00090910302A0910402B091050280509F4FD1 +:10ECE000AF4FBF4F8093020290930302A0930402A0 +:10ECF000B093050280509041A040B04008F426CE69 +:10ED0000A4CF83EB92EE62E00F94F5F140910602FE +:10ED100050910702609108027091090280E020E1A1 +:10ED20000F9491F28091060290910702A09108023F +:10ED3000B091090280509F4FAF4FBF4F80930602A2 +:10ED400090930702A0930802B0930902FFCD80ECD4 +:10ED500092EE62E00F94F5F183E792EE60E00F949B +:10ED6000F5F18FE792EE60E00F94F5F18BE892EE0B +:10ED700060E00F94F5F189E992EE60E00F94F5F10F +:10ED800085EA92EE60E00F94F5F183EB92EE60E09D +:10ED90000F94F5F180EC92EE60E00F94F5F187ECC2 +:10EDA00092EE60E00F94F5F188ED92EE60E00F9442 +:10EDB000F5F18FED92EE60E00F94F5F18AEE92EEB0 +:10EDC00060E00F94F5F183E093EEBDCD87EC92EE19 +:10EDD00062E00F94F5F181E40F947BF282E40F94EA +:10EDE0007BF283E40F947BF284E40F947BF285E45E +:10EDF0000F947BF286E40F947BF287E40F947BF20E +:10EE000088E40F947BF28AE40F947BF28BE40F94F6 +:10EE10007BF28CE40F947BF299CD88ED92EE62E068 +:10EE20000F94F5F1772473948824992409C48FED05 +:10EE300092EE62E00F94F5F140910A0250910B02BC +:10EE400060910C0270910D0282E020E10F9491F22A +:10EE500080910A0290910B02A0910C02B0910D02D8 +:10EE600080509F4FAF4FBF4F80930A0290930B0289 +:10EE7000A0930C02B0930D0269CD8AEE92EE62E08F +:10EE80000F94F5F184EE90EE60E00F94F5F18FECC5 +:10EE900091EE60E00F94F5F1662477244301CC5D98 +:10EEA000DE4F19821882C452D140D401C301B695F5 +:10EEB000A79597958795CA5DDE4F88839983AA8326 +:10EEC000BB83C652D140CC5DDE4FA881B981C4520C +:10EED000D1401196CC5DDE4FB983A883C452D14096 +:10EEE000CD0162E070E00F9434F2B0E2B093C6005E +:10EEF0008091C00086FFFCCF8091C0008064809329 +:10EF0000C000EDE2E093C6008091C00086FFFCCF18 +:10EF10008091C00080648093C000F0E2F093C6004E +:10EF20008091C00086FFFCCF8091C00080648093F8 +:10EF3000C000CA5DDE4FE880F9800A811B81C6529D +:10EF4000D140BB27A12F902F8F2D0F940DF2CA5DBA +:10EF5000DE4F8881C652D1400F940DF2B0E2FB2EF5 +:10EF6000F092C6008091C00086FFFCCF8091C00067 +:10EF700080648093C0000DE30093C6008091C000C0 +:10EF800086FFFCCF8091C00080648093C00010E2B7 +:10EF90001093C6008091C00086FFFCCF8091C00016 +:10EFA00080648093C0008BBEF3012791C65DDE4F65 +:10EFB0002883CA52D140A22EBB24CC24DD2408943D +:10EFC000611C711C811C911C8BBEF3018791282E42 +:10EFD0003324442455240894611C711C811C911C09 +:10EFE0008BBEF3013791C55DDE4F3883CB52D140E4 +:10EFF0000894611C711C811C911C8BBEF30147910C +:10F00000C45DDE4F4883CC52D140ADEFEA2EAFEF66 +:10F01000FA2EAFEF0A2FAFEF1A2F6E0C7F1C801E57 +:10F02000911E142D032DF22CEE24EA0CFB1C0C1D5A +:10F030001D1D0F940DF220E22093C6008091C000A8 +:10F0400086FFFCCF8091C00080648093C000C65DC5 +:10F05000DE4F8881CA52D1400F940DF230E23093D6 +:10F06000C6008091C00086FFFCCF8091C000806404 +:10F070008093C000C45DDE4F8881CC52D1400F9494 +:10F080000DF240E24093C6008091C00086FFFCCFA5 +:10F090008091C00080648093C000C55DDE4F888190 +:10F0A000CB52D1400F940DF250E25093C6008091A4 +:10F0B000C00086FFFCCF8091C00080648093C000B8 +:10F0C0008FEFE8168FEFF80680E0080780E018075A +:10F0D00031F484E092EE60E00F94C2F1DFC0D80119 +:10F0E000C7018070907CA070B0708050904CA040A0 +:10F0F000B040D1F52FEF3FE340E050E0E222F322B1 +:10F1000004231523CA5DDE4FA880B980CA80DB8046 +:10F11000C652D140AE0CBF1CC01ED11EAA0CBB1CD7 +:10F12000CC1CDD1C8EE092EE60E00F94C2F1BB2798 +:10F13000A12F902F8F2D0F940DF28E2D0F940DF285 +:10F1400030E23093C6008091C00086FFFCCF8091F2 +:10F15000C00080648093C0004EE34093C60080915D +:10F16000C00086FFFCCF87C08EE09EEFA0E0B0E03D +:10F17000E822F9220A231B239CE0E91694E9F90608 +:10F1800090E0090790E0190709F088C0C45DDE4FE0 +:10F19000A881CC52D140EA2EFF2400E010E0102FCD +:10F1A0000F2DFE2CEE24C55DDE4FB881CB52D14031 +:10F1B000EB0EF11C011D111DD601C501817090706F +:10F1C000A070B070DC0199278827E80EF91E0A1F8D +:10F1D0001B1F20EF30E040E050E0A222B322C42207 +:10F1E000D52241E1AA0CBB1CCC1CDD1C4A95D1F7F1 +:10F1F000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0BE +:10F20000282239224A225B2235E1220C331C441C7D +:10F21000551C3A95D1F7E20CF31C041D151D57013E +:10F220006801AA0CBB1CCC1CDD1C85E192EE60E0E1 +:10F230000F94C2F1C801AA27BB270F940DF2BB2778 +:10F24000A12F902F8F2D0F940DF28E2D0F940DF274 +:10F2500090E29093C6008091C00086FFFCCF809121 +:10F26000C00080648093C000AEE3A093C60080918C +:10F27000C00086FFFCCF8091C00080648093C000F6 +:10F28000C601AA27BB270F940DF2BB27AD2D9C2DDD +:10F290008B2D0F940DF28A2D0F940DF20F94DCF14B +:10F2A000CC5DDE4FE881F981C452D140F99709F471 +:10F2B0004DCBF4E0EF2EF12C012D112D6E0C7F1CA7 +:10F2C000801E911EF2CD83E093EE62E00F94F5F183 +:10F2D0008AE192EE60E00F94C2F18091C00087FF56 +:10F2E000FCCF1091C6001F751093C6008091C0001E +:10F2F00086FFFCCF8091C00080648093C0000F9493 +:10F30000DCF1812F81548A3108F036C1163409F4BA +:10F3100095C0173490F4133409F44EC0143430F40B +:10F320001134F1F0123409F01DC130C0143409F465 +:10F3300059C0153409F016C16BC01A3409F4C4C0A1 +:10F340001B3438F4173409F48FC0183409F00AC19B +:10F35000A1C01B3409F4D2C01C3409F003C1E8C0B9 +:10F360008FEF81B90DC082B1809582B980E090E0C5 +:10F37000E0EDF7E03197F1F70196883C9105C1F790 +:10F380008091C00087FFEFCF12B8EFC08FEF84B934 +:10F390000DC085B1809585B980E090E0E0EDF7E0A3 +:10F3A0003197F1F70196883C9105C1F78091C00033 +:10F3B00087FFEFCF15B8D9C08FEF87B90DC088B1DF +:10F3C000809588B980E090E0E0EDF7E03197F1F7C3 +:10F3D0000196883C9105C1F78091C00087FFEFCF6F +:10F3E00018B8C3C08FEF8AB90DC08BB180958BB9A7 +:10F3F00080E090E0E0EDF7E03197F1F70196883C8E +:10F400009105C1F78091C00087FFEFCF1BB8ADC059 +:10F410008FEF8DB90DC08EB180958EB980E090E0F0 +:10F42000E0EDF7E03197F1F70196883C9105C1F7DF +:10F430008091C00087FFEFCF1EB897C08FEF80BBD1 +:10F440000DC081B3809581BB80E090E0E0EDF7E0F6 +:10F450003197F1F70196883C9105C1F78091C00082 +:10F4600087FFEFCF11BA81C08FEF83BB0DC084B38C +:10F47000809584BB80E090E0E0EDF7E03197F1F714 +:10F480000196883C9105C1F78091C00087FFEFCFBE +:10F4900014BA6BC08FEF809301010FC080910201FD +:10F4A00080958093020180E090E0E0EDF7E03197F5 +:10F4B000F1F70196883C9105C1F78091C00087FF64 +:10F4C000EDCF1092020151C08FEF809304010FC065 +:10F4D0008091050180958093050180E090E0E0ED4A +:10F4E000F7E03197F1F70196883C9105C1F78091DB +:10F4F000C00087FFEDCF1092050137C08FEF8093DA +:10F5000007010FC08091080180958093080180E079 +:10F5100090E0E0EDF7E03197F1F70196883C910536 +:10F52000C1F78091C00087FFEDCF109208011DC088 +:10F530008FEF80930A010FC080910B01809580931B +:10F540000B0180E090E0E0EDF7E03197F1F70196F4 +:10F55000883C9105C1F78091C00087FFEDCF1092E4 +:10F560000B0103C085E292EEEEC98091C00087FFD7 +:10F57000FCCF8091C600EAC988E392EEE4C98CE131 +:10F5800091EEE1C988249924933011F1943028F444 +:10F59000913089F09230B8F408C0953061F195301F +:10F5A000F0F0963009F048C043C02B3109F042C951 +:10F5B00091E06BE13FC96227C15DDE4F2883CF52E6 +:10F5C000D14092E037C9B22FA0E0622793E032C960 +:10F5D000822F90E0A82BB92B622794E02BC92E3004 +:10F5E00009F039C3622795E0C05DDE4F19821882A9 +:10F5F000C053D1401FC9E1E0F0E0EC0FFD1FC05D3A +:10F60000DE4F08811981C053D140E00FF11F2083E4 +:10F610000F5F1F4FC05DDE4F19830883C053D14079 +:10F6200062270A171B0709F005C9D80196E002C92D +:10F63000261709F010C303C0973009F0FBC87724E0 +:10F640009981933109F412C19431C8F4963009F4C8 +:10F65000D8C0973050F4923009F406C1933009F4C1 +:10F660006DC0913009F059C253C0913109F477C08F +:10F67000923108F0BBC0903109F04FC2F5C098310B +:10F6800009F487C0993150F4953109F4EFC09531F0 +:10F6900008F4C6C1963109F040C2C2C19A3109F4DA +:10F6A0006CC09A3108F491C09B3109F45BC09D3164 +:10F6B00009F033C29D81903359F48F81882311F46E +:10F6C0009EE11CC0813011F091E018C098E916C08D +:10F6D000892F807591F0903539F4E0E0F0E089E011 +:10F6E0008093570094910AC0983539F4E3E0F0E034 +:10F6F00089E080935700949101C090E01A821B82A8 +:10F700008D818C831D829E831F8227E030E009C299 +:10F710001A8288E08B8381E48C8386E58D8382E581 +:10F720008E8389E48F8383E5888780E589878FE5E9 +:10F730008A8782E38B872BE030E0F3C18A818139AD +:10F7400041F0823941F0803911F48FE005C080E04A +:10F7500003C082E001C08AE01A828B8344C0772410 +:10F76000739482C08D81882311F48EE12CC0813086 +:10F7700011F081E028C088E926C01A82E1E0F0E0BB +:10F7800089E08093570084918B831C8224E030E0D1 +:10F79000C8C18B81803589F48C81883039F4E2E0EE +:10F7A000F0E089E08093570084910DC0E0E0F0E044 +:10F7B00089E080935700849106C0E3E0F0E089E09F +:10F7C0008093570084911A82DFCF8D81836C99E0FA +:10F7D000E1E0F0E0082E90935700E89507B600FCB2 +:10F7E000FDCF1A821B8223E030E09BC180EC8A832C +:10F7F000CE5CDE4F188219821A821B82C253D1401E +:10F800008EC18A8190E0A0E0B0E0582F44273327D2 +:10F8100022278B8190E0A0E0B0E0DC0199278827C7 +:10F82000282B392B4A2B5B2B8D8190E0A0E0B0E098 +:10F83000282B392B4A2B5B2B8C8190E0A0E0B0E089 +:10F84000BA2FA92F982F8827282B392B4A2B5B2BCF +:10F85000220F331F441F551FC05EDE4F288339839C +:10F860004A835B83C052D1401A8259C13A81C95C34 +:10F87000DE4F3883C753D140CA5CDE4F1882C6536F +:10F88000D1408B81C82EDD24CA5CDE4F488159816E +:10F89000C653D140C42AD52A933109F082C0CE5C28 +:10F8A000DE4F88819981AA81BB81C253D1408050AB +:10F8B000904CA340B04030F583E0CE5CDE4FE88052 +:10F8C000F9800A811B81C253D140F70100935B008C +:10F8D00080935700E89507B600FCFDCFCE5CDE4F65 +:10F8E000088119812A813B81C253D14000501F4FAA +:10F8F0002F4F3F4FCE5CDE4F088319832A833B8313 +:10F90000C253D140C05EDE4F488159816A817B81FC +:10F91000C052D140DE011B9631E08C9111962C91A2 +:10F9200011971296C75CDE4F2883C953D140C85C3B +:10F93000DE4F1882C853D14090E0C85CDE4FE881AA +:10F94000F981C853D1408E2B9F2B0C01FA01609393 +:10F950005B0030935700E89511244E5F5F4F6F4F67 +:10F960007F4F0EEFE02E0FEFF02ECE0CDF1CC114F8 +:10F97000D10499F685E0C05EDE4F088119812A81A5 +:10F980003B81C052D140F80120935B008093570027 +:10F99000E89507B600FCFDCF81E180935700E8951C +:10F9A00035C0C05EDE4F88819981AA81BB81C0527B +:10F9B000D140B695A795979587957C018601ABE0D8 +:10F9C000AA2EB12CAC0EBD1E0BC0D5016D915D01F0 +:10F9D000C7010F947FFE0894E11CF11C01501040F8 +:10F9E0000115110591F7A60160E070E0440F551F65 +:10F9F000661F771FC05EDE4FE880F9800A811B8199 +:10FA0000C052D1404E0D5F1D601F711F1A82C05E33 +:10FA1000DE4F488359836A837B83C052D1407FC0C5 +:10FA2000FA80C55CDE4FF882CB53D140C65CDE4F16 +:10FA30001882CA53D1408B81C82EDD24C65CDE4FAC +:10FA400008811981CA53D140C02AD12A1A828981DA +:10FA5000BE016D5F7F4F843121F59601C05EDE4FA0 +:10FA6000E880F9800A811B81C052D1400BBFF701A9 +:10FA700087919691DB018C9311969C936E5F7F4FDB +:10FA8000D801C7010296A11DB11DC05EDE4F88835B +:10FA90009983AA83BB83C052D14022503040F1F6F3 +:10FAA00036C0C05EDE4F288139814A815B81C052F9 +:10FAB000D1400894C108D108760100E010E0089414 +:10FAC000C11CD11C0894E11CF11C011D111DE20E8A +:10FAD000F31E041F151F21BDBB27A52F942F832FB5 +:10FAE00082BD2F5F3F4F4F4F5F4FF89A80B5DB01CC +:10FAF0008D93BD012E153F054007510761F7C05E8C +:10FB0000DE4F288339834A835B83C052D1409601FC +:10FB10002D5F3F4FFB01108204C080EC8A8322E0FE +:10FB200030E08BE18093C6008091C00086FFFCCF5F +:10FB30008091C00080648093C000C15DDE4FF88179 +:10FB4000CF52D140F093C6008091C00086FFFCCF19 +:10FB50008091C00080648093C000432F3093C60022 +:10FB60008091C00086FFFCCF8091C00080648093AC +:10FB7000C000922F2093C6008091C00086FFFCCF6A +:10FB80008091C00080648093C0008EE08093C600A6 +:10FB90008091C00086FFFCCF8091C000806480937C +:10FBA000C00065E1C15DDE4FE880CF52D1406E25D7 +:10FBB00069276427FE01319610C090819093C6009A +:10FBC0008091C00086FFFCCF31968091C000806498 +:10FBD0008093C0006927215030402115310569F715 +:10FBE0006093C6008091C00086FFFCCF8091C0006A +:10FBF00080648093C00085B1805885B9772081F4F6 +:10FC0000C15DDE4F0881CF52D1400F5FC15DDE4F35 +:10FC10000883CF52D14090E0A0E0B0E00D941AF4F8 +:10FC200027982F9880E090E020ED37E0F901319798 +:10FC3000F1F7019684369105C9F700008091C00064 +:10FC40008D7F8093C00081E180935700E895EE2777 +:10FC5000FF270994FFCF90E00D941AF497FB092E2B +:10FC600007260AD077FD04D02ED006D000201AF443 +:10FC7000709561957F4F0895F6F7909581959F4F08 +:10FC80000895A1E21A2EAA1BBB1BFD010DC0AA1FDD +:10FC9000BB1FEE1FFF1FA217B307E407F50720F0F5 +:10FCA000A21BB30BE40BF50B661F771F881F991F70 +:10FCB0001A9469F760957095809590959B01AC01B9 +:10FCC000BD01CF010895AA1BBB1B51E107C0AA1FAC +:10FCD000BB1FA617B70710F0A61BB70B881F991FED +:10FCE0005A95A9F780959095BC01CD010895F99991 +:10FCF000FECF92BD81BDF89A992780B50895262F31 +:10FD0000F999FECF1FBA92BD81BD20BD0FB6F89400 +:0EFD1000FA9AF99A0FBE01960895F894FFCF63 +:040000033000E000E9 +:00000001FF diff --git a/server/services/arduino/arduino-code/nano/arduino-code.ino.hex b/server/services/arduino/arduino-code/nano/arduino-code.ino.hex new file mode 100644 index 0000000000..6d854ec49f --- /dev/null +++ b/server/services/arduino/arduino-code/nano/arduino-code.ino.hex @@ -0,0 +1,966 @@ +:100000000C947E000C94D7130C94B0130C94A6009F +:100010000C94A6000C94A6000C94A6000C94BA14A0 +:100020000C94A6000C94A6000C94A6000C94FE134D +:100030000C94A6000C94A6000C94A6000C94A600A8 +:100040000C9466130C94A6000C9434130C940E13A9 +:100050000C94A6000C94A6000C94A6000C94A60088 +:100060000C94A6000C94A6000000000024002700B9 +:100070002A0000000000250028002B0000000008D6 +:10008000000201000003040700000000000000005F +:1000900000000000230026002900040404040404D6 +:1000A0000404020202020202030303030303010227 +:1000B00004081020408001020408102001020408F6 +:1000C00010205E01011F01030301008A02010A01E1 +:1000D0000202010064001E47040B0906007C0101B6 +:1000E000060103030100F401060E0102020100C231 +:1000F000011701010202010197150C1811241FBEFE +:10010000CFEFD8E0DEBFCDBF12E0A0E0B1E0E8E481 +:10011000FAE302C005900D92A23FB107D9F725E09E +:10012000A2EFB2E001C01D92A535B207E1F710E0E1 +:10013000CDE7D0E004C02197FE010E94161BCC370A +:10014000D107C9F70E9426160C94171D0C940000C5 +:10015000E0916D04F0916E04EF3FFE0719F11092EB +:1001600060041092610410926204109263042E2FB6 +:10017000E230C0F4FF27EE0FFF1FEF5FFE4F85EE6A +:1001800096E09183808380916900213031F08C7FEB +:10019000816080936900E89A0895837F84608093EA +:1001A0006900E99A08958230910538F0880F991F07 +:1001B000880F991F05970197F1F70895AF92BF92A5 +:1001C000CF92DF92EF92FF920F931F93CF93DF9323 +:1001D0006C017B018B01040F151FEB015E01AE1852 +:1001E000BF08C017D10759F06991D601ED91FC9174 +:1001F0000190F081E02DC6010995892B79F7C501A1 +:10020000DF91CF911F910F91FF90EF90DF90CF90F2 +:10021000BF90AF900895FC01538D448D252F30E0A1 +:10022000842F90E0821B930B541710F0CF96089503 +:1002300001970895FC01918D828D981761F0A28D30 +:10024000AE0FBF2FB11D5D968C91928D9F5F9F73F6 +:10025000928F90E008958FEF9FEF0895FC01918DAC +:10026000828D981731F0828DE80FF11D858D90E019 +:1002700008958FEF9FEF0895FC01918D228D892FB6 +:1002800090E0805C9F4F821B91098F73992708959E +:100290008EE993E00E943C0121E0892B09F420E0E3 +:1002A000822F0895FC01A48DA80FB92FB11DA35A68 +:1002B000BF4F2C91848D90E001968F739927848F86 +:1002C000A689B7892C93A089B1898C9183708064A9 +:1002D0008C93938D848D981306C00288F389E02D4A +:1002E00080818F7D80830895EF92FF920F931F93FB +:1002F000CF93DF93EC0181E0888F9B8D8C8D9813D9 +:100300001AC0E889F989808185FF15C09FB7F894E4 +:10031000EE89FF896083E889F98980818370806430 +:1003200080839FBF81E090E0DF91CF911F910F917B +:10033000FF90EF900895F62E0B8D10E00F5F1F4F8A +:100340000F731127E02E8C8D8E110CC00FB607FC99 +:10035000FACFE889F989808185FFF5CFCE010E9427 +:100360005201F1CFEB8DEC0FFD2FF11DE35AFF4F42 +:10037000F0829FB7F8940B8FEA89FB8980818062B5 +:10038000CFCFCF93DF93EC01888D8823B9F0AA8972 +:10039000BB89E889F9898C9185FD03C0808186FD40 +:1003A0000DC00FB607FCF7CF8C9185FFF2CF80818F +:1003B00085FFEDCFCE010E945201E9CFDF91CF91B1 +:1003C0000895833081F028F4813099F08230A9F0CB +:1003D00008958730A9F08830C9F08430B1F4809155 +:1003E00080008F7D03C0809180008F778093800094 +:1003F000089584B58F7784BD089584B58F7DFBCF34 +:100400008091B0008F778093B00008958091B00004 +:100410008F7DF9CF1F93CF93DF93282F30E0F90121 +:10042000E458FF4F8491F901E255FF4FD491F9014F +:10043000E656FF4FC491CC23A9F0162F81110E94DC +:10044000E101EC2FF0E0EE0FFF1FEE58FF4FA591FA +:10045000B4918FB7F894EC91111108C0D095DE23B8 +:10046000DC938FBFDF91CF911F910895DE2BF8CFE2 +:10047000CF93DF93EC0180914E0560E00E940A0269 +:10048000CE01DF91CF910C94D3001F93CF93DF93D4 +:10049000182FD92F80917B0460E0C1E0811102C048 +:1004A00061E0C0E080916F040E940A0280917304B1 +:1004B000909174049C01129FC001139F900D112410 +:1004C0000E94D3006C2F80916F040E940A028091D9 +:1004D0007304909174049C01D29FC001D39F900D2E +:1004E0001124DF91CF911F910C94D300CF93DF9310 +:1004F00090E0FC01E255FF4F249186569F4FFC018E +:1005000084918823D1F090E0880F991FFC01E8596D +:10051000FF4FA591B491FC01EE58FF4FC591D491C6 +:1005200061110EC09FB7F8948C91E22FE0958E2355 +:100530008C932881E223E8839FBFDF91CF910895B8 +:100540008FB7F894EC91E22BEC938FBFF6CF3FB7C7 +:10055000F8948091820390918303A0918403B091D9 +:10056000850326B5A89B05C02F3F19F00196A11D54 +:10057000B11D3FBFBA2FA92F982F8827BC01CD01ED +:10058000620F711D811D911D42E0660F771F881F4C +:10059000991F4A95D1F708958F929F92AF92BF927B +:1005A000CF92DF92EF92FF926C010E94A7024B0163 +:1005B0005C010D2C000CEE08FF080E94A7026819D0 +:1005C00079098A099B096C157D058E059F05B8F48C +:1005D00080914E0561E00E940A0280914F05909142 +:1005E00050050E94D30080914E0560E00E940A02EF +:1005F00080914F05909150050E94D300DECFFF906F +:10060000EF90DF90CF90BF90AF909F908F90089524 +:100610008F929F92AF92BF92CF92DF92EF92FF9212 +:100620006B017C010E94A7024B015C01C114D10443 +:10063000E104F104B9F00E94A702681979098A0956 +:100640009B09683E73408105910580F321E0C21A41 +:10065000D108E108F10888EE880E83E0981EA11CFD +:10066000B11CE4CFFF90EF90DF90CF90BF90AF90A0 +:100670009F908F90089508954F925F926F927F920E +:100680008F929F92AF92BF92DF92EF92FF920F9361 +:100690001F93CF93DF938C01EB0188818B32D1F1D3 +:1006A0008D32C9F52196EE24E394888190ED980F60 +:1006B0009A3010F08E3289F560E070E0CB01FE01D7 +:1006C0002191A0ED8A2E820E39E0381508F440C041 +:1006D0006A3929E97207820729E1920708F04DC0BB +:1006E000AAE0B0E09B01AC010E945C19912CB12CF6 +:1006F000A12C2401350140945094609470944616C6 +:10070000570668067906C8F1680D791D8A1D9B1D7C +:10071000EF01D5CF2196E12CC8CFF80110821182CC +:100720001282138214821582168217821086C801E3 +:10073000DF91CF911F910F91FF90EF90DF90BF90CD +:10074000AF909F908F907F906F905F904F900895A3 +:10075000211113C0F80160837183828393830E9407 +:100760001E18F80164837583868397838AE0E110FD +:1007700001C088E0F8018087DACFF12CEAE08E2E04 +:10078000912CA12CB12C61157105F0E88F07910512 +:1007900040F0A50194010E94A619CA01B901F39481 +:1007A000F2CFFE01299130ED320F3A3010F4F3947C +:1007B000F8CF2E32F1F4EF012196FE01219620812F +:1007C00050EDD52ED20E29E02D1598F06C3C3CEC66 +:1007D00073073CE08307910580F7AAE0B0E09B0136 +:1007E000AC010E945C196D0D711D811D911DFA9463 +:1007F000E4CF20812F7DD0E0C0E0253409F04FC048 +:1008000021812D32A9F53296BB24B394DF01D0E0CB +:10081000C0E02F2D0F2C000C330B4AE0A42EFD015D +:10082000DD9040ED4D0D4A30A8F5AC9EA001AD9E87 +:10083000500D1124CD2DDD0CDD0BE097C40FD51F1D +:10084000AE01420F531F473251054CF3BB20B9F0A4 +:1008500080E090E0A0E0B0E8E11003C080E090E02C +:10086000DC01F80184839583A683B7838CE083CF72 +:100870002B3219F03196B12CC9CF3296FCCF80E0E3 +:1008800090E0A0E8BFEFE110ECCF80E090E0A0E8BE +:10089000BFE7E7CFBB2019F0D195C195D1092081E1 +:1008A00021113BCFCF0DD11DF7FCDA950E941E1808 +:1008B0001C161D06E4F4F12CC0FF0CC024E0F29ECF +:1008C000F0011124EF5CFE4F208131814281538180 +:1008D0000E947F18D595C795F394209769F7E1108A +:1008E0009058F8016483758386839783BFCFD19531 +:1008F000C195D109F12C209791F3C0FF0CC024E0E1 +:10090000F29EF0011124E75EFE4F20813181428189 +:1009100053810E947F18D595C795F394ECCF80330F +:100920009CF08A3324F08F3524F08B3724F481E057 +:10093000089581344CF08B35D4F393ED980F81E01A +:100940009230B0F380E008958B32B9F7F0CFFC011C +:100950008185811114C0A481B581868197812FEF93 +:100960003FEFA817B90730F4CD0101969583848332 +:100970002C9130E037FD20E0208781E08187808561 +:1009800008951F93CF93DF93EC01162F0E94A704C5 +:10099000811306C0198681E0DF91CF911F910895E0 +:1009A00080E0FACFCF93DF93EC01CE010E94A70441 +:1009B0008B303CF489304CF4882349F090E080E09F +:1009C00008C08D3011F08032C9F71986EECF81E072 +:1009D00090E0DF91CF910895CF92DF92EF92FF9256 +:1009E000CF93DF93CDB7DEB729970FB6F894DEBF6C +:1009F0000FBECDBFFC01892B39F094819F779630D3 +:100A000081F030F49430F0F460E070E0CB010DC080 +:100A1000983039F09C30C1F7C080D180E280F380FB +:100A200020C0608171818281938129960FB6F894EC +:100A3000DEBF0FBECDBFDF91CF91FF90EF90DF9073 +:100A4000CF90089560817181CE0101960E943C0390 +:100A500089858830F9F08C30B9F6CD80DE80EF8062 +:100A6000F88420E030E0A901C701B6010E94EC1A29 +:100A700087FDCACF20E030E040E85FE4C701B6015F +:100A80000E94191818160CF4BFCFC701B6010E94B6 +:100A9000BD1ACBCF69817A818B819C81C6CFCF92E1 +:100AA000DF92EF92FF92CF93DF93CDB7DEB7299716 +:100AB0000FB6F894DEBF0FBECDBFFC01892B39F015 +:100AC00094819F77963069F028F4943080F570E037 +:100AD00060E01FC09A3081F09C3009F459C0983012 +:100AE000B1F780819181A281B381BC0181159048C9 +:100AF000A105B10570F0EBCF80819181A281B38116 +:100B000066277727681B790B81309048A105B105CE +:100B1000F0F6CB0129960FB6F894DEBF0FBECDBF1D +:100B2000DF91CF91FF90EF90DF90CF90089560819B +:100B30007181CE0101960E943C0389819A81AB812B +:100B4000BC8129852A30E1F22C3021F0283009F0CF +:100B5000BECFCBCFCD80DE80EF80F88420E030E0C8 +:100B600040E057ECC701B6010E94EC1A87FDAFCFF9 +:100B700020E03EEF4FEF56E4C701B6010E9419187E +:100B800018160CF4A4CFC701B6010E94B61AC1CF43 +:100B9000C080D180E280F380E1CFCF93FC01892B2C +:100BA00091F094819F77983029F078F4992359F047 +:100BB000963079F4C1E080819181A281B381892B43 +:100BC0008A2B8B2B39F4C0E005C09A3099F39C3006 +:100BD00021F0C1E08C2FCF910895C1E020E030E0FA +:100BE000A90160817181828193810E94191881110C +:100BF000F1CFE9CFFC0184819581009799F02281A2 +:100C00003381468157812417350718F015821482E5 +:100C10000895A9014F5F5F4F53834283820F931F53 +:100C2000FC0160830895FF920F931F93CF93DF938E +:100C3000CDB7DEB728970FB6F894DEBF0FBECDBF95 +:100C40008C01DC011296ED91FC912281338184812B +:100C5000958193838283FA83E9831C821B823E837E +:100C60002D83821B930B98878F83C8010E94A70452 +:100C7000F82EF8011186C8010E94A704D801199620 +:100C80001C92F816C9F1811110C061E070E080E09B +:100C900090E028960FB6F894DEBF0FBECDBFDF916F +:100CA000CF911F910F91FF9008958C35F9F4C801F1 +:100CB0000E94A704882349F3853729F464E070E093 +:100CC00080E090E0E6CFEBE5F1E09081992329F018 +:100CD000891308C08181811107C062E070E080E063 +:100CE00090E0D7CF3296F1CFF8011186682FCE0170 +:100CF00001960E94FA05BFCF60E0CE0101960E94E6 +:100D0000FA058D819E81892B79F0E981FA818B81A9 +:100D10009C812F813885AC01421B530B82819381CA +:100D2000840F951F938382832D813E8163E070E061 +:100D300080E090E02115310509F4ABCF60E070E070 +:100D4000CB01C901A6CFFC0180819181892B21F4BF +:100D500060E070E0CB01089561EB76E090E080E028 +:100D600008950895CF93DF93DC01EB01EC81FD81C1 +:100D70008A819B810896E817F90730F4F0E0E0E0FB +:100D8000CF01DF91CF9108953897FD83EC833097A1 +:100D9000A9F31296CD91DC911397209791F0CF0192 +:100DA0008C1B9D0B23E0959587952A95E1F78D8304 +:100DB0001396FC93EE931297158214821782168273 +:100DC000DFCF1196FC93EE93F3CF2F923F924F9289 +:100DD0005F926F927F928F929F92AF92BF92CF92CB +:100DE000DF92EF92FF920F931F93CF93DF93CDB7D4 +:100DF000DEB761970FB6F894DEBF0FBECDBF0E947D +:100E0000A7026B017C0180917C0390917D033601E8 +:100E1000681A790A2DEC621620E1720608F4D1C036 +:100E20008091F6029091F702D301A81BB90BCD0176 +:100E3000B7FF03C0919581959109883C91050CF00D +:100E4000BCC08091F4029091F50201969093F50256 +:100E50008093F402029709F0B0C002EC10E04090D9 +:100E6000F2025090F30249E050E0B801CE01019641 +:100E70000E9410188B816C81681708F4682F70E04D +:100E80008091F6029091F7020E94021B9B01409113 +:100E9000050150910601649FC001659F900D749FEC +:100EA000900D112464E670E00E94021B898541E0E8 +:100EB00050E0882311F042E050E08D81829FF001E4 +:100EC000839FF00D1124FB87EA878E81829FD001DA +:100ED000839FB00D1124BD87AC878F81829FF00165 +:100EE000839FF00D1124FF87EE878885829F100174 +:100EF000839F300C1124FA01EE0FFF1FEA50FD4FC3 +:100F0000812C912C5401920121503109398B288B6D +:100F1000888999894817590708F03FC0880C991C9F +:100F2000AA1CBB1C808191819C01AA85BB852A1BC0 +:100F30003B0B37FF03C03195219531092617370741 +:100F400070F422813381AC85BD852A1B3B0B37FFB2 +:100F500003C031952195310926173707D0F02E852A +:100F60003F85821B930B97FF03C091958195910953 +:100F700086179707B8F4828193818219930997FFA6 +:100F800003C09195819591098617970758F4689445 +:100F900080F84E5F5F4F3496BBCF38E04316510464 +:100FA00008F051C0075F1F4F80E0083F180709F0A5 +:100FB00056CF1092F5021092F4021092F3021092A2 +:100FC000F2028091F2029091F3028334910540F095 +:100FD0001092F3021092F2021092F5021092F402B3 +:100FE0008091F2029091F3029C012F5F3F4F30936A +:100FF000F3022093F202880F991FFC01EA50FD4F83 +:1010000071826082C0927C03D0927D03E0927E0365 +:10101000F0927F0361960FB6F894DEBF0FBECDBF8E +:10102000DF91CF911F910F91FF90EF90DF90CF90C4 +:10103000BF90AF909F908F907F906F905F904F90F8 +:101040003F902F9008958092600490926104A09246 +:101050006204B0926304ADCFFC0101900020E9F777 +:101060003197AF01481B590BBC018EE993E00C94FA +:10107000DE008F929F92AF92BF920F931F93CF93F8 +:10108000DF93CDB7DEB7A1970FB6F894DEBF0FBEE2 +:10109000CDBF19A2423008F44AE08E010F5D1F4F08 +:1010A000842E912CB12CA12CA50194010E94A6198B +:1010B000E62FB901CA01EA30F4F4E05DD801EE93FD +:1010C0008D01232B242B252B79F790E080E01097BE +:1010D00019F0CD010E942C08A1960FB6F894DEBF3E +:1010E0000FBECDBFDF91CF911F910F91BF90AF90F9 +:1010F0009F908F900895E95CE1CFCF93DF93D0E08C +:10110000C0E0009719F00E942C08EC018CE691E0F9 +:101110000E942C088C0F9D1FDF91CF9108954F9254 +:101120005F926F927F928F929F92AF92BF92CF9277 +:10113000DF92EF92FF920F931F93CF936B017C018D +:10114000742EAC019B010E94F11A882399F08FE65E +:1011500091E0CF911F910F91FF90EF90DF90CF9092 +:10116000BF90AF909F908F907F906F905F904F90C7 +:101170000C942C0846015701E894B7F82FEF3FEF85 +:101180004FE75FE7C501B4010E94F11A81110DC05C +:101190002FEF3FEF4FE75FE7C501B4010E94191839 +:1011A00018161CF483E791E0D4CF2FEF3FEF4FE701 +:1011B0005FE4C701B6010E94EC1A18161CF487E719 +:1011C00091E0C7CF2FEF3FEF4FE75FECC701B601CC +:1011D0000E94191887FDF3CF20E030E0A901C70174 +:1011E000B6010E94191810E000E087FF0AC06DE206 +:1011F0008EE993E00E9474018C01F7FAF094F7F8FD +:10120000F094C0E060E070E080E09FE37C1641F085 +:1012100020E030E040E251E40E94441ACF5FF6CF74 +:10122000A70196010E94D8192B013C010E94BD1A0A +:101230004B015C014AE00E9439087C01E00EF11E7E +:10124000CC23C1F1C501B4010E941E189B01AC0161 +:10125000C301B2010E94D7194B015C016EE28EE915 +:1012600093E00E947401E80EF91EC15018F120E0CD +:1012700030E040E251E4C501B4010E947F182B0127 +:101280003C010E94BD1A4B01B12CA12C4AE0C501C2 +:10129000B4010E943908E80EF91EC501B4010E948C +:1012A0001E189B01AC01C301B2010E94D7194B016A +:1012B0005C01DBCFC701CF911F910F91FF90EF90A1 +:1012C000DF90CF90BF90AF909F908F907F906F9066 +:1012D0005F904F900895FC0180819181009711F0FB +:1012E0000C94B81B08950F931F93CF93DF93EC01D9 +:1012F00088819981009759F02A813B812617370709 +:1013000030F081E0DF91CF911F910F9108958B0113 +:101310006F5F7F4F0E94411C009759F0998388832B +:101320001B830A832C813D81232B59F7FC011082FA +:10133000E8CF80E0E7CFEF92FF920F931F93CF9318 +:10134000DF93EC017B018A01BA010E9473092881B5 +:101350003981811114C02115310519F0C9010E948C +:10136000B81B198218821D821C821B821A82CE0130 +:10137000DF91CF911F910F91FF90EF9008951D8302 +:101380000C83B701C9010E94101DF1CFCF93DF93E9 +:10139000EC01FB018617970749F0608171816115A7 +:1013A000710541F0448155810E949B09CE01DF9176 +:1013B000CF91089588819981009711F00E94B81B00 +:1013C000198218821D821C821B821A82EFCFFC01B7 +:1013D000118210821382128215821482FB01019005 +:1013E0000020E9F73197AF01461B570B0C949B097E +:1013F0000F931F93CF93DF938B01EC012097E1F0C4 +:101400006E817F8160177107B9F00115110541F0F8 +:101410006115710529F0C8010E94071D892B61F033 +:101420008D81882339F028E08202C0011124C80F81 +:10143000D91FE4CFD0E0C0E0CE01DF91CF911F9162 +:101440000F9108958F929F92AF92BF92CF92DF92A9 +:10145000EF92FF920F931F93CF93DF93CDB7DEB739 +:10146000CB54D1090FB6F894DEBF0FBECDBF8C01AF +:101470007B01D42E0E94D2042C969FAF8EAF2C9766 +:10148000CE01865B9F4F0E94A306672B09F0B2C076 +:1014900080FDB0C0C8010E94A704873209F4B9C119 +:1014A00014F5823209F4B5C1C8010E94A704C82E00 +:1014B000FE0131964F01D12C5F018C2D0E948F04CB +:1014C000882309F4C4C1FFE3DF1609F4C0C1D801C1 +:1014D00019961C92D394F401C1924F01C8010E9445 +:1014E000A704C82EEACF8B3509F49EC08B37E1F6EE +:1014F000F701848180788062848311821082138254 +:101500001282DD2009F483C1D80119961C92C8010A +:101510000E94D20423969FAF8EAF2397CE018F5B9C +:101520009F4F0E94A306672B09F002C180FD00C1F6 +:101530006DE7C8010E94C1048111CDC0DA94C801D1 +:101540000E94A704873209F4D0C0823209F4CDC0CA +:10155000D8011296ED91FC9122813381848195818D +:1015600093838283FA83E9831C821B823E832D83CB +:10157000821B930B98878F83C8010E94A704A82E13 +:101580000E948F0422E030E0882389F1F80111865F +:101590006A2DCE0101960E94FA05C8010E94A70497 +:1015A000A82E0E948F048111F1CF60E0CE01019638 +:1015B0000E94FA058D819E81892B79F0E981FA815B +:1015C0008B819C812F813885AC01421B530B82811A +:1015D0009381840F951F938382838D819E8123E065 +:1015E00030E0009721F0B82EC92E30E020E09B2C8F +:1015F000AC2C83C02B968FAD2B972C969FAD2C9740 +:10160000C55BDF4F0FB6F894DEBF0FBECDBFDF91D5 +:10161000CF911F910F91FF90EF90DF90CF90BF90EF +:10162000AF909F908F900895D70114968C91149746 +:101630008078806414968C93149711961C921E9255 +:1016400013961C921E921297DD2009F4E0C0F80157 +:101650001186C8010E94D2049A838983CE01019623 +:101660000E94A306672B61F580FD2AC06DE5C801C5 +:101670000E94C10481112FC0DA94D8016D917C9130 +:10168000C7010E94B206009709F4BEC04D2DBC01EF +:10169000C8010E94220A9A838983CE0101960E9482 +:1016A000A306672B69F480FD0BC0C8010E94D20419 +:1016B0009A838983CE0101960E94A306672B19F0B5 +:1016C00089819A819DCF80FDFBCF6DE5C8010E9485 +:1016D000C104882311F080E098C06CE2C8010E9428 +:1016E000C1048111CACF82E090C0C8010E941306D4 +:1016F0009B019B2CAC2CB82EC92E23963FAF2EAF4E +:101700002397CE018F5B9F4F0E94A306672B81F426 +:1017100080FD0EC0C8010E94D20423969FAF8EAFF9 +:101720002397CE018F5B9F4F0E94A306672B39F052 +:1017300022968FAD229723969FAD239761CF80FD90 +:10174000F7CF6AE3C8010E94C104882361F26B2DC0 +:101750007C2DD7018D919C910E94F809BC01892BA9 +:1017600081F4F80160817181C7010E94B206FC0119 +:10177000892B09F449C0848180688483B682C7823A +:10178000BF014D2DC8010E94220A23969FAF8EAF44 +:101790002397CE018F5B9F4F0E94A306672B41F6D4 +:1017A00080FDC6CFC8010E94D20423969FAF8EAFA2 +:1017B0002397CE018F5B9F4F0E94A306672B09F0F2 +:1017C000B7CF80FDB5CF6DE7C8010E94C10481117C +:1017D00082CF6CE2C8010E94C104882309F483CF40 +:1017E000C8010E94D20423969FAF8EAF2397CE01EB +:1017F0008F5B9F4F0E94A306672B09F099CF80FD56 +:1018000097CFB92CCA2C9BCE83E090E0F9CE85E02F +:10181000FCCFC8010E94130669837A838B839C8363 +:10182000CE0101960E94A306672B09F049CF80FDE7 +:1018300047CF2B813C81D70114968C9114978078E7 +:10184000856014968C9314972D933C9344CFF501A7 +:10185000ED0DF11D108289818437B9F4D7011496FA +:101860008C9114978078866014968C9381E090E038 +:10187000A0E0B0E0F70180839183A283B38390E07E +:10188000F4E0DF12BDCE80E0BBCE863689F4D7010E +:1018900014968C9114978078866014968C93F70137 +:1018A000108211821282138281E090E0F5E0E9CF8C +:1018B0008E3631F481E090E024E0D212A1CEE3CF65 +:1018C000B501CE018F5B9F4F0E943C0325964CAD26 +:1018D0005DAD6EAD7FAD25972A968FAD2A978A3084 +:1018E00061F08C30C1F0883009F0FDCED70114963C +:1018F0008C9114978078886006C0D70114968C91DB +:10190000149780788A6014968C93F70140835183F2 +:1019100062837383E0CE29964CAD5DAD6EAD7FAD35 +:101920002997D70114968C91149780788C6014961F +:101930008C93F7014083518362837383CCCE0097ED +:1019400029F0FC01808191810C94F80990E080E0FD +:101950000895EF92FF920F931F93CF93DF93CDB72C +:10196000DEB72E970FB6F894DEBF0FBECDBFFC01D9 +:1019700001811281E580F6801A8619861C861B86F5 +:101980001E861D86CE0109960E94C6091A821982FA +:101990001C821B821E821D82BE01675F7F4FCE01AB +:1019A00001960E94C60981E090E098878F83CE015E +:1019B00009960E946B09B701C8010E949F0CFC01A7 +:1019C000892B39F194819F77963029F0D8F49230A1 +:1019D00000F1943060F50F811885CE0101960E94C8 +:1019E0006B0981E0012B09F080E02E960FB6F89488 +:1019F000DEBF0FBECDBFDF91CF911F910F91FF9042 +:101A0000EF9008959C3039F368F4983021F39A30C0 +:101A100011F381E090E029813A81232BC9F490E011 +:101A200080E016C09032B9F2903499F7D4CF60813B +:101A3000718189819A816817790769F0009771F03F +:101A40006115710571F00E94071D919581959109AD +:101A500098878F83C0CF90E080E0F7CF8FEF9FEF24 +:101A6000F4CF81E090E0F1CFFC01248125FF04C098 +:101A7000808191810C94F80990E080E008952F9284 +:101A80003F924F925F926F927F928F929F92AF920E +:101A9000BF92CF92DF92EF92FF920F931F93CF935B +:101AA000DF93CDB7DEB7C25BD1400FB6F894DEBF8F +:101AB0000FBECDBFFC01CE010E969A8389839C8315 +:101AC0008B834EE951E04C0F5D1F5E834D83588739 +:101AD0004F839D8590789D87208131818481958178 +:101AE000820F931F4D5951407A01C256DE4F5983E0 +:101AF0004883CE59D140C056DE4F59834883C05ADF +:101B0000D140CE55DE4F39832883C25AD140CC55BF +:101B1000DE4F99838883C45AD140C955DE4F18825D +:101B2000C75AD1405E0159E0A50EB11C4AE0B5018B +:101B3000CE0182569E4F0E94220AC855DE4F9983DD +:101B40008883C85AD140CE0188559E4F0E94A30673 +:101B5000672BC9F480FD17C0CA55DE4F8881C65A6D +:101B6000D140882381F08D85982F9F779C3019F084 +:101B70008D77883041F482E090E0C855DE4F99833C +:101B80008883C85AD140C855DE4F08811981C85A88 +:101B9000D140C255DE4F19830883CE5AD140CE01C1 +:101BA00082559E4F0E94A306672B09F00BC16C0162 +:101BB00021E0C222DD2480FD05C18D85850185FDE2 +:101BC00002C000E010E06FE771E0CE0188559E4F43 +:101BD0000E94E709C156DE4F0883CF59D140C05655 +:101BE000DE4F1883C05AD140CF55DE4FF982E882CC +:101BF000C15AD14038E8A32E31E0B32ECD55DE4F87 +:101C0000B982A882C35AD140BE0168557E4FCE0129 +:101C100082569E4F0E94A90C982ECE0188559E4F49 +:101C20000E946B099110F6C06AEB71E0CE018855F5 +:101C30009E4F0E94E709C156DE4F0883CF59D1401D +:101C4000C056DE4F1883C05AD140CF55DE4FF982BF +:101C5000E882C15AD140CD55DE4FB982A882C35A1D +:101C6000D140BE0168557E4FCE0182569E4F0E94E4 +:101C7000A90CD82ECE0188559E4F0E946B09DD20FD +:101C800009F404C266E971E0C8010E949F0C009744 +:101C900021F061EA71E00E94340D0E944F05382E58 +:101CA00066E971E0C8010E949F0C009721F065EB86 +:101CB00071E00E94340D0E94EC04C055DE4F688331 +:101CC000C05BD140CF54DE4F7883C15BD140282E1A +:101CD000CE54DE4F9883C25BD140F5E0EF2EF12C5D +:101CE0000BE613E0A3E78A2EA5E09A2EBBEDAB2E00 +:101CF000B5E1BB2E61E0832D0E940A02C801019765 +:101D0000F1F760E0832D0E940A0287EC99E20197C7 +:101D1000F1F7C055DE4F4880C05BD140CF54DE4F55 +:101D20005880C15BD140622CCE54DE4F7880C25BBC +:101D3000D140E0E2CE2ED12C61E0832D77FE8DC123 +:101D40000E940A02C8010197F1F760E0832D0E940A +:101D50000A02C5010197F1F761E0832D0E940A0292 +:101D6000C8010197F1F760E0832D0E940A02C401C7 +:101D70000197F1F7440C551C661C771C41E0C41A0E +:101D8000D108D1F661E0832D0E940A02C8010197B3 +:101D9000F1F760E0832D0E940A028BE995EA019732 +:101DA000F1F761E0832D0E940A02C8010197F1F763 +:101DB00060E0832D0E940A0251E0E51AF10809F063 +:101DC00099CF0EC08BE791E00630110538F4000F73 +:101DD000111FF801E35FFE4F808191810E947D0811 +:101DE000CE54DE4F0FB6F894DEBF0FBECDBFDF91ED +:101DF000CF911F910F91FF90EF90DF90CF90BF9008 +:101E0000AF909F908F907F906F905F904F903F909A +:101E10002F90089566E971E0C8010E949F0C009719 +:101E200021F061EA71E00E94340D0E944F05F82E06 +:101E3000E92E66E971E0C8010E949F0C009721F02D +:101E40006AEA71E00E94340D0E944F051C0166E9A8 +:101E500071E0C8010E949F0C009721F4412C512C85 +:101E600032014DC065EB71E00E94340DFC01892BFD +:101E7000A9F394819F77963039F1F8F4943070F398 +:101E800060817181CE0182569E4F0E943C03C256F2 +:101E9000DE4F488059806A807B80CE59D140CA5538 +:101EA000DE4F8881C65AD1408A3009F483C08C3015 +:101EB00009F489C0883091F60BC09A3061F09C30EB +:101EC00009F4A5C0983051F640805180628073803B +:101ED00077FE15C0C3CF408051806280738041E09F +:101EE00044165104610440E8740608F0B7CF7094BA +:101EF000609450944094411C511C611C711CF092E0 +:101F00006F04E092700461E08F2D0E947602809150 +:101F10006F0490917004019609F498C000916D04CB +:101F200010916E040F3F1007B1F0023070F4F80109 +:101F3000FF27013009F470C0E898EE0FFF1FEF5F34 +:101F4000FE4F8BE393E0918380838FEF9FEF90931D +:101F50006E0480936D04812C912C540183948091A4 +:101F6000710490917204C816D9060CF066C0710114 +:101F700051E0E51AF108F7FC56C0D501C4010E2C5A +:101F800004C0880F991FAA1FBB1F0A94D2F784218F +:101F90009521A621B721892B8A2B8B2B09F43EC0D2 +:101FA0008091790490917A040E94450281E0E81AB8 +:101FB000F108E1CF51E045165104610450E875067F +:101FC00008F04CCF94CFCE55DE4F88809980AA8000 +:101FD000BB80C25AD14020E030E040E05FECC50158 +:101FE000B4010E94EC1A87FD39CF20E030E040E0D8 +:101FF0005FE4C501B4010E94191818160CF42ECF25 +:10200000C501B4010E94B61A2B013C0178CF808033 +:102010009180A280B380DFCFE9988FCF8091770441 +:1020200090917804C1CF80917504909176040E94BC +:1020300045029FEFC91AD90A92CF0F3F100731F01E +:1020400010936E0400936D040E94A8008FEF9FEF21 +:102050009093700480936F04C3CE0E940A02C8015B +:102060000197F1F760E0832D0E940A02C4010197F5 +:10207000F1F761E0832D0E940A02C8010197F1F790 +:1020800060E0832D0E940A02C50172CE6AEC71E005 +:10209000CE0188559E4F0E94E709C156DE4F088346 +:1020A000CF59D140C056DE4F1883C05AD140CF55CA +:1020B000DE4FF982E882C15AD140CD55DE4FB98258 +:1020C000A882C35AD140BE0168557E4FCE018256C8 +:1020D0009E4F0E94A90CD82ECE0188559E4F0E947B +:1020E0006B09DD2009F47EC066E971E0C8010E9439 +:1020F0009F0C009721F061EA71E00E94340D0E946C +:102100004F05D82E66E971E0C8010E949F0C009728 +:1021100021F06AEA71E00E94340D0E944F057C01B3 +:1021200066E971E0C8010E949F0C009721F065EB01 +:1021300071E00E94340D0E94EC044B015C01D092CE +:102140004E058DE090E09093500580934F0580916F +:102150004E0561E00E94760280914E0560E00E948B +:102160000A0288E293E20E94CC0284E991E10E9493 +:102170003802C7010197C12CD12C7601C39404C049 +:10218000CC0CDD1CEE1CFF1C8A95D2F7C114D104C7 +:10219000E104F104F1F0D501C4018C219D21AE21AF +:1021A000BF21892B8A2B8B2B69F080E392E00E9460 +:1021B000CC028AE996E00E943802F694E794D7941C +:1021C000C794E4CF80E392E00E94CC0280E392E0E7 +:1021D000F2CF80E392E00E94CC0290E080E00E9487 +:1021E0003802FECD62ED71E0CE0188559E4F0E940F +:1021F000E709C156DE4F0883CF59D140C056DE4FA4 +:102200001883C05AD140CF55DE4FF982E882C15AB7 +:10221000D140CD55DE4FB982A882C35AD140BE010C +:1022200068557E4FCE0182569E4F0E94A90CD82E33 +:10223000CE0188559E4F0E946B09DD2009F4EDC048 +:1022400066E971E0C8010E949F0C009721F061EAE5 +:1022500071E00E94340D0E944F05F82E66E971E08E +:10226000C8010E949F0C009721F06CED71E00E9464 +:10227000340D0E944F058C0180916A048C3008F067 +:1022800053C061E08F2D0E94760280916A04282F4E +:1022900030E0F901EE0FFF1FE20FF31FE55CFB4F8B +:1022A0002F2D2F739081907C922B908310926B0432 +:1022B00010926C042CE0622F0E94F61A829FB001EB +:1022C000112430E020E0AB01420F531FFA01EE0F62 +:1022D000FF1FE40FF51FE55CFB4F908196FD16C0D4 +:1022E0002F5F3F4F2C30310571F781110FC01092D5 +:1022F000800082E08093810010928500109284001B +:10230000B19A80916F00826080936F00E0916A04BF +:102310008E2F90E0FC01EE0FFF1FE80FF91FE55C28 +:10232000FB4F808180648083F0906A04003282E0F9 +:1023300018070CF03DC080916B04E8E88E2E912CBC +:10234000881A910887FD9394880C991C880C991C15 +:10235000092C000CAA08BB0880916C0428E532E027 +:10236000281B310987FD3395220F331F220F331F9E +:10237000032E000C440B550B281939094A095B0937 +:10238000D801053B110514F0A4EBB0E0B7FF02C083 +:10239000B0E0A0E00E94671924EB30E040E050E09C +:1023A0000E943D1989019A01080D191D2A1D3B1D26 +:1023B0009BE09F1508F414CD20916B0488E890E011 +:1023C000821B910927FD9395880F991F880F991FEC +:1023D0000817190784F020916C0488E592E0821BAD +:1023E000910927FD9395880F991F880F991F08174A +:1023F00019070CF4C8010297880F991F4FB7F8947A +:102400002F2D30E0F901EE0FFF1FE20FF31FE55C07 +:10241000FB4F928381834FBFE3CC62EE71E0CE012C +:1024200088559E4F0E94E709C156DE4F0883CF5959 +:10243000D140C056DE4F1883C05AD140CF55DE4F31 +:10244000F982E882C15AD140CD55DE4FB982A882C7 +:10245000C35AD140BE0168557E4FCE0182569E4F71 +:102460000E94A90CD82ECE0188559E4F0E946B0960 +:10247000DD2029F166E971E0C8010E949F0C0097F8 +:1024800021F061EA71E00E94340D0E944F057C0149 +:1024900066E971E0C8010E949F0C009721F06BEE85 +:1024A00071E00E94340D0E94CD05182FF0926E0449 +:1024B000E0926D040E94A8001093000191CC62EF9D +:1024C00071E0CE0188559E4F0E94E709C156DE4F4C +:1024D0000883CF59D140C056DE4F1883C05AD1402F +:1024E000CF55DE4FF982E882C15AD140CD55DE4F3B +:1024F000B982A882C35AD140BE0168557E4FCE0131 +:1025000082569E4F0E94A90CF82ECE0188559E4FF0 +:102510000E946B09FF2009F463CC66E971E0C801F1 +:102520000E949F0C009721F061EA71E00E94340D37 +:102530000E944F057C0166E971E0C8010E949F0C72 +:10254000009721F06BEE71E00E94340D0E94CD05E2 +:1025500080939D03F0929803E092970341CC0F93F0 +:102560001F93CF93DF9300D000D000D0CDB7DEB75C +:102570008EE993E00E941A01853239F51A82198298 +:102580001C821B821E821D8264E674E0CE010196CD +:102590000E94C609CE0101960E943F0DCE01019610 +:1025A0000E946B0950E040E06BE671E084E694E045 +:1025B0000E949B0926960FB6F894DEBF0FBECDBFD2 +:1025C000DF91CF911F910F91089589831A82009115 +:1025D0006804109169040F5F1F4FB80184E694E00E +:1025E0000E947309882331F32091640430916504BB +:1025F0008091680490916904BE016F5F7F4F820FE4 +:10260000931F0E94101D1093690400936804D2CF99 +:102610000E94480181110C94AF1208951F920F92ED +:102620000FB60F9211242F933F934F935F936F93A5 +:102630007F938F939F93AF93BF93EF93FF938EE915 +:1026400093E00E945201FF91EF91BF91AF919F9152 +:102650008F917F916F915F914F913F912F910F904B +:102660000FBE0F901F9018951F920F920FB60F92EA +:1026700011242F938F939F93EF93FF93E091AE03D9 +:10268000F091AF038081E091B403F091B50382FD36 +:102690001BC090818091B7038F5F8F732091B80327 +:1026A000821741F0E091B703F0E0E256FC4F958FBE +:1026B0008093B703FF91EF919F918F912F910F908E +:1026C0000FBE0F901F9018958081F4CF1F920F922C +:1026D0000FB60F9211242F933F938F939F93AF9335 +:1026E000BF938091860390918703A0918803B09156 +:1026F00089033091810323E0230F2D3758F501968C +:10270000A11DB11D209381038093860390938703BD +:10271000A0938803B09389038091820390918303EF +:10272000A0918403B09185030196A11DB11D8093F2 +:10273000820390938303A0938403B0938503BF9196 +:10274000AF919F918F913F912F910F900FBE0F905E +:102750001F90189526E8230F0296A11DB11DD2CF18 +:102760001F920F920FB60F9211242F933F934F9306 +:102770005F936F937F938F939F93AF93BF93EF93E9 +:10278000FF93E0910301F09104010995FF91EF910E +:10279000BF91AF919F918F917F916F915F914F9179 +:1027A0003F912F910F900FBE0F901F9018951F9281 +:1027B0000F920FB60F9211242F933F934F935F9375 +:1027C0006F937F938F939F93AF93BF93EF93FF93F9 +:1027D000E0910101F09102010995FF91EF91BF9104 +:1027E000AF919F918F917F916F915F914F913F91A9 +:1027F0002F910F900FBE0F901F9018951F920F9260 +:102800000FB60F9211242F933F934F935F936F93C3 +:102810007F938F939F93AF93BF93CF93DF93EF9368 +:10282000FF9380918003C0915F04D0E087FF24C0B4 +:102830001092850010928400809180038F5F8093B6 +:10284000800380918003082E000C990B8C179D0744 +:1028500024F4809180038C30C4F1809184009091A5 +:102860008500049680349C4908F47AC080918400E5 +:1028700090918500049676C080918003082E000C0C +:10288000990B8C179D07C4F6E09180038E2FEE0FF5 +:10289000990BFC01EE0FFF1FE80FF91FE55CFB4FE2 +:1028A000808186FFC9CFE09180038E2FEE0F990BB8 +:1028B000FC01EE0FFF1FE80FF91FE55CFB4F808165 +:1028C00060E08F730E940A02B7CF2091840030919C +:1028D0008500E09180038E2FEE0F990BFC01EE0F27 +:1028E000FF1FE80FF91FE55CFB4F81819281820F8A +:1028F000931F9093890080938800E09180038E2F2E +:10290000EE0F990BFC01EE0FFF1FE80FF91FE55CBE +:10291000FB4F808186FF11C0E09180038E2FEE0F68 +:10292000990BFC01EE0FFF1FE80FF91FE55CFB4F51 +:10293000808161E08F730E940A02FF91EF91DF9125 +:10294000CF91BF91AF919F918F917F916F915F9147 +:102950004F913F912F910F900FBE0F901F901895A0 +:1029600080E49CE990938900809388008FEF8093A6 +:102970008003E3CF1F920F920FB60F9211242F9373 +:102980003F934F935F936F937F938F939F93AF93F7 +:10299000BF93CF93DF93EF93FF9320917D0430E0BB +:1029A000F901E458FF4F8491F901E255FF4FD491AA +:1029B000F901E656FF4FC491CC2379F081110E94B2 +:1029C000E101EC2FF0E0EE0FFF1FE057FF4FA59164 +:1029D000B491EC91ED2381E009F480E02091810431 +:1029E000309182042F5F3F4F309382042093810403 +:1029F00090918004953618F096E090937C04909125 +:102A00007C04943009F466C0B8F49230F1F093304D +:102A100009F444C090917F04992309F46BC081119B +:102A20007CC080917E04882309F463C080917E0479 +:102A300061E00E940A025EC0953009F457C09630EA +:102A400049F791E090934D054FC08111E3CF20915C +:102A50008104309182042436310528F410928204D6 +:102A600010928104D7CF10924D0510928004E0910E +:102A7000800491E09E0F90938004F0E02091810407 +:102A800030918204EE0FFF1FE458FB4F30872783FD +:102A9000109282041092810493E019C0813009F0F1 +:102AA000B9CFE091800491E09E0F90938004F0E014 +:102AB0002091810430918204EE0FFF1FE458FB4FF8 +:102AC00030872783109282041092810494E09093BF +:102AD0007C04A0CF882359F2209181043091820494 +:102AE0002536310508F496CF95E0F1CF811192CFCC +:102AF000B5CF2D9AFF91EF91DF91CF91BF91AF911B +:102B00009F918F917F916F915F914F913F912F9105 +:102B10000F900FBE0F901F90189580917E04882310 +:102B200021F080917E0460E084CF2D98E3CFCF9395 +:102B3000DF931092A1031092A00388EE93E0A0E02F +:102B4000B0E08093A2039093A303A093A403B09357 +:102B5000A5038DE491E090939F0380939E0385EC01 +:102B600090E09093AB038093AA0384EC90E0909361 +:102B7000AD038093AC0380EC90E09093AF0380931F +:102B8000AE0381EC90E09093B1038093B00382ECAC +:102B900090E09093B3038093B20386EC90E090931F +:102BA000B5038093B4031092B7031092B803109248 +:102BB000B9031092BA0383E080934E05CFEFDFEFA5 +:102BC000D0937004C0936F048AE090E090937204F5 +:102BD0008093710449E050E062EC70E083E794E098 +:102BE0000E941018D0936E04C0936D048CE390E0A3 +:102BF0009093060180930501109260041092610485 +:102C0000109262041092630480915F048C30D0F4BF +:102C100091E0980F90935F0480936A0490E0FC0128 +:102C2000EE0FFF1FE80FF91FE55CFB4F88EB9BE001 +:102C3000928381836BE671E084E694E0DF91CF912B +:102C40000C94E7098FEF80936A04F4CF789484B5ED +:102C5000826084BD84B5816084BD85B5826085BD98 +:102C600085B5816085BD80916E00816080936E0026 +:102C70001092810080918100826080938100809118 +:102C800081008160809381008091800081608093C9 +:102C900080008091B10084608093B1008091B00089 +:102CA00081608093B00080917A00846080937A0084 +:102CB00080917A00826080937A0080917A008160AE +:102CC00080937A0080917A00806880937A001092D5 +:102CD000C100E091AE03F091AF0382E08083E09108 +:102CE000AA03F091AB031082E091AC03F091AD0325 +:102CF0008FEC80831092B603E091B203F091B3039E +:102D000086E08083E091B003F091B103808180611F +:102D10008083E091B003F091B1038081886080836B +:102D2000E091B003F091B103808180688083E091ED +:102D3000B003F091B10380818F7D808310926E0487 +:102D400010926D040E94A80081E08093000180939E +:102D50009D0388E090E090939803809397034BE95C +:102D6000E42EF12C412C50EC552E59E7652E54ECF5 +:102D7000752E2FB7F8948091860390918703A091C8 +:102D80008803B09189032FBF20919D03222309F46A +:102D900003C14091990350919A0360919B037091F4 +:102DA0009C038C019D01041B150B260B370BB901ED +:102DB000A80140325E446105710508F4EDC08093BE +:102DC000990390939A03A0939B03B0939C03C091A3 +:102DD0009703D0919803CE019927FC01E255FF4F4C +:102DE000D490FC01E656FF4FE491F0E0EE0FFF1F98 +:102DF000E057FF4F059114911092920310929303A4 +:102E000010929403109295031092960361E08C2F18 +:102E10000E94760260E08C2F0E940A0262E170E05C +:102E200080E090E00E94080361E08C2F0E940A027B +:102E3000C7010197F1F760E08C2F0E94760280E9CC +:102E400091E0F80120812D2199F40197D1F740926A +:102E50008A0350928B0360928C0370928D03409290 +:102E60008E0350928F03609290037092910364C01E +:102E700080E991E0F80120812D2119F00197D1F727 +:102E8000E6CF98E2392E20E8C22E212C80E991E08D +:102E9000F80120812D2119F40197D1F7D8CF0E9494 +:102EA000A7024B015C0180E991E0F80120812D210E +:102EB00019F00197D1F7CBCF0E94A70268197909C1 +:102EC0008A099B09693271058105910538F0E22D67 +:102ED000F0E0E657FC4F80858C298087C69419F472 +:102EE000239480E8C82E3A943110D0CF61E08C2F23 +:102EF0000E94760261E08C2F0E940A026091920388 +:102F000070E090E080E00E941E1860938A03709346 +:102F10008B0380938C0390938D036091940370E0F6 +:102F200090E080E00E941E1860938E0370938F03E0 +:102F30008093900390939103C3E0D0E08BEF91E0F6 +:102F40000E942C0860918E0370918F0380919003F2 +:102F50009091910342E00E948F0885E392E00E94E5 +:102F60007D0888E392E00E942C0860918A037091AA +:102F70008B0380918C0390918D0342E00E948F0817 +:102F800085E392E00E947D0864E670E080E090E0D6 +:102F90000E940803219791F680910001882301F196 +:102FA0008091600490916104A0916204B0916304E7 +:102FB0000097A105B105A1F0892BD1F48FE692E02D +:102FC0000E942C0868EC70E080E090E00E9408030A +:102FD00010926004109261041092620410926304D3 +:102FE0000E944801882309F4C4CE0E94AF12C1CECA +:102FF00080E892E00E942C08609160047091610466 +:1030000080916204909163044AE00E94390885E34C +:1030100092E00E947D08D6CF84E694E00C946B0980 +:10302000FB01DC0102C005900D9241505040D8F7E1 +:1030300008950E945B1808F481E00895E89409C09F +:1030400097FB3EF490958095709561957F4F8F4FDB +:103050009F4F9923A9F0F92F96E9BB279395F695F1 +:10306000879577956795B795F111F8CFFAF4BB0F6F +:1030700011F460FF1BC06F5F7F4F8F4F9F4F16C0D3 +:10308000882311F096E911C0772321F09EE8872F5D +:10309000762F05C0662371F096E8862F70E060E019 +:1030A0002AF09A95660F771F881FDAF7880F969592 +:1030B000879597F90895990F0008550FAA0BE0E836 +:1030C000FEEF16161706E807F907C0F012161306EA +:1030D000E407F50798F0621B730B840B950B39F42A +:1030E0000A2661F0232B242B252B21F408950A2690 +:1030F00009F4A140A6958FEF811D811D08950E94BE +:1031000092180C9403190E94F51838F00E94FC18CC +:1031100020F0952311F00C94EC180C94F218112463 +:103120000C9437190E94141970F3959FC1F3950FF1 +:1031300050E0551F629FF001729FBB27F00DB11D3B +:10314000639FAA27F00DB11DAA1F649F6627B00DCB +:10315000A11D661F829F2227B00DA11D621F739FB4 +:10316000B00DA11D621F839FA00D611D221F749FC2 +:103170003327A00D611D231F849F600D211D822F09 +:10318000762F6A2F11249F5750409AF0F1F0882330 +:103190004AF0EE0FFF1FBB1F661F771F881F91505D +:1031A0005040A9F79E3F510580F00C94EC180C9408 +:1031B00037195F3FE4F3983ED4F38695779567958A +:1031C000B795F795E7959F5FC1F7FE2B880F911D87 +:1031D0009695879597F9089597F99F6780E870E02D +:1031E00060E008959FEF80EC089500240A9416167D +:1031F000170618060906089500240A9412161306E5 +:10320000140605060895092E0394000C11F4882372 +:1032100052F0BB0F40F4BF2B11F460FF04C06F5F8E +:103220007F4F8F4F9F4F089557FD9058440F551F64 +:1032300059F05F3F71F04795880F97FB991F61F038 +:103240009F3F79F087950895121613061406551FAF +:10325000F2CF4695F1DF08C0161617061806991F1B +:10326000F1CF86957105610508940895E894BB2710 +:1032700066277727CB0197F90895052E97FB1EF453 +:1032800000940E94541957FD07D00E94A61907FC0C +:1032900003D04EF40C9454195095409530952195D7 +:1032A0003F4F4F4F5F4F0895909580957095619572 +:1032B0007F4F8F4F9F4F08950E94C819A59F900D73 +:1032C000B49F900DA49F800D911D11240895B7FF08 +:1032D0000C945C190E945C19821B930B08952F9229 +:1032E0003F924F925F926F927F928F929F92AF9296 +:1032F000BF92CF92DF92EF92FF920F931F93CF93E3 +:10330000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF79 +:103310000FBECDBF09942A88398848885F846E849F +:103320007D848C849B84AA84B984C884DF80EE80E9 +:10333000FD800C811B81AA81B981CE0FD11D0FB6F2 +:10334000F894DEBF0FBECDBFED010895A1E21A2EA5 +:10335000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F39 +:10336000A217B307E407F50720F0A21BB30BE40B89 +:10337000F50B661F771F881F991F1A9469F76095D0 +:103380007095809590959B01AC01BD01CF0108958A +:10339000A29FB001B39FC001A39F700D811D112496 +:1033A000911DB29F700D811D1124911D08955058DB +:1033B000BB27AA270E94EF190C9403190E94F51845 +:1033C00038F00E94FC1820F039F49F3F19F426F4DD +:1033D0000C94F2180EF4E095E7FB0C94EC18E92F2E +:1033E0000E94141958F3BA176207730784079507E8 +:1033F00020F079F4A6F50C9436190EF4E0950B2E16 +:10340000BA2FA02D0B01B90190010C01CA01A00136 +:103410001124FF27591B99F0593F50F4503E68F191 +:103420001A16F040A22F232F342F4427585FF3CFD2 +:10343000469537952795A795F0405395C9F77EF4A3 +:103440001F16BA0B620B730B840BBAF09150A1F0EC +:10345000FF0FBB1F661F771F881FC2F70EC0BA0F72 +:10346000621F731F841F48F4879577956795B795FA +:10347000F7959E3F08F0B0CF9395880F08F09927F5 +:10348000EE0F9795879508950E94581A0C9403198A +:103490000E94FC1858F00E94F51840F029F45F3F94 +:1034A00029F00C94EC1851110C9437190C94F21863 +:1034B0000E94141968F39923B1F3552391F3951BD6 +:1034C000550BBB27AA2762177307840738F09F5F45 +:1034D0005F4F220F331F441FAA1FA9F335D00E2EB2 +:1034E0003AF0E0E832D091505040E695001CCAF71F +:1034F0002BD0FE2F29D0660F771F881FBB1F2617E2 +:1035000037074807AB07B0E809F0BB0B802DBF01B8 +:10351000FF2793585F4F3AF09E3F510578F00C9487 +:10352000EC180C9437195F3FE4F3983ED4F386957A +:1035300077956795B795F7959F5FC9F7880F911DA8 +:103540009695879597F90895E1E0660F771F881F94 +:10355000BB1F621773078407BA0720F0621B730B47 +:10356000840BBA0BEE1F88F7E09508950E94BD1AF0 +:103570006894B1110C94371908950E941C1988F0B1 +:103580009F5798F0B92F9927B751B0F0E1F0660F27 +:10359000771F881F991F1AF0BA95C9F714C0B13068 +:1035A00091F00E943619B1E008950C943619672FF6 +:1035B000782F8827B85F39F0B93FCCF38695779597 +:1035C0006795B395D9F73EF4909580957095619580 +:1035D0007F4F8F4F9F4F08950E945B1808F48FEF25 +:1035E00008950E945B18880B990B0895991B79E048 +:1035F00004C0991F961708F0961B881F7A95C9F783 +:1036000080950895AA1BBB1B51E107C0AA1FBB1FD1 +:10361000A617B70710F0A61BB70B881F991F5A955E +:10362000A9F780959095BC01CD010895EE0FFF1F7D +:103630000590F491E02D09940F931F93CF93DF939E +:103640008230910510F482E090E0E0915305F09112 +:10365000540530E020E0B0E0A0E0309799F4211567 +:10366000310509F44AC0281B390B24303105D8F53F +:103670008A819B816115710589F1FB0193838283A6 +:10368000FE0111C040815181028113814817590701 +:10369000E0F04817590799F4109761F012960C93CF +:1036A000129713961C933296CF01DF91CF911F9101 +:1036B0000F9108950093530510935405F4CF2115ED +:1036C000310551F04217530738F0A901DB019A0187 +:1036D000BD01DF01F801C1CFEF01F9CF909354058F +:1036E00080935305CDCFFE01E20FF31F8193919399 +:1036F0002250310939832883D7CF20915105309149 +:103700005205232B41F42091090130910A01309395 +:103710005205209351052091070130910801211590 +:10372000310541F42DB73EB740910B0150910C018A +:10373000241B350BE0915105F0915205E217F30778 +:10374000A0F42E1B3F0B2817390778F0AC014E5F11 +:103750005F4F2417350748F04E0F5F1F50935205F7 +:1037600040935105819391939FCFF0E0E0E09CCF8F +:10377000CF93DF930097E9F0FC0132971382128216 +:10378000A0915305B0915405ED0130E020E0109771 +:10379000A1F420813181820F931F20915105309136 +:1037A00052052817390709F061C0F0935205E093DC +:1037B0005105DF91CF910895EA01CE17DF07E8F5B3 +:1037C0004A815B819E0141155105B1F7E901FB83F7 +:1037D000EA8349915991C40FD51FEC17FD0761F495 +:1037E000808191810296840F951FE90199838883D6 +:1037F000828193819B838A83F0E0E0E012968D9131 +:103800009C9113970097B9F52D913C911197CD019B +:103810000296820F931F209151053091520528176F +:10382000390739F6309751F5109254051092530527 +:10383000B0935205A0935105BCCFD383C28340817E +:103840005181840F951FC817D90761F44E5F5F4FF0 +:1038500088819981480F591F518340838A819B81B8 +:10386000938382832115310509F0B0CFF09354057D +:10387000E09353059ECFFD01DC01C0CF138212827D +:10388000D7CFB0E0A0E0E7E4FCE10C9471198C0123 +:10389000009751F4CB010E941C1B8C01C801CDB7CD +:1038A000DEB7E0E10C948D19FC01E60FF71F9C01D7 +:1038B00022503109E217F30708F49DC0D901CD91D8 +:1038C000DC911197C617D70798F0C530D10530F3B2 +:1038D000CE0104978617970708F3C61BD70B2297CC +:1038E000C193D1936D937C93CF010E94B81BD6CF27 +:1038F0005B01AC1ABD0A4C018C0E9D1EA0915305B4 +:10390000B0915405512C412CF12CE12C109731F53C +:1039100080915105909152058815990509F05CC078 +:103920004616570608F058C080910701909108018B +:10393000009741F48DB79EB740910B0150910C0157 +:10394000841B950BE817F90708F055C0F093520552 +:10395000E0935105F90171836083A0CF8D919C9113 +:10396000119712966C90129713967C901397A81546 +:10397000B90559F56C0142E0C40ED11CCA14DB0430 +:1039800020F1AC014A195B09DA011296159780F013 +:103990006282738251834083D9016D937C93E114D9 +:1039A000F10471F0D7011396FC93EE93129776CF42 +:1039B00022968C0F9D1FF90191838083F301EFCF35 +:1039C000F0935405E093530569CF4816590608F45F +:1039D0002C017D01D3019ACFCB010E941C1B7C01DD +:1039E000009749F0AE01B8010E94FE1CC8010E9478 +:1039F000B81B870153CF10E000E050CFFB01DC0182 +:103A000002C001900D9241505040D8F70895FB013B +:103A1000DC018D91019080190110D9F3990B089563 +:103A2000FB01DC0101900D920020E1F7089510E008 +:103A3000CDE7D0E004C0FE010E94161B2196CE37D0 +:083A4000D107C9F7F894FFCF8C +:103A4800013B033B033C00000055058000B302B670 +:103A580002C602D302DC02E902CDCCCC3D0AD72350 +:103A68003C17B7D13877CC2B329595E6241FB14F48 +:103A78000A000020410000C84200401C4620BCBE8D +:103A88004CCA1B0E5AAEC59D74000000007401DEBE +:103A9800000B01C1013C011A012E012F2F22225CCB +:103AA8005C6208660C6E0A720D7409000D0A006EDD +:103AB800616E00696E66006F7666003F3F3F006585 +:103AC8006D69745F3433330066756E6374696F6E45 +:103AD8005F6E616D6500706172616D6574657273AA +:103AE80000646174615F70696E006269745F6C651F +:103AF8006E67746800636F646500656D69745F3430 +:103B080033335F636861636F6E00656D69745F6905 +:103B180072007365745F736572766F00616E676CAF +:103B28006500726563765F34333300656E61626C7D +:103B38006500726563765F646874007B2266756EE3 +:103B48006374696F6E5F6E616D65223A2264687492 +:103B58005F74656D7065726174757265222C227070 +:103B68006172616D6574657273223A7B2276616C4D +:103B78007565223A007D7D007B2266756E637469E7 +:103B88006F6E5F6E616D65223A226468745F687556 +:103B98006D6964697479222C22706172616D657433 +:103BA800657273223A7B2276616C7565223A0055FC +:103BB8006E6B6E6F776E20656E636F64696E6700FB +:103BC8007B2266756E6374696F6E5F6E616D6522C8 +:103BD8003A22726563765F343333222C2270617225 +:103BE800616D6574657273223A7B2276616C7565C6 +:103BF800223A004F6B00496E636F6D706C65746597 +:103C0800496E70757400496E76616C6964496E70AE +:103C18007574004E6F4D656D6F7279004E6F7453F9 +:103C28007570706F7274656400546F6F4465657069 +:023C380000008A +:00000001FF diff --git a/server/services/arduino/arduino-code/nano/arduino-code.ino.with_bootloader.hex b/server/services/arduino/arduino-code/nano/arduino-code.ino.with_bootloader.hex new file mode 100644 index 0000000000..8c159b9d15 --- /dev/null +++ b/server/services/arduino/arduino-code/nano/arduino-code.ino.with_bootloader.hex @@ -0,0 +1,1000 @@ +:100000000C947E000C94D7130C94B0130C94A6009F +:100010000C94A6000C94A6000C94A6000C94BA14A0 +:100020000C94A6000C94A6000C94A6000C94FE134D +:100030000C94A6000C94A6000C94A6000C94A600A8 +:100040000C9466130C94A6000C9434130C940E13A9 +:100050000C94A6000C94A6000C94A6000C94A60088 +:100060000C94A6000C94A6000000000024002700B9 +:100070002A0000000000250028002B0000000008D6 +:10008000000201000003040700000000000000005F +:1000900000000000230026002900040404040404D6 +:1000A0000404020202020202030303030303010227 +:1000B00004081020408001020408102001020408F6 +:1000C00010205E01011F01030301008A02010A01E1 +:1000D0000202010064001E47040B0906007C0101B6 +:1000E000060103030100F401060E0102020100C231 +:1000F000011701010202010197150C1811241FBEFE +:10010000CFEFD8E0DEBFCDBF12E0A0E0B1E0E8E481 +:10011000FAE302C005900D92A23FB107D9F725E09E +:10012000A2EFB2E001C01D92A535B207E1F710E0E1 +:10013000CDE7D0E004C02197FE010E94161BCC370A +:10014000D107C9F70E9426160C94171D0C940000C5 +:10015000E0916D04F0916E04EF3FFE0719F11092EB +:1001600060041092610410926204109263042E2FB6 +:10017000E230C0F4FF27EE0FFF1FEF5FFE4F85EE6A +:1001800096E09183808380916900213031F08C7FEB +:10019000816080936900E89A0895837F84608093EA +:1001A0006900E99A08958230910538F0880F991F07 +:1001B000880F991F05970197F1F70895AF92BF92A5 +:1001C000CF92DF92EF92FF920F931F93CF93DF9323 +:1001D0006C017B018B01040F151FEB015E01AE1852 +:1001E000BF08C017D10759F06991D601ED91FC9174 +:1001F0000190F081E02DC6010995892B79F7C501A1 +:10020000DF91CF911F910F91FF90EF90DF90CF90F2 +:10021000BF90AF900895FC01538D448D252F30E0A1 +:10022000842F90E0821B930B541710F0CF96089503 +:1002300001970895FC01918D828D981761F0A28D30 +:10024000AE0FBF2FB11D5D968C91928D9F5F9F73F6 +:10025000928F90E008958FEF9FEF0895FC01918DAC +:10026000828D981731F0828DE80FF11D858D90E019 +:1002700008958FEF9FEF0895FC01918D228D892FB6 +:1002800090E0805C9F4F821B91098F73992708959E +:100290008EE993E00E943C0121E0892B09F420E0E3 +:1002A000822F0895FC01A48DA80FB92FB11DA35A68 +:1002B000BF4F2C91848D90E001968F739927848F86 +:1002C000A689B7892C93A089B1898C9183708064A9 +:1002D0008C93938D848D981306C00288F389E02D4A +:1002E00080818F7D80830895EF92FF920F931F93FB +:1002F000CF93DF93EC0181E0888F9B8D8C8D9813D9 +:100300001AC0E889F989808185FF15C09FB7F894E4 +:10031000EE89FF896083E889F98980818370806430 +:1003200080839FBF81E090E0DF91CF911F910F917B +:10033000FF90EF900895F62E0B8D10E00F5F1F4F8A +:100340000F731127E02E8C8D8E110CC00FB607FC99 +:10035000FACFE889F989808185FFF5CFCE010E9427 +:100360005201F1CFEB8DEC0FFD2FF11DE35AFF4F42 +:10037000F0829FB7F8940B8FEA89FB8980818062B5 +:10038000CFCFCF93DF93EC01888D8823B9F0AA8972 +:10039000BB89E889F9898C9185FD03C0808186FD40 +:1003A0000DC00FB607FCF7CF8C9185FFF2CF80818F +:1003B00085FFEDCFCE010E945201E9CFDF91CF91B1 +:1003C0000895833081F028F4813099F08230A9F0CB +:1003D00008958730A9F08830C9F08430B1F4809155 +:1003E00080008F7D03C0809180008F778093800094 +:1003F000089584B58F7784BD089584B58F7DFBCF34 +:100400008091B0008F778093B00008958091B00004 +:100410008F7DF9CF1F93CF93DF93282F30E0F90121 +:10042000E458FF4F8491F901E255FF4FD491F9014F +:10043000E656FF4FC491CC23A9F0162F81110E94DC +:10044000E101EC2FF0E0EE0FFF1FEE58FF4FA591FA +:10045000B4918FB7F894EC91111108C0D095DE23B8 +:10046000DC938FBFDF91CF911F910895DE2BF8CFE2 +:10047000CF93DF93EC0180914E0560E00E940A0269 +:10048000CE01DF91CF910C94D3001F93CF93DF93D4 +:10049000182FD92F80917B0460E0C1E0811102C048 +:1004A00061E0C0E080916F040E940A0280917304B1 +:1004B000909174049C01129FC001139F900D112410 +:1004C0000E94D3006C2F80916F040E940A028091D9 +:1004D0007304909174049C01D29FC001D39F900D2E +:1004E0001124DF91CF911F910C94D300CF93DF9310 +:1004F00090E0FC01E255FF4F249186569F4FFC018E +:1005000084918823D1F090E0880F991FFC01E8596D +:10051000FF4FA591B491FC01EE58FF4FC591D491C6 +:1005200061110EC09FB7F8948C91E22FE0958E2355 +:100530008C932881E223E8839FBFDF91CF910895B8 +:100540008FB7F894EC91E22BEC938FBFF6CF3FB7C7 +:10055000F8948091820390918303A0918403B091D9 +:10056000850326B5A89B05C02F3F19F00196A11D54 +:10057000B11D3FBFBA2FA92F982F8827BC01CD01ED +:10058000620F711D811D911D42E0660F771F881F4C +:10059000991F4A95D1F708958F929F92AF92BF927B +:1005A000CF92DF92EF92FF926C010E94A7024B0163 +:1005B0005C010D2C000CEE08FF080E94A7026819D0 +:1005C00079098A099B096C157D058E059F05B8F48C +:1005D00080914E0561E00E940A0280914F05909142 +:1005E00050050E94D30080914E0560E00E940A02EF +:1005F00080914F05909150050E94D300DECFFF906F +:10060000EF90DF90CF90BF90AF909F908F90089524 +:100610008F929F92AF92BF92CF92DF92EF92FF9212 +:100620006B017C010E94A7024B015C01C114D10443 +:10063000E104F104B9F00E94A702681979098A0956 +:100640009B09683E73408105910580F321E0C21A41 +:10065000D108E108F10888EE880E83E0981EA11CFD +:10066000B11CE4CFFF90EF90DF90CF90BF90AF90A0 +:100670009F908F90089508954F925F926F927F920E +:100680008F929F92AF92BF92DF92EF92FF920F9361 +:100690001F93CF93DF938C01EB0188818B32D1F1D3 +:1006A0008D32C9F52196EE24E394888190ED980F60 +:1006B0009A3010F08E3289F560E070E0CB01FE01D7 +:1006C0002191A0ED8A2E820E39E0381508F440C041 +:1006D0006A3929E97207820729E1920708F04DC0BB +:1006E000AAE0B0E09B01AC010E945C19912CB12CF6 +:1006F000A12C2401350140945094609470944616C6 +:10070000570668067906C8F1680D791D8A1D9B1D7C +:10071000EF01D5CF2196E12CC8CFF80110821182CC +:100720001282138214821582168217821086C801E3 +:10073000DF91CF911F910F91FF90EF90DF90BF90CD +:10074000AF909F908F907F906F905F904F900895A3 +:10075000211113C0F80160837183828393830E9407 +:100760001E18F80164837583868397838AE0E110FD +:1007700001C088E0F8018087DACFF12CEAE08E2E04 +:10078000912CA12CB12C61157105F0E88F07910512 +:1007900040F0A50194010E94A619CA01B901F39481 +:1007A000F2CFFE01299130ED320F3A3010F4F3947C +:1007B000F8CF2E32F1F4EF012196FE01219620812F +:1007C00050EDD52ED20E29E02D1598F06C3C3CEC66 +:1007D00073073CE08307910580F7AAE0B0E09B0136 +:1007E000AC010E945C196D0D711D811D911DFA9463 +:1007F000E4CF20812F7DD0E0C0E0253409F04FC048 +:1008000021812D32A9F53296BB24B394DF01D0E0CB +:10081000C0E02F2D0F2C000C330B4AE0A42EFD015D +:10082000DD9040ED4D0D4A30A8F5AC9EA001AD9E87 +:10083000500D1124CD2DDD0CDD0BE097C40FD51F1D +:10084000AE01420F531F473251054CF3BB20B9F0A4 +:1008500080E090E0A0E0B0E8E11003C080E090E02C +:10086000DC01F80184839583A683B7838CE083CF72 +:100870002B3219F03196B12CC9CF3296FCCF80E0E3 +:1008800090E0A0E8BFEFE110ECCF80E090E0A0E8BE +:10089000BFE7E7CFBB2019F0D195C195D1092081E1 +:1008A00021113BCFCF0DD11DF7FCDA950E941E1808 +:1008B0001C161D06E4F4F12CC0FF0CC024E0F29ECF +:1008C000F0011124EF5CFE4F208131814281538180 +:1008D0000E947F18D595C795F394209769F7E1108A +:1008E0009058F8016483758386839783BFCFD19531 +:1008F000C195D109F12C209791F3C0FF0CC024E0E1 +:10090000F29EF0011124E75EFE4F20813181428189 +:1009100053810E947F18D595C795F394ECCF80330F +:100920009CF08A3324F08F3524F08B3724F481E057 +:10093000089581344CF08B35D4F393ED980F81E01A +:100940009230B0F380E008958B32B9F7F0CFFC011C +:100950008185811114C0A481B581868197812FEF93 +:100960003FEFA817B90730F4CD0101969583848332 +:100970002C9130E037FD20E0208781E08187808561 +:1009800008951F93CF93DF93EC01162F0E94A704C5 +:10099000811306C0198681E0DF91CF911F910895E0 +:1009A00080E0FACFCF93DF93EC01CE010E94A70441 +:1009B0008B303CF489304CF4882349F090E080E09F +:1009C00008C08D3011F08032C9F71986EECF81E072 +:1009D00090E0DF91CF910895CF92DF92EF92FF9256 +:1009E000CF93DF93CDB7DEB729970FB6F894DEBF6C +:1009F0000FBECDBFFC01892B39F094819F779630D3 +:100A000081F030F49430F0F460E070E0CB010DC080 +:100A1000983039F09C30C1F7C080D180E280F380FB +:100A200020C0608171818281938129960FB6F894EC +:100A3000DEBF0FBECDBFDF91CF91FF90EF90DF9073 +:100A4000CF90089560817181CE0101960E943C0390 +:100A500089858830F9F08C30B9F6CD80DE80EF8062 +:100A6000F88420E030E0A901C701B6010E94EC1A29 +:100A700087FDCACF20E030E040E85FE4C701B6015F +:100A80000E94191818160CF4BFCFC701B6010E94B6 +:100A9000BD1ACBCF69817A818B819C81C6CFCF92E1 +:100AA000DF92EF92FF92CF93DF93CDB7DEB7299716 +:100AB0000FB6F894DEBF0FBECDBFFC01892B39F015 +:100AC00094819F77963069F028F4943080F570E037 +:100AD00060E01FC09A3081F09C3009F459C0983012 +:100AE000B1F780819181A281B381BC0181159048C9 +:100AF000A105B10570F0EBCF80819181A281B38116 +:100B000066277727681B790B81309048A105B105CE +:100B1000F0F6CB0129960FB6F894DEBF0FBECDBF1D +:100B2000DF91CF91FF90EF90DF90CF90089560819B +:100B30007181CE0101960E943C0389819A81AB812B +:100B4000BC8129852A30E1F22C3021F0283009F0CF +:100B5000BECFCBCFCD80DE80EF80F88420E030E0C8 +:100B600040E057ECC701B6010E94EC1A87FDAFCFF9 +:100B700020E03EEF4FEF56E4C701B6010E9419187E +:100B800018160CF4A4CFC701B6010E94B61AC1CF43 +:100B9000C080D180E280F380E1CFCF93FC01892B2C +:100BA00091F094819F77983029F078F4992359F047 +:100BB000963079F4C1E080819181A281B381892B43 +:100BC0008A2B8B2B39F4C0E005C09A3099F39C3006 +:100BD00021F0C1E08C2FCF910895C1E020E030E0FA +:100BE000A90160817181828193810E94191881110C +:100BF000F1CFE9CFFC0184819581009799F02281A2 +:100C00003381468157812417350718F015821482E5 +:100C10000895A9014F5F5F4F53834283820F931F53 +:100C2000FC0160830895FF920F931F93CF93DF938E +:100C3000CDB7DEB728970FB6F894DEBF0FBECDBF95 +:100C40008C01DC011296ED91FC912281338184812B +:100C5000958193838283FA83E9831C821B823E837E +:100C60002D83821B930B98878F83C8010E94A70452 +:100C7000F82EF8011186C8010E94A704D801199620 +:100C80001C92F816C9F1811110C061E070E080E09B +:100C900090E028960FB6F894DEBF0FBECDBFDF916F +:100CA000CF911F910F91FF9008958C35F9F4C801F1 +:100CB0000E94A704882349F3853729F464E070E093 +:100CC00080E090E0E6CFEBE5F1E09081992329F018 +:100CD000891308C08181811107C062E070E080E063 +:100CE00090E0D7CF3296F1CFF8011186682FCE0170 +:100CF00001960E94FA05BFCF60E0CE0101960E94E6 +:100D0000FA058D819E81892B79F0E981FA818B81A9 +:100D10009C812F813885AC01421B530B82819381CA +:100D2000840F951F938382832D813E8163E070E061 +:100D300080E090E02115310509F4ABCF60E070E070 +:100D4000CB01C901A6CFFC0180819181892B21F4BF +:100D500060E070E0CB01089561EB76E090E080E028 +:100D600008950895CF93DF93DC01EB01EC81FD81C1 +:100D70008A819B810896E817F90730F4F0E0E0E0FB +:100D8000CF01DF91CF9108953897FD83EC833097A1 +:100D9000A9F31296CD91DC911397209791F0CF0192 +:100DA0008C1B9D0B23E0959587952A95E1F78D8304 +:100DB0001396FC93EE931297158214821782168273 +:100DC000DFCF1196FC93EE93F3CF2F923F924F9289 +:100DD0005F926F927F928F929F92AF92BF92CF92CB +:100DE000DF92EF92FF920F931F93CF93DF93CDB7D4 +:100DF000DEB761970FB6F894DEBF0FBECDBF0E947D +:100E0000A7026B017C0180917C0390917D033601E8 +:100E1000681A790A2DEC621620E1720608F4D1C036 +:100E20008091F6029091F702D301A81BB90BCD0176 +:100E3000B7FF03C0919581959109883C91050CF00D +:100E4000BCC08091F4029091F50201969093F50256 +:100E50008093F402029709F0B0C002EC10E04090D9 +:100E6000F2025090F30249E050E0B801CE01019641 +:100E70000E9410188B816C81681708F4682F70E04D +:100E80008091F6029091F7020E94021B9B01409113 +:100E9000050150910601649FC001659F900D749FEC +:100EA000900D112464E670E00E94021B898541E0E8 +:100EB00050E0882311F042E050E08D81829FF001E4 +:100EC000839FF00D1124FB87EA878E81829FD001DA +:100ED000839FB00D1124BD87AC878F81829FF00165 +:100EE000839FF00D1124FF87EE878885829F100174 +:100EF000839F300C1124FA01EE0FFF1FEA50FD4FC3 +:100F0000812C912C5401920121503109398B288B6D +:100F1000888999894817590708F03FC0880C991C9F +:100F2000AA1CBB1C808191819C01AA85BB852A1BC0 +:100F30003B0B37FF03C03195219531092617370741 +:100F400070F422813381AC85BD852A1B3B0B37FFB2 +:100F500003C031952195310926173707D0F02E852A +:100F60003F85821B930B97FF03C091958195910953 +:100F700086179707B8F4828193818219930997FFA6 +:100F800003C09195819591098617970758F4689445 +:100F900080F84E5F5F4F3496BBCF38E04316510464 +:100FA00008F051C0075F1F4F80E0083F180709F0A5 +:100FB00056CF1092F5021092F4021092F3021092A2 +:100FC000F2028091F2029091F3028334910540F095 +:100FD0001092F3021092F2021092F5021092F402B3 +:100FE0008091F2029091F3029C012F5F3F4F30936A +:100FF000F3022093F202880F991FFC01EA50FD4F83 +:1010000071826082C0927C03D0927D03E0927E0365 +:10101000F0927F0361960FB6F894DEBF0FBECDBF8E +:10102000DF91CF911F910F91FF90EF90DF90CF90C4 +:10103000BF90AF909F908F907F906F905F904F90F8 +:101040003F902F9008958092600490926104A09246 +:101050006204B0926304ADCFFC0101900020E9F777 +:101060003197AF01481B590BBC018EE993E00C94FA +:10107000DE008F929F92AF92BF920F931F93CF93F8 +:10108000DF93CDB7DEB7A1970FB6F894DEBF0FBEE2 +:10109000CDBF19A2423008F44AE08E010F5D1F4F08 +:1010A000842E912CB12CA12CA50194010E94A6198B +:1010B000E62FB901CA01EA30F4F4E05DD801EE93FD +:1010C0008D01232B242B252B79F790E080E01097BE +:1010D00019F0CD010E942C08A1960FB6F894DEBF3E +:1010E0000FBECDBFDF91CF911F910F91BF90AF90F9 +:1010F0009F908F900895E95CE1CFCF93DF93D0E08C +:10110000C0E0009719F00E942C08EC018CE691E0F9 +:101110000E942C088C0F9D1FDF91CF9108954F9254 +:101120005F926F927F928F929F92AF92BF92CF9277 +:10113000DF92EF92FF920F931F93CF936B017C018D +:10114000742EAC019B010E94F11A882399F08FE65E +:1011500091E0CF911F910F91FF90EF90DF90CF9092 +:10116000BF90AF909F908F907F906F905F904F90C7 +:101170000C942C0846015701E894B7F82FEF3FEF85 +:101180004FE75FE7C501B4010E94F11A81110DC05C +:101190002FEF3FEF4FE75FE7C501B4010E94191839 +:1011A00018161CF483E791E0D4CF2FEF3FEF4FE701 +:1011B0005FE4C701B6010E94EC1A18161CF487E719 +:1011C00091E0C7CF2FEF3FEF4FE75FECC701B601CC +:1011D0000E94191887FDF3CF20E030E0A901C70174 +:1011E000B6010E94191810E000E087FF0AC06DE206 +:1011F0008EE993E00E9474018C01F7FAF094F7F8FD +:10120000F094C0E060E070E080E09FE37C1641F085 +:1012100020E030E040E251E40E94441ACF5FF6CF74 +:10122000A70196010E94D8192B013C010E94BD1A0A +:101230004B015C014AE00E9439087C01E00EF11E7E +:10124000CC23C1F1C501B4010E941E189B01AC0161 +:10125000C301B2010E94D7194B015C016EE28EE915 +:1012600093E00E947401E80EF91EC15018F120E0CD +:1012700030E040E251E4C501B4010E947F182B0127 +:101280003C010E94BD1A4B01B12CA12C4AE0C501C2 +:10129000B4010E943908E80EF91EC501B4010E948C +:1012A0001E189B01AC01C301B2010E94D7194B016A +:1012B0005C01DBCFC701CF911F910F91FF90EF90A1 +:1012C000DF90CF90BF90AF909F908F907F906F9066 +:1012D0005F904F900895FC0180819181009711F0FB +:1012E0000C94B81B08950F931F93CF93DF93EC01D9 +:1012F00088819981009759F02A813B812617370709 +:1013000030F081E0DF91CF911F910F9108958B0113 +:101310006F5F7F4F0E94411C009759F0998388832B +:101320001B830A832C813D81232B59F7FC011082FA +:10133000E8CF80E0E7CFEF92FF920F931F93CF9318 +:10134000DF93EC017B018A01BA010E9473092881B5 +:101350003981811114C02115310519F0C9010E948C +:10136000B81B198218821D821C821B821A82CE0130 +:10137000DF91CF911F910F91FF90EF9008951D8302 +:101380000C83B701C9010E94101DF1CFCF93DF93E9 +:10139000EC01FB018617970749F0608171816115A7 +:1013A000710541F0448155810E949B09CE01DF9176 +:1013B000CF91089588819981009711F00E94B81B00 +:1013C000198218821D821C821B821A82EFCFFC01B7 +:1013D000118210821382128215821482FB01019005 +:1013E0000020E9F73197AF01461B570B0C949B097E +:1013F0000F931F93CF93DF938B01EC012097E1F0C4 +:101400006E817F8160177107B9F00115110541F0F8 +:101410006115710529F0C8010E94071D892B61F033 +:101420008D81882339F028E08202C0011124C80F81 +:10143000D91FE4CFD0E0C0E0CE01DF91CF911F9162 +:101440000F9108958F929F92AF92BF92CF92DF92A9 +:10145000EF92FF920F931F93CF93DF93CDB7DEB739 +:10146000CB54D1090FB6F894DEBF0FBECDBF8C01AF +:101470007B01D42E0E94D2042C969FAF8EAF2C9766 +:10148000CE01865B9F4F0E94A306672B09F0B2C076 +:1014900080FDB0C0C8010E94A704873209F4B9C119 +:1014A00014F5823209F4B5C1C8010E94A704C82E00 +:1014B000FE0131964F01D12C5F018C2D0E948F04CB +:1014C000882309F4C4C1FFE3DF1609F4C0C1D801C1 +:1014D00019961C92D394F401C1924F01C8010E9445 +:1014E000A704C82EEACF8B3509F49EC08B37E1F6EE +:1014F000F701848180788062848311821082138254 +:101500001282DD2009F483C1D80119961C92C8010A +:101510000E94D20423969FAF8EAF2397CE018F5B9C +:101520009F4F0E94A306672B09F002C180FD00C1F6 +:101530006DE7C8010E94C1048111CDC0DA94C801D1 +:101540000E94A704873209F4D0C0823209F4CDC0CA +:10155000D8011296ED91FC9122813381848195818D +:1015600093838283FA83E9831C821B823E832D83CB +:10157000821B930B98878F83C8010E94A704A82E13 +:101580000E948F0422E030E0882389F1F80111865F +:101590006A2DCE0101960E94FA05C8010E94A70497 +:1015A000A82E0E948F048111F1CF60E0CE01019638 +:1015B0000E94FA058D819E81892B79F0E981FA815B +:1015C0008B819C812F813885AC01421B530B82811A +:1015D0009381840F951F938382838D819E8123E065 +:1015E00030E0009721F0B82EC92E30E020E09B2C8F +:1015F000AC2C83C02B968FAD2B972C969FAD2C9740 +:10160000C55BDF4F0FB6F894DEBF0FBECDBFDF91D5 +:10161000CF911F910F91FF90EF90DF90CF90BF90EF +:10162000AF909F908F900895D70114968C91149746 +:101630008078806414968C93149711961C921E9255 +:1016400013961C921E921297DD2009F4E0C0F80157 +:101650001186C8010E94D2049A838983CE01019623 +:101660000E94A306672B61F580FD2AC06DE5C801C5 +:101670000E94C10481112FC0DA94D8016D917C9130 +:10168000C7010E94B206009709F4BEC04D2DBC01EF +:10169000C8010E94220A9A838983CE0101960E9482 +:1016A000A306672B69F480FD0BC0C8010E94D20419 +:1016B0009A838983CE0101960E94A306672B19F0B5 +:1016C00089819A819DCF80FDFBCF6DE5C8010E9485 +:1016D000C104882311F080E098C06CE2C8010E9428 +:1016E000C1048111CACF82E090C0C8010E941306D4 +:1016F0009B019B2CAC2CB82EC92E23963FAF2EAF4E +:101700002397CE018F5B9F4F0E94A306672B81F426 +:1017100080FD0EC0C8010E94D20423969FAF8EAFF9 +:101720002397CE018F5B9F4F0E94A306672B39F052 +:1017300022968FAD229723969FAD239761CF80FD90 +:10174000F7CF6AE3C8010E94C104882361F26B2DC0 +:101750007C2DD7018D919C910E94F809BC01892BA9 +:1017600081F4F80160817181C7010E94B206FC0119 +:10177000892B09F449C0848180688483B682C7823A +:10178000BF014D2DC8010E94220A23969FAF8EAF44 +:101790002397CE018F5B9F4F0E94A306672B41F6D4 +:1017A00080FDC6CFC8010E94D20423969FAF8EAFA2 +:1017B0002397CE018F5B9F4F0E94A306672B09F0F2 +:1017C000B7CF80FDB5CF6DE7C8010E94C10481117C +:1017D00082CF6CE2C8010E94C104882309F483CF40 +:1017E000C8010E94D20423969FAF8EAF2397CE01EB +:1017F0008F5B9F4F0E94A306672B09F099CF80FD56 +:1018000097CFB92CCA2C9BCE83E090E0F9CE85E02F +:10181000FCCFC8010E94130669837A838B839C8363 +:10182000CE0101960E94A306672B09F049CF80FDE7 +:1018300047CF2B813C81D70114968C9114978078E7 +:10184000856014968C9314972D933C9344CFF501A7 +:10185000ED0DF11D108289818437B9F4D7011496FA +:101860008C9114978078866014968C9381E090E038 +:10187000A0E0B0E0F70180839183A283B38390E07E +:10188000F4E0DF12BDCE80E0BBCE863689F4D7010E +:1018900014968C9114978078866014968C93F70137 +:1018A000108211821282138281E090E0F5E0E9CF8C +:1018B0008E3631F481E090E024E0D212A1CEE3CF65 +:1018C000B501CE018F5B9F4F0E943C0325964CAD26 +:1018D0005DAD6EAD7FAD25972A968FAD2A978A3084 +:1018E00061F08C30C1F0883009F0FDCED70114963C +:1018F0008C9114978078886006C0D70114968C91DB +:10190000149780788A6014968C93F70140835183F2 +:1019100062837383E0CE29964CAD5DAD6EAD7FAD35 +:101920002997D70114968C91149780788C6014961F +:101930008C93F7014083518362837383CCCE0097ED +:1019400029F0FC01808191810C94F80990E080E0FD +:101950000895EF92FF920F931F93CF93DF93CDB72C +:10196000DEB72E970FB6F894DEBF0FBECDBFFC01D9 +:1019700001811281E580F6801A8619861C861B86F5 +:101980001E861D86CE0109960E94C6091A821982FA +:101990001C821B821E821D82BE01675F7F4FCE01AB +:1019A00001960E94C60981E090E098878F83CE015E +:1019B00009960E946B09B701C8010E949F0CFC01A7 +:1019C000892B39F194819F77963029F0D8F49230A1 +:1019D00000F1943060F50F811885CE0101960E94C8 +:1019E0006B0981E0012B09F080E02E960FB6F89488 +:1019F000DEBF0FBECDBFDF91CF911F910F91FF9042 +:101A0000EF9008959C3039F368F4983021F39A30C0 +:101A100011F381E090E029813A81232BC9F490E011 +:101A200080E016C09032B9F2903499F7D4CF60813B +:101A3000718189819A816817790769F0009771F03F +:101A40006115710571F00E94071D919581959109AD +:101A500098878F83C0CF90E080E0F7CF8FEF9FEF24 +:101A6000F4CF81E090E0F1CFFC01248125FF04C098 +:101A7000808191810C94F80990E080E008952F9284 +:101A80003F924F925F926F927F928F929F92AF920E +:101A9000BF92CF92DF92EF92FF920F931F93CF935B +:101AA000DF93CDB7DEB7C25BD1400FB6F894DEBF8F +:101AB0000FBECDBFFC01CE010E969A8389839C8315 +:101AC0008B834EE951E04C0F5D1F5E834D83588739 +:101AD0004F839D8590789D87208131818481958178 +:101AE000820F931F4D5951407A01C256DE4F5983E0 +:101AF0004883CE59D140C056DE4F59834883C05ADF +:101B0000D140CE55DE4F39832883C25AD140CC55BF +:101B1000DE4F99838883C45AD140C955DE4F18825D +:101B2000C75AD1405E0159E0A50EB11C4AE0B5018B +:101B3000CE0182569E4F0E94220AC855DE4F9983DD +:101B40008883C85AD140CE0188559E4F0E94A30673 +:101B5000672BC9F480FD17C0CA55DE4F8881C65A6D +:101B6000D140882381F08D85982F9F779C3019F084 +:101B70008D77883041F482E090E0C855DE4F99833C +:101B80008883C85AD140C855DE4F08811981C85A88 +:101B9000D140C255DE4F19830883CE5AD140CE01C1 +:101BA00082559E4F0E94A306672B09F00BC16C0162 +:101BB00021E0C222DD2480FD05C18D85850185FDE2 +:101BC00002C000E010E06FE771E0CE0188559E4F43 +:101BD0000E94E709C156DE4F0883CF59D140C05655 +:101BE000DE4F1883C05AD140CF55DE4FF982E882CC +:101BF000C15AD14038E8A32E31E0B32ECD55DE4F87 +:101C0000B982A882C35AD140BE0168557E4FCE0129 +:101C100082569E4F0E94A90C982ECE0188559E4F49 +:101C20000E946B099110F6C06AEB71E0CE018855F5 +:101C30009E4F0E94E709C156DE4F0883CF59D1401D +:101C4000C056DE4F1883C05AD140CF55DE4FF982BF +:101C5000E882C15AD140CD55DE4FB982A882C35A1D +:101C6000D140BE0168557E4FCE0182569E4F0E94E4 +:101C7000A90CD82ECE0188559E4F0E946B09DD20FD +:101C800009F404C266E971E0C8010E949F0C009744 +:101C900021F061EA71E00E94340D0E944F05382E58 +:101CA00066E971E0C8010E949F0C009721F065EB86 +:101CB00071E00E94340D0E94EC04C055DE4F688331 +:101CC000C05BD140CF54DE4F7883C15BD140282E1A +:101CD000CE54DE4F9883C25BD140F5E0EF2EF12C5D +:101CE0000BE613E0A3E78A2EA5E09A2EBBEDAB2E00 +:101CF000B5E1BB2E61E0832D0E940A02C801019765 +:101D0000F1F760E0832D0E940A0287EC99E20197C7 +:101D1000F1F7C055DE4F4880C05BD140CF54DE4F55 +:101D20005880C15BD140622CCE54DE4F7880C25BBC +:101D3000D140E0E2CE2ED12C61E0832D77FE8DC123 +:101D40000E940A02C8010197F1F760E0832D0E940A +:101D50000A02C5010197F1F761E0832D0E940A0292 +:101D6000C8010197F1F760E0832D0E940A02C401C7 +:101D70000197F1F7440C551C661C771C41E0C41A0E +:101D8000D108D1F661E0832D0E940A02C8010197B3 +:101D9000F1F760E0832D0E940A028BE995EA019732 +:101DA000F1F761E0832D0E940A02C8010197F1F763 +:101DB00060E0832D0E940A0251E0E51AF10809F063 +:101DC00099CF0EC08BE791E00630110538F4000F73 +:101DD000111FF801E35FFE4F808191810E947D0811 +:101DE000CE54DE4F0FB6F894DEBF0FBECDBFDF91ED +:101DF000CF911F910F91FF90EF90DF90CF90BF9008 +:101E0000AF909F908F907F906F905F904F903F909A +:101E10002F90089566E971E0C8010E949F0C009719 +:101E200021F061EA71E00E94340D0E944F05F82E06 +:101E3000E92E66E971E0C8010E949F0C009721F02D +:101E40006AEA71E00E94340D0E944F051C0166E9A8 +:101E500071E0C8010E949F0C009721F4412C512C85 +:101E600032014DC065EB71E00E94340DFC01892BFD +:101E7000A9F394819F77963039F1F8F4943070F398 +:101E800060817181CE0182569E4F0E943C03C256F2 +:101E9000DE4F488059806A807B80CE59D140CA5538 +:101EA000DE4F8881C65AD1408A3009F483C08C3015 +:101EB00009F489C0883091F60BC09A3061F09C30EB +:101EC00009F4A5C0983051F640805180628073803B +:101ED00077FE15C0C3CF408051806280738041E09F +:101EE00044165104610440E8740608F0B7CF7094BA +:101EF000609450944094411C511C611C711CF092E0 +:101F00006F04E092700461E08F2D0E947602809150 +:101F10006F0490917004019609F498C000916D04CB +:101F200010916E040F3F1007B1F0023070F4F80109 +:101F3000FF27013009F470C0E898EE0FFF1FEF5F34 +:101F4000FE4F8BE393E0918380838FEF9FEF90931D +:101F50006E0480936D04812C912C540183948091A4 +:101F6000710490917204C816D9060CF066C0710114 +:101F700051E0E51AF108F7FC56C0D501C4010E2C5A +:101F800004C0880F991FAA1FBB1F0A94D2F784218F +:101F90009521A621B721892B8A2B8B2B09F43EC0D2 +:101FA0008091790490917A040E94450281E0E81AB8 +:101FB000F108E1CF51E045165104610450E875067F +:101FC00008F04CCF94CFCE55DE4F88809980AA8000 +:101FD000BB80C25AD14020E030E040E05FECC50158 +:101FE000B4010E94EC1A87FD39CF20E030E040E0D8 +:101FF0005FE4C501B4010E94191818160CF42ECF25 +:10200000C501B4010E94B61A2B013C0178CF808033 +:102010009180A280B380DFCFE9988FCF8091770441 +:1020200090917804C1CF80917504909176040E94BC +:1020300045029FEFC91AD90A92CF0F3F100731F01E +:1020400010936E0400936D040E94A8008FEF9FEF21 +:102050009093700480936F04C3CE0E940A02C8015B +:102060000197F1F760E0832D0E940A02C4010197F5 +:10207000F1F761E0832D0E940A02C8010197F1F790 +:1020800060E0832D0E940A02C50172CE6AEC71E005 +:10209000CE0188559E4F0E94E709C156DE4F088346 +:1020A000CF59D140C056DE4F1883C05AD140CF55CA +:1020B000DE4FF982E882C15AD140CD55DE4FB98258 +:1020C000A882C35AD140BE0168557E4FCE018256C8 +:1020D0009E4F0E94A90CD82ECE0188559E4F0E947B +:1020E0006B09DD2009F47EC066E971E0C8010E9439 +:1020F0009F0C009721F061EA71E00E94340D0E946C +:102100004F05D82E66E971E0C8010E949F0C009728 +:1021100021F06AEA71E00E94340D0E944F057C01B3 +:1021200066E971E0C8010E949F0C009721F065EB01 +:1021300071E00E94340D0E94EC044B015C01D092CE +:102140004E058DE090E09093500580934F0580916F +:102150004E0561E00E94760280914E0560E00E948B +:102160000A0288E293E20E94CC0284E991E10E9493 +:102170003802C7010197C12CD12C7601C39404C049 +:10218000CC0CDD1CEE1CFF1C8A95D2F7C114D104C7 +:10219000E104F104F1F0D501C4018C219D21AE21AF +:1021A000BF21892B8A2B8B2B69F080E392E00E9460 +:1021B000CC028AE996E00E943802F694E794D7941C +:1021C000C794E4CF80E392E00E94CC0280E392E0E7 +:1021D000F2CF80E392E00E94CC0290E080E00E9487 +:1021E0003802FECD62ED71E0CE0188559E4F0E940F +:1021F000E709C156DE4F0883CF59D140C056DE4FA4 +:102200001883C05AD140CF55DE4FF982E882C15AB7 +:10221000D140CD55DE4FB982A882C35AD140BE010C +:1022200068557E4FCE0182569E4F0E94A90CD82E33 +:10223000CE0188559E4F0E946B09DD2009F4EDC048 +:1022400066E971E0C8010E949F0C009721F061EAE5 +:1022500071E00E94340D0E944F05F82E66E971E08E +:10226000C8010E949F0C009721F06CED71E00E9464 +:10227000340D0E944F058C0180916A048C3008F067 +:1022800053C061E08F2D0E94760280916A04282F4E +:1022900030E0F901EE0FFF1FE20FF31FE55CFB4F8B +:1022A0002F2D2F739081907C922B908310926B0432 +:1022B00010926C042CE0622F0E94F61A829FB001EB +:1022C000112430E020E0AB01420F531FFA01EE0F62 +:1022D000FF1FE40FF51FE55CFB4F908196FD16C0D4 +:1022E0002F5F3F4F2C30310571F781110FC01092D5 +:1022F000800082E08093810010928500109284001B +:10230000B19A80916F00826080936F00E0916A04BF +:102310008E2F90E0FC01EE0FFF1FE80FF91FE55C28 +:10232000FB4F808180648083F0906A04003282E0F9 +:1023300018070CF03DC080916B04E8E88E2E912CBC +:10234000881A910887FD9394880C991C880C991C15 +:10235000092C000CAA08BB0880916C0428E532E027 +:10236000281B310987FD3395220F331F220F331F9E +:10237000032E000C440B550B281939094A095B0937 +:10238000D801053B110514F0A4EBB0E0B7FF02C083 +:10239000B0E0A0E00E94671924EB30E040E050E09C +:1023A0000E943D1989019A01080D191D2A1D3B1D26 +:1023B0009BE09F1508F414CD20916B0488E890E011 +:1023C000821B910927FD9395880F991F880F991FEC +:1023D0000817190784F020916C0488E592E0821BAD +:1023E000910927FD9395880F991F880F991F08174A +:1023F00019070CF4C8010297880F991F4FB7F8947A +:102400002F2D30E0F901EE0FFF1FE20FF31FE55C07 +:10241000FB4F928381834FBFE3CC62EE71E0CE012C +:1024200088559E4F0E94E709C156DE4F0883CF5959 +:10243000D140C056DE4F1883C05AD140CF55DE4F31 +:10244000F982E882C15AD140CD55DE4FB982A882C7 +:10245000C35AD140BE0168557E4FCE0182569E4F71 +:102460000E94A90CD82ECE0188559E4F0E946B0960 +:10247000DD2029F166E971E0C8010E949F0C0097F8 +:1024800021F061EA71E00E94340D0E944F057C0149 +:1024900066E971E0C8010E949F0C009721F06BEE85 +:1024A00071E00E94340D0E94CD05182FF0926E0449 +:1024B000E0926D040E94A8001093000191CC62EF9D +:1024C00071E0CE0188559E4F0E94E709C156DE4F4C +:1024D0000883CF59D140C056DE4F1883C05AD1402F +:1024E000CF55DE4FF982E882C15AD140CD55DE4F3B +:1024F000B982A882C35AD140BE0168557E4FCE0131 +:1025000082569E4F0E94A90CF82ECE0188559E4FF0 +:102510000E946B09FF2009F463CC66E971E0C801F1 +:102520000E949F0C009721F061EA71E00E94340D37 +:102530000E944F057C0166E971E0C8010E949F0C72 +:10254000009721F06BEE71E00E94340D0E94CD05E2 +:1025500080939D03F0929803E092970341CC0F93F0 +:102560001F93CF93DF9300D000D000D0CDB7DEB75C +:102570008EE993E00E941A01853239F51A82198298 +:102580001C821B821E821D8264E674E0CE010196CD +:102590000E94C609CE0101960E943F0DCE01019610 +:1025A0000E946B0950E040E06BE671E084E694E045 +:1025B0000E949B0926960FB6F894DEBF0FBECDBFD2 +:1025C000DF91CF911F910F91089589831A82009115 +:1025D0006804109169040F5F1F4FB80184E694E00E +:1025E0000E947309882331F32091640430916504BB +:1025F0008091680490916904BE016F5F7F4F820FE4 +:10260000931F0E94101D1093690400936804D2CF99 +:102610000E94480181110C94AF1208951F920F92ED +:102620000FB60F9211242F933F934F935F936F93A5 +:102630007F938F939F93AF93BF93EF93FF938EE915 +:1026400093E00E945201FF91EF91BF91AF919F9152 +:102650008F917F916F915F914F913F912F910F904B +:102660000FBE0F901F9018951F920F920FB60F92EA +:1026700011242F938F939F93EF93FF93E091AE03D9 +:10268000F091AF038081E091B403F091B50382FD36 +:102690001BC090818091B7038F5F8F732091B80327 +:1026A000821741F0E091B703F0E0E256FC4F958FBE +:1026B0008093B703FF91EF919F918F912F910F908E +:1026C0000FBE0F901F9018958081F4CF1F920F922C +:1026D0000FB60F9211242F933F938F939F93AF9335 +:1026E000BF938091860390918703A0918803B09156 +:1026F00089033091810323E0230F2D3758F501968C +:10270000A11DB11D209381038093860390938703BD +:10271000A0938803B09389038091820390918303EF +:10272000A0918403B09185030196A11DB11D8093F2 +:10273000820390938303A0938403B0938503BF9196 +:10274000AF919F918F913F912F910F900FBE0F905E +:102750001F90189526E8230F0296A11DB11DD2CF18 +:102760001F920F920FB60F9211242F933F934F9306 +:102770005F936F937F938F939F93AF93BF93EF93E9 +:10278000FF93E0910301F09104010995FF91EF910E +:10279000BF91AF919F918F917F916F915F914F9179 +:1027A0003F912F910F900FBE0F901F9018951F9281 +:1027B0000F920FB60F9211242F933F934F935F9375 +:1027C0006F937F938F939F93AF93BF93EF93FF93F9 +:1027D000E0910101F09102010995FF91EF91BF9104 +:1027E000AF919F918F917F916F915F914F913F91A9 +:1027F0002F910F900FBE0F901F9018951F920F9260 +:102800000FB60F9211242F933F934F935F936F93C3 +:102810007F938F939F93AF93BF93CF93DF93EF9368 +:10282000FF9380918003C0915F04D0E087FF24C0B4 +:102830001092850010928400809180038F5F8093B6 +:10284000800380918003082E000C990B8C179D0744 +:1028500024F4809180038C30C4F1809184009091A5 +:102860008500049680349C4908F47AC080918400E5 +:1028700090918500049676C080918003082E000C0C +:10288000990B8C179D07C4F6E09180038E2FEE0FF5 +:10289000990BFC01EE0FFF1FE80FF91FE55CFB4FE2 +:1028A000808186FFC9CFE09180038E2FEE0F990BB8 +:1028B000FC01EE0FFF1FE80FF91FE55CFB4F808165 +:1028C00060E08F730E940A02B7CF2091840030919C +:1028D0008500E09180038E2FEE0F990BFC01EE0F27 +:1028E000FF1FE80FF91FE55CFB4F81819281820F8A +:1028F000931F9093890080938800E09180038E2F2E +:10290000EE0F990BFC01EE0FFF1FE80FF91FE55CBE +:10291000FB4F808186FF11C0E09180038E2FEE0F68 +:10292000990BFC01EE0FFF1FE80FF91FE55CFB4F51 +:10293000808161E08F730E940A02FF91EF91DF9125 +:10294000CF91BF91AF919F918F917F916F915F9147 +:102950004F913F912F910F900FBE0F901F901895A0 +:1029600080E49CE990938900809388008FEF8093A6 +:102970008003E3CF1F920F920FB60F9211242F9373 +:102980003F934F935F936F937F938F939F93AF93F7 +:10299000BF93CF93DF93EF93FF9320917D0430E0BB +:1029A000F901E458FF4F8491F901E255FF4FD491AA +:1029B000F901E656FF4FC491CC2379F081110E94B2 +:1029C000E101EC2FF0E0EE0FFF1FE057FF4FA59164 +:1029D000B491EC91ED2381E009F480E02091810431 +:1029E000309182042F5F3F4F309382042093810403 +:1029F00090918004953618F096E090937C04909125 +:102A00007C04943009F466C0B8F49230F1F093304D +:102A100009F444C090917F04992309F46BC081119B +:102A20007CC080917E04882309F463C080917E0479 +:102A300061E00E940A025EC0953009F457C09630EA +:102A400049F791E090934D054FC08111E3CF20915C +:102A50008104309182042436310528F410928204D6 +:102A600010928104D7CF10924D0510928004E0910E +:102A7000800491E09E0F90938004F0E02091810407 +:102A800030918204EE0FFF1FE458FB4F30872783FD +:102A9000109282041092810493E019C0813009F0F1 +:102AA000B9CFE091800491E09E0F90938004F0E014 +:102AB0002091810430918204EE0FFF1FE458FB4FF8 +:102AC00030872783109282041092810494E09093BF +:102AD0007C04A0CF882359F2209181043091820494 +:102AE0002536310508F496CF95E0F1CF811192CFCC +:102AF000B5CF2D9AFF91EF91DF91CF91BF91AF911B +:102B00009F918F917F916F915F914F913F912F9105 +:102B10000F900FBE0F901F90189580917E04882310 +:102B200021F080917E0460E084CF2D98E3CFCF9395 +:102B3000DF931092A1031092A00388EE93E0A0E02F +:102B4000B0E08093A2039093A303A093A403B09357 +:102B5000A5038DE491E090939F0380939E0385EC01 +:102B600090E09093AB038093AA0384EC90E0909361 +:102B7000AD038093AC0380EC90E09093AF0380931F +:102B8000AE0381EC90E09093B1038093B00382ECAC +:102B900090E09093B3038093B20386EC90E090931F +:102BA000B5038093B4031092B7031092B803109248 +:102BB000B9031092BA0383E080934E05CFEFDFEFA5 +:102BC000D0937004C0936F048AE090E090937204F5 +:102BD0008093710449E050E062EC70E083E794E098 +:102BE0000E941018D0936E04C0936D048CE390E0A3 +:102BF0009093060180930501109260041092610485 +:102C0000109262041092630480915F048C30D0F4BF +:102C100091E0980F90935F0480936A0490E0FC0128 +:102C2000EE0FFF1FE80FF91FE55CFB4F88EB9BE001 +:102C3000928381836BE671E084E694E0DF91CF912B +:102C40000C94E7098FEF80936A04F4CF789484B5ED +:102C5000826084BD84B5816084BD85B5826085BD98 +:102C600085B5816085BD80916E00816080936E0026 +:102C70001092810080918100826080938100809118 +:102C800081008160809381008091800081608093C9 +:102C900080008091B10084608093B1008091B00089 +:102CA00081608093B00080917A00846080937A0084 +:102CB00080917A00826080937A0080917A008160AE +:102CC00080937A0080917A00806880937A001092D5 +:102CD000C100E091AE03F091AF0382E08083E09108 +:102CE000AA03F091AB031082E091AC03F091AD0325 +:102CF0008FEC80831092B603E091B203F091B3039E +:102D000086E08083E091B003F091B103808180611F +:102D10008083E091B003F091B1038081886080836B +:102D2000E091B003F091B103808180688083E091ED +:102D3000B003F091B10380818F7D808310926E0487 +:102D400010926D040E94A80081E08093000180939E +:102D50009D0388E090E090939803809397034BE95C +:102D6000E42EF12C412C50EC552E59E7652E54ECF5 +:102D7000752E2FB7F8948091860390918703A091C8 +:102D80008803B09189032FBF20919D03222309F46A +:102D900003C14091990350919A0360919B037091F4 +:102DA0009C038C019D01041B150B260B370BB901ED +:102DB000A80140325E446105710508F4EDC08093BE +:102DC000990390939A03A0939B03B0939C03C091A3 +:102DD0009703D0919803CE019927FC01E255FF4F4C +:102DE000D490FC01E656FF4FE491F0E0EE0FFF1F98 +:102DF000E057FF4F059114911092920310929303A4 +:102E000010929403109295031092960361E08C2F18 +:102E10000E94760260E08C2F0E940A0262E170E05C +:102E200080E090E00E94080361E08C2F0E940A027B +:102E3000C7010197F1F760E08C2F0E94760280E9CC +:102E400091E0F80120812D2199F40197D1F740926A +:102E50008A0350928B0360928C0370928D03409290 +:102E60008E0350928F03609290037092910364C01E +:102E700080E991E0F80120812D2119F00197D1F727 +:102E8000E6CF98E2392E20E8C22E212C80E991E08D +:102E9000F80120812D2119F40197D1F7D8CF0E9494 +:102EA000A7024B015C0180E991E0F80120812D210E +:102EB00019F00197D1F7CBCF0E94A70268197909C1 +:102EC0008A099B09693271058105910538F0E22D67 +:102ED000F0E0E657FC4F80858C298087C69419F472 +:102EE000239480E8C82E3A943110D0CF61E08C2F23 +:102EF0000E94760261E08C2F0E940A026091920388 +:102F000070E090E080E00E941E1860938A03709346 +:102F10008B0380938C0390938D036091940370E0F6 +:102F200090E080E00E941E1860938E0370938F03E0 +:102F30008093900390939103C3E0D0E08BEF91E0F6 +:102F40000E942C0860918E0370918F0380919003F2 +:102F50009091910342E00E948F0885E392E00E94E5 +:102F60007D0888E392E00E942C0860918A037091AA +:102F70008B0380918C0390918D0342E00E948F0817 +:102F800085E392E00E947D0864E670E080E090E0D6 +:102F90000E940803219791F680910001882301F196 +:102FA0008091600490916104A0916204B0916304E7 +:102FB0000097A105B105A1F0892BD1F48FE692E02D +:102FC0000E942C0868EC70E080E090E00E9408030A +:102FD00010926004109261041092620410926304D3 +:102FE0000E944801882309F4C4CE0E94AF12C1CECA +:102FF00080E892E00E942C08609160047091610466 +:1030000080916204909163044AE00E94390885E34C +:1030100092E00E947D08D6CF84E694E00C946B0980 +:10302000FB01DC0102C005900D9241505040D8F7E1 +:1030300008950E945B1808F481E00895E89409C09F +:1030400097FB3EF490958095709561957F4F8F4FDB +:103050009F4F9923A9F0F92F96E9BB279395F695F1 +:10306000879577956795B795F111F8CFFAF4BB0F6F +:1030700011F460FF1BC06F5F7F4F8F4F9F4F16C0D3 +:10308000882311F096E911C0772321F09EE8872F5D +:10309000762F05C0662371F096E8862F70E060E019 +:1030A0002AF09A95660F771F881FDAF7880F969592 +:1030B000879597F90895990F0008550FAA0BE0E836 +:1030C000FEEF16161706E807F907C0F012161306EA +:1030D000E407F50798F0621B730B840B950B39F42A +:1030E0000A2661F0232B242B252B21F408950A2690 +:1030F00009F4A140A6958FEF811D811D08950E94BE +:1031000092180C9403190E94F51838F00E94FC18CC +:1031100020F0952311F00C94EC180C94F218112463 +:103120000C9437190E94141970F3959FC1F3950FF1 +:1031300050E0551F629FF001729FBB27F00DB11D3B +:10314000639FAA27F00DB11DAA1F649F6627B00DCB +:10315000A11D661F829F2227B00DA11D621F739FB4 +:10316000B00DA11D621F839FA00D611D221F749FC2 +:103170003327A00D611D231F849F600D211D822F09 +:10318000762F6A2F11249F5750409AF0F1F0882330 +:103190004AF0EE0FFF1FBB1F661F771F881F91505D +:1031A0005040A9F79E3F510580F00C94EC180C9408 +:1031B00037195F3FE4F3983ED4F38695779567958A +:1031C000B795F795E7959F5FC1F7FE2B880F911D87 +:1031D0009695879597F9089597F99F6780E870E02D +:1031E00060E008959FEF80EC089500240A9416167D +:1031F000170618060906089500240A9412161306E5 +:10320000140605060895092E0394000C11F4882372 +:1032100052F0BB0F40F4BF2B11F460FF04C06F5F8E +:103220007F4F8F4F9F4F089557FD9058440F551F64 +:1032300059F05F3F71F04795880F97FB991F61F038 +:103240009F3F79F087950895121613061406551FAF +:10325000F2CF4695F1DF08C0161617061806991F1B +:10326000F1CF86957105610508940895E894BB2710 +:1032700066277727CB0197F90895052E97FB1EF453 +:1032800000940E94541957FD07D00E94A61907FC0C +:1032900003D04EF40C9454195095409530952195D7 +:1032A0003F4F4F4F5F4F0895909580957095619572 +:1032B0007F4F8F4F9F4F08950E94C819A59F900D73 +:1032C000B49F900DA49F800D911D11240895B7FF08 +:1032D0000C945C190E945C19821B930B08952F9229 +:1032E0003F924F925F926F927F928F929F92AF9296 +:1032F000BF92CF92DF92EF92FF920F931F93CF93E3 +:10330000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF79 +:103310000FBECDBF09942A88398848885F846E849F +:103320007D848C849B84AA84B984C884DF80EE80E9 +:10333000FD800C811B81AA81B981CE0FD11D0FB6F2 +:10334000F894DEBF0FBECDBFED010895A1E21A2EA5 +:10335000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F39 +:10336000A217B307E407F50720F0A21BB30BE40B89 +:10337000F50B661F771F881F991F1A9469F76095D0 +:103380007095809590959B01AC01BD01CF0108958A +:10339000A29FB001B39FC001A39F700D811D112496 +:1033A000911DB29F700D811D1124911D08955058DB +:1033B000BB27AA270E94EF190C9403190E94F51845 +:1033C00038F00E94FC1820F039F49F3F19F426F4DD +:1033D0000C94F2180EF4E095E7FB0C94EC18E92F2E +:1033E0000E94141958F3BA176207730784079507E8 +:1033F00020F079F4A6F50C9436190EF4E0950B2E16 +:10340000BA2FA02D0B01B90190010C01CA01A00136 +:103410001124FF27591B99F0593F50F4503E68F191 +:103420001A16F040A22F232F342F4427585FF3CFD2 +:10343000469537952795A795F0405395C9F77EF4A3 +:103440001F16BA0B620B730B840BBAF09150A1F0EC +:10345000FF0FBB1F661F771F881FC2F70EC0BA0F72 +:10346000621F731F841F48F4879577956795B795FA +:10347000F7959E3F08F0B0CF9395880F08F09927F5 +:10348000EE0F9795879508950E94581A0C9403198A +:103490000E94FC1858F00E94F51840F029F45F3F94 +:1034A00029F00C94EC1851110C9437190C94F21863 +:1034B0000E94141968F39923B1F3552391F3951BD6 +:1034C000550BBB27AA2762177307840738F09F5F45 +:1034D0005F4F220F331F441FAA1FA9F335D00E2EB2 +:1034E0003AF0E0E832D091505040E695001CCAF71F +:1034F0002BD0FE2F29D0660F771F881FBB1F2617E2 +:1035000037074807AB07B0E809F0BB0B802DBF01B8 +:10351000FF2793585F4F3AF09E3F510578F00C9487 +:10352000EC180C9437195F3FE4F3983ED4F386957A +:1035300077956795B795F7959F5FC9F7880F911DA8 +:103540009695879597F90895E1E0660F771F881F94 +:10355000BB1F621773078407BA0720F0621B730B47 +:10356000840BBA0BEE1F88F7E09508950E94BD1AF0 +:103570006894B1110C94371908950E941C1988F0B1 +:103580009F5798F0B92F9927B751B0F0E1F0660F27 +:10359000771F881F991F1AF0BA95C9F714C0B13068 +:1035A00091F00E943619B1E008950C943619672FF6 +:1035B000782F8827B85F39F0B93FCCF38695779597 +:1035C0006795B395D9F73EF4909580957095619580 +:1035D0007F4F8F4F9F4F08950E945B1808F48FEF25 +:1035E00008950E945B18880B990B0895991B79E048 +:1035F00004C0991F961708F0961B881F7A95C9F783 +:1036000080950895AA1BBB1B51E107C0AA1FBB1FD1 +:10361000A617B70710F0A61BB70B881F991F5A955E +:10362000A9F780959095BC01CD010895EE0FFF1F7D +:103630000590F491E02D09940F931F93CF93DF939E +:103640008230910510F482E090E0E0915305F09112 +:10365000540530E020E0B0E0A0E0309799F4211567 +:10366000310509F44AC0281B390B24303105D8F53F +:103670008A819B816115710589F1FB0193838283A6 +:10368000FE0111C040815181028113814817590701 +:10369000E0F04817590799F4109761F012960C93CF +:1036A000129713961C933296CF01DF91CF911F9101 +:1036B0000F9108950093530510935405F4CF2115ED +:1036C000310551F04217530738F0A901DB019A0187 +:1036D000BD01DF01F801C1CFEF01F9CF909354058F +:1036E00080935305CDCFFE01E20FF31F8193919399 +:1036F0002250310939832883D7CF20915105309149 +:103700005205232B41F42091090130910A01309395 +:103710005205209351052091070130910801211590 +:10372000310541F42DB73EB740910B0150910C018A +:10373000241B350BE0915105F0915205E217F30778 +:10374000A0F42E1B3F0B2817390778F0AC014E5F11 +:103750005F4F2417350748F04E0F5F1F50935205F7 +:1037600040935105819391939FCFF0E0E0E09CCF8F +:10377000CF93DF930097E9F0FC0132971382128216 +:10378000A0915305B0915405ED0130E020E0109771 +:10379000A1F420813181820F931F20915105309136 +:1037A00052052817390709F061C0F0935205E093DC +:1037B0005105DF91CF910895EA01CE17DF07E8F5B3 +:1037C0004A815B819E0141155105B1F7E901FB83F7 +:1037D000EA8349915991C40FD51FEC17FD0761F495 +:1037E000808191810296840F951FE90199838883D6 +:1037F000828193819B838A83F0E0E0E012968D9131 +:103800009C9113970097B9F52D913C911197CD019B +:103810000296820F931F209151053091520528176F +:10382000390739F6309751F5109254051092530527 +:10383000B0935205A0935105BCCFD383C28340817E +:103840005181840F951FC817D90761F44E5F5F4FF0 +:1038500088819981480F591F518340838A819B81B8 +:10386000938382832115310509F0B0CFF09354057D +:10387000E09353059ECFFD01DC01C0CF138212827D +:10388000D7CFB0E0A0E0E7E4FCE10C9471198C0123 +:10389000009751F4CB010E941C1B8C01C801CDB7CD +:1038A000DEB7E0E10C948D19FC01E60FF71F9C01D7 +:1038B00022503109E217F30708F49DC0D901CD91D8 +:1038C000DC911197C617D70798F0C530D10530F3B2 +:1038D000CE0104978617970708F3C61BD70B2297CC +:1038E000C193D1936D937C93CF010E94B81BD6CF27 +:1038F0005B01AC1ABD0A4C018C0E9D1EA0915305B4 +:10390000B0915405512C412CF12CE12C109731F53C +:1039100080915105909152058815990509F05CC078 +:103920004616570608F058C080910701909108018B +:10393000009741F48DB79EB740910B0150910C0157 +:10394000841B950BE817F90708F055C0F093520552 +:10395000E0935105F90171836083A0CF8D919C9113 +:10396000119712966C90129713967C901397A81546 +:10397000B90559F56C0142E0C40ED11CCA14DB0430 +:1039800020F1AC014A195B09DA011296159780F013 +:103990006282738251834083D9016D937C93E114D9 +:1039A000F10471F0D7011396FC93EE93129776CF42 +:1039B00022968C0F9D1FF90191838083F301EFCF35 +:1039C000F0935405E093530569CF4816590608F45F +:1039D0002C017D01D3019ACFCB010E941C1B7C01DD +:1039E000009749F0AE01B8010E94FE1CC8010E9478 +:1039F000B81B870153CF10E000E050CFFB01DC0182 +:103A000002C001900D9241505040D8F70895FB013B +:103A1000DC018D91019080190110D9F3990B089563 +:103A2000FB01DC0101900D920020E1F7089510E008 +:103A3000CDE7D0E004C0FE010E94161B2196CE37D0 +:083A4000D107C9F7F894FFCF8C +:103A4800013B033B033C00000055058000B302B670 +:103A580002C602D302DC02E902CDCCCC3D0AD72350 +:103A68003C17B7D13877CC2B329595E6241FB14F48 +:103A78000A000020410000C84200401C4620BCBE8D +:103A88004CCA1B0E5AAEC59D74000000007401DEBE +:103A9800000B01C1013C011A012E012F2F22225CCB +:103AA8005C6208660C6E0A720D7409000D0A006EDD +:103AB800616E00696E66006F7666003F3F3F006585 +:103AC8006D69745F3433330066756E6374696F6E45 +:103AD8005F6E616D6500706172616D6574657273AA +:103AE80000646174615F70696E006269745F6C651F +:103AF8006E67746800636F646500656D69745F3430 +:103B080033335F636861636F6E00656D69745F6905 +:103B180072007365745F736572766F00616E676CAF +:103B28006500726563765F34333300656E61626C7D +:103B38006500726563765F646874007B2266756EE3 +:103B48006374696F6E5F6E616D65223A2264687492 +:103B58005F74656D7065726174757265222C227070 +:103B68006172616D6574657273223A7B2276616C4D +:103B78007565223A007D7D007B2266756E637469E7 +:103B88006F6E5F6E616D65223A226468745F687556 +:103B98006D6964697479222C22706172616D657433 +:103BA800657273223A7B2276616C7565223A0055FC +:103BB8006E6B6E6F776E20656E636F64696E6700FB +:103BC8007B2266756E6374696F6E5F6E616D6522C8 +:103BD8003A22726563765F343333222C2270617225 +:103BE800616D6574657273223A7B2276616C7565C6 +:103BF800223A004F6B00496E636F6D706C65746597 +:103C0800496E70757400496E76616C6964496E70AE +:103C18007574004E6F4D656D6F7279004E6F7453F9 +:103C28007570706F7274656400546F6F4465657069 +:023C380000008A +:107E0000112484B714BE81FFF0D085E080938100F7 +:107E100082E08093C00088E18093C10086E0809377 +:107E2000C20080E18093C4008EE0C9D0259A86E02C +:107E300020E33CEF91E0309385002093840096BBD3 +:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 +:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 +:107E6000A2D0813461F49FD0082FAFD0023811F036 +:107E7000013811F484E001C083E08DD089C08234E0 +:107E800011F484E103C0853419F485E0A6D080C0E4 +:107E9000853579F488D0E82EFF2485D0082F10E0AE +:107EA000102F00270E291F29000F111F8ED06801E7 +:107EB0006FC0863521F484E090D080E0DECF843638 +:107EC00009F040C070D06FD0082F6DD080E0C81688 +:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 +:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 +:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 +:107F0000A601A0E0B1E02C9130E011968C91119780 +:107F100090E0982F8827822B932B1296FA010C0160 +:107F200087BEE89511244E5F5F4FF1E0A038BF0790 +:107F300051F7F601A7BEE89507B600FCFDCF97BE46 +:107F4000E89526C08437B1F42ED02DD0F82E2BD052 +:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 +:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 +:107F7000D11C0EC0853739F428D08EE10CD085E9AC +:107F80000AD08FE07ACF813511F488E018D01DD067 +:107F900080E101D065CF982F8091C00085FFFCCF94 +:107FA0009093C60008958091C00087FFFCCF809118 +:107FB000C00084FD01C0A8958091C6000895E0E648 +:107FC000F0E098E1908380830895EDDF803219F02E +:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA +:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 +:047FF000FF270994CA +:027FFE00040479 +:0400000300007E007B +:00000001FF diff --git a/server/services/arduino/arduino-code/uno/arduino-code.ino.hex b/server/services/arduino/arduino-code/uno/arduino-code.ino.hex new file mode 100644 index 0000000000..6d854ec49f --- /dev/null +++ b/server/services/arduino/arduino-code/uno/arduino-code.ino.hex @@ -0,0 +1,966 @@ +:100000000C947E000C94D7130C94B0130C94A6009F +:100010000C94A6000C94A6000C94A6000C94BA14A0 +:100020000C94A6000C94A6000C94A6000C94FE134D +:100030000C94A6000C94A6000C94A6000C94A600A8 +:100040000C9466130C94A6000C9434130C940E13A9 +:100050000C94A6000C94A6000C94A6000C94A60088 +:100060000C94A6000C94A6000000000024002700B9 +:100070002A0000000000250028002B0000000008D6 +:10008000000201000003040700000000000000005F +:1000900000000000230026002900040404040404D6 +:1000A0000404020202020202030303030303010227 +:1000B00004081020408001020408102001020408F6 +:1000C00010205E01011F01030301008A02010A01E1 +:1000D0000202010064001E47040B0906007C0101B6 +:1000E000060103030100F401060E0102020100C231 +:1000F000011701010202010197150C1811241FBEFE +:10010000CFEFD8E0DEBFCDBF12E0A0E0B1E0E8E481 +:10011000FAE302C005900D92A23FB107D9F725E09E +:10012000A2EFB2E001C01D92A535B207E1F710E0E1 +:10013000CDE7D0E004C02197FE010E94161BCC370A +:10014000D107C9F70E9426160C94171D0C940000C5 +:10015000E0916D04F0916E04EF3FFE0719F11092EB +:1001600060041092610410926204109263042E2FB6 +:10017000E230C0F4FF27EE0FFF1FEF5FFE4F85EE6A +:1001800096E09183808380916900213031F08C7FEB +:10019000816080936900E89A0895837F84608093EA +:1001A0006900E99A08958230910538F0880F991F07 +:1001B000880F991F05970197F1F70895AF92BF92A5 +:1001C000CF92DF92EF92FF920F931F93CF93DF9323 +:1001D0006C017B018B01040F151FEB015E01AE1852 +:1001E000BF08C017D10759F06991D601ED91FC9174 +:1001F0000190F081E02DC6010995892B79F7C501A1 +:10020000DF91CF911F910F91FF90EF90DF90CF90F2 +:10021000BF90AF900895FC01538D448D252F30E0A1 +:10022000842F90E0821B930B541710F0CF96089503 +:1002300001970895FC01918D828D981761F0A28D30 +:10024000AE0FBF2FB11D5D968C91928D9F5F9F73F6 +:10025000928F90E008958FEF9FEF0895FC01918DAC +:10026000828D981731F0828DE80FF11D858D90E019 +:1002700008958FEF9FEF0895FC01918D228D892FB6 +:1002800090E0805C9F4F821B91098F73992708959E +:100290008EE993E00E943C0121E0892B09F420E0E3 +:1002A000822F0895FC01A48DA80FB92FB11DA35A68 +:1002B000BF4F2C91848D90E001968F739927848F86 +:1002C000A689B7892C93A089B1898C9183708064A9 +:1002D0008C93938D848D981306C00288F389E02D4A +:1002E00080818F7D80830895EF92FF920F931F93FB +:1002F000CF93DF93EC0181E0888F9B8D8C8D9813D9 +:100300001AC0E889F989808185FF15C09FB7F894E4 +:10031000EE89FF896083E889F98980818370806430 +:1003200080839FBF81E090E0DF91CF911F910F917B +:10033000FF90EF900895F62E0B8D10E00F5F1F4F8A +:100340000F731127E02E8C8D8E110CC00FB607FC99 +:10035000FACFE889F989808185FFF5CFCE010E9427 +:100360005201F1CFEB8DEC0FFD2FF11DE35AFF4F42 +:10037000F0829FB7F8940B8FEA89FB8980818062B5 +:10038000CFCFCF93DF93EC01888D8823B9F0AA8972 +:10039000BB89E889F9898C9185FD03C0808186FD40 +:1003A0000DC00FB607FCF7CF8C9185FFF2CF80818F +:1003B00085FFEDCFCE010E945201E9CFDF91CF91B1 +:1003C0000895833081F028F4813099F08230A9F0CB +:1003D00008958730A9F08830C9F08430B1F4809155 +:1003E00080008F7D03C0809180008F778093800094 +:1003F000089584B58F7784BD089584B58F7DFBCF34 +:100400008091B0008F778093B00008958091B00004 +:100410008F7DF9CF1F93CF93DF93282F30E0F90121 +:10042000E458FF4F8491F901E255FF4FD491F9014F +:10043000E656FF4FC491CC23A9F0162F81110E94DC +:10044000E101EC2FF0E0EE0FFF1FEE58FF4FA591FA +:10045000B4918FB7F894EC91111108C0D095DE23B8 +:10046000DC938FBFDF91CF911F910895DE2BF8CFE2 +:10047000CF93DF93EC0180914E0560E00E940A0269 +:10048000CE01DF91CF910C94D3001F93CF93DF93D4 +:10049000182FD92F80917B0460E0C1E0811102C048 +:1004A00061E0C0E080916F040E940A0280917304B1 +:1004B000909174049C01129FC001139F900D112410 +:1004C0000E94D3006C2F80916F040E940A028091D9 +:1004D0007304909174049C01D29FC001D39F900D2E +:1004E0001124DF91CF911F910C94D300CF93DF9310 +:1004F00090E0FC01E255FF4F249186569F4FFC018E +:1005000084918823D1F090E0880F991FFC01E8596D +:10051000FF4FA591B491FC01EE58FF4FC591D491C6 +:1005200061110EC09FB7F8948C91E22FE0958E2355 +:100530008C932881E223E8839FBFDF91CF910895B8 +:100540008FB7F894EC91E22BEC938FBFF6CF3FB7C7 +:10055000F8948091820390918303A0918403B091D9 +:10056000850326B5A89B05C02F3F19F00196A11D54 +:10057000B11D3FBFBA2FA92F982F8827BC01CD01ED +:10058000620F711D811D911D42E0660F771F881F4C +:10059000991F4A95D1F708958F929F92AF92BF927B +:1005A000CF92DF92EF92FF926C010E94A7024B0163 +:1005B0005C010D2C000CEE08FF080E94A7026819D0 +:1005C00079098A099B096C157D058E059F05B8F48C +:1005D00080914E0561E00E940A0280914F05909142 +:1005E00050050E94D30080914E0560E00E940A02EF +:1005F00080914F05909150050E94D300DECFFF906F +:10060000EF90DF90CF90BF90AF909F908F90089524 +:100610008F929F92AF92BF92CF92DF92EF92FF9212 +:100620006B017C010E94A7024B015C01C114D10443 +:10063000E104F104B9F00E94A702681979098A0956 +:100640009B09683E73408105910580F321E0C21A41 +:10065000D108E108F10888EE880E83E0981EA11CFD +:10066000B11CE4CFFF90EF90DF90CF90BF90AF90A0 +:100670009F908F90089508954F925F926F927F920E +:100680008F929F92AF92BF92DF92EF92FF920F9361 +:100690001F93CF93DF938C01EB0188818B32D1F1D3 +:1006A0008D32C9F52196EE24E394888190ED980F60 +:1006B0009A3010F08E3289F560E070E0CB01FE01D7 +:1006C0002191A0ED8A2E820E39E0381508F440C041 +:1006D0006A3929E97207820729E1920708F04DC0BB +:1006E000AAE0B0E09B01AC010E945C19912CB12CF6 +:1006F000A12C2401350140945094609470944616C6 +:10070000570668067906C8F1680D791D8A1D9B1D7C +:10071000EF01D5CF2196E12CC8CFF80110821182CC +:100720001282138214821582168217821086C801E3 +:10073000DF91CF911F910F91FF90EF90DF90BF90CD +:10074000AF909F908F907F906F905F904F900895A3 +:10075000211113C0F80160837183828393830E9407 +:100760001E18F80164837583868397838AE0E110FD +:1007700001C088E0F8018087DACFF12CEAE08E2E04 +:10078000912CA12CB12C61157105F0E88F07910512 +:1007900040F0A50194010E94A619CA01B901F39481 +:1007A000F2CFFE01299130ED320F3A3010F4F3947C +:1007B000F8CF2E32F1F4EF012196FE01219620812F +:1007C00050EDD52ED20E29E02D1598F06C3C3CEC66 +:1007D00073073CE08307910580F7AAE0B0E09B0136 +:1007E000AC010E945C196D0D711D811D911DFA9463 +:1007F000E4CF20812F7DD0E0C0E0253409F04FC048 +:1008000021812D32A9F53296BB24B394DF01D0E0CB +:10081000C0E02F2D0F2C000C330B4AE0A42EFD015D +:10082000DD9040ED4D0D4A30A8F5AC9EA001AD9E87 +:10083000500D1124CD2DDD0CDD0BE097C40FD51F1D +:10084000AE01420F531F473251054CF3BB20B9F0A4 +:1008500080E090E0A0E0B0E8E11003C080E090E02C +:10086000DC01F80184839583A683B7838CE083CF72 +:100870002B3219F03196B12CC9CF3296FCCF80E0E3 +:1008800090E0A0E8BFEFE110ECCF80E090E0A0E8BE +:10089000BFE7E7CFBB2019F0D195C195D1092081E1 +:1008A00021113BCFCF0DD11DF7FCDA950E941E1808 +:1008B0001C161D06E4F4F12CC0FF0CC024E0F29ECF +:1008C000F0011124EF5CFE4F208131814281538180 +:1008D0000E947F18D595C795F394209769F7E1108A +:1008E0009058F8016483758386839783BFCFD19531 +:1008F000C195D109F12C209791F3C0FF0CC024E0E1 +:10090000F29EF0011124E75EFE4F20813181428189 +:1009100053810E947F18D595C795F394ECCF80330F +:100920009CF08A3324F08F3524F08B3724F481E057 +:10093000089581344CF08B35D4F393ED980F81E01A +:100940009230B0F380E008958B32B9F7F0CFFC011C +:100950008185811114C0A481B581868197812FEF93 +:100960003FEFA817B90730F4CD0101969583848332 +:100970002C9130E037FD20E0208781E08187808561 +:1009800008951F93CF93DF93EC01162F0E94A704C5 +:10099000811306C0198681E0DF91CF911F910895E0 +:1009A00080E0FACFCF93DF93EC01CE010E94A70441 +:1009B0008B303CF489304CF4882349F090E080E09F +:1009C00008C08D3011F08032C9F71986EECF81E072 +:1009D00090E0DF91CF910895CF92DF92EF92FF9256 +:1009E000CF93DF93CDB7DEB729970FB6F894DEBF6C +:1009F0000FBECDBFFC01892B39F094819F779630D3 +:100A000081F030F49430F0F460E070E0CB010DC080 +:100A1000983039F09C30C1F7C080D180E280F380FB +:100A200020C0608171818281938129960FB6F894EC +:100A3000DEBF0FBECDBFDF91CF91FF90EF90DF9073 +:100A4000CF90089560817181CE0101960E943C0390 +:100A500089858830F9F08C30B9F6CD80DE80EF8062 +:100A6000F88420E030E0A901C701B6010E94EC1A29 +:100A700087FDCACF20E030E040E85FE4C701B6015F +:100A80000E94191818160CF4BFCFC701B6010E94B6 +:100A9000BD1ACBCF69817A818B819C81C6CFCF92E1 +:100AA000DF92EF92FF92CF93DF93CDB7DEB7299716 +:100AB0000FB6F894DEBF0FBECDBFFC01892B39F015 +:100AC00094819F77963069F028F4943080F570E037 +:100AD00060E01FC09A3081F09C3009F459C0983012 +:100AE000B1F780819181A281B381BC0181159048C9 +:100AF000A105B10570F0EBCF80819181A281B38116 +:100B000066277727681B790B81309048A105B105CE +:100B1000F0F6CB0129960FB6F894DEBF0FBECDBF1D +:100B2000DF91CF91FF90EF90DF90CF90089560819B +:100B30007181CE0101960E943C0389819A81AB812B +:100B4000BC8129852A30E1F22C3021F0283009F0CF +:100B5000BECFCBCFCD80DE80EF80F88420E030E0C8 +:100B600040E057ECC701B6010E94EC1A87FDAFCFF9 +:100B700020E03EEF4FEF56E4C701B6010E9419187E +:100B800018160CF4A4CFC701B6010E94B61AC1CF43 +:100B9000C080D180E280F380E1CFCF93FC01892B2C +:100BA00091F094819F77983029F078F4992359F047 +:100BB000963079F4C1E080819181A281B381892B43 +:100BC0008A2B8B2B39F4C0E005C09A3099F39C3006 +:100BD00021F0C1E08C2FCF910895C1E020E030E0FA +:100BE000A90160817181828193810E94191881110C +:100BF000F1CFE9CFFC0184819581009799F02281A2 +:100C00003381468157812417350718F015821482E5 +:100C10000895A9014F5F5F4F53834283820F931F53 +:100C2000FC0160830895FF920F931F93CF93DF938E +:100C3000CDB7DEB728970FB6F894DEBF0FBECDBF95 +:100C40008C01DC011296ED91FC912281338184812B +:100C5000958193838283FA83E9831C821B823E837E +:100C60002D83821B930B98878F83C8010E94A70452 +:100C7000F82EF8011186C8010E94A704D801199620 +:100C80001C92F816C9F1811110C061E070E080E09B +:100C900090E028960FB6F894DEBF0FBECDBFDF916F +:100CA000CF911F910F91FF9008958C35F9F4C801F1 +:100CB0000E94A704882349F3853729F464E070E093 +:100CC00080E090E0E6CFEBE5F1E09081992329F018 +:100CD000891308C08181811107C062E070E080E063 +:100CE00090E0D7CF3296F1CFF8011186682FCE0170 +:100CF00001960E94FA05BFCF60E0CE0101960E94E6 +:100D0000FA058D819E81892B79F0E981FA818B81A9 +:100D10009C812F813885AC01421B530B82819381CA +:100D2000840F951F938382832D813E8163E070E061 +:100D300080E090E02115310509F4ABCF60E070E070 +:100D4000CB01C901A6CFFC0180819181892B21F4BF +:100D500060E070E0CB01089561EB76E090E080E028 +:100D600008950895CF93DF93DC01EB01EC81FD81C1 +:100D70008A819B810896E817F90730F4F0E0E0E0FB +:100D8000CF01DF91CF9108953897FD83EC833097A1 +:100D9000A9F31296CD91DC911397209791F0CF0192 +:100DA0008C1B9D0B23E0959587952A95E1F78D8304 +:100DB0001396FC93EE931297158214821782168273 +:100DC000DFCF1196FC93EE93F3CF2F923F924F9289 +:100DD0005F926F927F928F929F92AF92BF92CF92CB +:100DE000DF92EF92FF920F931F93CF93DF93CDB7D4 +:100DF000DEB761970FB6F894DEBF0FBECDBF0E947D +:100E0000A7026B017C0180917C0390917D033601E8 +:100E1000681A790A2DEC621620E1720608F4D1C036 +:100E20008091F6029091F702D301A81BB90BCD0176 +:100E3000B7FF03C0919581959109883C91050CF00D +:100E4000BCC08091F4029091F50201969093F50256 +:100E50008093F402029709F0B0C002EC10E04090D9 +:100E6000F2025090F30249E050E0B801CE01019641 +:100E70000E9410188B816C81681708F4682F70E04D +:100E80008091F6029091F7020E94021B9B01409113 +:100E9000050150910601649FC001659F900D749FEC +:100EA000900D112464E670E00E94021B898541E0E8 +:100EB00050E0882311F042E050E08D81829FF001E4 +:100EC000839FF00D1124FB87EA878E81829FD001DA +:100ED000839FB00D1124BD87AC878F81829FF00165 +:100EE000839FF00D1124FF87EE878885829F100174 +:100EF000839F300C1124FA01EE0FFF1FEA50FD4FC3 +:100F0000812C912C5401920121503109398B288B6D +:100F1000888999894817590708F03FC0880C991C9F +:100F2000AA1CBB1C808191819C01AA85BB852A1BC0 +:100F30003B0B37FF03C03195219531092617370741 +:100F400070F422813381AC85BD852A1B3B0B37FFB2 +:100F500003C031952195310926173707D0F02E852A +:100F60003F85821B930B97FF03C091958195910953 +:100F700086179707B8F4828193818219930997FFA6 +:100F800003C09195819591098617970758F4689445 +:100F900080F84E5F5F4F3496BBCF38E04316510464 +:100FA00008F051C0075F1F4F80E0083F180709F0A5 +:100FB00056CF1092F5021092F4021092F3021092A2 +:100FC000F2028091F2029091F3028334910540F095 +:100FD0001092F3021092F2021092F5021092F402B3 +:100FE0008091F2029091F3029C012F5F3F4F30936A +:100FF000F3022093F202880F991FFC01EA50FD4F83 +:1010000071826082C0927C03D0927D03E0927E0365 +:10101000F0927F0361960FB6F894DEBF0FBECDBF8E +:10102000DF91CF911F910F91FF90EF90DF90CF90C4 +:10103000BF90AF909F908F907F906F905F904F90F8 +:101040003F902F9008958092600490926104A09246 +:101050006204B0926304ADCFFC0101900020E9F777 +:101060003197AF01481B590BBC018EE993E00C94FA +:10107000DE008F929F92AF92BF920F931F93CF93F8 +:10108000DF93CDB7DEB7A1970FB6F894DEBF0FBEE2 +:10109000CDBF19A2423008F44AE08E010F5D1F4F08 +:1010A000842E912CB12CA12CA50194010E94A6198B +:1010B000E62FB901CA01EA30F4F4E05DD801EE93FD +:1010C0008D01232B242B252B79F790E080E01097BE +:1010D00019F0CD010E942C08A1960FB6F894DEBF3E +:1010E0000FBECDBFDF91CF911F910F91BF90AF90F9 +:1010F0009F908F900895E95CE1CFCF93DF93D0E08C +:10110000C0E0009719F00E942C08EC018CE691E0F9 +:101110000E942C088C0F9D1FDF91CF9108954F9254 +:101120005F926F927F928F929F92AF92BF92CF9277 +:10113000DF92EF92FF920F931F93CF936B017C018D +:10114000742EAC019B010E94F11A882399F08FE65E +:1011500091E0CF911F910F91FF90EF90DF90CF9092 +:10116000BF90AF909F908F907F906F905F904F90C7 +:101170000C942C0846015701E894B7F82FEF3FEF85 +:101180004FE75FE7C501B4010E94F11A81110DC05C +:101190002FEF3FEF4FE75FE7C501B4010E94191839 +:1011A00018161CF483E791E0D4CF2FEF3FEF4FE701 +:1011B0005FE4C701B6010E94EC1A18161CF487E719 +:1011C00091E0C7CF2FEF3FEF4FE75FECC701B601CC +:1011D0000E94191887FDF3CF20E030E0A901C70174 +:1011E000B6010E94191810E000E087FF0AC06DE206 +:1011F0008EE993E00E9474018C01F7FAF094F7F8FD +:10120000F094C0E060E070E080E09FE37C1641F085 +:1012100020E030E040E251E40E94441ACF5FF6CF74 +:10122000A70196010E94D8192B013C010E94BD1A0A +:101230004B015C014AE00E9439087C01E00EF11E7E +:10124000CC23C1F1C501B4010E941E189B01AC0161 +:10125000C301B2010E94D7194B015C016EE28EE915 +:1012600093E00E947401E80EF91EC15018F120E0CD +:1012700030E040E251E4C501B4010E947F182B0127 +:101280003C010E94BD1A4B01B12CA12C4AE0C501C2 +:10129000B4010E943908E80EF91EC501B4010E948C +:1012A0001E189B01AC01C301B2010E94D7194B016A +:1012B0005C01DBCFC701CF911F910F91FF90EF90A1 +:1012C000DF90CF90BF90AF909F908F907F906F9066 +:1012D0005F904F900895FC0180819181009711F0FB +:1012E0000C94B81B08950F931F93CF93DF93EC01D9 +:1012F00088819981009759F02A813B812617370709 +:1013000030F081E0DF91CF911F910F9108958B0113 +:101310006F5F7F4F0E94411C009759F0998388832B +:101320001B830A832C813D81232B59F7FC011082FA +:10133000E8CF80E0E7CFEF92FF920F931F93CF9318 +:10134000DF93EC017B018A01BA010E9473092881B5 +:101350003981811114C02115310519F0C9010E948C +:10136000B81B198218821D821C821B821A82CE0130 +:10137000DF91CF911F910F91FF90EF9008951D8302 +:101380000C83B701C9010E94101DF1CFCF93DF93E9 +:10139000EC01FB018617970749F0608171816115A7 +:1013A000710541F0448155810E949B09CE01DF9176 +:1013B000CF91089588819981009711F00E94B81B00 +:1013C000198218821D821C821B821A82EFCFFC01B7 +:1013D000118210821382128215821482FB01019005 +:1013E0000020E9F73197AF01461B570B0C949B097E +:1013F0000F931F93CF93DF938B01EC012097E1F0C4 +:101400006E817F8160177107B9F00115110541F0F8 +:101410006115710529F0C8010E94071D892B61F033 +:101420008D81882339F028E08202C0011124C80F81 +:10143000D91FE4CFD0E0C0E0CE01DF91CF911F9162 +:101440000F9108958F929F92AF92BF92CF92DF92A9 +:10145000EF92FF920F931F93CF93DF93CDB7DEB739 +:10146000CB54D1090FB6F894DEBF0FBECDBF8C01AF +:101470007B01D42E0E94D2042C969FAF8EAF2C9766 +:10148000CE01865B9F4F0E94A306672B09F0B2C076 +:1014900080FDB0C0C8010E94A704873209F4B9C119 +:1014A00014F5823209F4B5C1C8010E94A704C82E00 +:1014B000FE0131964F01D12C5F018C2D0E948F04CB +:1014C000882309F4C4C1FFE3DF1609F4C0C1D801C1 +:1014D00019961C92D394F401C1924F01C8010E9445 +:1014E000A704C82EEACF8B3509F49EC08B37E1F6EE +:1014F000F701848180788062848311821082138254 +:101500001282DD2009F483C1D80119961C92C8010A +:101510000E94D20423969FAF8EAF2397CE018F5B9C +:101520009F4F0E94A306672B09F002C180FD00C1F6 +:101530006DE7C8010E94C1048111CDC0DA94C801D1 +:101540000E94A704873209F4D0C0823209F4CDC0CA +:10155000D8011296ED91FC9122813381848195818D +:1015600093838283FA83E9831C821B823E832D83CB +:10157000821B930B98878F83C8010E94A704A82E13 +:101580000E948F0422E030E0882389F1F80111865F +:101590006A2DCE0101960E94FA05C8010E94A70497 +:1015A000A82E0E948F048111F1CF60E0CE01019638 +:1015B0000E94FA058D819E81892B79F0E981FA815B +:1015C0008B819C812F813885AC01421B530B82811A +:1015D0009381840F951F938382838D819E8123E065 +:1015E00030E0009721F0B82EC92E30E020E09B2C8F +:1015F000AC2C83C02B968FAD2B972C969FAD2C9740 +:10160000C55BDF4F0FB6F894DEBF0FBECDBFDF91D5 +:10161000CF911F910F91FF90EF90DF90CF90BF90EF +:10162000AF909F908F900895D70114968C91149746 +:101630008078806414968C93149711961C921E9255 +:1016400013961C921E921297DD2009F4E0C0F80157 +:101650001186C8010E94D2049A838983CE01019623 +:101660000E94A306672B61F580FD2AC06DE5C801C5 +:101670000E94C10481112FC0DA94D8016D917C9130 +:10168000C7010E94B206009709F4BEC04D2DBC01EF +:10169000C8010E94220A9A838983CE0101960E9482 +:1016A000A306672B69F480FD0BC0C8010E94D20419 +:1016B0009A838983CE0101960E94A306672B19F0B5 +:1016C00089819A819DCF80FDFBCF6DE5C8010E9485 +:1016D000C104882311F080E098C06CE2C8010E9428 +:1016E000C1048111CACF82E090C0C8010E941306D4 +:1016F0009B019B2CAC2CB82EC92E23963FAF2EAF4E +:101700002397CE018F5B9F4F0E94A306672B81F426 +:1017100080FD0EC0C8010E94D20423969FAF8EAFF9 +:101720002397CE018F5B9F4F0E94A306672B39F052 +:1017300022968FAD229723969FAD239761CF80FD90 +:10174000F7CF6AE3C8010E94C104882361F26B2DC0 +:101750007C2DD7018D919C910E94F809BC01892BA9 +:1017600081F4F80160817181C7010E94B206FC0119 +:10177000892B09F449C0848180688483B682C7823A +:10178000BF014D2DC8010E94220A23969FAF8EAF44 +:101790002397CE018F5B9F4F0E94A306672B41F6D4 +:1017A00080FDC6CFC8010E94D20423969FAF8EAFA2 +:1017B0002397CE018F5B9F4F0E94A306672B09F0F2 +:1017C000B7CF80FDB5CF6DE7C8010E94C10481117C +:1017D00082CF6CE2C8010E94C104882309F483CF40 +:1017E000C8010E94D20423969FAF8EAF2397CE01EB +:1017F0008F5B9F4F0E94A306672B09F099CF80FD56 +:1018000097CFB92CCA2C9BCE83E090E0F9CE85E02F +:10181000FCCFC8010E94130669837A838B839C8363 +:10182000CE0101960E94A306672B09F049CF80FDE7 +:1018300047CF2B813C81D70114968C9114978078E7 +:10184000856014968C9314972D933C9344CFF501A7 +:10185000ED0DF11D108289818437B9F4D7011496FA +:101860008C9114978078866014968C9381E090E038 +:10187000A0E0B0E0F70180839183A283B38390E07E +:10188000F4E0DF12BDCE80E0BBCE863689F4D7010E +:1018900014968C9114978078866014968C93F70137 +:1018A000108211821282138281E090E0F5E0E9CF8C +:1018B0008E3631F481E090E024E0D212A1CEE3CF65 +:1018C000B501CE018F5B9F4F0E943C0325964CAD26 +:1018D0005DAD6EAD7FAD25972A968FAD2A978A3084 +:1018E00061F08C30C1F0883009F0FDCED70114963C +:1018F0008C9114978078886006C0D70114968C91DB +:10190000149780788A6014968C93F70140835183F2 +:1019100062837383E0CE29964CAD5DAD6EAD7FAD35 +:101920002997D70114968C91149780788C6014961F +:101930008C93F7014083518362837383CCCE0097ED +:1019400029F0FC01808191810C94F80990E080E0FD +:101950000895EF92FF920F931F93CF93DF93CDB72C +:10196000DEB72E970FB6F894DEBF0FBECDBFFC01D9 +:1019700001811281E580F6801A8619861C861B86F5 +:101980001E861D86CE0109960E94C6091A821982FA +:101990001C821B821E821D82BE01675F7F4FCE01AB +:1019A00001960E94C60981E090E098878F83CE015E +:1019B00009960E946B09B701C8010E949F0CFC01A7 +:1019C000892B39F194819F77963029F0D8F49230A1 +:1019D00000F1943060F50F811885CE0101960E94C8 +:1019E0006B0981E0012B09F080E02E960FB6F89488 +:1019F000DEBF0FBECDBFDF91CF911F910F91FF9042 +:101A0000EF9008959C3039F368F4983021F39A30C0 +:101A100011F381E090E029813A81232BC9F490E011 +:101A200080E016C09032B9F2903499F7D4CF60813B +:101A3000718189819A816817790769F0009771F03F +:101A40006115710571F00E94071D919581959109AD +:101A500098878F83C0CF90E080E0F7CF8FEF9FEF24 +:101A6000F4CF81E090E0F1CFFC01248125FF04C098 +:101A7000808191810C94F80990E080E008952F9284 +:101A80003F924F925F926F927F928F929F92AF920E +:101A9000BF92CF92DF92EF92FF920F931F93CF935B +:101AA000DF93CDB7DEB7C25BD1400FB6F894DEBF8F +:101AB0000FBECDBFFC01CE010E969A8389839C8315 +:101AC0008B834EE951E04C0F5D1F5E834D83588739 +:101AD0004F839D8590789D87208131818481958178 +:101AE000820F931F4D5951407A01C256DE4F5983E0 +:101AF0004883CE59D140C056DE4F59834883C05ADF +:101B0000D140CE55DE4F39832883C25AD140CC55BF +:101B1000DE4F99838883C45AD140C955DE4F18825D +:101B2000C75AD1405E0159E0A50EB11C4AE0B5018B +:101B3000CE0182569E4F0E94220AC855DE4F9983DD +:101B40008883C85AD140CE0188559E4F0E94A30673 +:101B5000672BC9F480FD17C0CA55DE4F8881C65A6D +:101B6000D140882381F08D85982F9F779C3019F084 +:101B70008D77883041F482E090E0C855DE4F99833C +:101B80008883C85AD140C855DE4F08811981C85A88 +:101B9000D140C255DE4F19830883CE5AD140CE01C1 +:101BA00082559E4F0E94A306672B09F00BC16C0162 +:101BB00021E0C222DD2480FD05C18D85850185FDE2 +:101BC00002C000E010E06FE771E0CE0188559E4F43 +:101BD0000E94E709C156DE4F0883CF59D140C05655 +:101BE000DE4F1883C05AD140CF55DE4FF982E882CC +:101BF000C15AD14038E8A32E31E0B32ECD55DE4F87 +:101C0000B982A882C35AD140BE0168557E4FCE0129 +:101C100082569E4F0E94A90C982ECE0188559E4F49 +:101C20000E946B099110F6C06AEB71E0CE018855F5 +:101C30009E4F0E94E709C156DE4F0883CF59D1401D +:101C4000C056DE4F1883C05AD140CF55DE4FF982BF +:101C5000E882C15AD140CD55DE4FB982A882C35A1D +:101C6000D140BE0168557E4FCE0182569E4F0E94E4 +:101C7000A90CD82ECE0188559E4F0E946B09DD20FD +:101C800009F404C266E971E0C8010E949F0C009744 +:101C900021F061EA71E00E94340D0E944F05382E58 +:101CA00066E971E0C8010E949F0C009721F065EB86 +:101CB00071E00E94340D0E94EC04C055DE4F688331 +:101CC000C05BD140CF54DE4F7883C15BD140282E1A +:101CD000CE54DE4F9883C25BD140F5E0EF2EF12C5D +:101CE0000BE613E0A3E78A2EA5E09A2EBBEDAB2E00 +:101CF000B5E1BB2E61E0832D0E940A02C801019765 +:101D0000F1F760E0832D0E940A0287EC99E20197C7 +:101D1000F1F7C055DE4F4880C05BD140CF54DE4F55 +:101D20005880C15BD140622CCE54DE4F7880C25BBC +:101D3000D140E0E2CE2ED12C61E0832D77FE8DC123 +:101D40000E940A02C8010197F1F760E0832D0E940A +:101D50000A02C5010197F1F761E0832D0E940A0292 +:101D6000C8010197F1F760E0832D0E940A02C401C7 +:101D70000197F1F7440C551C661C771C41E0C41A0E +:101D8000D108D1F661E0832D0E940A02C8010197B3 +:101D9000F1F760E0832D0E940A028BE995EA019732 +:101DA000F1F761E0832D0E940A02C8010197F1F763 +:101DB00060E0832D0E940A0251E0E51AF10809F063 +:101DC00099CF0EC08BE791E00630110538F4000F73 +:101DD000111FF801E35FFE4F808191810E947D0811 +:101DE000CE54DE4F0FB6F894DEBF0FBECDBFDF91ED +:101DF000CF911F910F91FF90EF90DF90CF90BF9008 +:101E0000AF909F908F907F906F905F904F903F909A +:101E10002F90089566E971E0C8010E949F0C009719 +:101E200021F061EA71E00E94340D0E944F05F82E06 +:101E3000E92E66E971E0C8010E949F0C009721F02D +:101E40006AEA71E00E94340D0E944F051C0166E9A8 +:101E500071E0C8010E949F0C009721F4412C512C85 +:101E600032014DC065EB71E00E94340DFC01892BFD +:101E7000A9F394819F77963039F1F8F4943070F398 +:101E800060817181CE0182569E4F0E943C03C256F2 +:101E9000DE4F488059806A807B80CE59D140CA5538 +:101EA000DE4F8881C65AD1408A3009F483C08C3015 +:101EB00009F489C0883091F60BC09A3061F09C30EB +:101EC00009F4A5C0983051F640805180628073803B +:101ED00077FE15C0C3CF408051806280738041E09F +:101EE00044165104610440E8740608F0B7CF7094BA +:101EF000609450944094411C511C611C711CF092E0 +:101F00006F04E092700461E08F2D0E947602809150 +:101F10006F0490917004019609F498C000916D04CB +:101F200010916E040F3F1007B1F0023070F4F80109 +:101F3000FF27013009F470C0E898EE0FFF1FEF5F34 +:101F4000FE4F8BE393E0918380838FEF9FEF90931D +:101F50006E0480936D04812C912C540183948091A4 +:101F6000710490917204C816D9060CF066C0710114 +:101F700051E0E51AF108F7FC56C0D501C4010E2C5A +:101F800004C0880F991FAA1FBB1F0A94D2F784218F +:101F90009521A621B721892B8A2B8B2B09F43EC0D2 +:101FA0008091790490917A040E94450281E0E81AB8 +:101FB000F108E1CF51E045165104610450E875067F +:101FC00008F04CCF94CFCE55DE4F88809980AA8000 +:101FD000BB80C25AD14020E030E040E05FECC50158 +:101FE000B4010E94EC1A87FD39CF20E030E040E0D8 +:101FF0005FE4C501B4010E94191818160CF42ECF25 +:10200000C501B4010E94B61A2B013C0178CF808033 +:102010009180A280B380DFCFE9988FCF8091770441 +:1020200090917804C1CF80917504909176040E94BC +:1020300045029FEFC91AD90A92CF0F3F100731F01E +:1020400010936E0400936D040E94A8008FEF9FEF21 +:102050009093700480936F04C3CE0E940A02C8015B +:102060000197F1F760E0832D0E940A02C4010197F5 +:10207000F1F761E0832D0E940A02C8010197F1F790 +:1020800060E0832D0E940A02C50172CE6AEC71E005 +:10209000CE0188559E4F0E94E709C156DE4F088346 +:1020A000CF59D140C056DE4F1883C05AD140CF55CA +:1020B000DE4FF982E882C15AD140CD55DE4FB98258 +:1020C000A882C35AD140BE0168557E4FCE018256C8 +:1020D0009E4F0E94A90CD82ECE0188559E4F0E947B +:1020E0006B09DD2009F47EC066E971E0C8010E9439 +:1020F0009F0C009721F061EA71E00E94340D0E946C +:102100004F05D82E66E971E0C8010E949F0C009728 +:1021100021F06AEA71E00E94340D0E944F057C01B3 +:1021200066E971E0C8010E949F0C009721F065EB01 +:1021300071E00E94340D0E94EC044B015C01D092CE +:102140004E058DE090E09093500580934F0580916F +:102150004E0561E00E94760280914E0560E00E948B +:102160000A0288E293E20E94CC0284E991E10E9493 +:102170003802C7010197C12CD12C7601C39404C049 +:10218000CC0CDD1CEE1CFF1C8A95D2F7C114D104C7 +:10219000E104F104F1F0D501C4018C219D21AE21AF +:1021A000BF21892B8A2B8B2B69F080E392E00E9460 +:1021B000CC028AE996E00E943802F694E794D7941C +:1021C000C794E4CF80E392E00E94CC0280E392E0E7 +:1021D000F2CF80E392E00E94CC0290E080E00E9487 +:1021E0003802FECD62ED71E0CE0188559E4F0E940F +:1021F000E709C156DE4F0883CF59D140C056DE4FA4 +:102200001883C05AD140CF55DE4FF982E882C15AB7 +:10221000D140CD55DE4FB982A882C35AD140BE010C +:1022200068557E4FCE0182569E4F0E94A90CD82E33 +:10223000CE0188559E4F0E946B09DD2009F4EDC048 +:1022400066E971E0C8010E949F0C009721F061EAE5 +:1022500071E00E94340D0E944F05F82E66E971E08E +:10226000C8010E949F0C009721F06CED71E00E9464 +:10227000340D0E944F058C0180916A048C3008F067 +:1022800053C061E08F2D0E94760280916A04282F4E +:1022900030E0F901EE0FFF1FE20FF31FE55CFB4F8B +:1022A0002F2D2F739081907C922B908310926B0432 +:1022B00010926C042CE0622F0E94F61A829FB001EB +:1022C000112430E020E0AB01420F531FFA01EE0F62 +:1022D000FF1FE40FF51FE55CFB4F908196FD16C0D4 +:1022E0002F5F3F4F2C30310571F781110FC01092D5 +:1022F000800082E08093810010928500109284001B +:10230000B19A80916F00826080936F00E0916A04BF +:102310008E2F90E0FC01EE0FFF1FE80FF91FE55C28 +:10232000FB4F808180648083F0906A04003282E0F9 +:1023300018070CF03DC080916B04E8E88E2E912CBC +:10234000881A910887FD9394880C991C880C991C15 +:10235000092C000CAA08BB0880916C0428E532E027 +:10236000281B310987FD3395220F331F220F331F9E +:10237000032E000C440B550B281939094A095B0937 +:10238000D801053B110514F0A4EBB0E0B7FF02C083 +:10239000B0E0A0E00E94671924EB30E040E050E09C +:1023A0000E943D1989019A01080D191D2A1D3B1D26 +:1023B0009BE09F1508F414CD20916B0488E890E011 +:1023C000821B910927FD9395880F991F880F991FEC +:1023D0000817190784F020916C0488E592E0821BAD +:1023E000910927FD9395880F991F880F991F08174A +:1023F00019070CF4C8010297880F991F4FB7F8947A +:102400002F2D30E0F901EE0FFF1FE20FF31FE55C07 +:10241000FB4F928381834FBFE3CC62EE71E0CE012C +:1024200088559E4F0E94E709C156DE4F0883CF5959 +:10243000D140C056DE4F1883C05AD140CF55DE4F31 +:10244000F982E882C15AD140CD55DE4FB982A882C7 +:10245000C35AD140BE0168557E4FCE0182569E4F71 +:102460000E94A90CD82ECE0188559E4F0E946B0960 +:10247000DD2029F166E971E0C8010E949F0C0097F8 +:1024800021F061EA71E00E94340D0E944F057C0149 +:1024900066E971E0C8010E949F0C009721F06BEE85 +:1024A00071E00E94340D0E94CD05182FF0926E0449 +:1024B000E0926D040E94A8001093000191CC62EF9D +:1024C00071E0CE0188559E4F0E94E709C156DE4F4C +:1024D0000883CF59D140C056DE4F1883C05AD1402F +:1024E000CF55DE4FF982E882C15AD140CD55DE4F3B +:1024F000B982A882C35AD140BE0168557E4FCE0131 +:1025000082569E4F0E94A90CF82ECE0188559E4FF0 +:102510000E946B09FF2009F463CC66E971E0C801F1 +:102520000E949F0C009721F061EA71E00E94340D37 +:102530000E944F057C0166E971E0C8010E949F0C72 +:10254000009721F06BEE71E00E94340D0E94CD05E2 +:1025500080939D03F0929803E092970341CC0F93F0 +:102560001F93CF93DF9300D000D000D0CDB7DEB75C +:102570008EE993E00E941A01853239F51A82198298 +:102580001C821B821E821D8264E674E0CE010196CD +:102590000E94C609CE0101960E943F0DCE01019610 +:1025A0000E946B0950E040E06BE671E084E694E045 +:1025B0000E949B0926960FB6F894DEBF0FBECDBFD2 +:1025C000DF91CF911F910F91089589831A82009115 +:1025D0006804109169040F5F1F4FB80184E694E00E +:1025E0000E947309882331F32091640430916504BB +:1025F0008091680490916904BE016F5F7F4F820FE4 +:10260000931F0E94101D1093690400936804D2CF99 +:102610000E94480181110C94AF1208951F920F92ED +:102620000FB60F9211242F933F934F935F936F93A5 +:102630007F938F939F93AF93BF93EF93FF938EE915 +:1026400093E00E945201FF91EF91BF91AF919F9152 +:102650008F917F916F915F914F913F912F910F904B +:102660000FBE0F901F9018951F920F920FB60F92EA +:1026700011242F938F939F93EF93FF93E091AE03D9 +:10268000F091AF038081E091B403F091B50382FD36 +:102690001BC090818091B7038F5F8F732091B80327 +:1026A000821741F0E091B703F0E0E256FC4F958FBE +:1026B0008093B703FF91EF919F918F912F910F908E +:1026C0000FBE0F901F9018958081F4CF1F920F922C +:1026D0000FB60F9211242F933F938F939F93AF9335 +:1026E000BF938091860390918703A0918803B09156 +:1026F00089033091810323E0230F2D3758F501968C +:10270000A11DB11D209381038093860390938703BD +:10271000A0938803B09389038091820390918303EF +:10272000A0918403B09185030196A11DB11D8093F2 +:10273000820390938303A0938403B0938503BF9196 +:10274000AF919F918F913F912F910F900FBE0F905E +:102750001F90189526E8230F0296A11DB11DD2CF18 +:102760001F920F920FB60F9211242F933F934F9306 +:102770005F936F937F938F939F93AF93BF93EF93E9 +:10278000FF93E0910301F09104010995FF91EF910E +:10279000BF91AF919F918F917F916F915F914F9179 +:1027A0003F912F910F900FBE0F901F9018951F9281 +:1027B0000F920FB60F9211242F933F934F935F9375 +:1027C0006F937F938F939F93AF93BF93EF93FF93F9 +:1027D000E0910101F09102010995FF91EF91BF9104 +:1027E000AF919F918F917F916F915F914F913F91A9 +:1027F0002F910F900FBE0F901F9018951F920F9260 +:102800000FB60F9211242F933F934F935F936F93C3 +:102810007F938F939F93AF93BF93CF93DF93EF9368 +:10282000FF9380918003C0915F04D0E087FF24C0B4 +:102830001092850010928400809180038F5F8093B6 +:10284000800380918003082E000C990B8C179D0744 +:1028500024F4809180038C30C4F1809184009091A5 +:102860008500049680349C4908F47AC080918400E5 +:1028700090918500049676C080918003082E000C0C +:10288000990B8C179D07C4F6E09180038E2FEE0FF5 +:10289000990BFC01EE0FFF1FE80FF91FE55CFB4FE2 +:1028A000808186FFC9CFE09180038E2FEE0F990BB8 +:1028B000FC01EE0FFF1FE80FF91FE55CFB4F808165 +:1028C00060E08F730E940A02B7CF2091840030919C +:1028D0008500E09180038E2FEE0F990BFC01EE0F27 +:1028E000FF1FE80FF91FE55CFB4F81819281820F8A +:1028F000931F9093890080938800E09180038E2F2E +:10290000EE0F990BFC01EE0FFF1FE80FF91FE55CBE +:10291000FB4F808186FF11C0E09180038E2FEE0F68 +:10292000990BFC01EE0FFF1FE80FF91FE55CFB4F51 +:10293000808161E08F730E940A02FF91EF91DF9125 +:10294000CF91BF91AF919F918F917F916F915F9147 +:102950004F913F912F910F900FBE0F901F901895A0 +:1029600080E49CE990938900809388008FEF8093A6 +:102970008003E3CF1F920F920FB60F9211242F9373 +:102980003F934F935F936F937F938F939F93AF93F7 +:10299000BF93CF93DF93EF93FF9320917D0430E0BB +:1029A000F901E458FF4F8491F901E255FF4FD491AA +:1029B000F901E656FF4FC491CC2379F081110E94B2 +:1029C000E101EC2FF0E0EE0FFF1FE057FF4FA59164 +:1029D000B491EC91ED2381E009F480E02091810431 +:1029E000309182042F5F3F4F309382042093810403 +:1029F00090918004953618F096E090937C04909125 +:102A00007C04943009F466C0B8F49230F1F093304D +:102A100009F444C090917F04992309F46BC081119B +:102A20007CC080917E04882309F463C080917E0479 +:102A300061E00E940A025EC0953009F457C09630EA +:102A400049F791E090934D054FC08111E3CF20915C +:102A50008104309182042436310528F410928204D6 +:102A600010928104D7CF10924D0510928004E0910E +:102A7000800491E09E0F90938004F0E02091810407 +:102A800030918204EE0FFF1FE458FB4F30872783FD +:102A9000109282041092810493E019C0813009F0F1 +:102AA000B9CFE091800491E09E0F90938004F0E014 +:102AB0002091810430918204EE0FFF1FE458FB4FF8 +:102AC00030872783109282041092810494E09093BF +:102AD0007C04A0CF882359F2209181043091820494 +:102AE0002536310508F496CF95E0F1CF811192CFCC +:102AF000B5CF2D9AFF91EF91DF91CF91BF91AF911B +:102B00009F918F917F916F915F914F913F912F9105 +:102B10000F900FBE0F901F90189580917E04882310 +:102B200021F080917E0460E084CF2D98E3CFCF9395 +:102B3000DF931092A1031092A00388EE93E0A0E02F +:102B4000B0E08093A2039093A303A093A403B09357 +:102B5000A5038DE491E090939F0380939E0385EC01 +:102B600090E09093AB038093AA0384EC90E0909361 +:102B7000AD038093AC0380EC90E09093AF0380931F +:102B8000AE0381EC90E09093B1038093B00382ECAC +:102B900090E09093B3038093B20386EC90E090931F +:102BA000B5038093B4031092B7031092B803109248 +:102BB000B9031092BA0383E080934E05CFEFDFEFA5 +:102BC000D0937004C0936F048AE090E090937204F5 +:102BD0008093710449E050E062EC70E083E794E098 +:102BE0000E941018D0936E04C0936D048CE390E0A3 +:102BF0009093060180930501109260041092610485 +:102C0000109262041092630480915F048C30D0F4BF +:102C100091E0980F90935F0480936A0490E0FC0128 +:102C2000EE0FFF1FE80FF91FE55CFB4F88EB9BE001 +:102C3000928381836BE671E084E694E0DF91CF912B +:102C40000C94E7098FEF80936A04F4CF789484B5ED +:102C5000826084BD84B5816084BD85B5826085BD98 +:102C600085B5816085BD80916E00816080936E0026 +:102C70001092810080918100826080938100809118 +:102C800081008160809381008091800081608093C9 +:102C900080008091B10084608093B1008091B00089 +:102CA00081608093B00080917A00846080937A0084 +:102CB00080917A00826080937A0080917A008160AE +:102CC00080937A0080917A00806880937A001092D5 +:102CD000C100E091AE03F091AF0382E08083E09108 +:102CE000AA03F091AB031082E091AC03F091AD0325 +:102CF0008FEC80831092B603E091B203F091B3039E +:102D000086E08083E091B003F091B103808180611F +:102D10008083E091B003F091B1038081886080836B +:102D2000E091B003F091B103808180688083E091ED +:102D3000B003F091B10380818F7D808310926E0487 +:102D400010926D040E94A80081E08093000180939E +:102D50009D0388E090E090939803809397034BE95C +:102D6000E42EF12C412C50EC552E59E7652E54ECF5 +:102D7000752E2FB7F8948091860390918703A091C8 +:102D80008803B09189032FBF20919D03222309F46A +:102D900003C14091990350919A0360919B037091F4 +:102DA0009C038C019D01041B150B260B370BB901ED +:102DB000A80140325E446105710508F4EDC08093BE +:102DC000990390939A03A0939B03B0939C03C091A3 +:102DD0009703D0919803CE019927FC01E255FF4F4C +:102DE000D490FC01E656FF4FE491F0E0EE0FFF1F98 +:102DF000E057FF4F059114911092920310929303A4 +:102E000010929403109295031092960361E08C2F18 +:102E10000E94760260E08C2F0E940A0262E170E05C +:102E200080E090E00E94080361E08C2F0E940A027B +:102E3000C7010197F1F760E08C2F0E94760280E9CC +:102E400091E0F80120812D2199F40197D1F740926A +:102E50008A0350928B0360928C0370928D03409290 +:102E60008E0350928F03609290037092910364C01E +:102E700080E991E0F80120812D2119F00197D1F727 +:102E8000E6CF98E2392E20E8C22E212C80E991E08D +:102E9000F80120812D2119F40197D1F7D8CF0E9494 +:102EA000A7024B015C0180E991E0F80120812D210E +:102EB00019F00197D1F7CBCF0E94A70268197909C1 +:102EC0008A099B09693271058105910538F0E22D67 +:102ED000F0E0E657FC4F80858C298087C69419F472 +:102EE000239480E8C82E3A943110D0CF61E08C2F23 +:102EF0000E94760261E08C2F0E940A026091920388 +:102F000070E090E080E00E941E1860938A03709346 +:102F10008B0380938C0390938D036091940370E0F6 +:102F200090E080E00E941E1860938E0370938F03E0 +:102F30008093900390939103C3E0D0E08BEF91E0F6 +:102F40000E942C0860918E0370918F0380919003F2 +:102F50009091910342E00E948F0885E392E00E94E5 +:102F60007D0888E392E00E942C0860918A037091AA +:102F70008B0380918C0390918D0342E00E948F0817 +:102F800085E392E00E947D0864E670E080E090E0D6 +:102F90000E940803219791F680910001882301F196 +:102FA0008091600490916104A0916204B0916304E7 +:102FB0000097A105B105A1F0892BD1F48FE692E02D +:102FC0000E942C0868EC70E080E090E00E9408030A +:102FD00010926004109261041092620410926304D3 +:102FE0000E944801882309F4C4CE0E94AF12C1CECA +:102FF00080E892E00E942C08609160047091610466 +:1030000080916204909163044AE00E94390885E34C +:1030100092E00E947D08D6CF84E694E00C946B0980 +:10302000FB01DC0102C005900D9241505040D8F7E1 +:1030300008950E945B1808F481E00895E89409C09F +:1030400097FB3EF490958095709561957F4F8F4FDB +:103050009F4F9923A9F0F92F96E9BB279395F695F1 +:10306000879577956795B795F111F8CFFAF4BB0F6F +:1030700011F460FF1BC06F5F7F4F8F4F9F4F16C0D3 +:10308000882311F096E911C0772321F09EE8872F5D +:10309000762F05C0662371F096E8862F70E060E019 +:1030A0002AF09A95660F771F881FDAF7880F969592 +:1030B000879597F90895990F0008550FAA0BE0E836 +:1030C000FEEF16161706E807F907C0F012161306EA +:1030D000E407F50798F0621B730B840B950B39F42A +:1030E0000A2661F0232B242B252B21F408950A2690 +:1030F00009F4A140A6958FEF811D811D08950E94BE +:1031000092180C9403190E94F51838F00E94FC18CC +:1031100020F0952311F00C94EC180C94F218112463 +:103120000C9437190E94141970F3959FC1F3950FF1 +:1031300050E0551F629FF001729FBB27F00DB11D3B +:10314000639FAA27F00DB11DAA1F649F6627B00DCB +:10315000A11D661F829F2227B00DA11D621F739FB4 +:10316000B00DA11D621F839FA00D611D221F749FC2 +:103170003327A00D611D231F849F600D211D822F09 +:10318000762F6A2F11249F5750409AF0F1F0882330 +:103190004AF0EE0FFF1FBB1F661F771F881F91505D +:1031A0005040A9F79E3F510580F00C94EC180C9408 +:1031B00037195F3FE4F3983ED4F38695779567958A +:1031C000B795F795E7959F5FC1F7FE2B880F911D87 +:1031D0009695879597F9089597F99F6780E870E02D +:1031E00060E008959FEF80EC089500240A9416167D +:1031F000170618060906089500240A9412161306E5 +:10320000140605060895092E0394000C11F4882372 +:1032100052F0BB0F40F4BF2B11F460FF04C06F5F8E +:103220007F4F8F4F9F4F089557FD9058440F551F64 +:1032300059F05F3F71F04795880F97FB991F61F038 +:103240009F3F79F087950895121613061406551FAF +:10325000F2CF4695F1DF08C0161617061806991F1B +:10326000F1CF86957105610508940895E894BB2710 +:1032700066277727CB0197F90895052E97FB1EF453 +:1032800000940E94541957FD07D00E94A61907FC0C +:1032900003D04EF40C9454195095409530952195D7 +:1032A0003F4F4F4F5F4F0895909580957095619572 +:1032B0007F4F8F4F9F4F08950E94C819A59F900D73 +:1032C000B49F900DA49F800D911D11240895B7FF08 +:1032D0000C945C190E945C19821B930B08952F9229 +:1032E0003F924F925F926F927F928F929F92AF9296 +:1032F000BF92CF92DF92EF92FF920F931F93CF93E3 +:10330000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF79 +:103310000FBECDBF09942A88398848885F846E849F +:103320007D848C849B84AA84B984C884DF80EE80E9 +:10333000FD800C811B81AA81B981CE0FD11D0FB6F2 +:10334000F894DEBF0FBECDBFED010895A1E21A2EA5 +:10335000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F39 +:10336000A217B307E407F50720F0A21BB30BE40B89 +:10337000F50B661F771F881F991F1A9469F76095D0 +:103380007095809590959B01AC01BD01CF0108958A +:10339000A29FB001B39FC001A39F700D811D112496 +:1033A000911DB29F700D811D1124911D08955058DB +:1033B000BB27AA270E94EF190C9403190E94F51845 +:1033C00038F00E94FC1820F039F49F3F19F426F4DD +:1033D0000C94F2180EF4E095E7FB0C94EC18E92F2E +:1033E0000E94141958F3BA176207730784079507E8 +:1033F00020F079F4A6F50C9436190EF4E0950B2E16 +:10340000BA2FA02D0B01B90190010C01CA01A00136 +:103410001124FF27591B99F0593F50F4503E68F191 +:103420001A16F040A22F232F342F4427585FF3CFD2 +:10343000469537952795A795F0405395C9F77EF4A3 +:103440001F16BA0B620B730B840BBAF09150A1F0EC +:10345000FF0FBB1F661F771F881FC2F70EC0BA0F72 +:10346000621F731F841F48F4879577956795B795FA +:10347000F7959E3F08F0B0CF9395880F08F09927F5 +:10348000EE0F9795879508950E94581A0C9403198A +:103490000E94FC1858F00E94F51840F029F45F3F94 +:1034A00029F00C94EC1851110C9437190C94F21863 +:1034B0000E94141968F39923B1F3552391F3951BD6 +:1034C000550BBB27AA2762177307840738F09F5F45 +:1034D0005F4F220F331F441FAA1FA9F335D00E2EB2 +:1034E0003AF0E0E832D091505040E695001CCAF71F +:1034F0002BD0FE2F29D0660F771F881FBB1F2617E2 +:1035000037074807AB07B0E809F0BB0B802DBF01B8 +:10351000FF2793585F4F3AF09E3F510578F00C9487 +:10352000EC180C9437195F3FE4F3983ED4F386957A +:1035300077956795B795F7959F5FC9F7880F911DA8 +:103540009695879597F90895E1E0660F771F881F94 +:10355000BB1F621773078407BA0720F0621B730B47 +:10356000840BBA0BEE1F88F7E09508950E94BD1AF0 +:103570006894B1110C94371908950E941C1988F0B1 +:103580009F5798F0B92F9927B751B0F0E1F0660F27 +:10359000771F881F991F1AF0BA95C9F714C0B13068 +:1035A00091F00E943619B1E008950C943619672FF6 +:1035B000782F8827B85F39F0B93FCCF38695779597 +:1035C0006795B395D9F73EF4909580957095619580 +:1035D0007F4F8F4F9F4F08950E945B1808F48FEF25 +:1035E00008950E945B18880B990B0895991B79E048 +:1035F00004C0991F961708F0961B881F7A95C9F783 +:1036000080950895AA1BBB1B51E107C0AA1FBB1FD1 +:10361000A617B70710F0A61BB70B881F991F5A955E +:10362000A9F780959095BC01CD010895EE0FFF1F7D +:103630000590F491E02D09940F931F93CF93DF939E +:103640008230910510F482E090E0E0915305F09112 +:10365000540530E020E0B0E0A0E0309799F4211567 +:10366000310509F44AC0281B390B24303105D8F53F +:103670008A819B816115710589F1FB0193838283A6 +:10368000FE0111C040815181028113814817590701 +:10369000E0F04817590799F4109761F012960C93CF +:1036A000129713961C933296CF01DF91CF911F9101 +:1036B0000F9108950093530510935405F4CF2115ED +:1036C000310551F04217530738F0A901DB019A0187 +:1036D000BD01DF01F801C1CFEF01F9CF909354058F +:1036E00080935305CDCFFE01E20FF31F8193919399 +:1036F0002250310939832883D7CF20915105309149 +:103700005205232B41F42091090130910A01309395 +:103710005205209351052091070130910801211590 +:10372000310541F42DB73EB740910B0150910C018A +:10373000241B350BE0915105F0915205E217F30778 +:10374000A0F42E1B3F0B2817390778F0AC014E5F11 +:103750005F4F2417350748F04E0F5F1F50935205F7 +:1037600040935105819391939FCFF0E0E0E09CCF8F +:10377000CF93DF930097E9F0FC0132971382128216 +:10378000A0915305B0915405ED0130E020E0109771 +:10379000A1F420813181820F931F20915105309136 +:1037A00052052817390709F061C0F0935205E093DC +:1037B0005105DF91CF910895EA01CE17DF07E8F5B3 +:1037C0004A815B819E0141155105B1F7E901FB83F7 +:1037D000EA8349915991C40FD51FEC17FD0761F495 +:1037E000808191810296840F951FE90199838883D6 +:1037F000828193819B838A83F0E0E0E012968D9131 +:103800009C9113970097B9F52D913C911197CD019B +:103810000296820F931F209151053091520528176F +:10382000390739F6309751F5109254051092530527 +:10383000B0935205A0935105BCCFD383C28340817E +:103840005181840F951FC817D90761F44E5F5F4FF0 +:1038500088819981480F591F518340838A819B81B8 +:10386000938382832115310509F0B0CFF09354057D +:10387000E09353059ECFFD01DC01C0CF138212827D +:10388000D7CFB0E0A0E0E7E4FCE10C9471198C0123 +:10389000009751F4CB010E941C1B8C01C801CDB7CD +:1038A000DEB7E0E10C948D19FC01E60FF71F9C01D7 +:1038B00022503109E217F30708F49DC0D901CD91D8 +:1038C000DC911197C617D70798F0C530D10530F3B2 +:1038D000CE0104978617970708F3C61BD70B2297CC +:1038E000C193D1936D937C93CF010E94B81BD6CF27 +:1038F0005B01AC1ABD0A4C018C0E9D1EA0915305B4 +:10390000B0915405512C412CF12CE12C109731F53C +:1039100080915105909152058815990509F05CC078 +:103920004616570608F058C080910701909108018B +:10393000009741F48DB79EB740910B0150910C0157 +:10394000841B950BE817F90708F055C0F093520552 +:10395000E0935105F90171836083A0CF8D919C9113 +:10396000119712966C90129713967C901397A81546 +:10397000B90559F56C0142E0C40ED11CCA14DB0430 +:1039800020F1AC014A195B09DA011296159780F013 +:103990006282738251834083D9016D937C93E114D9 +:1039A000F10471F0D7011396FC93EE93129776CF42 +:1039B00022968C0F9D1FF90191838083F301EFCF35 +:1039C000F0935405E093530569CF4816590608F45F +:1039D0002C017D01D3019ACFCB010E941C1B7C01DD +:1039E000009749F0AE01B8010E94FE1CC8010E9478 +:1039F000B81B870153CF10E000E050CFFB01DC0182 +:103A000002C001900D9241505040D8F70895FB013B +:103A1000DC018D91019080190110D9F3990B089563 +:103A2000FB01DC0101900D920020E1F7089510E008 +:103A3000CDE7D0E004C0FE010E94161B2196CE37D0 +:083A4000D107C9F7F894FFCF8C +:103A4800013B033B033C00000055058000B302B670 +:103A580002C602D302DC02E902CDCCCC3D0AD72350 +:103A68003C17B7D13877CC2B329595E6241FB14F48 +:103A78000A000020410000C84200401C4620BCBE8D +:103A88004CCA1B0E5AAEC59D74000000007401DEBE +:103A9800000B01C1013C011A012E012F2F22225CCB +:103AA8005C6208660C6E0A720D7409000D0A006EDD +:103AB800616E00696E66006F7666003F3F3F006585 +:103AC8006D69745F3433330066756E6374696F6E45 +:103AD8005F6E616D6500706172616D6574657273AA +:103AE80000646174615F70696E006269745F6C651F +:103AF8006E67746800636F646500656D69745F3430 +:103B080033335F636861636F6E00656D69745F6905 +:103B180072007365745F736572766F00616E676CAF +:103B28006500726563765F34333300656E61626C7D +:103B38006500726563765F646874007B2266756EE3 +:103B48006374696F6E5F6E616D65223A2264687492 +:103B58005F74656D7065726174757265222C227070 +:103B68006172616D6574657273223A7B2276616C4D +:103B78007565223A007D7D007B2266756E637469E7 +:103B88006F6E5F6E616D65223A226468745F687556 +:103B98006D6964697479222C22706172616D657433 +:103BA800657273223A7B2276616C7565223A0055FC +:103BB8006E6B6E6F776E20656E636F64696E6700FB +:103BC8007B2266756E6374696F6E5F6E616D6522C8 +:103BD8003A22726563765F343333222C2270617225 +:103BE800616D6574657273223A7B2276616C7565C6 +:103BF800223A004F6B00496E636F6D706C65746597 +:103C0800496E70757400496E76616C6964496E70AE +:103C18007574004E6F4D656D6F7279004E6F7453F9 +:103C28007570706F7274656400546F6F4465657069 +:023C380000008A +:00000001FF diff --git a/server/services/arduino/arduino-code/uno/arduino-code.ino.with_bootloader.hex b/server/services/arduino/arduino-code/uno/arduino-code.ino.with_bootloader.hex new file mode 100644 index 0000000000..8c159b9d15 --- /dev/null +++ b/server/services/arduino/arduino-code/uno/arduino-code.ino.with_bootloader.hex @@ -0,0 +1,1000 @@ +:100000000C947E000C94D7130C94B0130C94A6009F +:100010000C94A6000C94A6000C94A6000C94BA14A0 +:100020000C94A6000C94A6000C94A6000C94FE134D +:100030000C94A6000C94A6000C94A6000C94A600A8 +:100040000C9466130C94A6000C9434130C940E13A9 +:100050000C94A6000C94A6000C94A6000C94A60088 +:100060000C94A6000C94A6000000000024002700B9 +:100070002A0000000000250028002B0000000008D6 +:10008000000201000003040700000000000000005F +:1000900000000000230026002900040404040404D6 +:1000A0000404020202020202030303030303010227 +:1000B00004081020408001020408102001020408F6 +:1000C00010205E01011F01030301008A02010A01E1 +:1000D0000202010064001E47040B0906007C0101B6 +:1000E000060103030100F401060E0102020100C231 +:1000F000011701010202010197150C1811241FBEFE +:10010000CFEFD8E0DEBFCDBF12E0A0E0B1E0E8E481 +:10011000FAE302C005900D92A23FB107D9F725E09E +:10012000A2EFB2E001C01D92A535B207E1F710E0E1 +:10013000CDE7D0E004C02197FE010E94161BCC370A +:10014000D107C9F70E9426160C94171D0C940000C5 +:10015000E0916D04F0916E04EF3FFE0719F11092EB +:1001600060041092610410926204109263042E2FB6 +:10017000E230C0F4FF27EE0FFF1FEF5FFE4F85EE6A +:1001800096E09183808380916900213031F08C7FEB +:10019000816080936900E89A0895837F84608093EA +:1001A0006900E99A08958230910538F0880F991F07 +:1001B000880F991F05970197F1F70895AF92BF92A5 +:1001C000CF92DF92EF92FF920F931F93CF93DF9323 +:1001D0006C017B018B01040F151FEB015E01AE1852 +:1001E000BF08C017D10759F06991D601ED91FC9174 +:1001F0000190F081E02DC6010995892B79F7C501A1 +:10020000DF91CF911F910F91FF90EF90DF90CF90F2 +:10021000BF90AF900895FC01538D448D252F30E0A1 +:10022000842F90E0821B930B541710F0CF96089503 +:1002300001970895FC01918D828D981761F0A28D30 +:10024000AE0FBF2FB11D5D968C91928D9F5F9F73F6 +:10025000928F90E008958FEF9FEF0895FC01918DAC +:10026000828D981731F0828DE80FF11D858D90E019 +:1002700008958FEF9FEF0895FC01918D228D892FB6 +:1002800090E0805C9F4F821B91098F73992708959E +:100290008EE993E00E943C0121E0892B09F420E0E3 +:1002A000822F0895FC01A48DA80FB92FB11DA35A68 +:1002B000BF4F2C91848D90E001968F739927848F86 +:1002C000A689B7892C93A089B1898C9183708064A9 +:1002D0008C93938D848D981306C00288F389E02D4A +:1002E00080818F7D80830895EF92FF920F931F93FB +:1002F000CF93DF93EC0181E0888F9B8D8C8D9813D9 +:100300001AC0E889F989808185FF15C09FB7F894E4 +:10031000EE89FF896083E889F98980818370806430 +:1003200080839FBF81E090E0DF91CF911F910F917B +:10033000FF90EF900895F62E0B8D10E00F5F1F4F8A +:100340000F731127E02E8C8D8E110CC00FB607FC99 +:10035000FACFE889F989808185FFF5CFCE010E9427 +:100360005201F1CFEB8DEC0FFD2FF11DE35AFF4F42 +:10037000F0829FB7F8940B8FEA89FB8980818062B5 +:10038000CFCFCF93DF93EC01888D8823B9F0AA8972 +:10039000BB89E889F9898C9185FD03C0808186FD40 +:1003A0000DC00FB607FCF7CF8C9185FFF2CF80818F +:1003B00085FFEDCFCE010E945201E9CFDF91CF91B1 +:1003C0000895833081F028F4813099F08230A9F0CB +:1003D00008958730A9F08830C9F08430B1F4809155 +:1003E00080008F7D03C0809180008F778093800094 +:1003F000089584B58F7784BD089584B58F7DFBCF34 +:100400008091B0008F778093B00008958091B00004 +:100410008F7DF9CF1F93CF93DF93282F30E0F90121 +:10042000E458FF4F8491F901E255FF4FD491F9014F +:10043000E656FF4FC491CC23A9F0162F81110E94DC +:10044000E101EC2FF0E0EE0FFF1FEE58FF4FA591FA +:10045000B4918FB7F894EC91111108C0D095DE23B8 +:10046000DC938FBFDF91CF911F910895DE2BF8CFE2 +:10047000CF93DF93EC0180914E0560E00E940A0269 +:10048000CE01DF91CF910C94D3001F93CF93DF93D4 +:10049000182FD92F80917B0460E0C1E0811102C048 +:1004A00061E0C0E080916F040E940A0280917304B1 +:1004B000909174049C01129FC001139F900D112410 +:1004C0000E94D3006C2F80916F040E940A028091D9 +:1004D0007304909174049C01D29FC001D39F900D2E +:1004E0001124DF91CF911F910C94D300CF93DF9310 +:1004F00090E0FC01E255FF4F249186569F4FFC018E +:1005000084918823D1F090E0880F991FFC01E8596D +:10051000FF4FA591B491FC01EE58FF4FC591D491C6 +:1005200061110EC09FB7F8948C91E22FE0958E2355 +:100530008C932881E223E8839FBFDF91CF910895B8 +:100540008FB7F894EC91E22BEC938FBFF6CF3FB7C7 +:10055000F8948091820390918303A0918403B091D9 +:10056000850326B5A89B05C02F3F19F00196A11D54 +:10057000B11D3FBFBA2FA92F982F8827BC01CD01ED +:10058000620F711D811D911D42E0660F771F881F4C +:10059000991F4A95D1F708958F929F92AF92BF927B +:1005A000CF92DF92EF92FF926C010E94A7024B0163 +:1005B0005C010D2C000CEE08FF080E94A7026819D0 +:1005C00079098A099B096C157D058E059F05B8F48C +:1005D00080914E0561E00E940A0280914F05909142 +:1005E00050050E94D30080914E0560E00E940A02EF +:1005F00080914F05909150050E94D300DECFFF906F +:10060000EF90DF90CF90BF90AF909F908F90089524 +:100610008F929F92AF92BF92CF92DF92EF92FF9212 +:100620006B017C010E94A7024B015C01C114D10443 +:10063000E104F104B9F00E94A702681979098A0956 +:100640009B09683E73408105910580F321E0C21A41 +:10065000D108E108F10888EE880E83E0981EA11CFD +:10066000B11CE4CFFF90EF90DF90CF90BF90AF90A0 +:100670009F908F90089508954F925F926F927F920E +:100680008F929F92AF92BF92DF92EF92FF920F9361 +:100690001F93CF93DF938C01EB0188818B32D1F1D3 +:1006A0008D32C9F52196EE24E394888190ED980F60 +:1006B0009A3010F08E3289F560E070E0CB01FE01D7 +:1006C0002191A0ED8A2E820E39E0381508F440C041 +:1006D0006A3929E97207820729E1920708F04DC0BB +:1006E000AAE0B0E09B01AC010E945C19912CB12CF6 +:1006F000A12C2401350140945094609470944616C6 +:10070000570668067906C8F1680D791D8A1D9B1D7C +:10071000EF01D5CF2196E12CC8CFF80110821182CC +:100720001282138214821582168217821086C801E3 +:10073000DF91CF911F910F91FF90EF90DF90BF90CD +:10074000AF909F908F907F906F905F904F900895A3 +:10075000211113C0F80160837183828393830E9407 +:100760001E18F80164837583868397838AE0E110FD +:1007700001C088E0F8018087DACFF12CEAE08E2E04 +:10078000912CA12CB12C61157105F0E88F07910512 +:1007900040F0A50194010E94A619CA01B901F39481 +:1007A000F2CFFE01299130ED320F3A3010F4F3947C +:1007B000F8CF2E32F1F4EF012196FE01219620812F +:1007C00050EDD52ED20E29E02D1598F06C3C3CEC66 +:1007D00073073CE08307910580F7AAE0B0E09B0136 +:1007E000AC010E945C196D0D711D811D911DFA9463 +:1007F000E4CF20812F7DD0E0C0E0253409F04FC048 +:1008000021812D32A9F53296BB24B394DF01D0E0CB +:10081000C0E02F2D0F2C000C330B4AE0A42EFD015D +:10082000DD9040ED4D0D4A30A8F5AC9EA001AD9E87 +:10083000500D1124CD2DDD0CDD0BE097C40FD51F1D +:10084000AE01420F531F473251054CF3BB20B9F0A4 +:1008500080E090E0A0E0B0E8E11003C080E090E02C +:10086000DC01F80184839583A683B7838CE083CF72 +:100870002B3219F03196B12CC9CF3296FCCF80E0E3 +:1008800090E0A0E8BFEFE110ECCF80E090E0A0E8BE +:10089000BFE7E7CFBB2019F0D195C195D1092081E1 +:1008A00021113BCFCF0DD11DF7FCDA950E941E1808 +:1008B0001C161D06E4F4F12CC0FF0CC024E0F29ECF +:1008C000F0011124EF5CFE4F208131814281538180 +:1008D0000E947F18D595C795F394209769F7E1108A +:1008E0009058F8016483758386839783BFCFD19531 +:1008F000C195D109F12C209791F3C0FF0CC024E0E1 +:10090000F29EF0011124E75EFE4F20813181428189 +:1009100053810E947F18D595C795F394ECCF80330F +:100920009CF08A3324F08F3524F08B3724F481E057 +:10093000089581344CF08B35D4F393ED980F81E01A +:100940009230B0F380E008958B32B9F7F0CFFC011C +:100950008185811114C0A481B581868197812FEF93 +:100960003FEFA817B90730F4CD0101969583848332 +:100970002C9130E037FD20E0208781E08187808561 +:1009800008951F93CF93DF93EC01162F0E94A704C5 +:10099000811306C0198681E0DF91CF911F910895E0 +:1009A00080E0FACFCF93DF93EC01CE010E94A70441 +:1009B0008B303CF489304CF4882349F090E080E09F +:1009C00008C08D3011F08032C9F71986EECF81E072 +:1009D00090E0DF91CF910895CF92DF92EF92FF9256 +:1009E000CF93DF93CDB7DEB729970FB6F894DEBF6C +:1009F0000FBECDBFFC01892B39F094819F779630D3 +:100A000081F030F49430F0F460E070E0CB010DC080 +:100A1000983039F09C30C1F7C080D180E280F380FB +:100A200020C0608171818281938129960FB6F894EC +:100A3000DEBF0FBECDBFDF91CF91FF90EF90DF9073 +:100A4000CF90089560817181CE0101960E943C0390 +:100A500089858830F9F08C30B9F6CD80DE80EF8062 +:100A6000F88420E030E0A901C701B6010E94EC1A29 +:100A700087FDCACF20E030E040E85FE4C701B6015F +:100A80000E94191818160CF4BFCFC701B6010E94B6 +:100A9000BD1ACBCF69817A818B819C81C6CFCF92E1 +:100AA000DF92EF92FF92CF93DF93CDB7DEB7299716 +:100AB0000FB6F894DEBF0FBECDBFFC01892B39F015 +:100AC00094819F77963069F028F4943080F570E037 +:100AD00060E01FC09A3081F09C3009F459C0983012 +:100AE000B1F780819181A281B381BC0181159048C9 +:100AF000A105B10570F0EBCF80819181A281B38116 +:100B000066277727681B790B81309048A105B105CE +:100B1000F0F6CB0129960FB6F894DEBF0FBECDBF1D +:100B2000DF91CF91FF90EF90DF90CF90089560819B +:100B30007181CE0101960E943C0389819A81AB812B +:100B4000BC8129852A30E1F22C3021F0283009F0CF +:100B5000BECFCBCFCD80DE80EF80F88420E030E0C8 +:100B600040E057ECC701B6010E94EC1A87FDAFCFF9 +:100B700020E03EEF4FEF56E4C701B6010E9419187E +:100B800018160CF4A4CFC701B6010E94B61AC1CF43 +:100B9000C080D180E280F380E1CFCF93FC01892B2C +:100BA00091F094819F77983029F078F4992359F047 +:100BB000963079F4C1E080819181A281B381892B43 +:100BC0008A2B8B2B39F4C0E005C09A3099F39C3006 +:100BD00021F0C1E08C2FCF910895C1E020E030E0FA +:100BE000A90160817181828193810E94191881110C +:100BF000F1CFE9CFFC0184819581009799F02281A2 +:100C00003381468157812417350718F015821482E5 +:100C10000895A9014F5F5F4F53834283820F931F53 +:100C2000FC0160830895FF920F931F93CF93DF938E +:100C3000CDB7DEB728970FB6F894DEBF0FBECDBF95 +:100C40008C01DC011296ED91FC912281338184812B +:100C5000958193838283FA83E9831C821B823E837E +:100C60002D83821B930B98878F83C8010E94A70452 +:100C7000F82EF8011186C8010E94A704D801199620 +:100C80001C92F816C9F1811110C061E070E080E09B +:100C900090E028960FB6F894DEBF0FBECDBFDF916F +:100CA000CF911F910F91FF9008958C35F9F4C801F1 +:100CB0000E94A704882349F3853729F464E070E093 +:100CC00080E090E0E6CFEBE5F1E09081992329F018 +:100CD000891308C08181811107C062E070E080E063 +:100CE00090E0D7CF3296F1CFF8011186682FCE0170 +:100CF00001960E94FA05BFCF60E0CE0101960E94E6 +:100D0000FA058D819E81892B79F0E981FA818B81A9 +:100D10009C812F813885AC01421B530B82819381CA +:100D2000840F951F938382832D813E8163E070E061 +:100D300080E090E02115310509F4ABCF60E070E070 +:100D4000CB01C901A6CFFC0180819181892B21F4BF +:100D500060E070E0CB01089561EB76E090E080E028 +:100D600008950895CF93DF93DC01EB01EC81FD81C1 +:100D70008A819B810896E817F90730F4F0E0E0E0FB +:100D8000CF01DF91CF9108953897FD83EC833097A1 +:100D9000A9F31296CD91DC911397209791F0CF0192 +:100DA0008C1B9D0B23E0959587952A95E1F78D8304 +:100DB0001396FC93EE931297158214821782168273 +:100DC000DFCF1196FC93EE93F3CF2F923F924F9289 +:100DD0005F926F927F928F929F92AF92BF92CF92CB +:100DE000DF92EF92FF920F931F93CF93DF93CDB7D4 +:100DF000DEB761970FB6F894DEBF0FBECDBF0E947D +:100E0000A7026B017C0180917C0390917D033601E8 +:100E1000681A790A2DEC621620E1720608F4D1C036 +:100E20008091F6029091F702D301A81BB90BCD0176 +:100E3000B7FF03C0919581959109883C91050CF00D +:100E4000BCC08091F4029091F50201969093F50256 +:100E50008093F402029709F0B0C002EC10E04090D9 +:100E6000F2025090F30249E050E0B801CE01019641 +:100E70000E9410188B816C81681708F4682F70E04D +:100E80008091F6029091F7020E94021B9B01409113 +:100E9000050150910601649FC001659F900D749FEC +:100EA000900D112464E670E00E94021B898541E0E8 +:100EB00050E0882311F042E050E08D81829FF001E4 +:100EC000839FF00D1124FB87EA878E81829FD001DA +:100ED000839FB00D1124BD87AC878F81829FF00165 +:100EE000839FF00D1124FF87EE878885829F100174 +:100EF000839F300C1124FA01EE0FFF1FEA50FD4FC3 +:100F0000812C912C5401920121503109398B288B6D +:100F1000888999894817590708F03FC0880C991C9F +:100F2000AA1CBB1C808191819C01AA85BB852A1BC0 +:100F30003B0B37FF03C03195219531092617370741 +:100F400070F422813381AC85BD852A1B3B0B37FFB2 +:100F500003C031952195310926173707D0F02E852A +:100F60003F85821B930B97FF03C091958195910953 +:100F700086179707B8F4828193818219930997FFA6 +:100F800003C09195819591098617970758F4689445 +:100F900080F84E5F5F4F3496BBCF38E04316510464 +:100FA00008F051C0075F1F4F80E0083F180709F0A5 +:100FB00056CF1092F5021092F4021092F3021092A2 +:100FC000F2028091F2029091F3028334910540F095 +:100FD0001092F3021092F2021092F5021092F402B3 +:100FE0008091F2029091F3029C012F5F3F4F30936A +:100FF000F3022093F202880F991FFC01EA50FD4F83 +:1010000071826082C0927C03D0927D03E0927E0365 +:10101000F0927F0361960FB6F894DEBF0FBECDBF8E +:10102000DF91CF911F910F91FF90EF90DF90CF90C4 +:10103000BF90AF909F908F907F906F905F904F90F8 +:101040003F902F9008958092600490926104A09246 +:101050006204B0926304ADCFFC0101900020E9F777 +:101060003197AF01481B590BBC018EE993E00C94FA +:10107000DE008F929F92AF92BF920F931F93CF93F8 +:10108000DF93CDB7DEB7A1970FB6F894DEBF0FBEE2 +:10109000CDBF19A2423008F44AE08E010F5D1F4F08 +:1010A000842E912CB12CA12CA50194010E94A6198B +:1010B000E62FB901CA01EA30F4F4E05DD801EE93FD +:1010C0008D01232B242B252B79F790E080E01097BE +:1010D00019F0CD010E942C08A1960FB6F894DEBF3E +:1010E0000FBECDBFDF91CF911F910F91BF90AF90F9 +:1010F0009F908F900895E95CE1CFCF93DF93D0E08C +:10110000C0E0009719F00E942C08EC018CE691E0F9 +:101110000E942C088C0F9D1FDF91CF9108954F9254 +:101120005F926F927F928F929F92AF92BF92CF9277 +:10113000DF92EF92FF920F931F93CF936B017C018D +:10114000742EAC019B010E94F11A882399F08FE65E +:1011500091E0CF911F910F91FF90EF90DF90CF9092 +:10116000BF90AF909F908F907F906F905F904F90C7 +:101170000C942C0846015701E894B7F82FEF3FEF85 +:101180004FE75FE7C501B4010E94F11A81110DC05C +:101190002FEF3FEF4FE75FE7C501B4010E94191839 +:1011A00018161CF483E791E0D4CF2FEF3FEF4FE701 +:1011B0005FE4C701B6010E94EC1A18161CF487E719 +:1011C00091E0C7CF2FEF3FEF4FE75FECC701B601CC +:1011D0000E94191887FDF3CF20E030E0A901C70174 +:1011E000B6010E94191810E000E087FF0AC06DE206 +:1011F0008EE993E00E9474018C01F7FAF094F7F8FD +:10120000F094C0E060E070E080E09FE37C1641F085 +:1012100020E030E040E251E40E94441ACF5FF6CF74 +:10122000A70196010E94D8192B013C010E94BD1A0A +:101230004B015C014AE00E9439087C01E00EF11E7E +:10124000CC23C1F1C501B4010E941E189B01AC0161 +:10125000C301B2010E94D7194B015C016EE28EE915 +:1012600093E00E947401E80EF91EC15018F120E0CD +:1012700030E040E251E4C501B4010E947F182B0127 +:101280003C010E94BD1A4B01B12CA12C4AE0C501C2 +:10129000B4010E943908E80EF91EC501B4010E948C +:1012A0001E189B01AC01C301B2010E94D7194B016A +:1012B0005C01DBCFC701CF911F910F91FF90EF90A1 +:1012C000DF90CF90BF90AF909F908F907F906F9066 +:1012D0005F904F900895FC0180819181009711F0FB +:1012E0000C94B81B08950F931F93CF93DF93EC01D9 +:1012F00088819981009759F02A813B812617370709 +:1013000030F081E0DF91CF911F910F9108958B0113 +:101310006F5F7F4F0E94411C009759F0998388832B +:101320001B830A832C813D81232B59F7FC011082FA +:10133000E8CF80E0E7CFEF92FF920F931F93CF9318 +:10134000DF93EC017B018A01BA010E9473092881B5 +:101350003981811114C02115310519F0C9010E948C +:10136000B81B198218821D821C821B821A82CE0130 +:10137000DF91CF911F910F91FF90EF9008951D8302 +:101380000C83B701C9010E94101DF1CFCF93DF93E9 +:10139000EC01FB018617970749F0608171816115A7 +:1013A000710541F0448155810E949B09CE01DF9176 +:1013B000CF91089588819981009711F00E94B81B00 +:1013C000198218821D821C821B821A82EFCFFC01B7 +:1013D000118210821382128215821482FB01019005 +:1013E0000020E9F73197AF01461B570B0C949B097E +:1013F0000F931F93CF93DF938B01EC012097E1F0C4 +:101400006E817F8160177107B9F00115110541F0F8 +:101410006115710529F0C8010E94071D892B61F033 +:101420008D81882339F028E08202C0011124C80F81 +:10143000D91FE4CFD0E0C0E0CE01DF91CF911F9162 +:101440000F9108958F929F92AF92BF92CF92DF92A9 +:10145000EF92FF920F931F93CF93DF93CDB7DEB739 +:10146000CB54D1090FB6F894DEBF0FBECDBF8C01AF +:101470007B01D42E0E94D2042C969FAF8EAF2C9766 +:10148000CE01865B9F4F0E94A306672B09F0B2C076 +:1014900080FDB0C0C8010E94A704873209F4B9C119 +:1014A00014F5823209F4B5C1C8010E94A704C82E00 +:1014B000FE0131964F01D12C5F018C2D0E948F04CB +:1014C000882309F4C4C1FFE3DF1609F4C0C1D801C1 +:1014D00019961C92D394F401C1924F01C8010E9445 +:1014E000A704C82EEACF8B3509F49EC08B37E1F6EE +:1014F000F701848180788062848311821082138254 +:101500001282DD2009F483C1D80119961C92C8010A +:101510000E94D20423969FAF8EAF2397CE018F5B9C +:101520009F4F0E94A306672B09F002C180FD00C1F6 +:101530006DE7C8010E94C1048111CDC0DA94C801D1 +:101540000E94A704873209F4D0C0823209F4CDC0CA +:10155000D8011296ED91FC9122813381848195818D +:1015600093838283FA83E9831C821B823E832D83CB +:10157000821B930B98878F83C8010E94A704A82E13 +:101580000E948F0422E030E0882389F1F80111865F +:101590006A2DCE0101960E94FA05C8010E94A70497 +:1015A000A82E0E948F048111F1CF60E0CE01019638 +:1015B0000E94FA058D819E81892B79F0E981FA815B +:1015C0008B819C812F813885AC01421B530B82811A +:1015D0009381840F951F938382838D819E8123E065 +:1015E00030E0009721F0B82EC92E30E020E09B2C8F +:1015F000AC2C83C02B968FAD2B972C969FAD2C9740 +:10160000C55BDF4F0FB6F894DEBF0FBECDBFDF91D5 +:10161000CF911F910F91FF90EF90DF90CF90BF90EF +:10162000AF909F908F900895D70114968C91149746 +:101630008078806414968C93149711961C921E9255 +:1016400013961C921E921297DD2009F4E0C0F80157 +:101650001186C8010E94D2049A838983CE01019623 +:101660000E94A306672B61F580FD2AC06DE5C801C5 +:101670000E94C10481112FC0DA94D8016D917C9130 +:10168000C7010E94B206009709F4BEC04D2DBC01EF +:10169000C8010E94220A9A838983CE0101960E9482 +:1016A000A306672B69F480FD0BC0C8010E94D20419 +:1016B0009A838983CE0101960E94A306672B19F0B5 +:1016C00089819A819DCF80FDFBCF6DE5C8010E9485 +:1016D000C104882311F080E098C06CE2C8010E9428 +:1016E000C1048111CACF82E090C0C8010E941306D4 +:1016F0009B019B2CAC2CB82EC92E23963FAF2EAF4E +:101700002397CE018F5B9F4F0E94A306672B81F426 +:1017100080FD0EC0C8010E94D20423969FAF8EAFF9 +:101720002397CE018F5B9F4F0E94A306672B39F052 +:1017300022968FAD229723969FAD239761CF80FD90 +:10174000F7CF6AE3C8010E94C104882361F26B2DC0 +:101750007C2DD7018D919C910E94F809BC01892BA9 +:1017600081F4F80160817181C7010E94B206FC0119 +:10177000892B09F449C0848180688483B682C7823A +:10178000BF014D2DC8010E94220A23969FAF8EAF44 +:101790002397CE018F5B9F4F0E94A306672B41F6D4 +:1017A00080FDC6CFC8010E94D20423969FAF8EAFA2 +:1017B0002397CE018F5B9F4F0E94A306672B09F0F2 +:1017C000B7CF80FDB5CF6DE7C8010E94C10481117C +:1017D00082CF6CE2C8010E94C104882309F483CF40 +:1017E000C8010E94D20423969FAF8EAF2397CE01EB +:1017F0008F5B9F4F0E94A306672B09F099CF80FD56 +:1018000097CFB92CCA2C9BCE83E090E0F9CE85E02F +:10181000FCCFC8010E94130669837A838B839C8363 +:10182000CE0101960E94A306672B09F049CF80FDE7 +:1018300047CF2B813C81D70114968C9114978078E7 +:10184000856014968C9314972D933C9344CFF501A7 +:10185000ED0DF11D108289818437B9F4D7011496FA +:101860008C9114978078866014968C9381E090E038 +:10187000A0E0B0E0F70180839183A283B38390E07E +:10188000F4E0DF12BDCE80E0BBCE863689F4D7010E +:1018900014968C9114978078866014968C93F70137 +:1018A000108211821282138281E090E0F5E0E9CF8C +:1018B0008E3631F481E090E024E0D212A1CEE3CF65 +:1018C000B501CE018F5B9F4F0E943C0325964CAD26 +:1018D0005DAD6EAD7FAD25972A968FAD2A978A3084 +:1018E00061F08C30C1F0883009F0FDCED70114963C +:1018F0008C9114978078886006C0D70114968C91DB +:10190000149780788A6014968C93F70140835183F2 +:1019100062837383E0CE29964CAD5DAD6EAD7FAD35 +:101920002997D70114968C91149780788C6014961F +:101930008C93F7014083518362837383CCCE0097ED +:1019400029F0FC01808191810C94F80990E080E0FD +:101950000895EF92FF920F931F93CF93DF93CDB72C +:10196000DEB72E970FB6F894DEBF0FBECDBFFC01D9 +:1019700001811281E580F6801A8619861C861B86F5 +:101980001E861D86CE0109960E94C6091A821982FA +:101990001C821B821E821D82BE01675F7F4FCE01AB +:1019A00001960E94C60981E090E098878F83CE015E +:1019B00009960E946B09B701C8010E949F0CFC01A7 +:1019C000892B39F194819F77963029F0D8F49230A1 +:1019D00000F1943060F50F811885CE0101960E94C8 +:1019E0006B0981E0012B09F080E02E960FB6F89488 +:1019F000DEBF0FBECDBFDF91CF911F910F91FF9042 +:101A0000EF9008959C3039F368F4983021F39A30C0 +:101A100011F381E090E029813A81232BC9F490E011 +:101A200080E016C09032B9F2903499F7D4CF60813B +:101A3000718189819A816817790769F0009771F03F +:101A40006115710571F00E94071D919581959109AD +:101A500098878F83C0CF90E080E0F7CF8FEF9FEF24 +:101A6000F4CF81E090E0F1CFFC01248125FF04C098 +:101A7000808191810C94F80990E080E008952F9284 +:101A80003F924F925F926F927F928F929F92AF920E +:101A9000BF92CF92DF92EF92FF920F931F93CF935B +:101AA000DF93CDB7DEB7C25BD1400FB6F894DEBF8F +:101AB0000FBECDBFFC01CE010E969A8389839C8315 +:101AC0008B834EE951E04C0F5D1F5E834D83588739 +:101AD0004F839D8590789D87208131818481958178 +:101AE000820F931F4D5951407A01C256DE4F5983E0 +:101AF0004883CE59D140C056DE4F59834883C05ADF +:101B0000D140CE55DE4F39832883C25AD140CC55BF +:101B1000DE4F99838883C45AD140C955DE4F18825D +:101B2000C75AD1405E0159E0A50EB11C4AE0B5018B +:101B3000CE0182569E4F0E94220AC855DE4F9983DD +:101B40008883C85AD140CE0188559E4F0E94A30673 +:101B5000672BC9F480FD17C0CA55DE4F8881C65A6D +:101B6000D140882381F08D85982F9F779C3019F084 +:101B70008D77883041F482E090E0C855DE4F99833C +:101B80008883C85AD140C855DE4F08811981C85A88 +:101B9000D140C255DE4F19830883CE5AD140CE01C1 +:101BA00082559E4F0E94A306672B09F00BC16C0162 +:101BB00021E0C222DD2480FD05C18D85850185FDE2 +:101BC00002C000E010E06FE771E0CE0188559E4F43 +:101BD0000E94E709C156DE4F0883CF59D140C05655 +:101BE000DE4F1883C05AD140CF55DE4FF982E882CC +:101BF000C15AD14038E8A32E31E0B32ECD55DE4F87 +:101C0000B982A882C35AD140BE0168557E4FCE0129 +:101C100082569E4F0E94A90C982ECE0188559E4F49 +:101C20000E946B099110F6C06AEB71E0CE018855F5 +:101C30009E4F0E94E709C156DE4F0883CF59D1401D +:101C4000C056DE4F1883C05AD140CF55DE4FF982BF +:101C5000E882C15AD140CD55DE4FB982A882C35A1D +:101C6000D140BE0168557E4FCE0182569E4F0E94E4 +:101C7000A90CD82ECE0188559E4F0E946B09DD20FD +:101C800009F404C266E971E0C8010E949F0C009744 +:101C900021F061EA71E00E94340D0E944F05382E58 +:101CA00066E971E0C8010E949F0C009721F065EB86 +:101CB00071E00E94340D0E94EC04C055DE4F688331 +:101CC000C05BD140CF54DE4F7883C15BD140282E1A +:101CD000CE54DE4F9883C25BD140F5E0EF2EF12C5D +:101CE0000BE613E0A3E78A2EA5E09A2EBBEDAB2E00 +:101CF000B5E1BB2E61E0832D0E940A02C801019765 +:101D0000F1F760E0832D0E940A0287EC99E20197C7 +:101D1000F1F7C055DE4F4880C05BD140CF54DE4F55 +:101D20005880C15BD140622CCE54DE4F7880C25BBC +:101D3000D140E0E2CE2ED12C61E0832D77FE8DC123 +:101D40000E940A02C8010197F1F760E0832D0E940A +:101D50000A02C5010197F1F761E0832D0E940A0292 +:101D6000C8010197F1F760E0832D0E940A02C401C7 +:101D70000197F1F7440C551C661C771C41E0C41A0E +:101D8000D108D1F661E0832D0E940A02C8010197B3 +:101D9000F1F760E0832D0E940A028BE995EA019732 +:101DA000F1F761E0832D0E940A02C8010197F1F763 +:101DB00060E0832D0E940A0251E0E51AF10809F063 +:101DC00099CF0EC08BE791E00630110538F4000F73 +:101DD000111FF801E35FFE4F808191810E947D0811 +:101DE000CE54DE4F0FB6F894DEBF0FBECDBFDF91ED +:101DF000CF911F910F91FF90EF90DF90CF90BF9008 +:101E0000AF909F908F907F906F905F904F903F909A +:101E10002F90089566E971E0C8010E949F0C009719 +:101E200021F061EA71E00E94340D0E944F05F82E06 +:101E3000E92E66E971E0C8010E949F0C009721F02D +:101E40006AEA71E00E94340D0E944F051C0166E9A8 +:101E500071E0C8010E949F0C009721F4412C512C85 +:101E600032014DC065EB71E00E94340DFC01892BFD +:101E7000A9F394819F77963039F1F8F4943070F398 +:101E800060817181CE0182569E4F0E943C03C256F2 +:101E9000DE4F488059806A807B80CE59D140CA5538 +:101EA000DE4F8881C65AD1408A3009F483C08C3015 +:101EB00009F489C0883091F60BC09A3061F09C30EB +:101EC00009F4A5C0983051F640805180628073803B +:101ED00077FE15C0C3CF408051806280738041E09F +:101EE00044165104610440E8740608F0B7CF7094BA +:101EF000609450944094411C511C611C711CF092E0 +:101F00006F04E092700461E08F2D0E947602809150 +:101F10006F0490917004019609F498C000916D04CB +:101F200010916E040F3F1007B1F0023070F4F80109 +:101F3000FF27013009F470C0E898EE0FFF1FEF5F34 +:101F4000FE4F8BE393E0918380838FEF9FEF90931D +:101F50006E0480936D04812C912C540183948091A4 +:101F6000710490917204C816D9060CF066C0710114 +:101F700051E0E51AF108F7FC56C0D501C4010E2C5A +:101F800004C0880F991FAA1FBB1F0A94D2F784218F +:101F90009521A621B721892B8A2B8B2B09F43EC0D2 +:101FA0008091790490917A040E94450281E0E81AB8 +:101FB000F108E1CF51E045165104610450E875067F +:101FC00008F04CCF94CFCE55DE4F88809980AA8000 +:101FD000BB80C25AD14020E030E040E05FECC50158 +:101FE000B4010E94EC1A87FD39CF20E030E040E0D8 +:101FF0005FE4C501B4010E94191818160CF42ECF25 +:10200000C501B4010E94B61A2B013C0178CF808033 +:102010009180A280B380DFCFE9988FCF8091770441 +:1020200090917804C1CF80917504909176040E94BC +:1020300045029FEFC91AD90A92CF0F3F100731F01E +:1020400010936E0400936D040E94A8008FEF9FEF21 +:102050009093700480936F04C3CE0E940A02C8015B +:102060000197F1F760E0832D0E940A02C4010197F5 +:10207000F1F761E0832D0E940A02C8010197F1F790 +:1020800060E0832D0E940A02C50172CE6AEC71E005 +:10209000CE0188559E4F0E94E709C156DE4F088346 +:1020A000CF59D140C056DE4F1883C05AD140CF55CA +:1020B000DE4FF982E882C15AD140CD55DE4FB98258 +:1020C000A882C35AD140BE0168557E4FCE018256C8 +:1020D0009E4F0E94A90CD82ECE0188559E4F0E947B +:1020E0006B09DD2009F47EC066E971E0C8010E9439 +:1020F0009F0C009721F061EA71E00E94340D0E946C +:102100004F05D82E66E971E0C8010E949F0C009728 +:1021100021F06AEA71E00E94340D0E944F057C01B3 +:1021200066E971E0C8010E949F0C009721F065EB01 +:1021300071E00E94340D0E94EC044B015C01D092CE +:102140004E058DE090E09093500580934F0580916F +:102150004E0561E00E94760280914E0560E00E948B +:102160000A0288E293E20E94CC0284E991E10E9493 +:102170003802C7010197C12CD12C7601C39404C049 +:10218000CC0CDD1CEE1CFF1C8A95D2F7C114D104C7 +:10219000E104F104F1F0D501C4018C219D21AE21AF +:1021A000BF21892B8A2B8B2B69F080E392E00E9460 +:1021B000CC028AE996E00E943802F694E794D7941C +:1021C000C794E4CF80E392E00E94CC0280E392E0E7 +:1021D000F2CF80E392E00E94CC0290E080E00E9487 +:1021E0003802FECD62ED71E0CE0188559E4F0E940F +:1021F000E709C156DE4F0883CF59D140C056DE4FA4 +:102200001883C05AD140CF55DE4FF982E882C15AB7 +:10221000D140CD55DE4FB982A882C35AD140BE010C +:1022200068557E4FCE0182569E4F0E94A90CD82E33 +:10223000CE0188559E4F0E946B09DD2009F4EDC048 +:1022400066E971E0C8010E949F0C009721F061EAE5 +:1022500071E00E94340D0E944F05F82E66E971E08E +:10226000C8010E949F0C009721F06CED71E00E9464 +:10227000340D0E944F058C0180916A048C3008F067 +:1022800053C061E08F2D0E94760280916A04282F4E +:1022900030E0F901EE0FFF1FE20FF31FE55CFB4F8B +:1022A0002F2D2F739081907C922B908310926B0432 +:1022B00010926C042CE0622F0E94F61A829FB001EB +:1022C000112430E020E0AB01420F531FFA01EE0F62 +:1022D000FF1FE40FF51FE55CFB4F908196FD16C0D4 +:1022E0002F5F3F4F2C30310571F781110FC01092D5 +:1022F000800082E08093810010928500109284001B +:10230000B19A80916F00826080936F00E0916A04BF +:102310008E2F90E0FC01EE0FFF1FE80FF91FE55C28 +:10232000FB4F808180648083F0906A04003282E0F9 +:1023300018070CF03DC080916B04E8E88E2E912CBC +:10234000881A910887FD9394880C991C880C991C15 +:10235000092C000CAA08BB0880916C0428E532E027 +:10236000281B310987FD3395220F331F220F331F9E +:10237000032E000C440B550B281939094A095B0937 +:10238000D801053B110514F0A4EBB0E0B7FF02C083 +:10239000B0E0A0E00E94671924EB30E040E050E09C +:1023A0000E943D1989019A01080D191D2A1D3B1D26 +:1023B0009BE09F1508F414CD20916B0488E890E011 +:1023C000821B910927FD9395880F991F880F991FEC +:1023D0000817190784F020916C0488E592E0821BAD +:1023E000910927FD9395880F991F880F991F08174A +:1023F00019070CF4C8010297880F991F4FB7F8947A +:102400002F2D30E0F901EE0FFF1FE20FF31FE55C07 +:10241000FB4F928381834FBFE3CC62EE71E0CE012C +:1024200088559E4F0E94E709C156DE4F0883CF5959 +:10243000D140C056DE4F1883C05AD140CF55DE4F31 +:10244000F982E882C15AD140CD55DE4FB982A882C7 +:10245000C35AD140BE0168557E4FCE0182569E4F71 +:102460000E94A90CD82ECE0188559E4F0E946B0960 +:10247000DD2029F166E971E0C8010E949F0C0097F8 +:1024800021F061EA71E00E94340D0E944F057C0149 +:1024900066E971E0C8010E949F0C009721F06BEE85 +:1024A00071E00E94340D0E94CD05182FF0926E0449 +:1024B000E0926D040E94A8001093000191CC62EF9D +:1024C00071E0CE0188559E4F0E94E709C156DE4F4C +:1024D0000883CF59D140C056DE4F1883C05AD1402F +:1024E000CF55DE4FF982E882C15AD140CD55DE4F3B +:1024F000B982A882C35AD140BE0168557E4FCE0131 +:1025000082569E4F0E94A90CF82ECE0188559E4FF0 +:102510000E946B09FF2009F463CC66E971E0C801F1 +:102520000E949F0C009721F061EA71E00E94340D37 +:102530000E944F057C0166E971E0C8010E949F0C72 +:10254000009721F06BEE71E00E94340D0E94CD05E2 +:1025500080939D03F0929803E092970341CC0F93F0 +:102560001F93CF93DF9300D000D000D0CDB7DEB75C +:102570008EE993E00E941A01853239F51A82198298 +:102580001C821B821E821D8264E674E0CE010196CD +:102590000E94C609CE0101960E943F0DCE01019610 +:1025A0000E946B0950E040E06BE671E084E694E045 +:1025B0000E949B0926960FB6F894DEBF0FBECDBFD2 +:1025C000DF91CF911F910F91089589831A82009115 +:1025D0006804109169040F5F1F4FB80184E694E00E +:1025E0000E947309882331F32091640430916504BB +:1025F0008091680490916904BE016F5F7F4F820FE4 +:10260000931F0E94101D1093690400936804D2CF99 +:102610000E94480181110C94AF1208951F920F92ED +:102620000FB60F9211242F933F934F935F936F93A5 +:102630007F938F939F93AF93BF93EF93FF938EE915 +:1026400093E00E945201FF91EF91BF91AF919F9152 +:102650008F917F916F915F914F913F912F910F904B +:102660000FBE0F901F9018951F920F920FB60F92EA +:1026700011242F938F939F93EF93FF93E091AE03D9 +:10268000F091AF038081E091B403F091B50382FD36 +:102690001BC090818091B7038F5F8F732091B80327 +:1026A000821741F0E091B703F0E0E256FC4F958FBE +:1026B0008093B703FF91EF919F918F912F910F908E +:1026C0000FBE0F901F9018958081F4CF1F920F922C +:1026D0000FB60F9211242F933F938F939F93AF9335 +:1026E000BF938091860390918703A0918803B09156 +:1026F00089033091810323E0230F2D3758F501968C +:10270000A11DB11D209381038093860390938703BD +:10271000A0938803B09389038091820390918303EF +:10272000A0918403B09185030196A11DB11D8093F2 +:10273000820390938303A0938403B0938503BF9196 +:10274000AF919F918F913F912F910F900FBE0F905E +:102750001F90189526E8230F0296A11DB11DD2CF18 +:102760001F920F920FB60F9211242F933F934F9306 +:102770005F936F937F938F939F93AF93BF93EF93E9 +:10278000FF93E0910301F09104010995FF91EF910E +:10279000BF91AF919F918F917F916F915F914F9179 +:1027A0003F912F910F900FBE0F901F9018951F9281 +:1027B0000F920FB60F9211242F933F934F935F9375 +:1027C0006F937F938F939F93AF93BF93EF93FF93F9 +:1027D000E0910101F09102010995FF91EF91BF9104 +:1027E000AF919F918F917F916F915F914F913F91A9 +:1027F0002F910F900FBE0F901F9018951F920F9260 +:102800000FB60F9211242F933F934F935F936F93C3 +:102810007F938F939F93AF93BF93CF93DF93EF9368 +:10282000FF9380918003C0915F04D0E087FF24C0B4 +:102830001092850010928400809180038F5F8093B6 +:10284000800380918003082E000C990B8C179D0744 +:1028500024F4809180038C30C4F1809184009091A5 +:102860008500049680349C4908F47AC080918400E5 +:1028700090918500049676C080918003082E000C0C +:10288000990B8C179D07C4F6E09180038E2FEE0FF5 +:10289000990BFC01EE0FFF1FE80FF91FE55CFB4FE2 +:1028A000808186FFC9CFE09180038E2FEE0F990BB8 +:1028B000FC01EE0FFF1FE80FF91FE55CFB4F808165 +:1028C00060E08F730E940A02B7CF2091840030919C +:1028D0008500E09180038E2FEE0F990BFC01EE0F27 +:1028E000FF1FE80FF91FE55CFB4F81819281820F8A +:1028F000931F9093890080938800E09180038E2F2E +:10290000EE0F990BFC01EE0FFF1FE80FF91FE55CBE +:10291000FB4F808186FF11C0E09180038E2FEE0F68 +:10292000990BFC01EE0FFF1FE80FF91FE55CFB4F51 +:10293000808161E08F730E940A02FF91EF91DF9125 +:10294000CF91BF91AF919F918F917F916F915F9147 +:102950004F913F912F910F900FBE0F901F901895A0 +:1029600080E49CE990938900809388008FEF8093A6 +:102970008003E3CF1F920F920FB60F9211242F9373 +:102980003F934F935F936F937F938F939F93AF93F7 +:10299000BF93CF93DF93EF93FF9320917D0430E0BB +:1029A000F901E458FF4F8491F901E255FF4FD491AA +:1029B000F901E656FF4FC491CC2379F081110E94B2 +:1029C000E101EC2FF0E0EE0FFF1FE057FF4FA59164 +:1029D000B491EC91ED2381E009F480E02091810431 +:1029E000309182042F5F3F4F309382042093810403 +:1029F00090918004953618F096E090937C04909125 +:102A00007C04943009F466C0B8F49230F1F093304D +:102A100009F444C090917F04992309F46BC081119B +:102A20007CC080917E04882309F463C080917E0479 +:102A300061E00E940A025EC0953009F457C09630EA +:102A400049F791E090934D054FC08111E3CF20915C +:102A50008104309182042436310528F410928204D6 +:102A600010928104D7CF10924D0510928004E0910E +:102A7000800491E09E0F90938004F0E02091810407 +:102A800030918204EE0FFF1FE458FB4F30872783FD +:102A9000109282041092810493E019C0813009F0F1 +:102AA000B9CFE091800491E09E0F90938004F0E014 +:102AB0002091810430918204EE0FFF1FE458FB4FF8 +:102AC00030872783109282041092810494E09093BF +:102AD0007C04A0CF882359F2209181043091820494 +:102AE0002536310508F496CF95E0F1CF811192CFCC +:102AF000B5CF2D9AFF91EF91DF91CF91BF91AF911B +:102B00009F918F917F916F915F914F913F912F9105 +:102B10000F900FBE0F901F90189580917E04882310 +:102B200021F080917E0460E084CF2D98E3CFCF9395 +:102B3000DF931092A1031092A00388EE93E0A0E02F +:102B4000B0E08093A2039093A303A093A403B09357 +:102B5000A5038DE491E090939F0380939E0385EC01 +:102B600090E09093AB038093AA0384EC90E0909361 +:102B7000AD038093AC0380EC90E09093AF0380931F +:102B8000AE0381EC90E09093B1038093B00382ECAC +:102B900090E09093B3038093B20386EC90E090931F +:102BA000B5038093B4031092B7031092B803109248 +:102BB000B9031092BA0383E080934E05CFEFDFEFA5 +:102BC000D0937004C0936F048AE090E090937204F5 +:102BD0008093710449E050E062EC70E083E794E098 +:102BE0000E941018D0936E04C0936D048CE390E0A3 +:102BF0009093060180930501109260041092610485 +:102C0000109262041092630480915F048C30D0F4BF +:102C100091E0980F90935F0480936A0490E0FC0128 +:102C2000EE0FFF1FE80FF91FE55CFB4F88EB9BE001 +:102C3000928381836BE671E084E694E0DF91CF912B +:102C40000C94E7098FEF80936A04F4CF789484B5ED +:102C5000826084BD84B5816084BD85B5826085BD98 +:102C600085B5816085BD80916E00816080936E0026 +:102C70001092810080918100826080938100809118 +:102C800081008160809381008091800081608093C9 +:102C900080008091B10084608093B1008091B00089 +:102CA00081608093B00080917A00846080937A0084 +:102CB00080917A00826080937A0080917A008160AE +:102CC00080937A0080917A00806880937A001092D5 +:102CD000C100E091AE03F091AF0382E08083E09108 +:102CE000AA03F091AB031082E091AC03F091AD0325 +:102CF0008FEC80831092B603E091B203F091B3039E +:102D000086E08083E091B003F091B103808180611F +:102D10008083E091B003F091B1038081886080836B +:102D2000E091B003F091B103808180688083E091ED +:102D3000B003F091B10380818F7D808310926E0487 +:102D400010926D040E94A80081E08093000180939E +:102D50009D0388E090E090939803809397034BE95C +:102D6000E42EF12C412C50EC552E59E7652E54ECF5 +:102D7000752E2FB7F8948091860390918703A091C8 +:102D80008803B09189032FBF20919D03222309F46A +:102D900003C14091990350919A0360919B037091F4 +:102DA0009C038C019D01041B150B260B370BB901ED +:102DB000A80140325E446105710508F4EDC08093BE +:102DC000990390939A03A0939B03B0939C03C091A3 +:102DD0009703D0919803CE019927FC01E255FF4F4C +:102DE000D490FC01E656FF4FE491F0E0EE0FFF1F98 +:102DF000E057FF4F059114911092920310929303A4 +:102E000010929403109295031092960361E08C2F18 +:102E10000E94760260E08C2F0E940A0262E170E05C +:102E200080E090E00E94080361E08C2F0E940A027B +:102E3000C7010197F1F760E08C2F0E94760280E9CC +:102E400091E0F80120812D2199F40197D1F740926A +:102E50008A0350928B0360928C0370928D03409290 +:102E60008E0350928F03609290037092910364C01E +:102E700080E991E0F80120812D2119F00197D1F727 +:102E8000E6CF98E2392E20E8C22E212C80E991E08D +:102E9000F80120812D2119F40197D1F7D8CF0E9494 +:102EA000A7024B015C0180E991E0F80120812D210E +:102EB00019F00197D1F7CBCF0E94A70268197909C1 +:102EC0008A099B09693271058105910538F0E22D67 +:102ED000F0E0E657FC4F80858C298087C69419F472 +:102EE000239480E8C82E3A943110D0CF61E08C2F23 +:102EF0000E94760261E08C2F0E940A026091920388 +:102F000070E090E080E00E941E1860938A03709346 +:102F10008B0380938C0390938D036091940370E0F6 +:102F200090E080E00E941E1860938E0370938F03E0 +:102F30008093900390939103C3E0D0E08BEF91E0F6 +:102F40000E942C0860918E0370918F0380919003F2 +:102F50009091910342E00E948F0885E392E00E94E5 +:102F60007D0888E392E00E942C0860918A037091AA +:102F70008B0380918C0390918D0342E00E948F0817 +:102F800085E392E00E947D0864E670E080E090E0D6 +:102F90000E940803219791F680910001882301F196 +:102FA0008091600490916104A0916204B0916304E7 +:102FB0000097A105B105A1F0892BD1F48FE692E02D +:102FC0000E942C0868EC70E080E090E00E9408030A +:102FD00010926004109261041092620410926304D3 +:102FE0000E944801882309F4C4CE0E94AF12C1CECA +:102FF00080E892E00E942C08609160047091610466 +:1030000080916204909163044AE00E94390885E34C +:1030100092E00E947D08D6CF84E694E00C946B0980 +:10302000FB01DC0102C005900D9241505040D8F7E1 +:1030300008950E945B1808F481E00895E89409C09F +:1030400097FB3EF490958095709561957F4F8F4FDB +:103050009F4F9923A9F0F92F96E9BB279395F695F1 +:10306000879577956795B795F111F8CFFAF4BB0F6F +:1030700011F460FF1BC06F5F7F4F8F4F9F4F16C0D3 +:10308000882311F096E911C0772321F09EE8872F5D +:10309000762F05C0662371F096E8862F70E060E019 +:1030A0002AF09A95660F771F881FDAF7880F969592 +:1030B000879597F90895990F0008550FAA0BE0E836 +:1030C000FEEF16161706E807F907C0F012161306EA +:1030D000E407F50798F0621B730B840B950B39F42A +:1030E0000A2661F0232B242B252B21F408950A2690 +:1030F00009F4A140A6958FEF811D811D08950E94BE +:1031000092180C9403190E94F51838F00E94FC18CC +:1031100020F0952311F00C94EC180C94F218112463 +:103120000C9437190E94141970F3959FC1F3950FF1 +:1031300050E0551F629FF001729FBB27F00DB11D3B +:10314000639FAA27F00DB11DAA1F649F6627B00DCB +:10315000A11D661F829F2227B00DA11D621F739FB4 +:10316000B00DA11D621F839FA00D611D221F749FC2 +:103170003327A00D611D231F849F600D211D822F09 +:10318000762F6A2F11249F5750409AF0F1F0882330 +:103190004AF0EE0FFF1FBB1F661F771F881F91505D +:1031A0005040A9F79E3F510580F00C94EC180C9408 +:1031B00037195F3FE4F3983ED4F38695779567958A +:1031C000B795F795E7959F5FC1F7FE2B880F911D87 +:1031D0009695879597F9089597F99F6780E870E02D +:1031E00060E008959FEF80EC089500240A9416167D +:1031F000170618060906089500240A9412161306E5 +:10320000140605060895092E0394000C11F4882372 +:1032100052F0BB0F40F4BF2B11F460FF04C06F5F8E +:103220007F4F8F4F9F4F089557FD9058440F551F64 +:1032300059F05F3F71F04795880F97FB991F61F038 +:103240009F3F79F087950895121613061406551FAF +:10325000F2CF4695F1DF08C0161617061806991F1B +:10326000F1CF86957105610508940895E894BB2710 +:1032700066277727CB0197F90895052E97FB1EF453 +:1032800000940E94541957FD07D00E94A61907FC0C +:1032900003D04EF40C9454195095409530952195D7 +:1032A0003F4F4F4F5F4F0895909580957095619572 +:1032B0007F4F8F4F9F4F08950E94C819A59F900D73 +:1032C000B49F900DA49F800D911D11240895B7FF08 +:1032D0000C945C190E945C19821B930B08952F9229 +:1032E0003F924F925F926F927F928F929F92AF9296 +:1032F000BF92CF92DF92EF92FF920F931F93CF93E3 +:10330000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF79 +:103310000FBECDBF09942A88398848885F846E849F +:103320007D848C849B84AA84B984C884DF80EE80E9 +:10333000FD800C811B81AA81B981CE0FD11D0FB6F2 +:10334000F894DEBF0FBECDBFED010895A1E21A2EA5 +:10335000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F39 +:10336000A217B307E407F50720F0A21BB30BE40B89 +:10337000F50B661F771F881F991F1A9469F76095D0 +:103380007095809590959B01AC01BD01CF0108958A +:10339000A29FB001B39FC001A39F700D811D112496 +:1033A000911DB29F700D811D1124911D08955058DB +:1033B000BB27AA270E94EF190C9403190E94F51845 +:1033C00038F00E94FC1820F039F49F3F19F426F4DD +:1033D0000C94F2180EF4E095E7FB0C94EC18E92F2E +:1033E0000E94141958F3BA176207730784079507E8 +:1033F00020F079F4A6F50C9436190EF4E0950B2E16 +:10340000BA2FA02D0B01B90190010C01CA01A00136 +:103410001124FF27591B99F0593F50F4503E68F191 +:103420001A16F040A22F232F342F4427585FF3CFD2 +:10343000469537952795A795F0405395C9F77EF4A3 +:103440001F16BA0B620B730B840BBAF09150A1F0EC +:10345000FF0FBB1F661F771F881FC2F70EC0BA0F72 +:10346000621F731F841F48F4879577956795B795FA +:10347000F7959E3F08F0B0CF9395880F08F09927F5 +:10348000EE0F9795879508950E94581A0C9403198A +:103490000E94FC1858F00E94F51840F029F45F3F94 +:1034A00029F00C94EC1851110C9437190C94F21863 +:1034B0000E94141968F39923B1F3552391F3951BD6 +:1034C000550BBB27AA2762177307840738F09F5F45 +:1034D0005F4F220F331F441FAA1FA9F335D00E2EB2 +:1034E0003AF0E0E832D091505040E695001CCAF71F +:1034F0002BD0FE2F29D0660F771F881FBB1F2617E2 +:1035000037074807AB07B0E809F0BB0B802DBF01B8 +:10351000FF2793585F4F3AF09E3F510578F00C9487 +:10352000EC180C9437195F3FE4F3983ED4F386957A +:1035300077956795B795F7959F5FC9F7880F911DA8 +:103540009695879597F90895E1E0660F771F881F94 +:10355000BB1F621773078407BA0720F0621B730B47 +:10356000840BBA0BEE1F88F7E09508950E94BD1AF0 +:103570006894B1110C94371908950E941C1988F0B1 +:103580009F5798F0B92F9927B751B0F0E1F0660F27 +:10359000771F881F991F1AF0BA95C9F714C0B13068 +:1035A00091F00E943619B1E008950C943619672FF6 +:1035B000782F8827B85F39F0B93FCCF38695779597 +:1035C0006795B395D9F73EF4909580957095619580 +:1035D0007F4F8F4F9F4F08950E945B1808F48FEF25 +:1035E00008950E945B18880B990B0895991B79E048 +:1035F00004C0991F961708F0961B881F7A95C9F783 +:1036000080950895AA1BBB1B51E107C0AA1FBB1FD1 +:10361000A617B70710F0A61BB70B881F991F5A955E +:10362000A9F780959095BC01CD010895EE0FFF1F7D +:103630000590F491E02D09940F931F93CF93DF939E +:103640008230910510F482E090E0E0915305F09112 +:10365000540530E020E0B0E0A0E0309799F4211567 +:10366000310509F44AC0281B390B24303105D8F53F +:103670008A819B816115710589F1FB0193838283A6 +:10368000FE0111C040815181028113814817590701 +:10369000E0F04817590799F4109761F012960C93CF +:1036A000129713961C933296CF01DF91CF911F9101 +:1036B0000F9108950093530510935405F4CF2115ED +:1036C000310551F04217530738F0A901DB019A0187 +:1036D000BD01DF01F801C1CFEF01F9CF909354058F +:1036E00080935305CDCFFE01E20FF31F8193919399 +:1036F0002250310939832883D7CF20915105309149 +:103700005205232B41F42091090130910A01309395 +:103710005205209351052091070130910801211590 +:10372000310541F42DB73EB740910B0150910C018A +:10373000241B350BE0915105F0915205E217F30778 +:10374000A0F42E1B3F0B2817390778F0AC014E5F11 +:103750005F4F2417350748F04E0F5F1F50935205F7 +:1037600040935105819391939FCFF0E0E0E09CCF8F +:10377000CF93DF930097E9F0FC0132971382128216 +:10378000A0915305B0915405ED0130E020E0109771 +:10379000A1F420813181820F931F20915105309136 +:1037A00052052817390709F061C0F0935205E093DC +:1037B0005105DF91CF910895EA01CE17DF07E8F5B3 +:1037C0004A815B819E0141155105B1F7E901FB83F7 +:1037D000EA8349915991C40FD51FEC17FD0761F495 +:1037E000808191810296840F951FE90199838883D6 +:1037F000828193819B838A83F0E0E0E012968D9131 +:103800009C9113970097B9F52D913C911197CD019B +:103810000296820F931F209151053091520528176F +:10382000390739F6309751F5109254051092530527 +:10383000B0935205A0935105BCCFD383C28340817E +:103840005181840F951FC817D90761F44E5F5F4FF0 +:1038500088819981480F591F518340838A819B81B8 +:10386000938382832115310509F0B0CFF09354057D +:10387000E09353059ECFFD01DC01C0CF138212827D +:10388000D7CFB0E0A0E0E7E4FCE10C9471198C0123 +:10389000009751F4CB010E941C1B8C01C801CDB7CD +:1038A000DEB7E0E10C948D19FC01E60FF71F9C01D7 +:1038B00022503109E217F30708F49DC0D901CD91D8 +:1038C000DC911197C617D70798F0C530D10530F3B2 +:1038D000CE0104978617970708F3C61BD70B2297CC +:1038E000C193D1936D937C93CF010E94B81BD6CF27 +:1038F0005B01AC1ABD0A4C018C0E9D1EA0915305B4 +:10390000B0915405512C412CF12CE12C109731F53C +:1039100080915105909152058815990509F05CC078 +:103920004616570608F058C080910701909108018B +:10393000009741F48DB79EB740910B0150910C0157 +:10394000841B950BE817F90708F055C0F093520552 +:10395000E0935105F90171836083A0CF8D919C9113 +:10396000119712966C90129713967C901397A81546 +:10397000B90559F56C0142E0C40ED11CCA14DB0430 +:1039800020F1AC014A195B09DA011296159780F013 +:103990006282738251834083D9016D937C93E114D9 +:1039A000F10471F0D7011396FC93EE93129776CF42 +:1039B00022968C0F9D1FF90191838083F301EFCF35 +:1039C000F0935405E093530569CF4816590608F45F +:1039D0002C017D01D3019ACFCB010E941C1B7C01DD +:1039E000009749F0AE01B8010E94FE1CC8010E9478 +:1039F000B81B870153CF10E000E050CFFB01DC0182 +:103A000002C001900D9241505040D8F70895FB013B +:103A1000DC018D91019080190110D9F3990B089563 +:103A2000FB01DC0101900D920020E1F7089510E008 +:103A3000CDE7D0E004C0FE010E94161B2196CE37D0 +:083A4000D107C9F7F894FFCF8C +:103A4800013B033B033C00000055058000B302B670 +:103A580002C602D302DC02E902CDCCCC3D0AD72350 +:103A68003C17B7D13877CC2B329595E6241FB14F48 +:103A78000A000020410000C84200401C4620BCBE8D +:103A88004CCA1B0E5AAEC59D74000000007401DEBE +:103A9800000B01C1013C011A012E012F2F22225CCB +:103AA8005C6208660C6E0A720D7409000D0A006EDD +:103AB800616E00696E66006F7666003F3F3F006585 +:103AC8006D69745F3433330066756E6374696F6E45 +:103AD8005F6E616D6500706172616D6574657273AA +:103AE80000646174615F70696E006269745F6C651F +:103AF8006E67746800636F646500656D69745F3430 +:103B080033335F636861636F6E00656D69745F6905 +:103B180072007365745F736572766F00616E676CAF +:103B28006500726563765F34333300656E61626C7D +:103B38006500726563765F646874007B2266756EE3 +:103B48006374696F6E5F6E616D65223A2264687492 +:103B58005F74656D7065726174757265222C227070 +:103B68006172616D6574657273223A7B2276616C4D +:103B78007565223A007D7D007B2266756E637469E7 +:103B88006F6E5F6E616D65223A226468745F687556 +:103B98006D6964697479222C22706172616D657433 +:103BA800657273223A7B2276616C7565223A0055FC +:103BB8006E6B6E6F776E20656E636F64696E6700FB +:103BC8007B2266756E6374696F6E5F6E616D6522C8 +:103BD8003A22726563765F343333222C2270617225 +:103BE800616D6574657273223A7B2276616C7565C6 +:103BF800223A004F6B00496E636F6D706C65746597 +:103C0800496E70757400496E76616C6964496E70AE +:103C18007574004E6F4D656D6F7279004E6F7453F9 +:103C28007570706F7274656400546F6F4465657069 +:023C380000008A +:107E0000112484B714BE81FFF0D085E080938100F7 +:107E100082E08093C00088E18093C10086E0809377 +:107E2000C20080E18093C4008EE0C9D0259A86E02C +:107E300020E33CEF91E0309385002093840096BBD3 +:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 +:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 +:107E6000A2D0813461F49FD0082FAFD0023811F036 +:107E7000013811F484E001C083E08DD089C08234E0 +:107E800011F484E103C0853419F485E0A6D080C0E4 +:107E9000853579F488D0E82EFF2485D0082F10E0AE +:107EA000102F00270E291F29000F111F8ED06801E7 +:107EB0006FC0863521F484E090D080E0DECF843638 +:107EC00009F040C070D06FD0082F6DD080E0C81688 +:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 +:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 +:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 +:107F0000A601A0E0B1E02C9130E011968C91119780 +:107F100090E0982F8827822B932B1296FA010C0160 +:107F200087BEE89511244E5F5F4FF1E0A038BF0790 +:107F300051F7F601A7BEE89507B600FCFDCF97BE46 +:107F4000E89526C08437B1F42ED02DD0F82E2BD052 +:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 +:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 +:107F7000D11C0EC0853739F428D08EE10CD085E9AC +:107F80000AD08FE07ACF813511F488E018D01DD067 +:107F900080E101D065CF982F8091C00085FFFCCF94 +:107FA0009093C60008958091C00087FFFCCF809118 +:107FB000C00084FD01C0A8958091C6000895E0E648 +:107FC000F0E098E1908380830895EDDF803219F02E +:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA +:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 +:047FF000FF270994CA +:027FFE00040479 +:0400000300007E007B +:00000001FF diff --git a/server/services/arduino/arduino-code/yun/arduino-code.ino.hex b/server/services/arduino/arduino-code/yun/arduino-code.ino.hex new file mode 100644 index 0000000000..2ae6dbb2fe --- /dev/null +++ b/server/services/arduino/arduino-code/yun/arduino-code.ino.hex @@ -0,0 +1,641 @@ +:100000000C94EF000C94420A0C941B0A0C94F40913 +:100010000C94CD090C9417010C9417010C94A609AB +:100020000C9417010C9417010C94BB060C942A072E +:100030000C9417010C9417010C9417010C941701E0 +:100040000C9417010C94690A0C9417010C94170175 +:100050000C9417010C9417010C9417010C945C0973 +:100060000C9417010C9417010C9417010C941701B0 +:100070000C9417010C9417010C9417010C941701A0 +:100080000C9417010C9417010C9417010C94170190 +:100090000C9417010C9417010C9417010C94170180 +:1000A0000C9417010C94250B0C9417010000000010 +:1000B000240027002A002D00300000000000250049 +:1000C00028002B002E0031000000000200090F0064 +:1000D00000030401000C000000000000000000000C +:1000E00000000000000000080B00020202000009EE +:1000F0000400000102020000052400100105240193 +:1001000001010424020605240600010705810310ED +:10011000004009040100020A000000070502024035 +:1001200000000705830240000004030904120100D7 +:1001300002EF02014041234180000101020301411D +:10014000726475696E6F204C4C430041726475692E +:100150006E6F2059756E00000000002300260029F4 +:10016000002C002F0004040404040304050202020E +:100170000204030202020206060606060604040240 +:100180000202040404080201104080401020408054 +:1001900040800802040180402010020110801020DD +:1001A0004040205E01011F01030301008A02010A91 +:1001B000010202010064001E47040B0906007C01D5 +:1001C00001060103030100F401060E010202010011 +:1001D000C2011701010202010100020CBE0E11242E +:1001E0001FBECFEFDAE0DEBFCDBF12E0A0E0B1E08E +:1001F000ECEFF6E202C005900D92A030B107D9F7FE +:1002000024E0A0E0B2E001C01D92AC32B207E1F7F9 +:1002100010E0CEEED0E004C02197FE010E947911DB +:10022000CD3ED107C9F70E94AB0C0C9471130C940E +:100230000000FC018091C102882311F13FB7F894BE +:1002400082E08093E9002091F200822F90E018165E +:10025000190614F481E090E0882339F0289844E6E8 +:100260004093C0024091F1004083222339F0209155 +:10027000F200211103C02BE62093E8003FBF089550 +:100280008FEF9FEF08952FB7F89483E08093E900F4 +:100290009091E800892F807295FF04C09091F20040 +:1002A00080E4891B2FBF08958091B80281110DC091 +:1002B00082E08093B40284E08093B5021092B7028A +:1002C0001092B60281E08093B80284EB92E0089528 +:1002D000409196025091970220919402309195029C +:1002E00042175307B4F49091E8009570E1F39091B0 +:1002F000E80092FD19C08093F100809196029091E0 +:10030000970201968F739927892B19F48EEF8093AA +:10031000E80080919602909197020196909397023F +:100320008093960281E0089580E00895EF92FF9215 +:100330000F931F93CF93DF93F82E192FE62E042FE0 +:1003400081E0860F880F0E94680183E00E946801A7 +:10035000CF2DD12FEC0EFD2EF11CCE15DF05B9F0FF +:1003600007FF13C0FE0184910E946801182F80E0EE +:100370000E946801812321968111EFCFDF91CF91F7 +:100380001F910F91FF90EF9008958881EDCF81E04C +:10039000F5CFDF92EF92FF920F931F93CF93DF93EE +:1003A000D82E8A01EB017B01E40EF51ECE15DF0588 +:1003B00059F0D7FE12C0FE0184910E946801219677 +:1003C0008111F4CF0FEF1FEFC801DF91CF911F9183 +:1003D0000F91FF90EF90DF9008958881EECF0F93FB +:1003E0001F93CF93DF931F92CDB7DEB782E089834F +:1003F00042E450E067EE70E080E80E94C9010E948C +:100400005401DC0112960D911C910115110589F022 +:10041000D801ED91FC910280F381E02DBE016F5F68 +:100420007F4FC801099597FD04C0F801008511852B +:10043000ECCF89810F90DF91CF911F910F9108959B +:10044000615030F02091F100FC0120830196F8CF3B +:10045000289884E68093C0020895CF93DF931F927B +:10046000CDB7DEB76983DC01ED91FC910280F381A9 +:10047000E02D41E050E0BE016F5F7F4F09950F9086 +:10048000DF91CF91089583E08093E9008091F2009D +:10049000882319F08AE38093E80008950E944301BD +:1004A00090E00895CF93DF931F92CDB7DEB7FC01A4 +:1004B0008485958597FD08C02FEF3FEF358724870A +:1004C0000F90DF91CF910895CE0101960E941901FE +:1004D000019719F4898190E0F3CF8FEF9FEFF0CF70 +:1004E0000F931F93CF93DF931F92CDB7DEB78C018D +:1004F000FC018485958597FF0BC0CE0101960E9473 +:100500001901019771F4898190E0F801958784873A +:10051000F801848595850F90DF91CF911F910F9100 +:1005200008958FEF9FEFF1CFFC018485958597FDAE +:100530000BC09FB7F89482E08093E9008091F200AD +:100540009FBF90E0019608959FB7F89482E0809352 +:10055000E9008091F2009FBF90E0089581508F30B4 +:1005600008F047C0E82FF0E0E854FD4F0C947911F3 +:10057000D502D902C702CD02D102F902F902F9026D +:10058000DC02E202E602EA02F002F902F4028091E1 +:1005900080008F77809380000895809180008F7D08 +:1005A000F9CF80918000877FF5CF84B58F7784BDA8 +:1005B000089584B58F7DFBCF809190008F778093D5 +:1005C00090000895809190008F7DF9CF80919000E8 +:1005D000877FF5CF8091C0008F778093C00008950A +:1005E0008091C0008F7DF9CF8091C200877F80937A +:1005F000C20008951F93CF93DF93282F30E0F901B5 +:10060000E853FF4F8491F901EC57FE4FD491F90163 +:10061000EB59FE4FC491CC23A9F0162F81110E94F3 +:10062000AE02EC2FF0E0EE0FFF1FE654FF4FA59156 +:10063000B4918FB7F894EC91111108C0D095DE23D6 +:10064000DC938FBFDF91CF911F910895DE2BF8CF00 +:10065000CF93DF9390E0FC01EC57FE4F24918B5930 +:100660009E4FFC0184918823D1F090E0880F991F60 +:10067000FC01E455FF4FA591B491FC01E654FF4FF6 +:10068000C591D49161110EC09FB7F8948C91E22F5F +:10069000E0958E238C932881E223E8839FBFDF912E +:1006A000CF9108958FB7F894EC91E22BEC938FBF24 +:1006B000F6CF3FB7F8948091900290919102A0916B +:1006C0009202B091930226B5A89B05C02F3F19F066 +:1006D0000196A11DB11D3FBFBA2FA92F982F8827C2 +:1006E000BC01CD01620F711D811D911D42E0660F9D +:1006F000771F881F991F4A95D1F708958F929F926F +:10070000AF92BF92CF92DF92EF92FF926B017C018A +:100710000E9459034B015C01C114D104E104F104AE +:10072000B9F00E945903681979098A099B09683E42 +:1007300073408105910580F321E0C21AD108E108D8 +:10074000F10888EE880E83E0981EA11CB11CE4CF4E +:10075000FF90EF90DF90CF90BF90AF909F908F90E1 +:1007600008958F929F92AF92BF92CF92DF92EF92B5 +:10077000FF920F931F93CF93DF936C017B018A014C +:1007800080910B01882309F45CC08091C102882309 +:1007900009F457C080919A0280FF05C08091E00063 +:1007A00082608093E000E801B12C8AEFA82E93E0EC +:1007B000892E2AE3922E209711F4BB20D9F10E94B2 +:1007C000430181110AC0AA94AA20D9F161E070E026 +:1007D00080E090E00E947E03EECF8C171D0611F0A2 +:1007E0000CF08C2F9FB7F8948092E9002091E800DC +:1007F00025FD02C09FBFDFCF282F30E0C21BD30BE7 +:10080000F701815020F041914093F100FACFE20EC0 +:10081000F31EBB2021F09092E800B12CEBCF809129 +:10082000E80085FDE7CF9092E800BB24B3942097C1 +:1008300009F3F3CF5D9884E68093990210161106B0 +:100840003CF081E090E0F6019383828310E000E0C9 +:10085000C801DF91CF911F910F91FF90EF90DF9032 +:10086000CF90BF90AF909F908F90089508952F9252 +:100870003F924F925F926F927F928F929F92AF9230 +:10088000BF92CF92DF92EF92FF920F931F93CF937D +:10089000DF93CDB7DEB761970FB6F894DEBF0FBE1A +:1008A000CDBF0E9459036B017C0180918A02909117 +:1008B0008B023601681A790A2DEC621620E1720665 +:1008C00008F4D1C08091040290910502D301A81BC5 +:1008D000B90BCD01B7FF03C0919581959109883C73 +:1008E00091050CF0BCC08091020290910302019628 +:1008F0009093030280930202029709F0B0C003EACA +:1009000011E0409000025090010249E050E0B8012F +:10091000CE0101960E94C70E8B816C81681708F486 +:10092000682F70E080910402909105020E94651189 +:100930009B014091170150911801649FC001659F70 +:10094000900D749F900D112464E670E00E94651173 +:10095000898541E050E0882311F042E050E08D812C +:10096000829FF001839FF00D1124FB87EA878E811F +:10097000829FD001839FB00D1124BD87AC878F81EA +:10098000829FF001839FF00D1124FF87EE878885F9 +:10099000829F1001839F300C1124FA01EE0FFF1F7C +:1009A000EC5FFD4F812C912C5401920121503109B3 +:1009B000398B288B888999894817590708F03FC0D7 +:1009C000880C991CAA1CBB1C808191819C01AA8562 +:1009D000BB852A1B3B0B37FF03C03195219531099D +:1009E0002617370770F422813381AC85BD852A1B19 +:1009F0003B0B37FF03C03195219531092617370787 +:100A0000D0F02E853F85821B930B97FF03C09195F5 +:100A10008195910986179707B8F48281938182198D +:100A2000930997FF03C091958195910986179707C0 +:100A300058F4689480F84E5F5F4F3496BBCF38E02F +:100A40004316510408F051C0075F1F4F81E0093D74 +:100A5000180709F056CF109203021092020210926A +:100A600001021092000280910002909101028334F1 +:100A7000910540F0109201021092000210920302C0 +:100A80001092020280910002909101029C012F5F5E +:100A90003F4F3093010220930002880F991FFC0101 +:100AA000EC5FFD4F71826082C0928A02D0928B020D +:100AB000E0928C02F0928D0261960FB6F894DEBF40 +:100AC0000FBECDBFDF91CF911F910F91FF90EF909F +:100AD000DF90CF90BF90AF909F908F907F906F905E +:100AE0005F904F903F902F9008958092370390929F +:100AF0003803A0923903B0923A03ADCFFC010190C4 +:100B00000020E9F73197AF01481B590BBC0182EC7B +:100B100092E00C94B1038F929F92AF92BF920F9389 +:100B20001F93CF93DF93CDB7DEB7A1970FB6F8949D +:100B3000DEBF0FBECDBF19A2423008F44AE08E01DD +:100B40000F5D1F4F842E912CB12CA12CA501940177 +:100B50000E942B10E62FB901CA01EA30F4F4E05DDF +:100B6000D801EE938D01232B242B252B79F790E0D0 +:100B700080E0109719F0CD010E947E05A1960FB676 +:100B8000F894DEBF0FBECDBFDF91CF911F910F91C3 +:100B9000BF90AF909F908F900895E95CE1CFCF9385 +:100BA000DF9388E391E00E947E05EC018BE391E006 +:100BB0000E947E058C0F9D1FDF91CF9108954F926B +:100BC0005F926F927F928F929F92AF92BF92CF92DD +:100BD000DF92EF92FF920F931F93CF936B017C01F3 +:100BE000742EAC019B010E946011882399F08EE362 +:100BF00091E0CF911F910F91FF90EF90DF90CF90F8 +:100C0000BF90AF909F908F907F906F905F904F902C +:100C10000C947E0546015701E894B7F82FEF3FEF9B +:100C20004FE75FE7C501B4010E94601181110DC05B +:100C30002FEF3FEF4FE75FE7C501B4010E94D00EF1 +:100C400018161CF482E491E0D4CF2FEF3FEF4FE76A +:100C50005FE4C701B6010E945B1118161CF486E41C +:100C600091E0C7CF2FEF3FEF4FE75FECC701B60131 +:100C70000E94D00E87FDF3CF20E030E0A901C7012C +:100C8000B6010E94D00E10E000E087FF0AC06DE2BE +:100C900082EC92E00E942D028C01F7FAF094F7F8B2 +:100CA000F094C0E060E070E080E09FE37C1641F0EB +:100CB00020E030E040E251E40E94BA10CF5FF6CF6E +:100CC000A70196010E944E102B013C010E942C119D +:100CD0004B015C014AE00E948B057C01E00EF11E95 +:100CE000CC23C1F1C501B4010E94D50E9B01AC011A +:100CF000C301B2010E944D104B015C016EE282EC17 +:100D000092E00E942D02E80EF91EC15018F120E079 +:100D100030E040E251E4C501B4010E94360F2B01DE +:100D20003C010E942C114B01B12CA12C4AE0C501C1 +:100D3000B4010E948B05E80EF91EC501B4010E94A2 +:100D4000D50E9B01AC01C301B2010E944D104B01B5 +:100D50005C01DBCFC701CF911F910F91FF90EF9006 +:100D6000DF90CF90BF90AF909F908F907F906F90CB +:100D70005F904F9008951F920F920FB60F9211241B +:100D80008F939F938091E1009091E100937F9093E6 +:100D9000E10083FF0FC01092E90091E09093EB0017 +:100DA0001092EC0092E39093ED001092C10298E053 +:100DB0009093F00082FF22C093E09093E90090911D +:100DC000F200992319F09AE39093E8009091990228 +:100DD000992341F090919902915090939902911129 +:100DE00001C05D9A9091C002992341F09091C00298 +:100DF00091509093C002911101C0289A84FF18C0AD +:100E00008091E2008E7E81608093E2008091E1001B +:100E10008F7E8093E10080919A028E7E8061809324 +:100E20009A029F918F910F900FBE0F901F9018956F +:100E300080FFF7CF8091E2008E7E80618093E20098 +:100E40008091E1008E7E8093E10080919A028E7EF7 +:100E50008160E5CF1F920F920FB60F921124CF92AF +:100E6000DF92EF92FF920F931F932F933F934F9335 +:100E70005F936F937F938F939F93AF93BF93EF9302 +:100E8000FF93CF93DF93CDB7DEB76C97DEBFCDBFB7 +:100E90001092E9008091E80083FF25C068E0CE0150 +:100EA00045960E94200282EF8093E8008D8987FF9B +:100EB00039C09091E80090FFFCCF982F907609F010 +:100EC00034C19E894F89588D2F89F88C911131C07A +:100ED000803861F580919B028093F1001092F100BF +:100EE0008EEF8093E8006C960FB6F894DEBF0FBECD +:100EF000CDBFDF91CF91FF91EF91BF91AF919F91C6 +:100F00008F917F916F915F914F913F912F911F91A1 +:100F10000F91FF90EF90DF90CF900F900FBE0F904A +:100F20001F9018959EEF9093E800C7CF1092F100A4 +:100F3000D5CF913059F48111D3CF4130510581F68D +:100F400080919B028D7F80939B02CACF933049F49E +:100F50008111C6CF4130510519F680919B02826004 +:100F6000F2CF953041F48091E80080FFFCCF2068FB +:100F70002093E300B5CF963009F0A9C00B8D1C8DEE +:100F800022E01092E9001092970210929602F2125B +:100F90002EC010929502109294020E94EF011F82BF +:100FA00099E09983FA8291E09E8390EA98879AEF7C +:100FB00099872091960230919702275F3F4F3C839B +:100FC0002B838D831092E900109297021092960263 +:100FD000109395020093940249E050E0BE016F5FC8 +:100FE0007F4F80E00E94C9010E94EF0179CF1093EA +:100FF0009502009394020E945401DC0112960D9117 +:101000001C910115110509F451C1D801ED91FC9114 +:101010000480F581E02DBE016B5E7F4FC80109950C +:10102000009709F03EC1F80100851185EACFF3E091 +:10103000FF120EC08F89882309F440C0823061F40A +:1010400040E86BE08BE491E00E949601811148CF6B +:1010500081E28093EB0047CF813029F440E86BE0D8 +:101060008FE391E0F1CF833099F70E945401DC01C6 +:101070001296ED90FC908E010F5F1F4F6801E114F6 +:10108000F10479F0D701ED91FC910680F781E02D14 +:10109000B801C7010995080F111DF701E084F1841B +:1010A000EECFD8011C92F60101900020E9F73197AC +:1010B000BF016C197D0940E0C601C6CF69E271E04D +:1010C000FB01449150E080E80E94C90109CF9730AC +:1010D00009F4BECF983021F481E08093F10000CF75 +:1010E000993009F0FDCE837009F0B2CFE0E2F1E073 +:1010F00081E031E096E32191222371F08093E900B1 +:101100003093EB00DF0111972C912093EC0090932A +:10111000ED008F5F873079F78EE78093EA001092B9 +:10112000EA008F898093C102DBCE8B8D9C8D10925B +:10113000E900109297021092960290939502809384 +:101140009402898D811192C08E899D89913A49F4CA +:10115000813209F07DCF47E050E064E071E080E04B +:10116000B3CF913209F074CF833269F48F89988DAF +:10117000B0E0A0E08093000190930101A0930201F0 +:10118000B0930301ADCE803269F48091E80082FF14 +:10119000FCCF67E084E091E00E9420028BEF809317 +:1011A000E8009ECE823209F09BCE8F8980930B019E +:1011B000EEEFFFE7859194918B3F9C4D51F1E0E07C +:1011C000F8E08091040190910501A0910601B09191 +:1011D0000701803B9440A105B105F1F480910B011A +:1011E00080FD1AC0EE3F8AE0F80789F587E797E7A8 +:1011F00091838083809160008093980288E19BE0D6 +:101200000FB6F894A895809360000FBE909360008D +:1012100067CEEEEFFAE0D5CF80819181873797478F +:1012200009F05ECEA895809160008861809360008F +:101230008091980280936000EE3F2AE0F20789F0E7 +:101240008091FE0A9091FF0A9183808349CE80812C +:1012500091818737980751F29093FF0A8093FE0A95 +:10126000C5CF1092FF0A1092FE0A3ACE0E94540196 +:10127000DC0112960D911C910115110509F4E8CEBF +:10128000D801ED91FC910190F081E02DBE016B5EE3 +:101290007F4FC8010995811123CEF8010085118582 +:1012A000EBCF181619060CF41BCED2CEF1E0FF12CC +:1012B000BECE6DE271E004CF1F920F920FB60F9277 +:1012C00011242F933F938F939F93AF93BF9380915C +:1012D0009C0290919D02A0919E02B0919F0230913C +:1012E0008F0223E0230F2D3758F50196A11DB11D64 +:1012F00020938F0280939C0290939D02A0939E0264 +:10130000B0939F028091900290919102A0919202DD +:10131000B09193020196A11DB11D8093900290930C +:101320009102A0939202B0939302BF91AF919F91CB +:101330008F913F912F910F900FBE0F901F90189596 +:1013400026E8230F0296A11DB11DD2CF1F920F9246 +:101350000FB60F9211242F933F934F935F936F9388 +:101360007F938F939F93AF93BF93EF93FF93E091FE +:101370001401F09115010995FF91EF91BF91AF9183 +:101380009F918F917F916F915F914F913F912F919D +:101390000F900FBE0F901F9018951F920F920FB6CF +:1013A0000F9211242F933F934F935F936F937F93EB +:1013B0008F939F93AF93BF93EF93FF93E0911201AD +:1013C000F09113010995FF91EF91BF91AF919F911A +:1013D0008F917F916F915F914F913F912F910F90DE +:1013E0000FBE0F901F9018951F920F920FB60F927D +:1013F00011242F933F934F935F936F937F938F931A +:101400009F93AF93BF93EF93FF93E0911001F091FF +:1014100011010995FF91EF91BF91AF919F918F912C +:101420007F916F915F914F913F912F910F900FBEE0 +:101430000F901F9018951F920F920FB60F921124C4 +:101440002F933F934F935F936F937F938F939F93CC +:10145000AF93BF93EF93FF93E0910E01F0910F01D3 +:101460000995FF91EF91BF91AF919F918F917F91DE +:101470006F915F914F913F912F910F900FBE0F9001 +:101480001F9018951F920F920FB60F9211242F9351 +:101490003F934F935F936F937F938F939F93AF93FC +:1014A000BF93EF93FF93E0910C01F0910D0109952B +:1014B000FF91EF91BF91AF919F918F917F916F912C +:1014C0005F914F913F912F910F900FBE0F901F9002 +:1014D00018951F920F920FB60F9211242F933F93DE +:1014E0004F935F936F937F938F939F93AF93BF932C +:1014F000CF93DF93EF93FF9380918E02C0913603D9 +:10150000D0E087FF24C01092850010928400809163 +:101510008E028F5F80938E0280918E02082E000CC7 +:10152000990B8C179D0724F480918E028C30C4F1A6 +:101530008091840090918500049680349C4908F441 +:101540007AC08091840090918500049676C0809145 +:101550008E02082E000C990B8C179D07C4F6E091A3 +:101560008E028E2FEE0F990BFC01EE0FFF1FE80F7E +:10157000F91FEE5EFC4F808186FFC9CFE0918E029D +:101580008E2FEE0F990BFC01EE0FFF1FE80FF91FD6 +:10159000EE5EFC4F808160E08F730E94FA02B7CF4D +:1015A0002091840030918500E0918E028E2FEE0F05 +:1015B000990BFC01EE0FFF1FE80FF91FEE5EFC4FC9 +:1015C00081819281820F931F90938900809388007C +:1015D000E0918E028E2FEE0F990BFC01EE0FFF1F94 +:1015E000E80FF91FEE5EFC4F808186FF11C0E0918D +:1015F0008E028E2FEE0F990BFC01EE0FFF1FE80FEE +:10160000F91FEE5EFC4F808161E08F730E94FA0249 +:10161000FF91EF91DF91CF91BF91AF919F918F910A +:101620007F916F915F914F913F912F910F900FBEDE +:101630000F901F90189580E49CE990938900809307 +:1016400088008FEF80938E02E3CF1F920F920FB628 +:101650000F9211242F933F934F935F936F937F9338 +:101660008F939F93AF93BF93CF93DF93EF93FF93AA +:101670002091540330E0F901E853FF4F8491F901C0 +:10168000EC57FE4FD491F901EB59FE4FC491CC2396 +:1016900079F081110E94AE02EC2FF0E0EE0FFF1FF7 +:1016A000E95AFE4FA591B491EC91ED2381E009F444 +:1016B00080E020915803309159032F5F3F4F3093C2 +:1016C00059032093580390915703953618F096E0EC +:1016D0009093530390915303943009F466C0B8F487 +:1016E0009230F1F0933009F444C09091560399235D +:1016F00009F46BC081117CC080915503882309F4E3 +:1017000063C08091550361E00E94FA025EC095308B +:1017100009F457C0963049F791E0909324044FC0E4 +:101720008111E3CF209158033091590324363105BC +:1017300028F41092590310925803D7CF1092240422 +:1017400010925703E091570391E09E0F9093570337 +:10175000F0E02091580330915903EE0FFF1FED5A2E +:10176000FC4F30872783109259031092580393E05F +:1017700019C0813009F0B9CFE091570391E09E0F75 +:1017800090935703F0E02091580330915903EE0FE6 +:10179000FF1FED5AFC4F3087278310925903109298 +:1017A000580394E090935303A0CF882359F22091DB +:1017B0005803309159032536310508F496CF95E04A +:1017C000F1CF811192CFB5CF2D9AFF91EF91DF919B +:1017D000CF91BF91AF919F918F917F916F915F91C9 +:1017E0004F913F912F910F900FBE0F901F90189522 +:1017F00080915503882321F08091550360E084CFC8 +:101800002D98E3CFCF93DF931092C5021092C402BC +:1018100088EE93E0A0E0B0E08093C6029093C70208 +:10182000A093C802B093C9028AE291E09093C302E8 +:101830008093C202CFEFDFEFD093CF02C093CE02EE +:1018400083E080932504D0934703C09346038AE046 +:1018500090E0909349038093480349E050E063EAA5 +:1018600071E08AE493E00E94C70ED0934503C093D1 +:1018700044038CE390E09093180180931701109239 +:101880003703109238031092390310923A03809173 +:1018900036038C3008F044C091E0980F90933603E3 +:1018A0008093410390E0FC01EE0FFF1FE80FF91F4A +:1018B000EE5EFC4F88EB9BE09283818310923C03A9 +:1018C00010923B0310923E0310923D03109240038E +:1018D00010923F0361E070E090E080E00E94A4126B +:1018E000009711F190933C0380933B0310923E03C9 +:1018F00010923D0320913F0330914003232B11F4BC +:10190000FC0110821092400310923F036DE371E0DE +:1019100080913B0390913C03DF91CF910C946A132B +:101920008FEF80934103CACF80913B0390913C039A +:10193000009711F00E941B1210923C0310923B037F +:101940001092400310923F0310923E0310923D0309 +:10195000DF91CF910895789484B5826084BD84B579 +:10196000816084BD85B5826085BD85B5816085BD9A +:1019700080916E00816080936E0010928100809152 +:1019800081008260809381008091810081608093DA +:10199000810080918000816080938000809191001F +:1019A000826080939100809191008160809391008A +:1019B000809190008160809390008091C10084604C +:1019C0008093C1008091C10082608093C1008091AA +:1019D000C10081608093C1008091C30081608093C9 +:1019E000C3008091C00082608093C0008091C200DB +:1019F00081608093C20080917A00846080937A0035 +:101A000080917A00826080937A0080917A00816070 +:101A100080937A0080917A00806880937A00109297 +:101A2000C10210929B0210929A028091D7008160AD +:101A30008093D70080EA8093D80089B5806189BD02 +:101A400089B5826089BD09B400FEFDCF61E070E018 +:101A500080E090E00E947E038091D8008F7C8061BE +:101A60008093D8008091E000807F8093E000809197 +:101A7000E1008E7E8093E1008DE08093E200559A34 +:101A8000209A8FEF9FEF9093CF028093CE02109217 +:101A900045031092440310923703109238031092BA +:101AA000390310923A0387E394E090930D018093F9 +:101AB0000C01809169008C7F816080936900E89AB5 +:101AC00081E0809316018093B30288E090E09093C8 +:101AD000AE028093AD024BE9E42EF12C412C50EC88 +:101AE000552E59E7652E54EC752E2FB7F89480913A +:101AF0009C0290919D02A0919E02B0919F022FBFE7 +:101B00002091B302222309F4FFC04091AF0250910B +:101B1000B0026091B1027091B2028C019D01041B70 +:101B2000150B260B370BB901A80140325E44610545 +:101B3000710508F4E9C08093AF029093B002A093BE +:101B4000B102B093B202C091AD02D091AE02CE010B +:101B50009927FC01EC57FE4FD490FC01EB59FE4F46 +:101B6000E491F0E0EE0FFF1FE95AFE4F059114914A +:101B70001092A8021092A9021092AA021092AB022F +:101B80001092AC0261E08C2F0E94280360E08C2F41 +:101B90000E94FA0262E170E080E090E00E947E0321 +:101BA00061E08C2F0E94FA02C7010197F1F760E013 +:101BB0008C2F0E94280380E991E0F80120812D21DB +:101BC00099F40197D1F74092A0025092A10260923D +:101BD000A2027092A3024092A4025092A5026092C7 +:101BE000A6027092A70264C080E991E0F80120810A +:101BF0002D2119F00197D1F7E6CF98E2392E20E890 +:101C0000C22E212C80E991E0F80120812D2119F4C8 +:101C10000197D1F7D8CF0E9459034B015C0180E9AD +:101C200091E0F80120812D2119F00197D1F7CBCF58 +:101C30000E945903681979098A099B09693271055B +:101C40008105910538F0E22DF0E0E056FD4F8085EA +:101C50008C298087C69419F4239480E8C82E3A947E +:101C60003110D0CF61E08C2F0E94280361E08C2FCF +:101C70000E94FA026091A80270E090E080E00E9469 +:101C8000D50E6093A0027093A1028093A20290935C +:101C9000A3026091AA0270E090E080E00E94D50E5D +:101CA0006093A4027093A5028093A6029093A7026A +:101CB000C3E0D0E08AE491E00E947E056091A40236 +:101CC0007091A5028091A6029091A70242E00E9425 +:101CD000DF050E94CF0584E891E00E947E056091B7 +:101CE000A0027091A1028091A2029091A30242E011 +:101CF0000E94DF050E94CF0564E670E080E090E07E +:101D00000E947E032197B1F680911601882311F17C +:101D10008090370390903803A0903903B0903A0335 +:101D200081149104A104B104A9F081149104D1F4A7 +:101D30008BEB91E00E947E0568EC70E080E090E023 +:101D40000E947E03109237031092380310923903D9 +:101D500010923A0300E010E0012B09F4C6CE0E9475 +:101D60000000C3CE8CEC91E00E947E054AE0C501E4 +:101D7000B4010E948B050E94CF05DECF80913B030A +:101D800090913C03009711F00C941B120895FB01F5 +:101D9000DC0102C005900D9241505040D8F70895E3 +:101DA0000E94120F08F481E00895E89409C097FB9F +:101DB0003EF490958095709561957F4F8F4F9F4F22 +:101DC0009923A9F0F92F96E9BB279395F695879566 +:101DD00077956795B795F111F8CFFAF4BB0F11F429 +:101DE00060FF1BC06F5F7F4F8F4F9F4F16C08823D0 +:101DF00011F096E911C0772321F09EE8872F762F06 +:101E000005C0662371F096E8862F70E060E02AF046 +:101E10009A95660F771F881FDAF7880F9695879532 +:101E200097F90895990F0008550FAA0BE0E8FEEF07 +:101E300016161706E807F907C0F012161306E4078E +:101E4000F50798F0621B730B840B950B39F40A2687 +:101E500061F0232B242B252B21F408950A2609F465 +:101E6000A140A6958FEF811D811D08950E94490F05 +:101E70000C94BA0F0E94AC0F38F00E94B30F20F000 +:101E8000952311F00C94A30F0C94A90F11240C941A +:101E9000EE0F0E94CB0F70F3959FC1F3950F50E0AA +:101EA000551F629FF001729FBB27F00DB11D639F0C +:101EB000AA27F00DB11DAA1F649F6627B00DA11DB2 +:101EC000661F829F2227B00DA11D621F739FB00D58 +:101ED000A11D621F839FA00D611D221F749F3327C8 +:101EE000A00D611D231F849F600D211D822F762F61 +:101EF0006A2F11249F5750409AF0F1F088234AF03E +:101F0000EE0FFF1FBB1F661F771F881F91505040A9 +:101F1000A9F79E3F510580F00C94A30F0C94EE0F8F +:101F20005F3FE4F3983ED4F3869577956795B79530 +:101F3000F795E7959F5FC1F7FE2B880F911D96954A +:101F4000879597F9089597F99F6780E870E060E0BA +:101F500008959FEF80EC089500240A941616170642 +:101F600018060906089500240A941216130614068A +:101F700005060895092E0394000C11F4882352F0ED +:101F8000BB0F40F4BF2B11F460FF04C06F5F7F4FA5 +:101F90008F4F9F4F089557FD9058440F551F59F08C +:101FA0005F3F71F04795880F97FB991F61F09F3F46 +:101FB00079F087950895121613061406551FF2CF6F +:101FC0004695F1DF08C0161617061806991FF1CFBF +:101FD00086957105610508940895E894BB276627E6 +:101FE0007727CB0197F908952F923F924F925F92F6 +:101FF0006F927F928F929F92AF92BF92CF92DF9219 +:10200000EF92FF920F931F93CF93DF93CDB7DEB77D +:10201000CA1BDB0B0FB6F894DEBF0FBECDBF099411 +:102020002A88398848885F846E847D848C849B8468 +:10203000AA84B984C884DF80EE80FD800C811B8176 +:10204000AA81B981CE0FD11D0FB6F894DEBF0FBEA5 +:10205000CDBFED010895A1E21A2EAA1BBB1BFD0105 +:102060000DC0AA1FBB1FEE1FFF1FA217B307E40777 +:10207000F50720F0A21BB30BE40BF50B661F771FCF +:10208000881F991F1A9469F76095709580959095AF +:102090009B01AC01BD01CF0108955058BB27AA2771 +:1020A0000E9465100C94BA0F0E94AC0F38F00E9489 +:1020B000B30F20F039F49F3F19F426F40C94A90FC4 +:1020C0000EF4E095E7FB0C94A30FE92F0E94CB0FD1 +:1020D00058F3BA17620773078407950720F079F45D +:1020E000A6F50C94ED0F0EF4E0950B2EBA2FA02D53 +:1020F0000B01B90190010C01CA01A0011124FF27B5 +:10210000591B99F0593F50F4503E68F11A16F040AF +:10211000A22F232F342F4427585FF3CF46953795AE +:102120002795A795F0405395C9F77EF41F16BA0B73 +:10213000620B730B840BBAF09150A1F0FF0FBB1F21 +:10214000661F771F881FC2F70EC0BA0F621F731F6A +:10215000841F48F4879577956795B795F7959E3FC7 +:1021600008F0B0CF9395880F08F09927EE0F979558 +:10217000879508950E94CE100C94BA0F0E94B30F59 +:1021800058F00E94AC0F40F029F45F3F29F00C9406 +:10219000A30F51110C94EE0F0C94A90F0E94CB0FBA +:1021A00068F39923B1F3552391F3951B550BBB2786 +:1021B000AA2762177307840738F09F5F5F4F220FCB +:1021C000331F441FAA1FA9F335D00E2E3AF0E0E8C2 +:1021D00032D091505040E695001CCAF72BD0FE2F0C +:1021E00029D0660F771F881FBB1F261737074807A0 +:1021F000AB07B0E809F0BB0B802DBF01FF27935858 +:102200005F4F3AF09E3F510578F00C94A30F0C9469 +:10221000EE0F5F3FE4F3983ED4F38695779567958C +:10222000B795F7959F5FC9F7880F911D969587958C +:1022300097F90895E1E0660F771F881FBB1F6217AB +:1022400073078407BA0720F0621B730B840BBA0B69 +:10225000EE1F88F7E09508950E94D30F88F09F57EE +:1022600098F0B92F9927B751B0F0E1F0660F771FBA +:10227000881F991F1AF0BA95C9F714C0B13091F0B0 +:102280000E94ED0FB1E008950C94ED0F672F782FA9 +:102290008827B85F39F0B93FCCF386957795679575 +:1022A000B395D9F73EF490958095709561957F4FE1 +:1022B0008F4F9F4F08950E94120F08F48FEF0895DB +:1022C0000E94120F880B990B0895AA1BBB1B51E1AA +:1022D00007C0AA1FBB1FA617B70710F0A61BB70B96 +:1022E000881F991F5A95A9F780959095BC01CD013B +:1022F0000895EE0FFF1F0590F491E02D09940F93C0 +:102300001F93CF93DF938230910510F482E090E029 +:10231000E0912A04F0912B0430E020E0B0E0A0E04E +:10232000309799F42115310509F44AC0281B390B5F +:1023300024303105D8F58A819B816115710589F1B9 +:10234000FB0193838283FE0111C040815181028190 +:10235000138148175907E0F04817590799F4109767 +:1023600061F012960C93129713961C933296CF013C +:10237000DF91CF911F910F91089500932A0410933C +:102380002B04F4CF2115310551F04217530738F0D3 +:10239000A901DB019A01BD01DF01F801C1CFEF0105 +:1023A000F9CF90932B0480932A04CDCFFE01E20F46 +:1023B000F31F819391932250310939832883D7CF1A +:1023C0002091280430912904232B41F420911B01F2 +:1023D00030911C0130932904209328042091190185 +:1023E00030911A012115310541F42DB73EB74091C6 +:1023F0001D0150911E01241B350BE0912804F09122 +:102400002904E217F307A0F42E1B3F0B2817390706 +:1024100078F0AC014E5F5F4F2417350748F04E0F40 +:102420005F1F5093290440932804819391939FCF79 +:10243000F0E0E0E09CCFCF93DF930097E9F0FC0160 +:10244000329713821282A0912A04B0912B04ED01DD +:1024500030E020E01097A1F420813181820F931F9A +:1024600020912804309129042817390709F061C008 +:10247000F0932904E0932804DF91CF910895EA01B5 +:10248000CE17DF07E8F54A815B819E0141155105B2 +:10249000B1F7E901FB83EA8349915991C40FD51F34 +:1024A000EC17FD0761F4808191810296840F951FDE +:1024B000E90199838883828193819B838A83F0E0F9 +:1024C000E0E012968D919C9113970097B9F52D91AC +:1024D0003C911197CD010296820F931F2091280401 +:1024E000309129042817390739F6309751F51092A1 +:1024F0002B0410922A04B0932904A0932804BCCF83 +:10250000D383C28340815181840F951FC817D90797 +:1025100061F44E5F5F4F88819981480F591F518345 +:1025200040838A819B81938382832115310509F041 +:10253000B0CFF0932B04E0932A049ECFFD01DC0181 +:10254000C0CF13821282D7CFB0E0A0E0EAEAF2E176 +:102550000C94F60F8C01009751F4CB010E947F116F +:102560008C01C801CDB7DEB7E0E10C941210FC017C +:10257000E60FF71F9C0122503109E217F30708F418 +:102580009DC0D901CD91DC911197C617D70798F05E +:10259000C530D10530F3CE0104978617970708F3AD +:1025A000C61BD70B2297C193D1936D937C93CF0118 +:1025B0000E941B12D6CF5B01AC1ABD0A4C018C0ED7 +:1025C0009D1EA0912A04B0912B04512C412CF12C7A +:1025D000E12C109731F580912804909129048815F9 +:1025E000990509F05CC04616570608F058C080915E +:1025F000190190911A01009741F48DB79EB740914F +:102600001D0150911E01841B950BE817F90708F076 +:1026100055C0F0932904E0932804F9017183608385 +:10262000A0CF8D919C91119712966C901297139652 +:102630007C901397A815B90559F56C0142E0C40EBA +:10264000D11CCA14DB0420F1AC014A195B09DA0180 +:102650001296159780F06282738251834083D9016C +:102660006D937C93E114F10471F0D7011396FC9300 +:10267000EE93129776CF22968C0F9D1FF9019183CE +:102680008083F301EFCFF0932B04E0932A0469CF0A +:102690004816590608F42C017D01D3019ACFCB01CD +:1026A0000E947F117C01009749F0AE01B8010E94A1 +:1026B0006113C8010E941B12870153CF10E000E094 +:1026C00050CFFB01DC0102C001900D9241505040FF +:1026D000D8F70895FB01DC0101900D920020E1F78D +:1026E000089510E0CEEED0E004C0FE010E94791102 +:0C26F0002196CF3ED107C9F7F894FFCF28 +:1026FC00FFFFFFFF00E1000000000000360436047D +:10270C00360436043604013C0000002C0480000022 +:10271C00C18081000000000000002D02B1034E02B8 +:10272C0043029402520270027D7D000D0A006E611C +:10273C006E00696E66006F7666007B2266756E634E +:10274C0074696F6E5F6E616D65223A226468745FA6 +:10275C0074656D7065726174757265222C2270617E +:10276C0072616D6574657273223A7B2276616C7549 +:10277C0065223A007B2266756E6374696F6E5F6EBC +:10278C00616D65223A226468745F68756D6964696D +:10279C007479222C22706172616D6574657273227A +:1027AC003A7B2276616C7565223A00556E6B6E6FC2 +:1027BC00776E20656E636F64696E67007B22667549 +:1027CC006E6374696F6E5F6E616D65223A2272651D +:1027DC0063765F343333222C22706172616D6574C1 +:1027EC00657273223A7B2276616C7565223A000021 +:00000001FF diff --git a/server/services/arduino/arduino-code/yun/arduino-code.ino.with_bootloader.hex b/server/services/arduino/arduino-code/yun/arduino-code.ino.with_bootloader.hex new file mode 100644 index 0000000000..d1ad7d61d9 --- /dev/null +++ b/server/services/arduino/arduino-code/yun/arduino-code.ino.with_bootloader.hex @@ -0,0 +1,898 @@ +:100000000C94EF000C94420A0C941B0A0C94F40913 +:100010000C94CD090C9417010C9417010C94A609AB +:100020000C9417010C9417010C94BB060C942A072E +:100030000C9417010C9417010C9417010C941701E0 +:100040000C9417010C94690A0C9417010C94170175 +:100050000C9417010C9417010C9417010C945C0973 +:100060000C9417010C9417010C9417010C941701B0 +:100070000C9417010C9417010C9417010C941701A0 +:100080000C9417010C9417010C9417010C94170190 +:100090000C9417010C9417010C9417010C94170180 +:1000A0000C9417010C94250B0C9417010000000010 +:1000B000240027002A002D00300000000000250049 +:1000C00028002B002E0031000000000200090F0064 +:1000D00000030401000C000000000000000000000C +:1000E00000000000000000080B00020202000009EE +:1000F0000400000102020000052400100105240193 +:1001000001010424020605240600010705810310ED +:10011000004009040100020A000000070502024035 +:1001200000000705830240000004030904120100D7 +:1001300002EF02014041234180000101020301411D +:10014000726475696E6F204C4C430041726475692E +:100150006E6F2059756E00000000002300260029F4 +:10016000002C002F0004040404040304050202020E +:100170000204030202020206060606060604040240 +:100180000202040404080201104080401020408054 +:1001900040800802040180402010020110801020DD +:1001A0004040205E01011F01030301008A02010A91 +:1001B000010202010064001E47040B0906007C01D5 +:1001C00001060103030100F401060E010202010011 +:1001D000C2011701010202010100020CBE0E11242E +:1001E0001FBECFEFDAE0DEBFCDBF12E0A0E0B1E08E +:1001F000ECEFF6E202C005900D92A030B107D9F7FE +:1002000024E0A0E0B2E001C01D92AC32B207E1F7F9 +:1002100010E0CEEED0E004C02197FE010E947911DB +:10022000CD3ED107C9F70E94AB0C0C9471130C940E +:100230000000FC018091C102882311F13FB7F894BE +:1002400082E08093E9002091F200822F90E018165E +:10025000190614F481E090E0882339F0289844E6E8 +:100260004093C0024091F1004083222339F0209155 +:10027000F200211103C02BE62093E8003FBF089550 +:100280008FEF9FEF08952FB7F89483E08093E900F4 +:100290009091E800892F807295FF04C09091F20040 +:1002A00080E4891B2FBF08958091B80281110DC091 +:1002B00082E08093B40284E08093B5021092B7028A +:1002C0001092B60281E08093B80284EB92E0089528 +:1002D000409196025091970220919402309195029C +:1002E00042175307B4F49091E8009570E1F39091B0 +:1002F000E80092FD19C08093F100809196029091E0 +:10030000970201968F739927892B19F48EEF8093AA +:10031000E80080919602909197020196909397023F +:100320008093960281E0089580E00895EF92FF9215 +:100330000F931F93CF93DF93F82E192FE62E042FE0 +:1003400081E0860F880F0E94680183E00E946801A7 +:10035000CF2DD12FEC0EFD2EF11CCE15DF05B9F0FF +:1003600007FF13C0FE0184910E946801182F80E0EE +:100370000E946801812321968111EFCFDF91CF91F7 +:100380001F910F91FF90EF9008958881EDCF81E04C +:10039000F5CFDF92EF92FF920F931F93CF93DF93EE +:1003A000D82E8A01EB017B01E40EF51ECE15DF0588 +:1003B00059F0D7FE12C0FE0184910E946801219677 +:1003C0008111F4CF0FEF1FEFC801DF91CF911F9183 +:1003D0000F91FF90EF90DF9008958881EECF0F93FB +:1003E0001F93CF93DF931F92CDB7DEB782E089834F +:1003F00042E450E067EE70E080E80E94C9010E948C +:100400005401DC0112960D911C910115110589F022 +:10041000D801ED91FC910280F381E02DBE016F5F68 +:100420007F4FC801099597FD04C0F801008511852B +:10043000ECCF89810F90DF91CF911F910F9108959B +:10044000615030F02091F100FC0120830196F8CF3B +:10045000289884E68093C0020895CF93DF931F927B +:10046000CDB7DEB76983DC01ED91FC910280F381A9 +:10047000E02D41E050E0BE016F5F7F4F09950F9086 +:10048000DF91CF91089583E08093E9008091F2009D +:10049000882319F08AE38093E80008950E944301BD +:1004A00090E00895CF93DF931F92CDB7DEB7FC01A4 +:1004B0008485958597FD08C02FEF3FEF358724870A +:1004C0000F90DF91CF910895CE0101960E941901FE +:1004D000019719F4898190E0F3CF8FEF9FEFF0CF70 +:1004E0000F931F93CF93DF931F92CDB7DEB78C018D +:1004F000FC018485958597FF0BC0CE0101960E9473 +:100500001901019771F4898190E0F801958784873A +:10051000F801848595850F90DF91CF911F910F9100 +:1005200008958FEF9FEFF1CFFC018485958597FDAE +:100530000BC09FB7F89482E08093E9008091F200AD +:100540009FBF90E0019608959FB7F89482E0809352 +:10055000E9008091F2009FBF90E0089581508F30B4 +:1005600008F047C0E82FF0E0E854FD4F0C947911F3 +:10057000D502D902C702CD02D102F902F902F9026D +:10058000DC02E202E602EA02F002F902F4028091E1 +:1005900080008F77809380000895809180008F7D08 +:1005A000F9CF80918000877FF5CF84B58F7784BDA8 +:1005B000089584B58F7DFBCF809190008F778093D5 +:1005C00090000895809190008F7DF9CF80919000E8 +:1005D000877FF5CF8091C0008F778093C00008950A +:1005E0008091C0008F7DF9CF8091C200877F80937A +:1005F000C20008951F93CF93DF93282F30E0F901B5 +:10060000E853FF4F8491F901EC57FE4FD491F90163 +:10061000EB59FE4FC491CC23A9F0162F81110E94F3 +:10062000AE02EC2FF0E0EE0FFF1FE654FF4FA59156 +:10063000B4918FB7F894EC91111108C0D095DE23D6 +:10064000DC938FBFDF91CF911F910895DE2BF8CF00 +:10065000CF93DF9390E0FC01EC57FE4F24918B5930 +:100660009E4FFC0184918823D1F090E0880F991F60 +:10067000FC01E455FF4FA591B491FC01E654FF4FF6 +:10068000C591D49161110EC09FB7F8948C91E22F5F +:10069000E0958E238C932881E223E8839FBFDF912E +:1006A000CF9108958FB7F894EC91E22BEC938FBF24 +:1006B000F6CF3FB7F8948091900290919102A0916B +:1006C0009202B091930226B5A89B05C02F3F19F066 +:1006D0000196A11DB11D3FBFBA2FA92F982F8827C2 +:1006E000BC01CD01620F711D811D911D42E0660F9D +:1006F000771F881F991F4A95D1F708958F929F926F +:10070000AF92BF92CF92DF92EF92FF926B017C018A +:100710000E9459034B015C01C114D104E104F104AE +:10072000B9F00E945903681979098A099B09683E42 +:1007300073408105910580F321E0C21AD108E108D8 +:10074000F10888EE880E83E0981EA11CB11CE4CF4E +:10075000FF90EF90DF90CF90BF90AF909F908F90E1 +:1007600008958F929F92AF92BF92CF92DF92EF92B5 +:10077000FF920F931F93CF93DF936C017B018A014C +:1007800080910B01882309F45CC08091C102882309 +:1007900009F457C080919A0280FF05C08091E00063 +:1007A00082608093E000E801B12C8AEFA82E93E0EC +:1007B000892E2AE3922E209711F4BB20D9F10E94B2 +:1007C000430181110AC0AA94AA20D9F161E070E026 +:1007D00080E090E00E947E03EECF8C171D0611F0A2 +:1007E0000CF08C2F9FB7F8948092E9002091E800DC +:1007F00025FD02C09FBFDFCF282F30E0C21BD30BE7 +:10080000F701815020F041914093F100FACFE20EC0 +:10081000F31EBB2021F09092E800B12CEBCF809129 +:10082000E80085FDE7CF9092E800BB24B3942097C1 +:1008300009F3F3CF5D9884E68093990210161106B0 +:100840003CF081E090E0F6019383828310E000E0C9 +:10085000C801DF91CF911F910F91FF90EF90DF9032 +:10086000CF90BF90AF909F908F90089508952F9252 +:100870003F924F925F926F927F928F929F92AF9230 +:10088000BF92CF92DF92EF92FF920F931F93CF937D +:10089000DF93CDB7DEB761970FB6F894DEBF0FBE1A +:1008A000CDBF0E9459036B017C0180918A02909117 +:1008B0008B023601681A790A2DEC621620E1720665 +:1008C00008F4D1C08091040290910502D301A81BC5 +:1008D000B90BCD01B7FF03C0919581959109883C73 +:1008E00091050CF0BCC08091020290910302019628 +:1008F0009093030280930202029709F0B0C003EACA +:1009000011E0409000025090010249E050E0B8012F +:10091000CE0101960E94C70E8B816C81681708F486 +:10092000682F70E080910402909105020E94651189 +:100930009B014091170150911801649FC001659F70 +:10094000900D749F900D112464E670E00E94651173 +:10095000898541E050E0882311F042E050E08D812C +:10096000829FF001839FF00D1124FB87EA878E811F +:10097000829FD001839FB00D1124BD87AC878F81EA +:10098000829FF001839FF00D1124FF87EE878885F9 +:10099000829F1001839F300C1124FA01EE0FFF1F7C +:1009A000EC5FFD4F812C912C5401920121503109B3 +:1009B000398B288B888999894817590708F03FC0D7 +:1009C000880C991CAA1CBB1C808191819C01AA8562 +:1009D000BB852A1B3B0B37FF03C03195219531099D +:1009E0002617370770F422813381AC85BD852A1B19 +:1009F0003B0B37FF03C03195219531092617370787 +:100A0000D0F02E853F85821B930B97FF03C09195F5 +:100A10008195910986179707B8F48281938182198D +:100A2000930997FF03C091958195910986179707C0 +:100A300058F4689480F84E5F5F4F3496BBCF38E02F +:100A40004316510408F051C0075F1F4F81E0093D74 +:100A5000180709F056CF109203021092020210926A +:100A600001021092000280910002909101028334F1 +:100A7000910540F0109201021092000210920302C0 +:100A80001092020280910002909101029C012F5F5E +:100A90003F4F3093010220930002880F991FFC0101 +:100AA000EC5FFD4F71826082C0928A02D0928B020D +:100AB000E0928C02F0928D0261960FB6F894DEBF40 +:100AC0000FBECDBFDF91CF911F910F91FF90EF909F +:100AD000DF90CF90BF90AF909F908F907F906F905E +:100AE0005F904F903F902F9008958092370390929F +:100AF0003803A0923903B0923A03ADCFFC010190C4 +:100B00000020E9F73197AF01481B590BBC0182EC7B +:100B100092E00C94B1038F929F92AF92BF920F9389 +:100B20001F93CF93DF93CDB7DEB7A1970FB6F8949D +:100B3000DEBF0FBECDBF19A2423008F44AE08E01DD +:100B40000F5D1F4F842E912CB12CA12CA501940177 +:100B50000E942B10E62FB901CA01EA30F4F4E05DDF +:100B6000D801EE938D01232B242B252B79F790E0D0 +:100B700080E0109719F0CD010E947E05A1960FB676 +:100B8000F894DEBF0FBECDBFDF91CF911F910F91C3 +:100B9000BF90AF909F908F900895E95CE1CFCF9385 +:100BA000DF9388E391E00E947E05EC018BE391E006 +:100BB0000E947E058C0F9D1FDF91CF9108954F926B +:100BC0005F926F927F928F929F92AF92BF92CF92DD +:100BD000DF92EF92FF920F931F93CF936B017C01F3 +:100BE000742EAC019B010E946011882399F08EE362 +:100BF00091E0CF911F910F91FF90EF90DF90CF90F8 +:100C0000BF90AF909F908F907F906F905F904F902C +:100C10000C947E0546015701E894B7F82FEF3FEF9B +:100C20004FE75FE7C501B4010E94601181110DC05B +:100C30002FEF3FEF4FE75FE7C501B4010E94D00EF1 +:100C400018161CF482E491E0D4CF2FEF3FEF4FE76A +:100C50005FE4C701B6010E945B1118161CF486E41C +:100C600091E0C7CF2FEF3FEF4FE75FECC701B60131 +:100C70000E94D00E87FDF3CF20E030E0A901C7012C +:100C8000B6010E94D00E10E000E087FF0AC06DE2BE +:100C900082EC92E00E942D028C01F7FAF094F7F8B2 +:100CA000F094C0E060E070E080E09FE37C1641F0EB +:100CB00020E030E040E251E40E94BA10CF5FF6CF6E +:100CC000A70196010E944E102B013C010E942C119D +:100CD0004B015C014AE00E948B057C01E00EF11E95 +:100CE000CC23C1F1C501B4010E94D50E9B01AC011A +:100CF000C301B2010E944D104B015C016EE282EC17 +:100D000092E00E942D02E80EF91EC15018F120E079 +:100D100030E040E251E4C501B4010E94360F2B01DE +:100D20003C010E942C114B01B12CA12C4AE0C501C1 +:100D3000B4010E948B05E80EF91EC501B4010E94A2 +:100D4000D50E9B01AC01C301B2010E944D104B01B5 +:100D50005C01DBCFC701CF911F910F91FF90EF9006 +:100D6000DF90CF90BF90AF909F908F907F906F90CB +:100D70005F904F9008951F920F920FB60F9211241B +:100D80008F939F938091E1009091E100937F9093E6 +:100D9000E10083FF0FC01092E90091E09093EB0017 +:100DA0001092EC0092E39093ED001092C10298E053 +:100DB0009093F00082FF22C093E09093E90090911D +:100DC000F200992319F09AE39093E8009091990228 +:100DD000992341F090919902915090939902911129 +:100DE00001C05D9A9091C002992341F09091C00298 +:100DF00091509093C002911101C0289A84FF18C0AD +:100E00008091E2008E7E81608093E2008091E1001B +:100E10008F7E8093E10080919A028E7E8061809324 +:100E20009A029F918F910F900FBE0F901F9018956F +:100E300080FFF7CF8091E2008E7E80618093E20098 +:100E40008091E1008E7E8093E10080919A028E7EF7 +:100E50008160E5CF1F920F920FB60F921124CF92AF +:100E6000DF92EF92FF920F931F932F933F934F9335 +:100E70005F936F937F938F939F93AF93BF93EF9302 +:100E8000FF93CF93DF93CDB7DEB76C97DEBFCDBFB7 +:100E90001092E9008091E80083FF25C068E0CE0150 +:100EA00045960E94200282EF8093E8008D8987FF9B +:100EB00039C09091E80090FFFCCF982F907609F010 +:100EC00034C19E894F89588D2F89F88C911131C07A +:100ED000803861F580919B028093F1001092F100BF +:100EE0008EEF8093E8006C960FB6F894DEBF0FBECD +:100EF000CDBFDF91CF91FF91EF91BF91AF919F91C6 +:100F00008F917F916F915F914F913F912F911F91A1 +:100F10000F91FF90EF90DF90CF900F900FBE0F904A +:100F20001F9018959EEF9093E800C7CF1092F100A4 +:100F3000D5CF913059F48111D3CF4130510581F68D +:100F400080919B028D7F80939B02CACF933049F49E +:100F50008111C6CF4130510519F680919B02826004 +:100F6000F2CF953041F48091E80080FFFCCF2068FB +:100F70002093E300B5CF963009F0A9C00B8D1C8DEE +:100F800022E01092E9001092970210929602F2125B +:100F90002EC010929502109294020E94EF011F82BF +:100FA00099E09983FA8291E09E8390EA98879AEF7C +:100FB00099872091960230919702275F3F4F3C839B +:100FC0002B838D831092E900109297021092960263 +:100FD000109395020093940249E050E0BE016F5FC8 +:100FE0007F4F80E00E94C9010E94EF0179CF1093EA +:100FF0009502009394020E945401DC0112960D9117 +:101000001C910115110509F451C1D801ED91FC9114 +:101010000480F581E02DBE016B5E7F4FC80109950C +:10102000009709F03EC1F80100851185EACFF3E091 +:10103000FF120EC08F89882309F440C0823061F40A +:1010400040E86BE08BE491E00E949601811148CF6B +:1010500081E28093EB0047CF813029F440E86BE0D8 +:101060008FE391E0F1CF833099F70E945401DC01C6 +:101070001296ED90FC908E010F5F1F4F6801E114F6 +:10108000F10479F0D701ED91FC910680F781E02D14 +:10109000B801C7010995080F111DF701E084F1841B +:1010A000EECFD8011C92F60101900020E9F73197AC +:1010B000BF016C197D0940E0C601C6CF69E271E04D +:1010C000FB01449150E080E80E94C90109CF9730AC +:1010D00009F4BECF983021F481E08093F10000CF75 +:1010E000993009F0FDCE837009F0B2CFE0E2F1E073 +:1010F00081E031E096E32191222371F08093E900B1 +:101100003093EB00DF0111972C912093EC0090932A +:10111000ED008F5F873079F78EE78093EA001092B9 +:10112000EA008F898093C102DBCE8B8D9C8D10925B +:10113000E900109297021092960290939502809384 +:101140009402898D811192C08E899D89913A49F4CA +:10115000813209F07DCF47E050E064E071E080E04B +:10116000B3CF913209F074CF833269F48F89988DAF +:10117000B0E0A0E08093000190930101A0930201F0 +:10118000B0930301ADCE803269F48091E80082FF14 +:10119000FCCF67E084E091E00E9420028BEF809317 +:1011A000E8009ECE823209F09BCE8F8980930B019E +:1011B000EEEFFFE7859194918B3F9C4D51F1E0E07C +:1011C000F8E08091040190910501A0910601B09191 +:1011D0000701803B9440A105B105F1F480910B011A +:1011E00080FD1AC0EE3F8AE0F80789F587E797E7A8 +:1011F00091838083809160008093980288E19BE0D6 +:101200000FB6F894A895809360000FBE909360008D +:1012100067CEEEEFFAE0D5CF80819181873797478F +:1012200009F05ECEA895809160008861809360008F +:101230008091980280936000EE3F2AE0F20789F0E7 +:101240008091FE0A9091FF0A9183808349CE80812C +:1012500091818737980751F29093FF0A8093FE0A95 +:10126000C5CF1092FF0A1092FE0A3ACE0E94540196 +:10127000DC0112960D911C910115110509F4E8CEBF +:10128000D801ED91FC910190F081E02DBE016B5EE3 +:101290007F4FC8010995811123CEF8010085118582 +:1012A000EBCF181619060CF41BCED2CEF1E0FF12CC +:1012B000BECE6DE271E004CF1F920F920FB60F9277 +:1012C00011242F933F938F939F93AF93BF9380915C +:1012D0009C0290919D02A0919E02B0919F0230913C +:1012E0008F0223E0230F2D3758F50196A11DB11D64 +:1012F00020938F0280939C0290939D02A0939E0264 +:10130000B0939F028091900290919102A0919202DD +:10131000B09193020196A11DB11D8093900290930C +:101320009102A0939202B0939302BF91AF919F91CB +:101330008F913F912F910F900FBE0F901F90189596 +:1013400026E8230F0296A11DB11DD2CF1F920F9246 +:101350000FB60F9211242F933F934F935F936F9388 +:101360007F938F939F93AF93BF93EF93FF93E091FE +:101370001401F09115010995FF91EF91BF91AF9183 +:101380009F918F917F916F915F914F913F912F919D +:101390000F900FBE0F901F9018951F920F920FB6CF +:1013A0000F9211242F933F934F935F936F937F93EB +:1013B0008F939F93AF93BF93EF93FF93E0911201AD +:1013C000F09113010995FF91EF91BF91AF919F911A +:1013D0008F917F916F915F914F913F912F910F90DE +:1013E0000FBE0F901F9018951F920F920FB60F927D +:1013F00011242F933F934F935F936F937F938F931A +:101400009F93AF93BF93EF93FF93E0911001F091FF +:1014100011010995FF91EF91BF91AF919F918F912C +:101420007F916F915F914F913F912F910F900FBEE0 +:101430000F901F9018951F920F920FB60F921124C4 +:101440002F933F934F935F936F937F938F939F93CC +:10145000AF93BF93EF93FF93E0910E01F0910F01D3 +:101460000995FF91EF91BF91AF919F918F917F91DE +:101470006F915F914F913F912F910F900FBE0F9001 +:101480001F9018951F920F920FB60F9211242F9351 +:101490003F934F935F936F937F938F939F93AF93FC +:1014A000BF93EF93FF93E0910C01F0910D0109952B +:1014B000FF91EF91BF91AF919F918F917F916F912C +:1014C0005F914F913F912F910F900FBE0F901F9002 +:1014D00018951F920F920FB60F9211242F933F93DE +:1014E0004F935F936F937F938F939F93AF93BF932C +:1014F000CF93DF93EF93FF9380918E02C0913603D9 +:10150000D0E087FF24C01092850010928400809163 +:101510008E028F5F80938E0280918E02082E000CC7 +:10152000990B8C179D0724F480918E028C30C4F1A6 +:101530008091840090918500049680349C4908F441 +:101540007AC08091840090918500049676C0809145 +:101550008E02082E000C990B8C179D07C4F6E091A3 +:101560008E028E2FEE0F990BFC01EE0FFF1FE80F7E +:10157000F91FEE5EFC4F808186FFC9CFE0918E029D +:101580008E2FEE0F990BFC01EE0FFF1FE80FF91FD6 +:10159000EE5EFC4F808160E08F730E94FA02B7CF4D +:1015A0002091840030918500E0918E028E2FEE0F05 +:1015B000990BFC01EE0FFF1FE80FF91FEE5EFC4FC9 +:1015C00081819281820F931F90938900809388007C +:1015D000E0918E028E2FEE0F990BFC01EE0FFF1F94 +:1015E000E80FF91FEE5EFC4F808186FF11C0E0918D +:1015F0008E028E2FEE0F990BFC01EE0FFF1FE80FEE +:10160000F91FEE5EFC4F808161E08F730E94FA0249 +:10161000FF91EF91DF91CF91BF91AF919F918F910A +:101620007F916F915F914F913F912F910F900FBEDE +:101630000F901F90189580E49CE990938900809307 +:1016400088008FEF80938E02E3CF1F920F920FB628 +:101650000F9211242F933F934F935F936F937F9338 +:101660008F939F93AF93BF93CF93DF93EF93FF93AA +:101670002091540330E0F901E853FF4F8491F901C0 +:10168000EC57FE4FD491F901EB59FE4FC491CC2396 +:1016900079F081110E94AE02EC2FF0E0EE0FFF1FF7 +:1016A000E95AFE4FA591B491EC91ED2381E009F444 +:1016B00080E020915803309159032F5F3F4F3093C2 +:1016C00059032093580390915703953618F096E0EC +:1016D0009093530390915303943009F466C0B8F487 +:1016E0009230F1F0933009F444C09091560399235D +:1016F00009F46BC081117CC080915503882309F4E3 +:1017000063C08091550361E00E94FA025EC095308B +:1017100009F457C0963049F791E0909324044FC0E4 +:101720008111E3CF209158033091590324363105BC +:1017300028F41092590310925803D7CF1092240422 +:1017400010925703E091570391E09E0F9093570337 +:10175000F0E02091580330915903EE0FFF1FED5A2E +:10176000FC4F30872783109259031092580393E05F +:1017700019C0813009F0B9CFE091570391E09E0F75 +:1017800090935703F0E02091580330915903EE0FE6 +:10179000FF1FED5AFC4F3087278310925903109298 +:1017A000580394E090935303A0CF882359F22091DB +:1017B0005803309159032536310508F496CF95E04A +:1017C000F1CF811192CFB5CF2D9AFF91EF91DF919B +:1017D000CF91BF91AF919F918F917F916F915F91C9 +:1017E0004F913F912F910F900FBE0F901F90189522 +:1017F00080915503882321F08091550360E084CFC8 +:101800002D98E3CFCF93DF931092C5021092C402BC +:1018100088EE93E0A0E0B0E08093C6029093C70208 +:10182000A093C802B093C9028AE291E09093C302E8 +:101830008093C202CFEFDFEFD093CF02C093CE02EE +:1018400083E080932504D0934703C09346038AE046 +:1018500090E0909349038093480349E050E063EAA5 +:1018600071E08AE493E00E94C70ED0934503C093D1 +:1018700044038CE390E09093180180931701109239 +:101880003703109238031092390310923A03809173 +:1018900036038C3008F044C091E0980F90933603E3 +:1018A0008093410390E0FC01EE0FFF1FE80FF91F4A +:1018B000EE5EFC4F88EB9BE09283818310923C03A9 +:1018C00010923B0310923E0310923D03109240038E +:1018D00010923F0361E070E090E080E00E94A4126B +:1018E000009711F190933C0380933B0310923E03C9 +:1018F00010923D0320913F0330914003232B11F4BC +:10190000FC0110821092400310923F036DE371E0DE +:1019100080913B0390913C03DF91CF910C946A132B +:101920008FEF80934103CACF80913B0390913C039A +:10193000009711F00E941B1210923C0310923B037F +:101940001092400310923F0310923E0310923D0309 +:10195000DF91CF910895789484B5826084BD84B579 +:10196000816084BD85B5826085BD85B5816085BD9A +:1019700080916E00816080936E0010928100809152 +:1019800081008260809381008091810081608093DA +:10199000810080918000816080938000809191001F +:1019A000826080939100809191008160809391008A +:1019B000809190008160809390008091C10084604C +:1019C0008093C1008091C10082608093C1008091AA +:1019D000C10081608093C1008091C30081608093C9 +:1019E000C3008091C00082608093C0008091C200DB +:1019F00081608093C20080917A00846080937A0035 +:101A000080917A00826080937A0080917A00816070 +:101A100080937A0080917A00806880937A00109297 +:101A2000C10210929B0210929A028091D7008160AD +:101A30008093D70080EA8093D80089B5806189BD02 +:101A400089B5826089BD09B400FEFDCF61E070E018 +:101A500080E090E00E947E038091D8008F7C8061BE +:101A60008093D8008091E000807F8093E000809197 +:101A7000E1008E7E8093E1008DE08093E200559A34 +:101A8000209A8FEF9FEF9093CF028093CE02109217 +:101A900045031092440310923703109238031092BA +:101AA000390310923A0387E394E090930D018093F9 +:101AB0000C01809169008C7F816080936900E89AB5 +:101AC00081E0809316018093B30288E090E09093C8 +:101AD000AE028093AD024BE9E42EF12C412C50EC88 +:101AE000552E59E7652E54EC752E2FB7F89480913A +:101AF0009C0290919D02A0919E02B0919F022FBFE7 +:101B00002091B302222309F4FFC04091AF0250910B +:101B1000B0026091B1027091B2028C019D01041B70 +:101B2000150B260B370BB901A80140325E44610545 +:101B3000710508F4E9C08093AF029093B002A093BE +:101B4000B102B093B202C091AD02D091AE02CE010B +:101B50009927FC01EC57FE4FD490FC01EB59FE4F46 +:101B6000E491F0E0EE0FFF1FE95AFE4F059114914A +:101B70001092A8021092A9021092AA021092AB022F +:101B80001092AC0261E08C2F0E94280360E08C2F41 +:101B90000E94FA0262E170E080E090E00E947E0321 +:101BA00061E08C2F0E94FA02C7010197F1F760E013 +:101BB0008C2F0E94280380E991E0F80120812D21DB +:101BC00099F40197D1F74092A0025092A10260923D +:101BD000A2027092A3024092A4025092A5026092C7 +:101BE000A6027092A70264C080E991E0F80120810A +:101BF0002D2119F00197D1F7E6CF98E2392E20E890 +:101C0000C22E212C80E991E0F80120812D2119F4C8 +:101C10000197D1F7D8CF0E9459034B015C0180E9AD +:101C200091E0F80120812D2119F00197D1F7CBCF58 +:101C30000E945903681979098A099B09693271055B +:101C40008105910538F0E22DF0E0E056FD4F8085EA +:101C50008C298087C69419F4239480E8C82E3A947E +:101C60003110D0CF61E08C2F0E94280361E08C2FCF +:101C70000E94FA026091A80270E090E080E00E9469 +:101C8000D50E6093A0027093A1028093A20290935C +:101C9000A3026091AA0270E090E080E00E94D50E5D +:101CA0006093A4027093A5028093A6029093A7026A +:101CB000C3E0D0E08AE491E00E947E056091A40236 +:101CC0007091A5028091A6029091A70242E00E9425 +:101CD000DF050E94CF0584E891E00E947E056091B7 +:101CE000A0027091A1028091A2029091A30242E011 +:101CF0000E94DF050E94CF0564E670E080E090E07E +:101D00000E947E032197B1F680911601882311F17C +:101D10008090370390903803A0903903B0903A0335 +:101D200081149104A104B104A9F081149104D1F4A7 +:101D30008BEB91E00E947E0568EC70E080E090E023 +:101D40000E947E03109237031092380310923903D9 +:101D500010923A0300E010E0012B09F4C6CE0E9475 +:101D60000000C3CE8CEC91E00E947E054AE0C501E4 +:101D7000B4010E948B050E94CF05DECF80913B030A +:101D800090913C03009711F00C941B120895FB01F5 +:101D9000DC0102C005900D9241505040D8F70895E3 +:101DA0000E94120F08F481E00895E89409C097FB9F +:101DB0003EF490958095709561957F4F8F4F9F4F22 +:101DC0009923A9F0F92F96E9BB279395F695879566 +:101DD00077956795B795F111F8CFFAF4BB0F11F429 +:101DE00060FF1BC06F5F7F4F8F4F9F4F16C08823D0 +:101DF00011F096E911C0772321F09EE8872F762F06 +:101E000005C0662371F096E8862F70E060E02AF046 +:101E10009A95660F771F881FDAF7880F9695879532 +:101E200097F90895990F0008550FAA0BE0E8FEEF07 +:101E300016161706E807F907C0F012161306E4078E +:101E4000F50798F0621B730B840B950B39F40A2687 +:101E500061F0232B242B252B21F408950A2609F465 +:101E6000A140A6958FEF811D811D08950E94490F05 +:101E70000C94BA0F0E94AC0F38F00E94B30F20F000 +:101E8000952311F00C94A30F0C94A90F11240C941A +:101E9000EE0F0E94CB0F70F3959FC1F3950F50E0AA +:101EA000551F629FF001729FBB27F00DB11D639F0C +:101EB000AA27F00DB11DAA1F649F6627B00DA11DB2 +:101EC000661F829F2227B00DA11D621F739FB00D58 +:101ED000A11D621F839FA00D611D221F749F3327C8 +:101EE000A00D611D231F849F600D211D822F762F61 +:101EF0006A2F11249F5750409AF0F1F088234AF03E +:101F0000EE0FFF1FBB1F661F771F881F91505040A9 +:101F1000A9F79E3F510580F00C94A30F0C94EE0F8F +:101F20005F3FE4F3983ED4F3869577956795B79530 +:101F3000F795E7959F5FC1F7FE2B880F911D96954A +:101F4000879597F9089597F99F6780E870E060E0BA +:101F500008959FEF80EC089500240A941616170642 +:101F600018060906089500240A941216130614068A +:101F700005060895092E0394000C11F4882352F0ED +:101F8000BB0F40F4BF2B11F460FF04C06F5F7F4FA5 +:101F90008F4F9F4F089557FD9058440F551F59F08C +:101FA0005F3F71F04795880F97FB991F61F09F3F46 +:101FB00079F087950895121613061406551FF2CF6F +:101FC0004695F1DF08C0161617061806991FF1CFBF +:101FD00086957105610508940895E894BB276627E6 +:101FE0007727CB0197F908952F923F924F925F92F6 +:101FF0006F927F928F929F92AF92BF92CF92DF9219 +:10200000EF92FF920F931F93CF93DF93CDB7DEB77D +:10201000CA1BDB0B0FB6F894DEBF0FBECDBF099411 +:102020002A88398848885F846E847D848C849B8468 +:10203000AA84B984C884DF80EE80FD800C811B8176 +:10204000AA81B981CE0FD11D0FB6F894DEBF0FBEA5 +:10205000CDBFED010895A1E21A2EAA1BBB1BFD0105 +:102060000DC0AA1FBB1FEE1FFF1FA217B307E40777 +:10207000F50720F0A21BB30BE40BF50B661F771FCF +:10208000881F991F1A9469F76095709580959095AF +:102090009B01AC01BD01CF0108955058BB27AA2771 +:1020A0000E9465100C94BA0F0E94AC0F38F00E9489 +:1020B000B30F20F039F49F3F19F426F40C94A90FC4 +:1020C0000EF4E095E7FB0C94A30FE92F0E94CB0FD1 +:1020D00058F3BA17620773078407950720F079F45D +:1020E000A6F50C94ED0F0EF4E0950B2EBA2FA02D53 +:1020F0000B01B90190010C01CA01A0011124FF27B5 +:10210000591B99F0593F50F4503E68F11A16F040AF +:10211000A22F232F342F4427585FF3CF46953795AE +:102120002795A795F0405395C9F77EF41F16BA0B73 +:10213000620B730B840BBAF09150A1F0FF0FBB1F21 +:10214000661F771F881FC2F70EC0BA0F621F731F6A +:10215000841F48F4879577956795B795F7959E3FC7 +:1021600008F0B0CF9395880F08F09927EE0F979558 +:10217000879508950E94CE100C94BA0F0E94B30F59 +:1021800058F00E94AC0F40F029F45F3F29F00C9406 +:10219000A30F51110C94EE0F0C94A90F0E94CB0FBA +:1021A00068F39923B1F3552391F3951B550BBB2786 +:1021B000AA2762177307840738F09F5F5F4F220FCB +:1021C000331F441FAA1FA9F335D00E2E3AF0E0E8C2 +:1021D00032D091505040E695001CCAF72BD0FE2F0C +:1021E00029D0660F771F881FBB1F261737074807A0 +:1021F000AB07B0E809F0BB0B802DBF01FF27935858 +:102200005F4F3AF09E3F510578F00C94A30F0C9469 +:10221000EE0F5F3FE4F3983ED4F38695779567958C +:10222000B795F7959F5FC9F7880F911D969587958C +:1022300097F90895E1E0660F771F881FBB1F6217AB +:1022400073078407BA0720F0621B730B840BBA0B69 +:10225000EE1F88F7E09508950E94D30F88F09F57EE +:1022600098F0B92F9927B751B0F0E1F0660F771FBA +:10227000881F991F1AF0BA95C9F714C0B13091F0B0 +:102280000E94ED0FB1E008950C94ED0F672F782FA9 +:102290008827B85F39F0B93FCCF386957795679575 +:1022A000B395D9F73EF490958095709561957F4FE1 +:1022B0008F4F9F4F08950E94120F08F48FEF0895DB +:1022C0000E94120F880B990B0895AA1BBB1B51E1AA +:1022D00007C0AA1FBB1FA617B70710F0A61BB70B96 +:1022E000881F991F5A95A9F780959095BC01CD013B +:1022F0000895EE0FFF1F0590F491E02D09940F93C0 +:102300001F93CF93DF938230910510F482E090E029 +:10231000E0912A04F0912B0430E020E0B0E0A0E04E +:10232000309799F42115310509F44AC0281B390B5F +:1023300024303105D8F58A819B816115710589F1B9 +:10234000FB0193838283FE0111C040815181028190 +:10235000138148175907E0F04817590799F4109767 +:1023600061F012960C93129713961C933296CF013C +:10237000DF91CF911F910F91089500932A0410933C +:102380002B04F4CF2115310551F04217530738F0D3 +:10239000A901DB019A01BD01DF01F801C1CFEF0105 +:1023A000F9CF90932B0480932A04CDCFFE01E20F46 +:1023B000F31F819391932250310939832883D7CF1A +:1023C0002091280430912904232B41F420911B01F2 +:1023D00030911C0130932904209328042091190185 +:1023E00030911A012115310541F42DB73EB74091C6 +:1023F0001D0150911E01241B350BE0912804F09122 +:102400002904E217F307A0F42E1B3F0B2817390706 +:1024100078F0AC014E5F5F4F2417350748F04E0F40 +:102420005F1F5093290440932804819391939FCF79 +:10243000F0E0E0E09CCFCF93DF930097E9F0FC0160 +:10244000329713821282A0912A04B0912B04ED01DD +:1024500030E020E01097A1F420813181820F931F9A +:1024600020912804309129042817390709F061C008 +:10247000F0932904E0932804DF91CF910895EA01B5 +:10248000CE17DF07E8F54A815B819E0141155105B2 +:10249000B1F7E901FB83EA8349915991C40FD51F34 +:1024A000EC17FD0761F4808191810296840F951FDE +:1024B000E90199838883828193819B838A83F0E0F9 +:1024C000E0E012968D919C9113970097B9F52D91AC +:1024D0003C911197CD010296820F931F2091280401 +:1024E000309129042817390739F6309751F51092A1 +:1024F0002B0410922A04B0932904A0932804BCCF83 +:10250000D383C28340815181840F951FC817D90797 +:1025100061F44E5F5F4F88819981480F591F518345 +:1025200040838A819B81938382832115310509F041 +:10253000B0CFF0932B04E0932A049ECFFD01DC0181 +:10254000C0CF13821282D7CFB0E0A0E0EAEAF2E176 +:102550000C94F60F8C01009751F4CB010E947F116F +:102560008C01C801CDB7DEB7E0E10C941210FC017C +:10257000E60FF71F9C0122503109E217F30708F418 +:102580009DC0D901CD91DC911197C617D70798F05E +:10259000C530D10530F3CE0104978617970708F3AD +:1025A000C61BD70B2297C193D1936D937C93CF0118 +:1025B0000E941B12D6CF5B01AC1ABD0A4C018C0ED7 +:1025C0009D1EA0912A04B0912B04512C412CF12C7A +:1025D000E12C109731F580912804909129048815F9 +:1025E000990509F05CC04616570608F058C080915E +:1025F000190190911A01009741F48DB79EB740914F +:102600001D0150911E01841B950BE817F90708F076 +:1026100055C0F0932904E0932804F9017183608385 +:10262000A0CF8D919C91119712966C901297139652 +:102630007C901397A815B90559F56C0142E0C40EBA +:10264000D11CCA14DB0420F1AC014A195B09DA0180 +:102650001296159780F06282738251834083D9016C +:102660006D937C93E114F10471F0D7011396FC9300 +:10267000EE93129776CF22968C0F9D1FF9019183CE +:102680008083F301EFCFF0932B04E0932A0469CF0A +:102690004816590608F42C017D01D3019ACFCB01CD +:1026A0000E947F117C01009749F0AE01B8010E94A1 +:1026B0006113C8010E941B12870153CF10E000E094 +:1026C00050CFFB01DC0102C001900D9241505040FF +:1026D000D8F70895FB01DC0101900D920020E1F78D +:1026E000089510E0CEEED0E004C0FE010E94791102 +:0C26F0002196CF3ED107C9F7F894FFCF28 +:1026FC00FFFFFFFF00E1000000000000360436047D +:10270C00360436043604013C0000002C0480000022 +:10271C00C18081000000000000002D02B1034E02B8 +:10272C0043029402520270027D7D000D0A006E611C +:10273C006E00696E66006F7666007B2266756E634E +:10274C0074696F6E5F6E616D65223A226468745FA6 +:10275C0074656D7065726174757265222C2270617E +:10276C0072616D6574657273223A7B2276616C7549 +:10277C0065223A007B2266756E6374696F6E5F6EBC +:10278C00616D65223A226468745F68756D6964696D +:10279C007479222C22706172616D6574657273227A +:1027AC003A7B2276616C7565223A00556E6B6E6FC2 +:1027BC00776E20656E636F64696E67007B22667549 +:1027CC006E6374696F6E5F6E616D65223A2272651D +:1027DC0063765F343333222C22706172616D6574C1 +:1027EC00657273223A7B2276616C7565223A000021 +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000FCC400005AC0000048 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C000005DC000004CC000004AC00000FD +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 +:1070C000FFE702C005900D92A63AB107D9F711E08B +:1070D000A6EAB1E001C01D92AF3BB107E1F74FD383 +:1070E00030C78ECFF89410926F001092810081E02B +:1070F00085BF15BE47985D9A289A0C9400000895A4 +:107100001F920F920FB60F9211242F938F939F937C +:10711000EF93FF9310928500109284008091A60156 +:107120009091A701009741F001979093A701809358 +:10713000A601892B09F45D9A8091A8019091A9017B +:10714000009741F001979093A9018093A801892BA2 +:1071500009F4289A8091AC019091AD010196909329 +:10716000AD018093AC01E0E0F0E0859194918F5FF8 +:107170009F4F49F08091AA019091AB0101969093A5 +:10718000AB018093AA01FF91EF919F918F912F9175 +:107190000F900FBE0F901F90189584E08093E90028 +:1071A0000DC08091E8008B778093E80003C08EB318 +:1071B000882351F08091E80082FFF9CF8091E800A8 +:1071C00085FFEFCF8091F1000895982F83E08093A1 +:1071D000E9008091E80085FD0DC08091E8008E7780 +:1071E0008093E80003C08EB3882369F08091E800A3 +:1071F00080FFF9CF9093F1005D9884E690E0909342 +:10720000A7018093A60108954F925F926F927F929B +:107210008F929F92AF92BF92CF92DF92EF92FF92A6 +:107220000F931F93CF93DF9384E08093E9008091C5 +:10723000E80082FF57C2289884E690E09093A90165 +:107240008093A801AADF182F853481F48CE49DE196 +:107250009093AB018093AA0107B600FCFDCFF9998A +:10726000FECF81E180935700E89503C0843519F47F +:1072700094DF8DE00DC28C34E1F38035D1F3843797 +:1072800021F484E4A2DF80E003C2813611F489E5B1 +:10729000FFC18134B1F481DF182F7FDF90E0880FC8 +:1072A000991FAA2797FDA095BA2F312F330F20E001 +:1072B000442737FD4095542F822B932BA42BB52BBD +:1072C000B8C1803711F483E5E3C1833549F4C0E0E8 +:1072D000D1E089917ADF21E0C730D207D1F7D9C157 +:1072E000863521F481E371DF80E3D2C1833731F445 +:1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD +:10730000E0E0F0E093E085E090935700E89507B661 +:1073100000FCFDCF80935700E89507B600FCFDCF39 +:10732000E058FF4FA0E7E030FA0771F7A2CF8237AD +:1073300039F4E1E0F0E089E0809357008491A8C13E +:10734000863439F4E0E0F0E089E0809357008491DE +:107350009FC18E3439F4E3E0F0E089E08093570078 +:10736000849196C1813539F4E2E0F0E089E08093C0 +:10737000570084918DC1823631F489E526DF80E0A3 +:1073800024DF80E885C1823419F0873609F0E5C032 +:107390001092AB011092AA0100DF082FFEDEF82E3A +:1073A000FCDE682E8554823008F071C1902F80E099 +:1073B000CF2DD0E0C82BD92B10926F00173609F0D3 +:1073C0004BC081E180935700E895DD24CC24C39421 +:1073D0003FC0E090AF01F090B0010091B101109179 +:1073E000B201B6E46B16D9F4ED2DF0E0EE29FF29D9 +:1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 +:10740000B0E0E80EF91E0A1F1B1FE092AF01F092D8 +:10741000B0010093B1011093B201DC2418C0D8016F +:10742000C701B695A7959795879575D5CEDE82E06D +:1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA +:10744000AF01F092B0010093B1011093B201219706 +:10745000209709F0BECF7DC08090AF019090B00121 +:10746000A090B101B090B20196E4691609F05DC038 +:1074700083E0F40180935700E89507B600FCFDCF48 +:1074800054C0F6E46F1661F5772031F1E090AF015A +:10749000F090B0010091B1011091B2017EDED82EC2 +:1074A000CC24852D90E08C299D29F7010C01409278 +:1074B0005700E895112482E090E0A0E0B0E0E80EEB +:1074C000F91E0A1F1B1FE092AF01F092B00100935A +:1074D000B1011093B20102C060DE582E742423C0A3 +:1074E000E090AF01F090B0010091B1011091B201B4 +:1074F00016950795F794E79450DE682FC70113D5CA +:107500008091AF019091B001A091B101B091B20111 +:107510000296A11DB11D8093AF019093B001A0937D +:10752000B101B093B201219704C0552477244424BB +:107530004394209709F0A5CF96E4691641F485E0BD +:10754000F40180935700E89507B600FCFDCF8DE06D +:107550003CDE82E080936F009CC0833471F4009124 +:10756000AF011091B00119DE90E021E0F8010C01AB +:1075700020935700E89511247CCE833619F5E090CE +:10758000AF01F090B0010091B1011091B20105DEA0 +:10759000F701E16090E021E00C0120935700E895AD +:1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E +:1075B0001B1FE092AF01F092B0010093B101109354 +:1075C000B20157CE8D3661F4E091AF01F091B00178 +:1075D00085E080935700E89507B600FCFDCF49CEC3 +:1075E000823551F4E091AF01F091B0010591149111 +:1075F000812FEBDD802F4CC0843421F5E090AF016A +:10760000F090B0010091B1011091B201169507956B +:10761000F794E794C2DD682FC70185D48091AF014C +:107620009091B001A091B101B091B2010296A11D5B +:10763000B11D8093AF019093B001A093B101B093BD +:10764000B20117CE843609F5E090AF01F090B00199 +:107650000091B1011091B201D801C701B695A7956B +:107660009795879558D4B1DD82E090E0A0E0B0E036 +:10767000E80EF91E0A1F1B1FE092AF01F092B00145 +:107680000093B1011093B20104C08B3111F08FE36C +:107690009CDD83E08093E9009091E8008091E80010 +:1076A0008E778093E80095FF04C010C08EB38823C6 +:1076B000C9F08091E80080FFF9CF8091E8008E77D3 +:1076C0008093E80003C08EB3882361F08091E800C6 +:1076D00080FFF9CF84E08093E9008091E8008B7708 +:1076E0008093E800DF91CF911F910F91FF90EF9071 +:1076F000DF90CF90BF90AF909F908F907F906F90D2 +:107700005F904F9008959091B701892F8F778132C4 +:1077100049F58091B8018032A1F0813219F5913A92 +:1077200009F58091E800877F8093E8008CE091E084 +:1077300067E070E027D28091E8008B778093E800C3 +:107740000895913279F48091E800877F8093E80072 +:107750008CE091E067E070E079D28091E8008E776C +:107760008093E800089582E061EC42E0D1D083E0AC +:1077700061E842E1CDD084E060E842E1C9C01F93F6 +:10778000209100081092000844B714BE88E10FB69B +:10779000F89480936000109260000FBE80E8E0E0F3 +:1077A000F0E00FB6F89480936100E09361000FBEA3 +:1077B00031E035BF92E095BF3F9A209A559A809369 +:1077C00061001092610047985D9A289A1092890092 +:1077D0008AEF8093880090936F0083E0809381000C +:1077E000859194918F5F9F4F11F03093AE01942F4C +:1077F00041FF19C0809109012817A9F08093000862 +:10780000789480911301882339F08091AC01909194 +:10781000AD018F5E9240C8F310920008F89481E0A9 +:10782000809313010CC090FF04C08091AE018823A7 +:1078300051F493FF09C080910901281729F0809124 +:10784000AE01882309F04EDCD4D078941092AB01BD +:107850001092AA011EEF20C0D7DC4BD38091AA0161 +:107860009091AB0181549F4110F0109213018091CF +:10787000B3019091B40101969093B4018093B30148 +:10788000292F97FF03C0512F591B252F220F28178F +:1078900010F4479801C0479A809113018823E1F6BC +:1078A0008091E00081608093E0001CDC80E090E04B +:1078B0001F910895FA01923049F0933061F09130B0 +:1078C000F9F484E191E022E130E01EC086E291E02B +:1078D0002EE330E019C0882329F484E691E024E007 +:1078E00030E012C0813029F488E691E022E230E0F5 +:1078F0000BC0823029F48CE891E028E130E004C02C +:1079000080E090E020E030E091838083C901089519 +:107910008093E9008091EB0081608093EB001092EE +:10792000ED006093EC004093ED008091EE00881F25 +:107930008827881F08958091B70188238CF403C09D +:107940008EB38823B1F08091E80082FFF9CF809157 +:10795000E8008B778093E80008958EB3882349F080 +:107960008091E80080FFF9CF8091E8008E778093C6 +:10797000E8000895EF92FF920F931F9345D04CD0EB +:1079800008ED10E0F80180818F7780838081806826 +:10799000808380818F7D808319BC1EBA1092B501CF +:1079A00080EEE82EF12CF70180818B7F8083F80137 +:1079B00080818160808380E060E042E0A9DFE1EEC9 +:1079C000F0E080818E7F8083E2EEF0E08081816054 +:1079D0008083808188608083F70180818E7F8083AF +:1079E000F8018081806180831F910F91FF90EF905B +:1079F0000895E7EDF0E08081816080838AE482BFB2 +:107A000081E08093B601B6CFE8EDF0E080818E7F13 +:107A100080831092E20008951092DA001092E10043 +:107A200008951F920F920FB60F9211242F933F9338 +:107A30004F935F936F937F938F939F93AF93BF9376 +:107A4000EF93FF938091DA0080FF1BC08091D800F4 +:107A500080FF17C08091DA008E7F8093DA008091DA +:107A6000D90080FF0BC080E189BD82E189BD09B4E6 +:107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 +:107A800037D28091E10080FF17C08091E20080FF33 +:107A900013C08091E2008E7F8093E2008091E2002B +:107AA00080618093E2008091D80080628093D8004A +:107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 +:107AC0008091E20084FF28C080E189BD82E189BD08 +:107AD00009B400FEFDCF8091D8008F7D8093D8003F +:107AE0008091E1008F7E8093E1008091E2008F7EA3 +:107AF0008093E2008091E20081608093E2008091B7 +:107B0000B501882331F48091E30087FD02C081E054 +:107B100001C084E08EBBECD18091E10083FF21C0E5 +:107B20008091E20083FF1DC08091E100877F8093F8 +:107B3000E10082E08EBB1092B5018091E1008E7F62 +:107B40008093E1008091E2008E7F8093E20080913B +:107B5000E20080618093E20080E060E042E0D8DEF5 +:107B6000C7D1FF91EF91BF91AF919F918F917F917D +:107B70006F915F914F913F912F910F900FBE0F909A +:107B80001F9018959C014091BD015091BE01461770 +:107B9000570718F4F90190E044C06115710511F020 +:107BA000AB01F8CF8091E8008E778093E80040E049 +:107BB00050E0F0CF8EB3882309F444C0853009F437 +:107BC00043C08091E80083FF02C081E00895809166 +:107BD000E80082FD31C08091E80080FF22C08091E2 +:107BE000F3009091F200782F60E0292F30E0262BEF +:107BF000372B07C081918093F100415050402F5F97 +:107C00003F4F4115510519F02830310598F390E0A8 +:107C10002830310509F491E08091E8008E77809357 +:107C2000E8004115510531F6992321F605C08EB3C0 +:107C3000882341F0853041F08091E80082FFF7CF42 +:107C400080E0089582E0089583E008959C01611525 +:107C5000710529F48091E8008B778093E800F901A1 +:107C600026C08EB3882391F1853091F18091E80090 +:107C700083FF02C081E008958091E80082FFF1CF88 +:107C800006C08091F10081936150704059F02091BD +:107C9000F3008091F200322F20E090E0822B932BB2 +:107CA000892B79F78091E8008B778093E800611544 +:107CB0007105B9F605C08EB3882341F0853041F0D7 +:107CC0008091E80080FFF7CF80E0089582E008957A +:107CD00083E008950F931F93DF93CF9300D0CDB728 +:107CE000DEB7E7EBF1E08091F100819381E0EF3BBB +:107CF000F807C9F708DD8091E80083FFE4C08091B0 +:107D0000B7019091B801953009F46DC0963040F4F8 +:107D1000913081F1913070F0933009F0D4C02AC0D5 +:107D2000983009F4A3C0993009F4B2C0963009F034 +:107D3000CAC07CC0803809F4C6C0823809F0C3C00C +:107D40008091BB0187708093E9008091EB001092D5 +:107D5000E9002091E800277F2093E80090E025E0EB +:107D6000969587952A95E1F781708093F10010929E +:107D7000F10087C0882319F0823009F0A4C08F7108 +:107D8000823009F0A0C08091B901882331F520919B +:107D9000BB01277009F497C02093E9008091EB00A4 +:107DA00080FF1BC0933021F48091EB00806213C0F0 +:107DB0008091EB0080618093EB0081E090E002C055 +:107DC000880F991F2A95E2F78093EA001092EA0043 +:107DD0008091EB0088608093EB001092E900809125 +:107DE000E800877F51C0882309F06DC01091B90168 +:107DF0001F770FB7F8948091E800877F8093E800A1 +:107E00009ADD8091E80080FFFCCF8091E3008078CC +:107E1000812B8093E30080688093E300112311F4A9 +:107E200082E001C083E08EBB0FBF4DC0805882301E +:107E300008F049C08091B9019091BA016091BB01ED +:107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 +:107E50008091E800877F8093E80089819A8192DE93 +:107E60008091E8008B778093E8002DC0803859F529 +:107E70008091E800877F8093E8008091B50180932E +:107E8000F1008091E8008E778093E80054DD1BC0FC +:107E90008823C9F49091B9019230A8F48091E80048 +:107EA000877F8093E8009093B50145DD8091B5010F +:107EB000882331F48091E30087FD02C081E001C096 +:107EC00084E08EBB50DC8091E80083FF0AC0809183 +:107ED000EB0080628093EB008091E800877F8093C5 +:107EE000E8000F900F90CF91DF911F910F910895AF +:107EF00008951F938EB3882361F01091E9001092CA +:107F0000E9008091E80083FF01C0E4DE1770109360 +:107F1000E9001F910895F999FECF92BD81BDF89AAD +:107F2000992780B50895262FF999FECF1FBA92BDE3 +:107F300081BD20BD0FB6F894FA9AF99A0FBE01964A +:067F40000895F894FFCF44 +:107F46004341544552494E41007700080000000065 +:107F5600000008011201100102000008412341003F +:107F660001000201000109023E00020100803209FF +:107F7600040000010202010005240010010424028D +:107F8600040524060001070582030800FF09040111 +:107F960000020A000000070504021000010705831D +:107FA6000210000104030904220341007200640068 +:107FB600750069006E006F002000590075006E00A4 +:107FC60020002000200020002000000018034100AF +:107FD60072006400750069006E006F0020004C009E +:067FE6004C004300000006 +:040000030000700089 +:00000001FF diff --git a/server/services/arduino/index.js b/server/services/arduino/index.js new file mode 100644 index 0000000000..ff321cc81e --- /dev/null +++ b/server/services/arduino/index.js @@ -0,0 +1,35 @@ +const logger = require('../../utils/logger'); +const ArduinoManager = require('./lib'); +const ArduinoController = require('./api/arduino.controller'); + +module.exports = function ArduinoService(gladys, serviceId) { + const arduinoManager = new ArduinoManager(gladys, serviceId); + + /** + * @public + * @description This function starts service + * @example + * gladys.services.arduino.start(); + */ + async function start() { + logger.log('starting Arduino service'); + arduinoManager.init(); + } + + /** + * @public + * @description This function stops the service + * @example + * gladys.services.arduino.stop(); + */ + async function stop() { + logger.log('stopping Arduino service'); + } + + return Object.freeze({ + start, + stop, + device: arduinoManager, + controllers: ArduinoController(arduinoManager), + }); +}; diff --git a/server/services/arduino/lib/device.configure.js b/server/services/arduino/lib/device.configure.js new file mode 100644 index 0000000000..868b8e4ad5 --- /dev/null +++ b/server/services/arduino/lib/device.configure.js @@ -0,0 +1,43 @@ +const { DEVICE_FUNCTION } = require('../../../utils/constants'); +const { getDeviceParam } = require('../../../utils/device'); +const logger = require('../../../utils/logger'); + +/** + * @description Change value of a device + * @param {Object} device - The device to configure. + * @returns {Promise} - . + * @example + * configure(device); + */ +async function configure(device) { + const arduino = await this.gladys.device.getBySelector(getDeviceParam(device, 'ARDUINO_LINKED')); + const path = getDeviceParam(arduino, 'ARDUINO_PATH'); + + let functionName = getDeviceParam(device, 'FUNCTION'); + + const message = { + function_name: functionName, + parameters: { + data_pin: getDeviceParam(device, 'DATA_PIN'), + }, + }; + + switch (functionName) { + case DEVICE_FUNCTION.DHT_TEMPERATURE: + case DEVICE_FUNCTION.DHT_HUMIDITY: + functionName = 'recv_dht'; + message.parameters.enable = '1'; + break; + default: + logger.debug(`Arduino : Function = "${functionName}" not handled`); + break; + } + + if (functionName === 'recv_dht') { + this.send(path, message, getDeviceParam(device, 'PULSE_LENGTH')); + } +} + +module.exports = { + configure, +}; diff --git a/server/services/arduino/lib/device.setValue.js b/server/services/arduino/lib/device.setValue.js new file mode 100644 index 0000000000..f7d4ee0d11 --- /dev/null +++ b/server/services/arduino/lib/device.setValue.js @@ -0,0 +1,92 @@ +const { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES, DEVICE_FUNCTION, STATE } = require('../../../utils/constants'); +const { getDeviceParam } = require('../../../utils/device'); +const logger = require('../../../utils/logger'); + +/** + * @description Change value of a device. + * @param {Object} device - The device to control. + * @param {Object} deviceFeature - The binary deviceFeature to control. + * @param {string|number} value - The new value. + * @returns {Promise} - . + * @example + * setValue(device, deviceFeature, value); + */ +async function setValue(device, deviceFeature, value) { + const arduino = await this.gladys.device.getBySelector(getDeviceParam(device, 'ARDUINO_LINKED')); + const path = getDeviceParam(arduino, 'ARDUINO_PATH'); + + const functionName = getDeviceParam(device, 'FUNCTION'); + + const message = { + function_name: functionName, + parameters: { + data_pin: getDeviceParam(device, 'DATA_PIN'), + }, + }; + + switch (functionName) { + case DEVICE_FUNCTION.RECV_433: + if ( + (deviceFeature.category === DEVICE_FEATURE_CATEGORIES.OPENING_SENSOR || + deviceFeature.category === DEVICE_FEATURE_CATEGORIES.MOTION_SENSOR) && + parseInt(getDeviceParam(device, 'CODE'), 0) === parseInt(value, 0) + ) { + this.gladys.device.setValue(device, deviceFeature, STATE.ON); + } + break; + case DEVICE_FUNCTION.DHT_TEMPERATURE: + case DEVICE_FUNCTION.DHT_HUMIDITY: + message.function_name = 'recv_dht'; + break; + case DEVICE_FUNCTION.EMIT_433: + switch (device.features[0].type) { + case DEVICE_FEATURE_TYPES.SWITCH.BINARY: + message.parameters.code = + value === 1 ? getDeviceParam(device, 'CODE_ON') : getDeviceParam(device, 'CODE_OFF'); + break; + case DEVICE_FEATURE_TYPES.SENSOR.PUSH: + message.parameters.code = getDeviceParam(device, 'CODE'); + break; + default: + break; + } + + message.parameters.bit_length = getDeviceParam(device, 'BIT_LENGTH'); + break; + + case DEVICE_FUNCTION.EMIT_433_CHACON: + message.parameters.code = value === 1 ? getDeviceParam(device, 'CODE_ON') : getDeviceParam(device, 'CODE_OFF'); + break; + + case DEVICE_FUNCTION.EMIT_IR: + switch (device.features[0].type) { + case DEVICE_FEATURE_TYPES.SWITCH.BINARY: + message.parameters.code = + value === 1 ? getDeviceParam(device, 'CODE_ON') : getDeviceParam(device, 'CODE_OFF'); + break; + case DEVICE_FEATURE_TYPES.SENSOR.PUSH: + message.parameters.code = getDeviceParam(device, 'CODE'); + break; + default: + break; + } + + message.parameters.bit_length = getDeviceParam(device, 'BIT_LENGTH'); + break; + default: + logger.debug(`Arduino : Function = "${functionName}" not handled`); + break; + } + + if ( + functionName !== DEVICE_FUNCTION.RECV_433 && + functionName !== DEVICE_FUNCTION.DHT_HUMIDITY && + functionName !== DEVICE_FUNCTION.DHT_TEMPERATURE + ) { + this.send(path, message, getDeviceParam(device, 'PULSE_LENGTH')); + } +} + +module.exports = { + setValue, +}; diff --git a/server/services/arduino/lib/index.js b/server/services/arduino/lib/index.js new file mode 100644 index 0000000000..689dbb06dd --- /dev/null +++ b/server/services/arduino/lib/index.js @@ -0,0 +1,31 @@ +const Bottleneck = require('bottleneck/es5'); +const { init } = require('./init'); +const { send } = require('./send'); +const { listen } = require('./listen'); +const { setup } = require('./setup'); +const { setValue } = require('./device.setValue'); +const { configure } = require('./device.configure'); + +// we rate-limit the number of request per seconds to control lights +const setValueLimiter = new Bottleneck({ + minTime: 400, // 400 ms +}); + +const ArduinoManager = function ArduinoManager(gladys, serviceId) { + this.SerialPort = require('serialport'); + this.Readline = require('@serialport/parser-readline'); + this.Avrgirl = require('avrgirl-arduino'); + this.gladys = gladys; + this.serviceId = serviceId; + this.arduinosPorts = {}; + this.arduinoParsers = {}; +}; + +ArduinoManager.prototype.init = init; +ArduinoManager.prototype.send = send; +ArduinoManager.prototype.listen = listen; +ArduinoManager.prototype.setup = setup; +ArduinoManager.prototype.configure = configure; +ArduinoManager.prototype.setValue = setValueLimiter.wrap(setValue); + +module.exports = ArduinoManager; diff --git a/server/services/arduino/lib/init.js b/server/services/arduino/lib/init.js new file mode 100644 index 0000000000..405419b0fa --- /dev/null +++ b/server/services/arduino/lib/init.js @@ -0,0 +1,60 @@ +const logger = require('../../../utils/logger'); +const { getDeviceParam } = require('../../../utils/device'); +const { onPortData } = require('./onPortData'); + +/** + * @description Initialize the communication with the devices. + * @returns {Promise} - . + * @example + * init(); + */ +async function init() { + try { + const list = await this.gladys.device.get({ + service: 'arduino', + model: null, + }); + + const arduinoList = []; + list.forEach((element) => { + if (element.model === 'card') { + arduinoList.push(element); + } + }); + + arduinoList.forEach(async (arduino) => { + const arduinoPath = getDeviceParam(arduino, 'ARDUINO_PATH'); + + const deviceList = []; + list.forEach((element) => { + if (element.model !== 'card' && getDeviceParam(element, 'ARDUINO_LINKED') === arduino.selector) { + deviceList.push(element); + } + }); + + if (this.arduinosPorts[arduinoPath] !== undefined && this.arduinosPorts[arduinoPath].isOpen) { + this.arduinosPorts[arduinoPath].close((err) => {}); + } + + this.arduinosPorts[arduinoPath] = new this.SerialPort(arduinoPath, { + baudRate: 9600, + lock: false, + }); + + this.arduinoParsers[arduinoPath] = this.arduinosPorts[arduinoPath].pipe(new this.Readline({ delimiter: '\n' })); + + if (!this.arduinosPorts[arduinoPath].isOpen) { + this.arduinoParsers[arduinoPath].on('data', async (data) => { + onPortData(data, this, deviceList); + }); + } + }, this); + } catch (e) { + logger.warn('Unable to init device'); + logger.debug(e); + } +} + +module.exports = { + init, +}; diff --git a/server/services/arduino/lib/isJsonString.js b/server/services/arduino/lib/isJsonString.js new file mode 100644 index 0000000000..314b743e70 --- /dev/null +++ b/server/services/arduino/lib/isJsonString.js @@ -0,0 +1,19 @@ +/** + * @description Check if a string is parsable into JSON. + * @param {string} str - The string to check. + * @returns {boolean} - True if parsable. + * @example + * IsJsonString(str); + */ +function IsJsonString(str) { + try { + JSON.parse(str); + } catch (e) { + return false; + } + return true; +} + +module.exports = { + IsJsonString, +}; diff --git a/server/services/arduino/lib/listen.js b/server/services/arduino/lib/listen.js new file mode 100644 index 0000000000..e7b8364bc5 --- /dev/null +++ b/server/services/arduino/lib/listen.js @@ -0,0 +1,51 @@ +const logger = require('../../../utils/logger'); +const { getDeviceParam } = require('../../../utils/device'); +const { onPortData } = require('./onPortData'); + +/** + * @description Listen to an arduino. + * @param {Object} arduino - The arduino to listen. + * @returns {Promise} - . + * @example + * listen(arduino); + */ +async function listen(arduino) { + try { + const arduinoPath = getDeviceParam(arduino, 'ARDUINO_PATH'); + const list = await this.gladys.device.get({ + service: 'arduino', + model: null, + }); + + const deviceList = []; + list.forEach((element) => { + if (element.model !== 'card' && getDeviceParam(element, 'ARDUINO_LINKED') === arduino.selector) { + deviceList.push(element); + } + }); + + if (this.arduinosPorts[arduinoPath] !== undefined && this.arduinosPorts[arduinoPath].isOpen) { + this.arduinosPorts[arduinoPath].close((err) => {}); + } + + this.arduinosPorts[arduinoPath] = new this.SerialPort(arduinoPath, { + baudRate: 9600, + lock: false, + }); + + this.arduinoParsers[arduinoPath] = this.arduinosPorts[arduinoPath].pipe(new this.Readline({ delimiter: '\n' })); + + if (!this.arduinosPorts[arduinoPath].isOpen) { + this.arduinoParsers[arduinoPath].on('data', async (data) => { + onPortData(data, this, deviceList); + }); + } + } catch (e) { + logger.warn('Unable to listen to device'); + logger.debug(e); + } +} + +module.exports = { + listen, +}; diff --git a/server/services/arduino/lib/onPortData.js b/server/services/arduino/lib/onPortData.js new file mode 100644 index 0000000000..9e149b0359 --- /dev/null +++ b/server/services/arduino/lib/onPortData.js @@ -0,0 +1,42 @@ +const logger = require('../../../utils/logger'); +const { DEVICE_FUNCTION } = require('../../../utils/constants'); +const { getDeviceParam } = require('../../../utils/device'); +const { IsJsonString } = require('./isJsonString'); +/** + * @description Arduino onPortData function. + * @param {Object} data - The data. + * @param {Object} arduinoManager - The text to send. + * @param {Object} deviceList - The pulse length. + * @returns {Promise} - . + * @example + * onPortData(data, arduinoManager, deviceList); + */ +async function onPortData(data, arduinoManager, deviceList) { + logger.warn(data.toString('utf8')); + if (IsJsonString(data.toString('utf8'))) { + const messageJSON = JSON.parse(data.toString('utf8')); + + deviceList.forEach(async (device) => { + const functionName = getDeviceParam(device, 'FUNCTION'); + if (functionName === messageJSON.function_name) { + switch (functionName) { + case DEVICE_FUNCTION.RECV_433: + await arduinoManager.gladys.device.setValue(device, device.features[0], messageJSON.parameters.value); + break; + case DEVICE_FUNCTION.DHT_TEMPERATURE: + await arduinoManager.gladys.device.setValue(device, device.features[0], messageJSON.parameters.value); + break; + case DEVICE_FUNCTION.DHT_HUMIDITY: + await arduinoManager.gladys.device.setValue(device, device.features[0], messageJSON.parameters.value); + break; + default: + break; + } + } + }); + } +} + +module.exports = { + onPortData, +}; diff --git a/server/services/arduino/lib/onPortOpen.js b/server/services/arduino/lib/onPortOpen.js new file mode 100644 index 0000000000..5face44984 --- /dev/null +++ b/server/services/arduino/lib/onPortOpen.js @@ -0,0 +1,20 @@ +const logger = require('../../../utils/logger'); +/** + * @description Arduino onPortData function. + * @param {Object} port - The port. + * @param {Object} textToSend - The text to send. + * @param {number} pulseLength - The pulse length. + * @example + * onPortOpen(port, textToSend, pulseLength); + */ +function onPortOpen(port, textToSend, pulseLength) { + logger.warn('Arduino: port opened'); + for (let i = 0; i < pulseLength; i += 1) { + port.write(textToSend); + } + // this.gladys.event.emit('open'); +} + +module.exports = { + onPortOpen, +}; diff --git a/server/services/arduino/lib/send.js b/server/services/arduino/lib/send.js new file mode 100644 index 0000000000..150b881a7e --- /dev/null +++ b/server/services/arduino/lib/send.js @@ -0,0 +1,32 @@ +const logger = require('../../../utils/logger'); + +const { onPortOpen } = require('./onPortOpen'); + +/** + * @description Send a message to the Arduino + * @param {Object} path - The Arduino path. + * @param {Object} message - The message to send. + * @param {Object} pulseLength - The pulse length. + * @example + * send(path, message, pulse_length); + */ +async function send(path, message, pulseLength) { + try { + const textToSend = `${JSON.stringify(message)}%`; + + const port = new this.SerialPort(path, { baudRate: 9600, lock: false }); + + if (!port.isOpen) { + port.on('open', () => { + onPortOpen(port, textToSend, pulseLength); + }); + } + } catch (e) { + logger.warn('Unable to send message'); + logger.debug(e); + } +} + +module.exports = { + send, +}; diff --git a/server/services/arduino/lib/setup.js b/server/services/arduino/lib/setup.js new file mode 100644 index 0000000000..24a154b126 --- /dev/null +++ b/server/services/arduino/lib/setup.js @@ -0,0 +1,35 @@ +const path = require('path'); +const { getDeviceParam } = require('../../../utils/device'); + +/** + * @description Setup the Arduino and copy the code in it. + * @param {Object} device - The Arduino device. + * @returns {Promise} - . + * @example + * setup(device); + */ +async function setup(device) { + try { + const arduinoPath = getDeviceParam(device, 'ARDUINO_PATH'); + const model = getDeviceParam(device, 'ARDUINO_MODEL'); + + const avrgirl = new this.Avrgirl({ + board: model, + path: arduinoPath, + }); + + avrgirl.flash(path.resolve(`services/arduino/arduino-code/`, `${model}/arduino-code.ino.hex`), (error) => { + if (error) { + return new Error(error); + } + return null; + }); + return { success: true }; + } catch (e) { + return { success: false }; + } +} + +module.exports = { + setup, +}; diff --git a/server/services/arduino/package-lock.json b/server/services/arduino/package-lock.json new file mode 100644 index 0000000000..e99beefda9 --- /dev/null +++ b/server/services/arduino/package-lock.json @@ -0,0 +1,744 @@ +{ + "name": "gladys-arduino", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@serialport/binding-abstract": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", + "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", + "requires": { + "debug": "^4.1.1" + } + }, + "@serialport/binding-mock": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", + "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", + "requires": { + "@serialport/binding-abstract": "^8.0.6", + "debug": "^4.1.1" + } + }, + "@serialport/bindings": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.8.tgz", + "integrity": "sha512-xMJHr7CyOPq+wwC/S2RNI+tY+WZW4gXY3tE8QUOIRp0K7lSyLYOzKdyGUtk2uI0ohDMV3OcB+TEhhffT2S2DHQ==", + "requires": { + "@serialport/binding-abstract": "^8.0.6", + "@serialport/parser-readline": "^8.0.6", + "bindings": "^1.5.0", + "debug": "^4.1.1", + "nan": "^2.14.0", + "prebuild-install": "^5.3.0" + }, + "dependencies": { + "@serialport/parser-delimiter": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", + "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" + }, + "@serialport/parser-readline": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", + "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", + "requires": { + "@serialport/parser-delimiter": "^8.0.6" + } + } + } + }, + "@serialport/parser-byte-length": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", + "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" + }, + "@serialport/parser-cctalk": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", + "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" + }, + "@serialport/parser-delimiter": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-9.0.0.tgz", + "integrity": "sha512-OesbvlJf1BjFC1zde6cnW1RttxZ8BoXGCOiNvM9mLKdvJ06l9o/4HyVCg2bymj6ziy/gz4407pwyPfvVYApE3A==" + }, + "@serialport/parser-readline": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-9.0.0.tgz", + "integrity": "sha512-JMCqfn6A+BzcCc/4upYeLB48zijBJmOO/YGcyilXgCW0Mfedqsewgtatmk2tqFhQoJfjyOu3dRE3Lz9xHlRGZQ==", + "requires": { + "@serialport/parser-delimiter": "^9.0.0" + } + }, + "@serialport/parser-ready": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", + "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" + }, + "@serialport/parser-regex": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", + "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" + }, + "@serialport/stream": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", + "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", + "requires": { + "debug": "^4.1.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "avrgirl-arduino": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/avrgirl-arduino/-/avrgirl-arduino-4.2.3.tgz", + "integrity": "sha512-VieaZC2rVOfEKKu/CvRgjweValsdgH7TzgpfUROj80k8blURZ04CdfWpSSbD2SfYaa7Y8Lfocy9Bljr/SD8R8g==", + "requires": { + "async": "^2.1.2", + "awty": "^0.1.0", + "browser-serialport": "git+https://github.com/noopkat/browser-serialport.git#c8628c41c11890d3058875994c15f83f2df8185b", + "chip.avr.avr109": "^1.1.0", + "colors": "^1.1.2", + "graceful-fs": "^4.1.2", + "intel-hex": "^0.1.2", + "jscs-loader": "^0.3.0", + "minimist": "^1.2.0", + "serialport": "^8.0.5", + "stk500": "^2.0.2", + "stk500-v2": "^1.0.4" + } + }, + "awty": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/awty/-/awty-0.1.0.tgz", + "integrity": "sha1-i3BcHuMTn41unylAnZC3T5PoQLo=", + "requires": { + "isval": "0.0.2" + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, + "browser-serialport": { + "version": "git+https://github.com/noopkat/browser-serialport.git#c8628c41c11890d3058875994c15f83f2df8185b", + "from": "git+https://github.com/noopkat/browser-serialport.git#c8628c41c11890d3058875994c15f83f2df8185b" + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "chip.avr.avr109": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chip.avr.avr109/-/chip.avr.avr109-1.1.1.tgz", + "integrity": "sha512-+0+cvkHDsy/gizui/zFirTtDpvTQumJSs2SE9lT2BAzyE+CslXWQN9blfjMjhChcyNdZT8mFUQjETVne1gxBBQ==", + "requires": { + "intel-hex": "*" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "intel-hex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/intel-hex/-/intel-hex-0.1.2.tgz", + "integrity": "sha512-BHdANJX9xz74E1IeaRklWDnUEgVuWKD6HQ6ESklElF+4O9/8UtLzuEYoFOiSWcYZV7I40Xwv6c/BKhJqu0w6lQ==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isval": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/isval/-/isval-0.0.2.tgz", + "integrity": "sha1-HOsBcciRE+P1CYpPczbKrzO+8D8=" + }, + "jscs-loader": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jscs-loader/-/jscs-loader-0.3.0.tgz", + "integrity": "sha1-NkOw38sHfrY9N/7TW/Am86zv1IE=", + "requires": { + "loader-utils": "^0.2.5", + "rcfinder": "^0.1.8", + "strip-json-comments": "^2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node-abi": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.17.0.tgz", + "integrity": "sha512-dFRAA0ACk/aBo0TIXQMEWMLUTyWYYT8OBYIzLmEUrQTElGRjxDCvyBZIsDL0QA7QCaj9PrawhOmTEdsuLY4uOQ==", + "requires": { + "semver": "^5.4.1" + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "prebuild-install": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.4.tgz", + "integrity": "sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "rcfinder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", + "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "requires": { + "lodash.clonedeep": "^4.3.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialport": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.8.tgz", + "integrity": "sha512-GEaMYbAk9chfGyxoVC27PHnKMUMOQOCAg+9umOhAgk88vH0H6DbQ9/Tj3lRwoj7lE+TLra75P/0l1RXMfX4yQg==", + "requires": { + "@serialport/binding-mock": "^8.0.6", + "@serialport/bindings": "^8.0.8", + "@serialport/parser-byte-length": "^8.0.6", + "@serialport/parser-cctalk": "^8.0.6", + "@serialport/parser-delimiter": "^8.0.6", + "@serialport/parser-readline": "^8.0.6", + "@serialport/parser-ready": "^8.0.6", + "@serialport/parser-regex": "^8.0.6", + "@serialport/stream": "^8.0.6", + "debug": "^4.1.1" + }, + "dependencies": { + "@serialport/parser-delimiter": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", + "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" + }, + "@serialport/parser-readline": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", + "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", + "requires": { + "@serialport/parser-delimiter": "^8.0.6" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "stk500": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stk500/-/stk500-2.0.2.tgz", + "integrity": "sha512-7tkhBdcyQimPyXGtsAqxy56a/3FsryxXcX6p+/M6n8A0mEJF9fgNiNbUprX6A8pe21qGdhzIM+okTORIFKoS9A==", + "requires": { + "async": "^0.9.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "stk500-v2": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stk500-v2/-/stk500-v2-1.0.4.tgz", + "integrity": "sha512-5j7aYxA4S1YbwxQrEoefqtHoPCFCbv267aYdE7WDw4YAO9H4SpL4gg8YfuKoi+jGq+0wBP52D72FJNDTeVxB7Q==", + "requires": { + "async": "^0.9.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/server/services/arduino/package.json b/server/services/arduino/package.json new file mode 100644 index 0000000000..1de82c2667 --- /dev/null +++ b/server/services/arduino/package.json @@ -0,0 +1,21 @@ +{ + "name": "gladys-arduino", + "main": "index.js", + "os": [ + "darwin", + "linux", + "win32" + ], + "cpu": [ + "x64", + "arm", + "arm64" + ], + "scripts": {}, + "dependencies": { + "@serialport/parser-readline": "^9.0.0", + "avrgirl-arduino": "^4.2.2", + "bottleneck": "^2.19.5", + "serialport": "^8.0.8" + } +} diff --git a/server/services/index.js b/server/services/index.js index 3e825da201..93c40e7dea 100644 --- a/server/services/index.js +++ b/server/services/index.js @@ -1,4 +1,5 @@ module.exports.example = require('./example'); +module.exports.arduino = require('./arduino'); module.exports.caldav = require('./caldav'); module.exports.openweather = require('./openweather'); module.exports.mqtt = require('./mqtt'); diff --git a/server/services/usb/api/usb.controller.js b/server/services/usb/api/usb.controller.js index f62b70f4cb..6824703f82 100644 --- a/server/services/usb/api/usb.controller.js +++ b/server/services/usb/api/usb.controller.js @@ -14,6 +14,11 @@ module.exports = function UsbController({ list }) { return { comPath: port.path, comName: port.path, + manufacturer: port.manufacturer, + serialNumber: port.serialNumber, + locationId: port.locationId, + vendorId: port.vendorId, + productId: port.productId, }; }), ); diff --git a/server/test/services/arduino/ArduinoMock.test.js b/server/test/services/arduino/ArduinoMock.test.js new file mode 100644 index 0000000000..d029389776 --- /dev/null +++ b/server/test/services/arduino/ArduinoMock.test.js @@ -0,0 +1,15 @@ +const { fake } = require('sinon'); +const EventEmitter = require('events'); + +const ArduinoMock = function ArduinoMock(options) {}; + +ArduinoMock.prototype = Object.create(new EventEmitter()); + +ArduinoMock.prototype.init = fake.returns(null); +ArduinoMock.prototype.send = fake.returns(null); +ArduinoMock.prototype.listen = fake.returns(null); +ArduinoMock.prototype.setup = fake.returns(null); +ArduinoMock.prototype.configure = fake.returns(null); +ArduinoMock.prototype.setValue = fake.returns(null); + +module.exports = ArduinoMock; diff --git a/server/test/services/arduino/AvrgirlMock.test.js b/server/test/services/arduino/AvrgirlMock.test.js new file mode 100644 index 0000000000..ef9fe04864 --- /dev/null +++ b/server/test/services/arduino/AvrgirlMock.test.js @@ -0,0 +1,16 @@ +// const { fake } = require('sinon'); +const EventEmitter = require('events'); + +// const logger = require('../../../utils/logger'); + +const Avrgirl = function Avrgirl(options) {}; + +Avrgirl.prototype = Object.create(new EventEmitter()); + +const flash = (path, callBack) => { + callBack(); +}; + +Avrgirl.prototype.flash = flash; + +module.exports = Avrgirl; diff --git a/server/test/services/arduino/ReadLineMock.test.js b/server/test/services/arduino/ReadLineMock.test.js new file mode 100644 index 0000000000..0f3e09cb86 --- /dev/null +++ b/server/test/services/arduino/ReadLineMock.test.js @@ -0,0 +1,16 @@ +const { fake } = require('sinon'); +const EventEmitter = require('events'); + +const ReadLine = function ReadLine(options) {}; + +ReadLine.prototype = Object.create(new EventEmitter()); + +ReadLine.on = () => { + return fake.resolves(null); +}; + +ReadLine.prototype.pipe = fake.resolves(null); +ReadLine.prototype.open = fake.resolves(null); +ReadLine.prototype.on = fake.resolves(null); + +module.exports = ReadLine; diff --git a/server/test/services/arduino/SerialPortMock.test.js b/server/test/services/arduino/SerialPortMock.test.js new file mode 100644 index 0000000000..54236bf6bf --- /dev/null +++ b/server/test/services/arduino/SerialPortMock.test.js @@ -0,0 +1,40 @@ +const { fake } = require('sinon'); +const EventEmitter = require('events'); + +const ReadLine = require('./ReadLineMock.test'); + +const SerialPort = function SerialPort() {}; + +SerialPort.prototype = Object.create(new EventEmitter()); + +const ports = [ + { + comName: '/dev/ttACM0', + manufacturer: undefined, + serialNumber: undefined, + pnpId: undefined, + locationId: undefined, + vendorId: undefined, + productId: undefined, + }, +]; + +SerialPort.list = () => { + return new Promise((resolve, reject) => { + resolve(ports); + }); +}; + +SerialPort.pipe = () => { + return null; +}; + +SerialPort.on = () => { + return fake.resolves(null); +}; + +SerialPort.prototype.pipe = fake.returns(new ReadLine({ delimiter: '\n' })); +SerialPort.prototype.open = fake.resolves(null); +SerialPort.prototype.write = fake.resolves(null); + +module.exports = SerialPort; diff --git a/server/test/services/arduino/api/arduino.controller.test.js b/server/test/services/arduino/api/arduino.controller.test.js new file mode 100644 index 0000000000..1bcd00b833 --- /dev/null +++ b/server/test/services/arduino/api/arduino.controller.test.js @@ -0,0 +1,74 @@ +const { fake, assert, spy } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const ArduinoController = require('../../../../services/arduino/api/arduino.controller'); +const ArduinoMock = require('../ArduinoMock.test'); +const AvrgirlMock = require('../AvrgirlMock.test'); +const SerialPortMock = require('../SerialPortMock.test'); +const ReadLineMock = require('../ReadLineMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + 'avrgirl-arduino': AvrgirlMock, + serialport: SerialPortMock, + '@serialport/parser-readline': ReadLineMock, +}); + +const arduinoData = require('../lib/data/arduinoData.json'); +const dhtData = require('../lib/data/dhtData.json'); + +const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + +const deviceManager = { + get: fake.resolves([arduinoData, dhtData]), + getBySelector: fake.returns(arduinoData), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +arduinoManager.gladys = gladys; + +const res = { + json: fake.returns(null), +}; + +describe('Arduino Controller', async () => { + describe('post /api/v1/service/arduino/listen', async () => { + it('should listen to arduino devices', async () => { + const arduinoController = ArduinoController(arduinoManager); + const req = { body: arduinoData }; + const arduinoSpy = spy(arduinoController['post /api/v1/service/arduino/listen'], 'controller'); + arduinoController['post /api/v1/service/arduino/listen'].controller(req, res); + assert.calledOnce(arduinoSpy); + arduinoSpy.restore(); + }); + }); + + describe('post /api/v1/service/arduino/configure', () => { + it('should configure a device', async () => { + const arduinoController = ArduinoController(arduinoManager); + const req = { body: dhtData }; + const arduinoSpy = spy(arduinoController['post /api/v1/service/arduino/configure'], 'controller'); + arduinoController['post /api/v1/service/arduino/configure'].controller(req, res); + assert.calledOnce(arduinoSpy); + arduinoSpy.restore(); + }); + }); + + describe('post /api/v1/service/arduino/setup', async () => { + it('should upload an arduino code in the card', async () => { + const arduinoController = ArduinoController(arduinoManager); + const req = { body: arduinoData }; + const arduinoSpy = spy(arduinoController['post /api/v1/service/arduino/setup'], 'controller'); + arduinoController['post /api/v1/service/arduino/setup'].controller(req, res); + assert.calledOnce(arduinoSpy); + arduinoSpy.restore(); + }); + }); +}); diff --git a/server/test/services/arduino/arduino.test.js b/server/test/services/arduino/arduino.test.js new file mode 100644 index 0000000000..c9636bc2ef --- /dev/null +++ b/server/test/services/arduino/arduino.test.js @@ -0,0 +1,45 @@ +const { expect } = require('chai'); +const { fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const ArduinoService = require('../../../services/arduino'); + +const arduinoData = require('./lib/data/arduinoData.json'); +const deviceData = require('./lib/data/deviceData.json'); +const dhtData = require('./lib/data/dhtData.json'); + +const SerialPortMock = require('./SerialPortMock.test'); + +const ArduinoManager = proxyquire('../../../services/arduino/lib', { serialport: SerialPortMock }); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData, dhtData]), + getBySelector: fake.resolves(arduinoData), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('Arduino Service', () => { + const arduinoService = ArduinoService(gladys, '1dbaeb48-d6d2-4930-b7ca-f17d637a364b'); + const arduinoManager = new ArduinoManager(gladys, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + before(async () => { + await arduinoManager.init(); + }); + it('should have controllers', () => { + expect(arduinoService) + .to.have.property('controllers') + .and.be.instanceOf(Object); + }); + it('should start service', async () => { + await arduinoService.start(); + }); + it('should stop service', async () => { + await arduinoService.stop(); + }); +}); diff --git a/server/test/services/arduino/lib/arduinoManager.test.js b/server/test/services/arduino/lib/arduinoManager.test.js new file mode 100644 index 0000000000..829ff00003 --- /dev/null +++ b/server/test/services/arduino/lib/arduinoManager.test.js @@ -0,0 +1,77 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); + +const SerialPortMock = require('../SerialPortMock.test'); +const AvrgirlMock = require('../AvrgirlMock.test'); +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); +const deviceData = require('./data/deviceData.json'); +const dhtData = require('./data/dhtData.json'); +const messageData = require('./data/messageData.json'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + serialport: SerialPortMock, + 'avrgirl-arduino': AvrgirlMock, +}); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData, dhtData]), + getBySelector: fake.resolves(arduinoData), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('arduinoManager commands', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + arduinoManager.arduinosParsers = { '/dev/ttyACM0': new SerialPortMock() }; + arduinoManager.arduinosPorts = { '/dev/ttyACM0': new SerialPortMock() }; + it('should listen to arduino devices', async () => { + const listenSpy = spy(arduinoManager, 'listen'); + await arduinoManager.listen(arduinoData); + assert.calledOnce(listenSpy); + listenSpy.restore(); + }); + it('should send a JSON to the arduino', async () => { + const sendSpy = spy(arduinoManager, 'send'); + await arduinoManager.send('/dev/ttyACM0', messageData, 1); + // arduinoManager.arduinosPorts['/dev/ttyACM0'].emit('open'); + // arduinoManager.arduinoPorts['/dev/ttyACM0'].emit('on'); + assert.calledOnce(sendSpy); + sendSpy.restore(); + }); + it('send.js : should return "Unable to send message"', async () => { + const fakeMessage = {}; + fakeMessage.prop = fakeMessage; + const sendSpy = spy(arduinoManager, 'send'); + await arduinoManager.send('/dev/ttyAMA0', fakeMessage, 1); + assert.calledOnce(sendSpy); + sendSpy.restore(); + }); + it('should configure reception of an arduino (DHT)', async () => { + const configureSpy = spy(arduinoManager, 'configure'); + await arduinoManager.configure(dhtData); + assert.calledOnce(configureSpy); + configureSpy.restore(); + }); + it('should set the value of a feature', async () => { + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceData, deviceData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should flash an arduino card', async () => { + const setupSpy = spy(arduinoManager, 'setup'); + await arduinoManager.setup(arduinoData); + assert.calledOnce(setupSpy); + setupSpy.restore(); + }); +}); diff --git a/server/test/services/arduino/lib/data/arduinoData.json b/server/test/services/arduino/lib/data/arduinoData.json new file mode 100644 index 0000000000..3c43f1b13e --- /dev/null +++ b/server/test/services/arduino/lib/data/arduinoData.json @@ -0,0 +1,44 @@ +{ + "id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "null", + "name": "Arduino Mega", + "selector": "arduino-mega", + "model": "card", + "external_id": "51bc71ad-816c-4682-9bc2-6840a5036b74", + "should_poll": "false", + "poll_frequency": "30000", + "createdAt": "2020-05-25T17: 25: 45.129Z", + "updatedAt": "2020-05-25T17: 25: 45.129Z", + "features": [], + "params": [ + { + "id": "5b6c5d6f-8756-46af-bfca-f40bb74a14b4", + "device_id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "name": "ARDUINO_PATH", + "value": "/dev/ttyACM0", + "createdAt": "2020-05-25T17: 25: 45.168Z", + "updatedAt": "2020-05-25T17: 25: 45.168Z" + }, + { + "id": "371e873b-b39e-4b84-a87e-e401ce3678ec", + "device_id": "8e25bf9a-4b24-4099-a08d-f4afe323c3a7", + "name": "ARDUINO_MODEL", + "value": "mega", + "createdAt": "2020-05-25T17: 25: 45.169Z", + "updatedAt": "2020-05-25T17: 25: 45.169Z" + } + ], + "room": "null", + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/deviceData.json b/server/test/services/arduino/lib/data/deviceData.json new file mode 100644 index 0000000000..119de5e8d6 --- /dev/null +++ b/server/test/services/arduino/lib/data/deviceData.json @@ -0,0 +1,120 @@ +{ + "id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "Lampe Salon", + "selector": "lampe-salon", + "model": "null", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "should_poll": "false", + "poll_frequency": "null", + "createdAt": "2020-05-26T18: 17: 50.969Z", + "updatedAt": "2020-05-26T18: 17: 50.969Z", + "features": [ + { + "id": "4412eb0f-e705-444c-aa83-b4d76d634673", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "Lampe Salon", + "selector": "lampe-salon", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "category": "light", + "type": "binary", + "read_only": "false", + "keep_history": "false", + "has_feedback": "false", + "unit": "null", + "min": "0", + "max": "1", + "last_value": "0", + "last_value_string": "null", + "last_value_changed": "2020-05-27T01: 44: 03.922Z", + "createdAt": "2020-05-26T18: 17: 50.989Z", + "updatedAt": "2020-05-27T01: 37: 15.610Z" + } + ], + "params": [ + { + "id": "8e316fbc-1386-4774-b7a4-90e88233c7dc", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "DATA_PIN", + "value": "4", + "createdAt": "2020-05-26T18: 17: 51.007Z", + "updatedAt": "2020-05-26T18: 17: 51.007Z" + }, + { + "id": "dabb2541-2e5f-4c8e-a95d-0efd90850ea9", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "FUNCTION", + "value": "emit_433_chacon", + "createdAt": "2020-05-26T18: 17: 51.009Z", + "updatedAt": "2020-05-26T18: 17: 51.009Z" + }, + { + "id": "2e6b89f6-396b-412d-bd9f-7477cdf3c9c4", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-26T18: 17: 51.011Z", + "updatedAt": "2020-05-26T18: 17: 51.011Z" + }, + { + "id": "5fdf8a00-575c-4136-ad7b-27330aea47a6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.013Z", + "updatedAt": "2020-05-26T18: 17: 51.013Z" + }, + { + "id": "6e53cd3e-618b-42c4-8c74-7a42e429ebb1", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_ON", + "value": "1536116368", + "createdAt": "2020-05-26T18: 17: 51.015Z", + "updatedAt": "2020-05-26T18: 17: 51.015Z" + }, + { + "id": "cdbea6fc-0a49-4d82-83c4-b1849281f478", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_OFF", + "value": "1536116352", + "createdAt": "2020-05-26T18: 17: 51.017Z", + "updatedAt": "2020-05-26T18: 17: 51.017Z" + }, + { + "id": "42258fdb-0f3c-4cef-889d-385f39d166d6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "BIT_LENGTH", + "value": "24", + "createdAt": "2020-05-26T18: 17: 51.019Z", + "updatedAt": "2020-05-26T18: 17: 51.019Z" + }, + { + "id": "2614bb79-be14-42c9-a47d-cfab5e8f126d", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "PULSE_LENGTH", + "value": "3", + "createdAt": "2020-05-26T18: 17: 51.021Z", + "updatedAt": "2020-05-26T18: 17: 51.021Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17: 16: 16.594Z", + "updatedAt": "2020-05-25T17: 16: 16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/deviceEmit433Data.json b/server/test/services/arduino/lib/data/deviceEmit433Data.json new file mode 100644 index 0000000000..84affc4fd5 --- /dev/null +++ b/server/test/services/arduino/lib/data/deviceEmit433Data.json @@ -0,0 +1,120 @@ +{ + "id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "Emit 433", + "selector": "emit-433", + "model": "null", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "should_poll": "false", + "poll_frequency": "null", + "createdAt": "2020-05-26T18: 17: 50.969Z", + "updatedAt": "2020-05-26T18: 17: 50.969Z", + "features": [ + { + "id": "4412eb0f-e705-444c-aa83-b4d76d634673", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "Emit 433", + "selector": "emit-433", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "category": "light", + "type": "binary", + "read_only": "false", + "keep_history": "false", + "has_feedback": "false", + "unit": "null", + "min": "0", + "max": "1", + "last_value": "0", + "last_value_string": "null", + "last_value_changed": "2020-05-27T01: 44: 03.922Z", + "createdAt": "2020-05-26T18: 17: 50.989Z", + "updatedAt": "2020-05-27T01: 37: 15.610Z" + } + ], + "params": [ + { + "id": "8e316fbc-1386-4774-b7a4-90e88233c7dc", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "DATA_PIN", + "value": "4", + "createdAt": "2020-05-26T18: 17: 51.007Z", + "updatedAt": "2020-05-26T18: 17: 51.007Z" + }, + { + "id": "dabb2541-2e5f-4c8e-a95d-0efd90850ea9", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "FUNCTION", + "value": "emit_433", + "createdAt": "2020-05-26T18: 17: 51.009Z", + "updatedAt": "2020-05-26T18: 17: 51.009Z" + }, + { + "id": "2e6b89f6-396b-412d-bd9f-7477cdf3c9c4", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-26T18: 17: 51.011Z", + "updatedAt": "2020-05-26T18: 17: 51.011Z" + }, + { + "id": "5fdf8a00-575c-4136-ad7b-27330aea47a6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.013Z", + "updatedAt": "2020-05-26T18: 17: 51.013Z" + }, + { + "id": "6e53cd3e-618b-42c4-8c74-7a42e429ebb1", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_ON", + "value": "1536116368", + "createdAt": "2020-05-26T18: 17: 51.015Z", + "updatedAt": "2020-05-26T18: 17: 51.015Z" + }, + { + "id": "cdbea6fc-0a49-4d82-83c4-b1849281f478", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_OFF", + "value": "1536116352", + "createdAt": "2020-05-26T18: 17: 51.017Z", + "updatedAt": "2020-05-26T18: 17: 51.017Z" + }, + { + "id": "42258fdb-0f3c-4cef-889d-385f39d166d6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "BIT_LENGTH", + "value": "32", + "createdAt": "2020-05-26T18: 17: 51.019Z", + "updatedAt": "2020-05-26T18: 17: 51.019Z" + }, + { + "id": "2614bb79-be14-42c9-a47d-cfab5e8f126d", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "PULSE_LENGTH", + "value": "3", + "createdAt": "2020-05-26T18: 17: 51.021Z", + "updatedAt": "2020-05-26T18: 17: 51.021Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17: 16: 16.594Z", + "updatedAt": "2020-05-25T17: 16: 16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/deviceIRData.json b/server/test/services/arduino/lib/data/deviceIRData.json new file mode 100644 index 0000000000..b541d89311 --- /dev/null +++ b/server/test/services/arduino/lib/data/deviceIRData.json @@ -0,0 +1,120 @@ +{ + "id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "IR", + "selector": "ir", + "model": "null", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "should_poll": "false", + "poll_frequency": "null", + "createdAt": "2020-05-26T18: 17: 50.969Z", + "updatedAt": "2020-05-26T18: 17: 50.969Z", + "features": [ + { + "id": "4412eb0f-e705-444c-aa83-b4d76d634673", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "IR", + "selector": "ir", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "category": "light", + "type": "binary", + "read_only": "false", + "keep_history": "false", + "has_feedback": "false", + "unit": "null", + "min": "0", + "max": "1", + "last_value": "0", + "last_value_string": "null", + "last_value_changed": "2020-05-27T01: 44: 03.922Z", + "createdAt": "2020-05-26T18: 17: 50.989Z", + "updatedAt": "2020-05-27T01: 37: 15.610Z" + } + ], + "params": [ + { + "id": "8e316fbc-1386-4774-b7a4-90e88233c7dc", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "DATA_PIN", + "value": "4", + "createdAt": "2020-05-26T18: 17: 51.007Z", + "updatedAt": "2020-05-26T18: 17: 51.007Z" + }, + { + "id": "dabb2541-2e5f-4c8e-a95d-0efd90850ea9", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "FUNCTION", + "value": "emit_ir", + "createdAt": "2020-05-26T18: 17: 51.009Z", + "updatedAt": "2020-05-26T18: 17: 51.009Z" + }, + { + "id": "2e6b89f6-396b-412d-bd9f-7477cdf3c9c4", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-26T18: 17: 51.011Z", + "updatedAt": "2020-05-26T18: 17: 51.011Z" + }, + { + "id": "5fdf8a00-575c-4136-ad7b-27330aea47a6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.013Z", + "updatedAt": "2020-05-26T18: 17: 51.013Z" + }, + { + "id": "6e53cd3e-618b-42c4-8c74-7a42e429ebb1", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_ON", + "value": "1536116368", + "createdAt": "2020-05-26T18: 17: 51.015Z", + "updatedAt": "2020-05-26T18: 17: 51.015Z" + }, + { + "id": "cdbea6fc-0a49-4d82-83c4-b1849281f478", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_OFF", + "value": "1536116352", + "createdAt": "2020-05-26T18: 17: 51.017Z", + "updatedAt": "2020-05-26T18: 17: 51.017Z" + }, + { + "id": "42258fdb-0f3c-4cef-889d-385f39d166d6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "BIT_LENGTH", + "value": "32", + "createdAt": "2020-05-26T18: 17: 51.019Z", + "updatedAt": "2020-05-26T18: 17: 51.019Z" + }, + { + "id": "2614bb79-be14-42c9-a47d-cfab5e8f126d", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "PULSE_LENGTH", + "value": "3", + "createdAt": "2020-05-26T18: 17: 51.021Z", + "updatedAt": "2020-05-26T18: 17: 51.021Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17: 16: 16.594Z", + "updatedAt": "2020-05-25T17: 16: 16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/deviceRecv433Data.json b/server/test/services/arduino/lib/data/deviceRecv433Data.json new file mode 100644 index 0000000000..2903deca89 --- /dev/null +++ b/server/test/services/arduino/lib/data/deviceRecv433Data.json @@ -0,0 +1,120 @@ +{ + "id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "Recv 433", + "selector": "recv-433", + "model": "null", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "should_poll": "false", + "poll_frequency": "null", + "createdAt": "2020-05-26T18: 17: 50.969Z", + "updatedAt": "2020-05-26T18: 17: 50.969Z", + "features": [ + { + "id": "4412eb0f-e705-444c-aa83-b4d76d634673", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "Recv 433", + "selector": "recv-433", + "external_id": "9965d82b-bc80-4cb5-a60b-c5b0577559f3", + "category": "motion-sensor", + "type": "binary", + "read_only": "false", + "keep_history": "false", + "has_feedback": "false", + "unit": "null", + "min": "0", + "max": "1", + "last_value": "0", + "last_value_string": "null", + "last_value_changed": "2020-05-27T01: 44: 03.922Z", + "createdAt": "2020-05-26T18: 17: 50.989Z", + "updatedAt": "2020-05-27T01: 37: 15.610Z" + } + ], + "params": [ + { + "id": "8e316fbc-1386-4774-b7a4-90e88233c7dc", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "DATA_PIN", + "value": "4", + "createdAt": "2020-05-26T18: 17: 51.007Z", + "updatedAt": "2020-05-26T18: 17: 51.007Z" + }, + { + "id": "dabb2541-2e5f-4c8e-a95d-0efd90850ea9", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "FUNCTION", + "value": "recv_433", + "createdAt": "2020-05-26T18: 17: 51.009Z", + "updatedAt": "2020-05-26T18: 17: 51.009Z" + }, + { + "id": "2e6b89f6-396b-412d-bd9f-7477cdf3c9c4", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-26T18: 17: 51.011Z", + "updatedAt": "2020-05-26T18: 17: 51.011Z" + }, + { + "id": "5fdf8a00-575c-4136-ad7b-27330aea47a6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE", + "value": "4464676", + "createdAt": "2020-05-26T18: 17: 51.013Z", + "updatedAt": "2020-05-26T18: 17: 51.013Z" + }, + { + "id": "6e53cd3e-618b-42c4-8c74-7a42e429ebb1", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_ON", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.015Z", + "updatedAt": "2020-05-26T18: 17: 51.015Z" + }, + { + "id": "cdbea6fc-0a49-4d82-83c4-b1849281f478", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "CODE_OFF", + "value": "0", + "createdAt": "2020-05-26T18: 17: 51.017Z", + "updatedAt": "2020-05-26T18: 17: 51.017Z" + }, + { + "id": "42258fdb-0f3c-4cef-889d-385f39d166d6", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "BIT_LENGTH", + "value": "32", + "createdAt": "2020-05-26T18: 17: 51.019Z", + "updatedAt": "2020-05-26T18: 17: 51.019Z" + }, + { + "id": "2614bb79-be14-42c9-a47d-cfab5e8f126d", + "device_id": "779fa305-bb11-4b73-aa4a-accc79743e9b", + "name": "PULSE_LENGTH", + "value": "3", + "createdAt": "2020-05-26T18: 17: 51.021Z", + "updatedAt": "2020-05-26T18: 17: 51.021Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17: 16: 16.594Z", + "updatedAt": "2020-05-25T17: 16: 16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": "null", + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": "true", + "has_message_feature": "false", + "createdAt": "2020-05-25T17: 07: 00.776Z", + "updatedAt": "2020-05-25T17: 07: 00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/dhtData.json b/server/test/services/arduino/lib/data/dhtData.json new file mode 100644 index 0000000000..2c91e919f6 --- /dev/null +++ b/server/test/services/arduino/lib/data/dhtData.json @@ -0,0 +1,120 @@ +{ + "id": "67804a09-804d-45df-be98-0e4a51056ea8", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "Temperature", + "selector": "temperature", + "model": null, + "external_id": "f0546382-5132-49e4-aaad-5e49fe78af0b", + "should_poll": false, + "poll_frequency": null, + "createdAt": "2020-05-25T17:28:53.170Z", + "updatedAt": "2020-05-25T17:28:53.170Z", + "features": [ + { + "id": "196129b3-5aae-44bc-8ab8-3e3fe31be144", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "Temperature", + "selector": "temperature", + "external_id": "f0546382-5132-49e4-aaad-5e49fe78af0b", + "category": "temperature-sensor", + "type": "decimal", + "read_only": true, + "keep_history": false, + "has_feedback": false, + "unit": "celsius", + "min": 0, + "max": 100, + "last_value": 26, + "last_value_string": null, + "last_value_changed": "2020-05-27T04:56:18.108Z", + "createdAt": "2020-05-25T17:28:53.180Z", + "updatedAt": "2020-05-27T04:56:18.118Z" + } + ], + "params": [ + { + "id": "4604c9f7-4b23-468b-bee0-2f925ab51f47", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "DATA_PIN", + "value": "8", + "createdAt": "2020-05-25T17:28:53.191Z", + "updatedAt": "2020-05-25T17:28:53.191Z" + }, + { + "id": "70088af5-e527-4b7d-9dd1-92868f2a6fe1", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "FUNCTION", + "value": "dht_temperature", + "createdAt": "2020-05-25T17:28:53.193Z", + "updatedAt": "2020-05-25T17:28:53.193Z" + }, + { + "id": "22c9a314-9076-47bd-b099-2fc10449c787", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-25T17:28:53.194Z", + "updatedAt": "2020-05-25T17:28:53.194Z" + }, + { + "id": "d5b8c0f9-7d55-4ce2-b28d-e797752fba12", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-25T17:28:53.195Z", + "updatedAt": "2020-05-25T17:28:53.195Z" + }, + { + "id": "a0350656-c79a-4677-90b9-df201254c499", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE_ON", + "value": "0", + "createdAt": "2020-05-25T17:28:53.196Z", + "updatedAt": "2020-05-25T17:28:53.196Z" + }, + { + "id": "92fdfcf1-4352-43bd-9f22-9a7115b4f771", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE_OFF", + "value": "0", + "createdAt": "2020-05-25T17:28:53.197Z", + "updatedAt": "2020-05-25T17:28:53.197Z" + }, + { + "id": "387908b1-d956-44c6-8bad-3174361cd748", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "BIT_LENGTH", + "value": "32", + "createdAt": "2020-05-25T17:28:53.198Z", + "updatedAt": "2020-05-25T17:28:53.198Z" + }, + { + "id": "a2470072-0c62-43be-ad3d-0748e8ee2dac", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "PULSE_LENGTH", + "value": "1", + "createdAt": "2020-05-25T17:28:53.199Z", + "updatedAt": "2020-05-25T17:28:53.199Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17:16:16.594Z", + "updatedAt": "2020-05-25T17:16:16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": null, + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": true, + "has_message_feature": false, + "createdAt": "2020-05-25T17:07:00.776Z", + "updatedAt": "2020-05-25T17:07:00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/dhtHumidityData.json b/server/test/services/arduino/lib/data/dhtHumidityData.json new file mode 100644 index 0000000000..4fe5574e92 --- /dev/null +++ b/server/test/services/arduino/lib/data/dhtHumidityData.json @@ -0,0 +1,120 @@ +{ + "id": "67804a09-804d-45df-be98-0e4a51056ea8", + "service_id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "room_id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "name": "Humidity", + "selector": "humidity", + "model": null, + "external_id": "f0546382-5132-49e4-aaad-5e49fe78af0b", + "should_poll": false, + "poll_frequency": null, + "createdAt": "2020-05-25T17:28:53.170Z", + "updatedAt": "2020-05-25T17:28:53.170Z", + "features": [ + { + "id": "196129b3-5aae-44bc-8ab8-3e3fe31be144", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "Humidity", + "selector": "humidity", + "external_id": "f0546382-5132-49e4-aaad-5e49fe78af0b", + "category": "humidity-sensor", + "type": "decimal", + "read_only": true, + "keep_history": false, + "has_feedback": false, + "unit": "percent", + "min": 0, + "max": 100, + "last_value": 26, + "last_value_string": null, + "last_value_changed": "2020-05-27T04:56:18.108Z", + "createdAt": "2020-05-25T17:28:53.180Z", + "updatedAt": "2020-05-27T04:56:18.118Z" + } + ], + "params": [ + { + "id": "4604c9f7-4b23-468b-bee0-2f925ab51f47", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "DATA_PIN", + "value": "8", + "createdAt": "2020-05-25T17:28:53.191Z", + "updatedAt": "2020-05-25T17:28:53.191Z" + }, + { + "id": "70088af5-e527-4b7d-9dd1-92868f2a6fe1", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "FUNCTION", + "value": "dht_humidity", + "createdAt": "2020-05-25T17:28:53.193Z", + "updatedAt": "2020-05-25T17:28:53.193Z" + }, + { + "id": "22c9a314-9076-47bd-b099-2fc10449c787", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "ARDUINO_LINKED", + "value": "arduino-mega", + "createdAt": "2020-05-25T17:28:53.194Z", + "updatedAt": "2020-05-25T17:28:53.194Z" + }, + { + "id": "d5b8c0f9-7d55-4ce2-b28d-e797752fba12", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE", + "value": "0", + "createdAt": "2020-05-25T17:28:53.195Z", + "updatedAt": "2020-05-25T17:28:53.195Z" + }, + { + "id": "a0350656-c79a-4677-90b9-df201254c499", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE_ON", + "value": "0", + "createdAt": "2020-05-25T17:28:53.196Z", + "updatedAt": "2020-05-25T17:28:53.196Z" + }, + { + "id": "92fdfcf1-4352-43bd-9f22-9a7115b4f771", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "CODE_OFF", + "value": "0", + "createdAt": "2020-05-25T17:28:53.197Z", + "updatedAt": "2020-05-25T17:28:53.197Z" + }, + { + "id": "387908b1-d956-44c6-8bad-3174361cd748", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "BIT_LENGTH", + "value": "32", + "createdAt": "2020-05-25T17:28:53.198Z", + "updatedAt": "2020-05-25T17:28:53.198Z" + }, + { + "id": "a2470072-0c62-43be-ad3d-0748e8ee2dac", + "device_id": "67804a09-804d-45df-be98-0e4a51056ea8", + "name": "PULSE_LENGTH", + "value": "1", + "createdAt": "2020-05-25T17:28:53.199Z", + "updatedAt": "2020-05-25T17:28:53.199Z" + } + ], + "room": { + "id": "8eb3add6-9f31-4dcf-89d7-20edcef55462", + "house_id": "bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8", + "name": "Salon", + "selector": "salon", + "createdAt": "2020-05-25T17:16:16.594Z", + "updatedAt": "2020-05-25T17:16:16.594Z" + }, + "service": { + "id": "1dbaeb48-d6d2-4930-b7ca-f17d637a364b", + "pod_id": null, + "name": "arduino", + "selector": "arduino", + "version": "0.1.0", + "enabled": true, + "has_message_feature": false, + "createdAt": "2020-05-25T17:07:00.776Z", + "updatedAt": "2020-05-25T17:07:00.776Z" + } +} diff --git a/server/test/services/arduino/lib/data/messageData.json b/server/test/services/arduino/lib/data/messageData.json new file mode 100644 index 0000000000..e31e490814 --- /dev/null +++ b/server/test/services/arduino/lib/data/messageData.json @@ -0,0 +1 @@ +{ "function_name": "emit_433_chacon", "parameters": { "data_pin": "4", "code": "1536116352" } } diff --git a/server/test/services/arduino/lib/device.configure.test.js b/server/test/services/arduino/lib/device.configure.test.js new file mode 100644 index 0000000000..43ea5bac58 --- /dev/null +++ b/server/test/services/arduino/lib/device.configure.test.js @@ -0,0 +1,47 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); + +const ArduinoMock = require('../ArduinoMock.test'); +const SerialPortMock = require('../SerialPortMock.test'); +const AvrgirlMock = require('../AvrgirlMock.test'); + +const arduinoData = require('./data/arduinoData.json'); +const deviceData = require('./data/deviceData.json'); +const dhtData = require('./data/dhtData.json'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + serialport: SerialPortMock, + 'avrgirl-arduino': AvrgirlMock, +}); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData, dhtData]), + getBySelector: fake.resolves(arduinoData), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('configure function', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + it('should configure the device (dht)', async () => { + const configureSpy = spy(arduinoManager, 'configure'); + arduinoManager.configure(dhtData); + assert.calledOnce(configureSpy); + configureSpy.restore(); + }); + it('should configure the device (chacon) and return an error', async () => { + const configureSpy = spy(arduinoManager, 'configure'); + arduinoManager.configure(deviceData); + assert.calledOnce(configureSpy); + configureSpy.restore(); + }); +}); diff --git a/server/test/services/arduino/lib/device.setValue.test.js b/server/test/services/arduino/lib/device.setValue.test.js new file mode 100644 index 0000000000..da2ac0ab7c --- /dev/null +++ b/server/test/services/arduino/lib/device.setValue.test.js @@ -0,0 +1,266 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const SerialPortMock = require('../SerialPortMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { serialport: SerialPortMock }); +const ArduinoMock = require('../ArduinoMock.test'); + +const arduinoData = require('./data/arduinoData.json'); +const deviceChaconData = require('./data/deviceData.json'); +const deviceEmit433Data = require('./data/deviceEmit433Data.json'); +const deviceIRData = require('./data/deviceIRData.json'); +const dhtData = require('./data/dhtData.json'); +const deviceRecv433Data = require('./data/deviceRecv433Data.json'); + +const fakeDeviceData = { + id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + service_id: '1dbaeb48-d6d2-4930-b7ca-f17d637a364b', + room_id: '8eb3add6-9f31-4dcf-89d7-20edcef55462', + name: 'Fake Device', + selector: 'fake-device', + model: 'null', + external_id: '9965d82b-bc80-4cb5-a60b-c5b0577559f3', + should_poll: 'false', + poll_frequency: 'null', + createdAt: '2020-05-26T18: 17: 50.969Z', + updatedAt: '2020-05-26T18: 17: 50.969Z', + features: [ + { + id: '4412eb0f-e705-444c-aa83-b4d76d634673', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'Fake Device', + selector: 'fake-device', + external_id: '9965d82b-bc80-4cb5-a60b-c5b0577559f3', + category: 'light', + type: 'binary', + read_only: 'false', + keep_history: 'false', + has_feedback: 'false', + unit: 'null', + min: '0', + max: '1', + last_value: '0', + last_value_string: 'null', + last_value_changed: '2020-05-27T01: 44: 03.922Z', + createdAt: '2020-05-26T18: 17: 50.989Z', + updatedAt: '2020-05-27T01: 37: 15.610Z', + }, + ], + params: [ + { + id: '8e316fbc-1386-4774-b7a4-90e88233c7dc', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'DATA_PIN', + value: '4', + createdAt: '2020-05-26T18: 17: 51.007Z', + updatedAt: '2020-05-26T18: 17: 51.007Z', + }, + { + id: 'dabb2541-2e5f-4c8e-a95d-0efd90850ea9', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'FUNCTION', + value: 'fake-function', + createdAt: '2020-05-26T18: 17: 51.009Z', + updatedAt: '2020-05-26T18: 17: 51.009Z', + }, + { + id: '2e6b89f6-396b-412d-bd9f-7477cdf3c9c4', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'ARDUINO_LINKED', + value: 'arduino-mega', + createdAt: '2020-05-26T18: 17: 51.011Z', + updatedAt: '2020-05-26T18: 17: 51.011Z', + }, + { + id: '5fdf8a00-575c-4136-ad7b-27330aea47a6', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'CODE', + value: '0', + createdAt: '2020-05-26T18: 17: 51.013Z', + updatedAt: '2020-05-26T18: 17: 51.013Z', + }, + { + id: '6e53cd3e-618b-42c4-8c74-7a42e429ebb1', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'CODE_ON', + value: '1536116368', + createdAt: '2020-05-26T18: 17: 51.015Z', + updatedAt: '2020-05-26T18: 17: 51.015Z', + }, + { + id: 'cdbea6fc-0a49-4d82-83c4-b1849281f478', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'CODE_OFF', + value: '1536116352', + createdAt: '2020-05-26T18: 17: 51.017Z', + updatedAt: '2020-05-26T18: 17: 51.017Z', + }, + { + id: '42258fdb-0f3c-4cef-889d-385f39d166d6', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'BIT_LENGTH', + value: '24', + createdAt: '2020-05-26T18: 17: 51.019Z', + updatedAt: '2020-05-26T18: 17: 51.019Z', + }, + { + id: '2614bb79-be14-42c9-a47d-cfab5e8f126d', + device_id: '779fa305-bb11-4b73-aa4a-accc79743e9b', + name: 'PULSE_LENGTH', + value: '3', + createdAt: '2020-05-26T18: 17: 51.021Z', + updatedAt: '2020-05-26T18: 17: 51.021Z', + }, + ], + room: { + id: '8eb3add6-9f31-4dcf-89d7-20edcef55462', + house_id: 'bb6c2b29-3f55-4644-a0d4-5395ca7e7fe8', + name: 'Salon', + selector: 'salon', + createdAt: '2020-05-25T17: 16: 16.594Z', + updatedAt: '2020-05-25T17: 16: 16.594Z', + }, + service: { + id: '1dbaeb48-d6d2-4930-b7ca-f17d637a364b', + pod_id: 'null', + name: 'arduino', + selector: 'arduino', + version: '0.1.0', + enabled: 'true', + has_message_feature: 'false', + createdAt: '2020-05-25T17: 07: 00.776Z', + updatedAt: '2020-05-25T17: 07: 00.776Z', + }, +}; + +const deviceManager = { + get: fake.resolves([arduinoData, deviceChaconData, deviceEmit433Data, deviceRecv433Data, dhtData]), + getBySelector: fake.resolves(arduinoData), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('setValue function', async () => { + it('should set the value (ON for classic 433 - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceEmit433Data.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceEmit433Data, deviceEmit433Data.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (OFF for classic 433 - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceEmit433Data.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceEmit433Data, deviceEmit433Data.features[0], 0); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (ON for classic 433 - Push)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceEmit433Data.features[0].type = 'push'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceEmit433Data, deviceEmit433Data.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (OFF for classic 433 - Push)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceEmit433Data.features[0].type = 'push'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceEmit433Data, deviceEmit433Data.features[0], 0); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (ON for chacon - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceChaconData.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceChaconData, deviceChaconData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (OFF for chacon - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceChaconData.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceChaconData, deviceChaconData.features[0], 0); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (ON for IR - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceIRData.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceIRData, deviceIRData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (OFF for IR - Binary)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceIRData.features[0].type = 'binary'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceIRData, deviceIRData.features[0], 0); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (ON for IR - Push)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceIRData.features[0].type = 'push'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceIRData, deviceIRData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (OFF for IR - Push)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + deviceIRData.features[0].type = 'push'; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceIRData, deviceIRData.features[0], 0); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (for DHT)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(dhtData, dhtData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should set the value (for recv 433)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(deviceRecv433Data, deviceRecv433Data.features[0], 4464676); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); + it('should return an error (Arduino : Function = "fake-function" not handled)', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + const setValueSpy = spy(arduinoManager, 'setValue'); + await arduinoManager.setValue(fakeDeviceData, fakeDeviceData.features[0], 1); + assert.calledOnce(setValueSpy); + setValueSpy.restore(); + }); +}); diff --git a/server/test/services/arduino/lib/init.test.js b/server/test/services/arduino/lib/init.test.js new file mode 100644 index 0000000000..9db12cd362 --- /dev/null +++ b/server/test/services/arduino/lib/init.test.js @@ -0,0 +1,45 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const SerialPortMock = require('../SerialPortMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { serialport: SerialPortMock }); + +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); +const deviceData = require('./data/deviceData.json'); +const dhtData = require('./data/dhtData.json'); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData, dhtData]), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); +arduinoManager.gladys = gladys; + +describe('init method', async () => { + it('Should init the connection with the arduino devices', async () => { + const initSpy = spy(arduinoManager, 'init'); + await arduinoManager.init(); + assert.calledOnce(initSpy); + initSpy.restore(); + }); + it('Should return "Unable to init device"', async () => { + // arduinoData.model = null; + // dhtData.model = 'card'; + const initSpy = spy(arduinoManager, 'init'); + await arduinoManager.init(); + assert.calledOnce(initSpy); + initSpy.restore(); + // arduinoData.model = 'card'; + // dhtData.model = null; + }); +}); diff --git a/server/test/services/arduino/lib/isJsonString.test.js b/server/test/services/arduino/lib/isJsonString.test.js new file mode 100644 index 0000000000..89aa0f0f66 --- /dev/null +++ b/server/test/services/arduino/lib/isJsonString.test.js @@ -0,0 +1,16 @@ +const { expect } = require('chai'); + +const { IsJsonString } = require('../../../../services/arduino/lib/isJsonString'); + +describe('IsJsonString function', async () => { + it('should return true', async () => { + const message = '{ "function_name": "emit_433_chacon", "parameters": { "data_pin": "4", "code": "1536116352" } }'; + const res = IsJsonString(message); + expect(res).to.equal(true); + }); + it('should return false', async () => { + const message = '{ "function_name": "emit_433_chacon", "parameters": { "data_pin": "4", "code": "1536116352"'; + const res = IsJsonString(message); + expect(res).to.equal(false); + }); +}); diff --git a/server/test/services/arduino/lib/listen.test.js b/server/test/services/arduino/lib/listen.test.js new file mode 100644 index 0000000000..67d8208b64 --- /dev/null +++ b/server/test/services/arduino/lib/listen.test.js @@ -0,0 +1,47 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const SerialPortMock = require('../SerialPortMock.test'); +const ReadLineMock = require('../ReadLineMock.test'); + +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + serialport: SerialPortMock, + '@serialport/parser-readline': ReadLineMock, +}); + +const deviceManager = { + get: fake.resolves([arduinoData]), + getBySelector: fake.resolves([arduinoData]), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('listen function', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + arduinoManager.arduinoParsers = { '/dev/ttyACM0': null }; + it('should listen to arduino device', async () => { + const listenSpy = spy(arduinoManager, 'listen'); + await arduinoManager.listen(arduinoData); + assert.calledOnce(listenSpy); + listenSpy.restore(); + }); + it('should be unable to listen to arduino device', async () => { + arduinoData.model = null; + const listenSpy = spy(arduinoManager, 'listen'); + await arduinoManager.listen(arduinoData); + assert.calledOnce(listenSpy); + listenSpy.restore(); + arduinoData.model = 'card'; + }); +}); diff --git a/server/test/services/arduino/lib/onPortData.test.js b/server/test/services/arduino/lib/onPortData.test.js new file mode 100644 index 0000000000..ad1928646c --- /dev/null +++ b/server/test/services/arduino/lib/onPortData.test.js @@ -0,0 +1,58 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const AvrgirlMock = require('../AvrgirlMock.test'); +const SerialPortMock = require('../SerialPortMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + 'avrgirl-arduino': AvrgirlMock, + serialport: SerialPortMock, +}); +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); +const deviceData = require('./data/deviceData.json'); +const dhtData = require('./data/dhtData.json'); +const dhtHumidityData = require('./data/dhtHumidityData.json'); +const deviceRecv433Data = require('./data/deviceRecv433Data.json'); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData, dhtData, dhtHumidityData, deviceRecv433Data]), + getBySelector: fake.resolves(arduinoData), + setValue: fake.resolves(null), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; +const portData = require('../../../../services/arduino/lib/onPortData'); + +describe('onPortData function', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + arduinoManager.arduinosPorts['dev/ttyACM0'] = new arduinoManager.SerialPort(); + it('should read data from the arduino (recv_433)', async () => { + const message = '{"function_name":"recv_433","parameters":{"value":4464676}}'; + const onPortDataSpy = spy(portData, 'onPortData'); + portData.onPortData(message, arduinoManager, [deviceData, dhtData, dhtHumidityData, deviceRecv433Data]); + assert.calledOnce(onPortDataSpy); + onPortDataSpy.restore(); + }); + it('should read data from the arduino (dht_temperature)', async () => { + const message = '{"function_name":"dht_temperature","parameters":{"value":23.00}}'; + const onPortDataSpy = spy(portData, 'onPortData'); + portData.onPortData(message, arduinoManager, [deviceData, dhtData, dhtHumidityData, deviceRecv433Data]); + assert.calledOnce(onPortDataSpy); + onPortDataSpy.restore(); + }); + it('should read data from the arduino (dht_humidity)', async () => { + const message = '{"function_name":"dht_humidity","parameters":{"value":56.00}}'; + const onPortDataSpy = spy(portData, 'onPortData'); + portData.onPortData(message, arduinoManager, [deviceData, dhtData, dhtHumidityData, deviceRecv433Data]); + assert.calledOnce(onPortDataSpy); + onPortDataSpy.restore(); + }); +}); diff --git a/server/test/services/arduino/lib/onPortOpen.test.js b/server/test/services/arduino/lib/onPortOpen.test.js new file mode 100644 index 0000000000..3b70fe7ce0 --- /dev/null +++ b/server/test/services/arduino/lib/onPortOpen.test.js @@ -0,0 +1,40 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const AvrgirlMock = require('../AvrgirlMock.test'); +const SerialPortMock = require('../SerialPortMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { + 'avrgirl-arduino': AvrgirlMock, + serialport: SerialPortMock, +}); +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); +const deviceData = require('./data/deviceData.json'); + +const deviceManager = { + get: fake.resolves([arduinoData, deviceData]), + getBySelector: fake.resolves(arduinoData), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; +const portOpen = require('../../../../services/arduino/lib/onPortOpen'); + +describe('onPortOpen function', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + arduinoManager.gladys = gladys; + arduinoManager.arduinosPorts['dev/ttyACM0'] = new arduinoManager.SerialPort(); + it('should write on the arduino', async () => { + const message = '{ "function_name": "emit_433_chacon", "parameters": { "data_pin": "4", "code": "1536116352" } }'; + const onPortOpenSpy = spy(portOpen, 'onPortOpen'); + portOpen.onPortOpen(arduinoManager.arduinosPorts['dev/ttyACM0'], message, 1); + assert.calledOnce(onPortOpenSpy); + onPortOpenSpy.restore(); + }); +}); diff --git a/server/test/services/arduino/lib/setup.test.js b/server/test/services/arduino/lib/setup.test.js new file mode 100644 index 0000000000..410d48a939 --- /dev/null +++ b/server/test/services/arduino/lib/setup.test.js @@ -0,0 +1,84 @@ +const { spy, assert, fake } = require('sinon'); +const EventEmitter = require('events'); +const proxyquire = require('proxyquire').noCallThru(); +const AvrgirlMock = require('../AvrgirlMock.test'); + +const ArduinoManager = proxyquire('../../../../services/arduino/lib', { 'avrgirl-arduino': AvrgirlMock }); +const ArduinoMock = require('../ArduinoMock.test'); +const arduinoData = require('./data/arduinoData.json'); + +const falseArduinoData = { + id: '8e25bf9a-4b24-4099-a08d-f4afe323c3a7', + service_id: '1dbaeb48-d6d2-4930-b7ca-f17d637a364b', + room_id: 'null', + name: 'Arduino Mega', + selector: 'arduino-false', + model: null, + external_id: '51bc71ad-816c-4682-9bc2-6840a5036b74', + should_poll: 'false', + poll_frequency: '30000', + createdAt: '2020-05-25T17: 25: 45.129Z', + updatedAt: '2020-05-25T17: 25: 45.129Z', + features: [], + params: [ + { + id: '5b6c5d6f-8756-46af-bfca-f40bb74a14b4', + device_id: '8e25bf9a-4b24-4099-a08d-f4afe323c3a7', + name: 'ARDUINO_PATH', + value: '/dev/ttyAMA0', + createdAt: '2020-05-25T17: 25: 45.168Z', + updatedAt: '2020-05-25T17: 25: 45.168Z', + }, + { + id: '371e873b-b39e-4b84-a87e-e401ce3678ec', + device_id: '8e25bf9a-4b24-4099-a08d-f4afe323c3a7', + name: 'ARDUINO_MODEL', + value: 'fake', + createdAt: '2020-05-25T17: 25: 45.169Z', + updatedAt: '2020-05-25T17: 25: 45.169Z', + }, + ], + room: 'null', + service: { + id: '1dbaeb48-d6d2-4930-b7ca-f17d637a364b', + pod_id: 'null', + name: 'arduino', + selector: 'arduino', + version: '0.1.0', + enabled: 'true', + has_message_feature: 'false', + createdAt: '2020-05-25T17: 07: 00.776Z', + updatedAt: '2020-05-25T17: 07: 00.776Z', + }, +}; + +const deviceManager = { + get: fake.resolves([arduinoData, falseArduinoData]), + getBySelector: fake.resolves(arduinoData), +}; + +const gladys = { + event: new EventEmitter(), + device: deviceManager, + variable: { + getValue: () => Promise.resolve('test'), + }, +}; + +describe('setup method', async () => { + const arduinoManager = new ArduinoManager(ArduinoMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); + it('Should upload an arduino code in the board', async () => { + const setupSpy = spy(arduinoManager, 'setup'); + arduinoManager.gladys = gladys; + await arduinoManager.setup(arduinoData); + assert.calledOnce(setupSpy); + setupSpy.restore(); + }); + it('Should return an error', async () => { + const setupSpy = spy(arduinoManager, 'setup'); + arduinoManager.gladys = gladys; + await arduinoManager.setup(new Error('fake')); + assert.calledOnce(setupSpy); + setupSpy.restore(); + }); +}); diff --git a/server/utils/constants.js b/server/utils/constants.js index 744a1dd131..896f175ac4 100644 --- a/server/utils/constants.js +++ b/server/utils/constants.js @@ -248,6 +248,7 @@ const DEVICE_FEATURE_CATEGORIES = { CO2_SENSOR: 'co2-sensor', COUNTER_SENSOR: 'counter-sensor', LEAK_SENSOR: 'leak-sensor', + RADIO_SENSOR: 'radio-sensor', CAMERA: 'camera', SWITCH: 'switch', SIREN: 'siren', @@ -346,6 +347,15 @@ const DEVICE_POLL_FREQUENCIES = { EVERY_SECONDS: 1 * 1000, }; +const DEVICE_FUNCTION = { + RECV_433: 'recv_433', + EMIT_433: 'emit_433', + EMIT_433_CHACON: 'emit_433_chacon', + EMIT_IR: 'emit_ir', + DHT_TEMPERATURE: 'dht_temperature', + DHT_HUMIDITY: 'dht_humidity', +}; + const WEBSOCKET_MESSAGE_TYPES = { BACKUP: { DOWNLOADED: 'backup.downloaded', @@ -424,6 +434,101 @@ const ERROR_MESSAGES = { NO_CONNECTED_TO_THE_INTERNET: 'NO_CONNECTED_TO_THE_INTERNET', }; +const ARDUINO_MODEL = [ + { + NAME: 'uno', + LABEL: 'Arduino Uno', + }, + { + NAME: 'mega', + LABEL: 'Arduino Mega', + }, + { + NAME: 'adk', + LABEL: 'Arduino ADK', + }, + { + NAME: 'leonardo', + LABEL: 'Arduino Leonardo', + }, + { + NAME: 'micro', + LABEL: 'Arduino Micro', + }, + { + NAME: 'nano', + LABEL: 'Arduino Nano', + }, + { + NAME: 'nano (new bootloader)', + LABEL: 'Arduino Nano (with new bootloader)', + }, + { + NAME: 'lilypad-usb', + LABEL: 'Arduino Lilypad USB', + }, + { + NAME: 'duemilanove168', + LABEL: 'Arduino Duemilanove', + }, + { + NAME: 'yun', + LABEL: 'Arduino Yun', + }, + { + NAME: 'esplora', + LABEL: 'Arduino Esplora', + }, + { + NAME: 'blend-micro', + LABEL: 'RedBearLab Blend Micro', + }, + { + NAME: 'tinyduino', + LABEL: 'Tiny Circuits Tinyduino', + }, + { + NAME: 'sf-pro-micro', + LABEL: 'SparkFun Pro Micro', + }, + { + NAME: 'qduino', + LABEL: 'Qtechknow Qduino', + }, + { + NAME: 'pinoccio', + LABEL: 'Pinoccio Scout', + }, + { + NAME: 'imuduino', + LABEL: 'Femtoduino IMUduino', + }, + { + NAME: 'feather', + LABEL: 'Adafruit Feather 32u4 Basic Proto', + }, + { + NAME: 'arduboy', + LABEL: 'Arduboy', + }, + { + NAME: 'circuit-playground-classic', + LABEL: 'Adafruit Circuit Playground', + }, + { + NAME: 'bqZum', + LABEL: 'BQ ZUM', + }, + { + NAME: 'zumcore2', + LABEL: 'BQ ZUM Core 2', + }, + { + NAME: 'zumjunior', + LABEL: 'BQ ZUM Junior', + }, +]; + const createList = (obj) => { const list = []; Object.keys(obj).forEach((key) => { @@ -451,6 +556,7 @@ const SESSION_TOKEN_TYPE_LIST = createList(SESSION_TOKEN_TYPES); const DEVICE_FEATURE_UNITS_LIST = createList(DEVICE_FEATURE_UNITS); const DASHBOARD_TYPE_LIST = createList(DASHBOARD_TYPE); const DASHBOARD_BOX_TYPE_LIST = createList(DASHBOARD_BOX_TYPE); +const DEVICE_FUNCTION_LIST = createList(DEVICE_FUNCTION); module.exports.STATE = STATE; module.exports.EVENTS = EVENTS; @@ -494,4 +600,9 @@ module.exports.DASHBOARD_TYPE_LIST = DASHBOARD_TYPE_LIST; module.exports.DASHBOARD_BOX_TYPE = DASHBOARD_BOX_TYPE; module.exports.DASHBOARD_BOX_TYPE_LIST = DASHBOARD_BOX_TYPE_LIST; +module.exports.DEVICE_FUNCTION = DEVICE_FUNCTION; +module.exports.DEVICE_FUNCTION_LIST = DEVICE_FUNCTION_LIST; + module.exports.ERROR_MESSAGES = ERROR_MESSAGES; + +module.exports.ARDUINO_MODEL = ARDUINO_MODEL;