From cb4d28a066ff6269d092f412929da59afd8e6430 Mon Sep 17 00:00:00 2001 From: Lauren Murphy Date: Mon, 26 Apr 2021 22:01:30 -0500 Subject: [PATCH] samples: add tensorflow hello world sample Adds Tensorflow Hello World sample to tree. Signed-off-by: Lauren Murphy --- .../tensorflow/hello_world/CMakeLists.txt | 20 ++ .../modules/tensorflow/hello_world/README.rst | 91 +++++++ .../hello_world/images/model_architecture.png | Bin 0 -> 91424 bytes .../modules/tensorflow/hello_world/prj.conf | 17 ++ .../tensorflow/hello_world/sample.yaml | 16 ++ .../tensorflow/hello_world/src/assert.cc | 23 ++ .../tensorflow/hello_world/src/constants.c | 20 ++ .../tensorflow/hello_world/src/constants.h | 35 +++ .../modules/tensorflow/hello_world/src/main.c | 34 +++ .../hello_world/src/main_functions.cc | 135 ++++++++++ .../hello_world/src/main_functions.h | 40 +++ .../tensorflow/hello_world/src/model.cc | 242 ++++++++++++++++++ .../tensorflow/hello_world/src/model.h | 33 +++ .../hello_world/src/output_handler.cc | 26 ++ .../hello_world/src/output_handler.h | 27 ++ samples/modules/tensorflow/tensorflow.rst | 10 + 16 files changed, 769 insertions(+) create mode 100644 samples/modules/tensorflow/hello_world/CMakeLists.txt create mode 100644 samples/modules/tensorflow/hello_world/README.rst create mode 100644 samples/modules/tensorflow/hello_world/images/model_architecture.png create mode 100644 samples/modules/tensorflow/hello_world/prj.conf create mode 100644 samples/modules/tensorflow/hello_world/sample.yaml create mode 100644 samples/modules/tensorflow/hello_world/src/assert.cc create mode 100644 samples/modules/tensorflow/hello_world/src/constants.c create mode 100644 samples/modules/tensorflow/hello_world/src/constants.h create mode 100644 samples/modules/tensorflow/hello_world/src/main.c create mode 100644 samples/modules/tensorflow/hello_world/src/main_functions.cc create mode 100644 samples/modules/tensorflow/hello_world/src/main_functions.h create mode 100644 samples/modules/tensorflow/hello_world/src/model.cc create mode 100644 samples/modules/tensorflow/hello_world/src/model.h create mode 100644 samples/modules/tensorflow/hello_world/src/output_handler.cc create mode 100644 samples/modules/tensorflow/hello_world/src/output_handler.h create mode 100644 samples/modules/tensorflow/tensorflow.rst diff --git a/samples/modules/tensorflow/hello_world/CMakeLists.txt b/samples/modules/tensorflow/hello_world/CMakeLists.txt new file mode 100644 index 00000000000..8ab6ec2695f --- /dev/null +++ b/samples/modules/tensorflow/hello_world/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.13.1) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(tensorflow_hello_world) + +# Required for TensorFlow to compile properly +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") + +target_sources(app PRIVATE + src/assert.cc + src/main.c + src/main_functions.cc + src/constants.c + src/output_handler.cc + src/model.cc + src/model.h + src/output_handler.h + src/constants.h + src/main_functions.h +) diff --git a/samples/modules/tensorflow/hello_world/README.rst b/samples/modules/tensorflow/hello_world/README.rst new file mode 100644 index 00000000000..0174419f5e3 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/README.rst @@ -0,0 +1,91 @@ +.. _tensorflow_hello_world: + +TensorFlow Hello World sample +############################# + +Overview +******** + +This sample TensorFlow application replicates a sine wave and +demonstrates the absolute basics of using TensorFlow Lite Micro. + +The model included with the sample is trained to replicate a +sine function and generates x values to print alongside the +y values predicted by the model. The x values iterate from 0 to +an approximation of 2π. + +The sample also includes a full end-to-end workflow of training +a model and converting it for use with TensorFlow Lite Micro for +running inference on a microcontroller. + +.. Note:: + This README and sample have been modified from + `the TensorFlow Hello World sample for Zephyr`_. + +.. _the TensorFlow Hello World sample for Zephyr: + https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/hello_world + +Building and Running +******************** + +This sample should work on most boards since it does not rely +on any sensors. + +This application can be built and executed on QEMU as follows: + +.. zephyr-app-commands:: + :zephyr-app: samples/tensorflow/hello_world + :host-os: unix + :board: qemu_x86 + :goals: run + :compact: + +Exit QEMU by pressing :kbd:`CTRL+A` :kbd:`x`. + +Sample Output +============= + +.. code-block:: console + + ... + + x_value: 1.0995567*2^1, y_value: 1.6951603*2^-1 + + x_value: 1.2566366*2^1, y_value: 1.1527088*2^-1 + + x_value: 1.4137159*2^1, y_value: 1.1527088*2^-2 + + x_value: 1.5707957*2^1, y_value: -1.0849024*2^-6 + + x_value: 1.7278753*2^1, y_value: -1.0509993*2^-2 + + ... + +The modified sample prints 50 generated-x-and-predicted-y pairs. + +Modifying Sample for Your Own Project +************************************* + +It is recommended that you copy and modify one of the two TensorFlow +samples when creating your own TensorFlow project. To build with +TensorFlow, you must enable the below Kconfig options in your :file:`prj.conf` +and set a flag in your :file:`CMakeLists.txt`. + +:file:`prj.conf`: + +.. code-block:: console + + CONFIG_CPLUSPLUS=y + CONFIG_NEWLIB_LIBC=y + CONFIG_TENSORFLOW_LITE_MICRO=y + +:file:`CMakeLists.txt`: + +.. code-block:: console + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") + +Training +******** +Follow the instructions in the :file:`train/` directory to train your +own model for use in the sample. diff --git a/samples/modules/tensorflow/hello_world/images/model_architecture.png b/samples/modules/tensorflow/hello_world/images/model_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..792d18fab4b25113b2de9a2819b683213220058d GIT binary patch literal 91424 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�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

klG}!`4F{@jg57VGDxfPB`j;#uHD{uic=6$ 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 MQ_@nblShaBAAP&m%>V!Z literal 0 HcmV?d00001 diff --git a/samples/modules/tensorflow/hello_world/prj.conf b/samples/modules/tensorflow/hello_world/prj.conf new file mode 100644 index 00000000000..def96c1e0d0 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/prj.conf @@ -0,0 +1,17 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ==============================================================================s +CONFIG_CPLUSPLUS=y +CONFIG_NEWLIB_LIBC=y +CONFIG_TENSORFLOW_LITE_MICRO=y diff --git a/samples/modules/tensorflow/hello_world/sample.yaml b/samples/modules/tensorflow/hello_world/sample.yaml new file mode 100644 index 00000000000..20e037e8ccf --- /dev/null +++ b/samples/modules/tensorflow/hello_world/sample.yaml @@ -0,0 +1,16 @@ +sample: + description: Hello World TensorFlow sample + name: hello world tensorflow +common: + tags: tensorflow + harness: console + harness_config: + type: multi_line + ordered: false + regex: + - "x_value:.*, y_value:.*" + - "" +tests: + sample.tensorflow.helloworld: + platform_allow: qemu_x86 qemu_x86_64 + tags: tensorflow diff --git a/samples/modules/tensorflow/hello_world/src/assert.cc b/samples/modules/tensorflow/hello_world/src/assert.cc new file mode 100644 index 00000000000..98a2a2a1774 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/assert.cc @@ -0,0 +1,23 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern "C" { + +void __assert_func(const char *, int, const char *, const char *) +{ +} + +} diff --git a/samples/modules/tensorflow/hello_world/src/constants.c b/samples/modules/tensorflow/hello_world/src/constants.c new file mode 100644 index 00000000000..a0fcbc149dc --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/constants.c @@ -0,0 +1,20 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "constants.h" + +/* This is a small number so that it's easy to read the logs */ +const int kInferencesPerCycle = 20; diff --git a/samples/modules/tensorflow/hello_world/src/constants.h b/samples/modules/tensorflow/hello_world/src/constants.h new file mode 100644 index 00000000000..e7e652c1721 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/constants.h @@ -0,0 +1,35 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ + +/* This constant represents the range of x values our model was trained on, + * which is from 0 to (2 * Pi). We approximate Pi to avoid requiring additional + * libraries. + */ +const float kXrange = 2.f * 3.14159265359f; + +/* This constant determines the number of inferences to perform across the range + * of x values defined above. Since each inference takes time, the higher this + * number, the more time it will take to run through the entire range. The value + * of this constant can be tuned so that one full cycle takes a desired amount + * of time. Since different devices take different amounts of time to perform + * inference, this value should be defined per-device. + */ +extern const int kInferencesPerCycle; + +#endif /* TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ */ diff --git a/samples/modules/tensorflow/hello_world/src/main.c b/samples/modules/tensorflow/hello_world/src/main.c new file mode 100644 index 00000000000..66263882f4b --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/main.c @@ -0,0 +1,34 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "main_functions.h" + +#define NUM_LOOPS 50 + +/* This is the default main used on systems that have the standard C entry + * point. Other devices (for example FreeRTOS or ESP32) that have different + * requirements for entry code (like an app_main function) should specialize + * this main.cc file in a target-specific subfolder. + */ +int main(int argc, char *argv[]) +{ + setup(); + /* Note: Modified from original while(true) to accommodate CI */ + for (int i = 0; i < NUM_LOOPS; i++) { + loop(); + } + return 0; +} diff --git a/samples/modules/tensorflow/hello_world/src/main_functions.cc b/samples/modules/tensorflow/hello_world/src/main_functions.cc new file mode 100644 index 00000000000..fbc5096c499 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/main_functions.cc @@ -0,0 +1,135 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "main_functions.h" + +#include +#include "constants.h" +#include "model.h" +#include "output_handler.h" +#include +#include +#include +#include + +/* Globals, used for compatibility with Arduino-style sketches. */ +namespace { + tflite::ErrorReporter *error_reporter = nullptr; + const tflite::Model *model = nullptr; + tflite::MicroInterpreter *interpreter = nullptr; + TfLiteTensor *input = nullptr; + TfLiteTensor *output = nullptr; + int inference_count = 0; + + /* Create an area of memory to use for input, output, and intermediate arrays. + * Minimum arena size, at the time of writing. After allocating tensors + * you can retrieve this value by invoking interpreter.arena_used_bytes(). + */ + const int kModelArenaSize = 2468; + + /* Extra headroom for model + alignment + future interpreter changes. */ + const int kExtraArenaSize = 560 + 16 + 100; + const int kTensorArenaSize = kModelArenaSize + kExtraArenaSize; + uint8_t tensor_arena[kTensorArenaSize]; +} /* namespace */ + +/* The name of this function is important for Arduino compatibility. */ +void setup(void) +{ + /* Set up logging. Google style is to avoid globals or statics because of + * lifetime uncertainty, but since this has a trivial destructor it's okay. + * NOLINTNEXTLINE(runtime-global-variables) + */ + static tflite::MicroErrorReporter micro_error_reporter; + + error_reporter = µ_error_reporter; + + /* Map the model into a usable data structure. This doesn't involve any + * copying or parsing, it's a very lightweight operation. + */ + model = tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + /* This pulls in all the operation implementations we need. + * NOLINTNEXTLINE(runtime-global-variables) + */ + static tflite::AllOpsResolver resolver; + + /* Build an interpreter to run the model with. */ + static tflite::MicroInterpreter static_interpreter( + model, resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + /* Allocate memory from the tensor_arena for the model's tensors. */ + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); + return; + } + + /* Obtain pointers to the model's input and output tensors. */ + input = interpreter->input(0); + output = interpreter->output(0); + + /* Keep track of how many inferences we have performed. */ + inference_count = 0; +} + +/* The name of this function is important for Arduino compatibility. */ +void loop(void) +{ + /* Calculate an x value to feed into the model. We compare the current + * inference_count to the number of inferences per cycle to determine + * our position within the range of possible x values the model was + * trained on, and use this to calculate a value. + */ + float position = static_cast < float > (inference_count) / + static_cast < float > (kInferencesPerCycle); + float x_val = position * kXrange; + + /* Place our calculated x value in the model's input tensor */ + input->data.f[0] = x_val; + + /* Run inference, and report any error */ + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed on x_val: %f\n", + static_cast < double > (x_val)); + return; + } + + /* Read the predicted y value from the model's output tensor */ + float y_val = output->data.f[0]; + + /* Output the results. A custom HandleOutput function can be implemented + * for each supported hardware target. + */ + HandleOutput(error_reporter, x_val, y_val); + + /* Increment the inference_counter, and reset it if we have reached + * the total number per cycle + */ + inference_count += 1; + if (inference_count >= kInferencesPerCycle) { + inference_count = 0; + } +} diff --git a/samples/modules/tensorflow/hello_world/src/main_functions.h b/samples/modules/tensorflow/hello_world/src/main_functions.h new file mode 100644 index 00000000000..058385c4d45 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/main_functions.h @@ -0,0 +1,40 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ + +/* Expose a C friendly interface for main functions. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Initializes all data needed for the example. The name is important, and needs + * to be setup() for Arduino compatibility. + */ +void setup(void); + +/* Runs one iteration of data gathering and inference. This should be called + * repeatedly from the application code. The name needs to be loop() for Arduino + * compatibility. + */ +void loop(void); + +#ifdef __cplusplus +} +#endif + +#endif /* TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ */ diff --git a/samples/modules/tensorflow/hello_world/src/model.cc b/samples/modules/tensorflow/hello_world/src/model.cc new file mode 100644 index 00000000000..1efb73152e2 --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/model.cc @@ -0,0 +1,242 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically created from a TensorFlow Lite flatbuffer using the command: + * xxd -i model.tflite > model.cc + * + * This is a standard TensorFlow Lite model file that has been converted into a + * C data array, so it can be easily compiled into a binary for devices that + * don't have a file system. + * + * See train/README.md for a full description of the creation process. + */ + +#include "model.h" + +/* Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. */ +alignas(8) const unsigned char g_model[] = { + 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x12, 0x00, + 0x1c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x60, 0x09, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, + 0x0c, 0x02, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, + 0x7c, 0xfd, 0xff, 0xff, 0x80, 0xfd, 0xff, 0xff, 0x84, 0xfd, 0xff, 0xff, + 0x88, 0xfd, 0xff, 0xff, 0x22, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, + 0x9f, 0x0a, 0x00, 0x00, 0x65, 0x06, 0x00, 0x00, 0x3d, 0xf8, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0x2f, 0xf8, 0xff, 0xff, + 0xe8, 0x04, 0x00, 0x00, 0x21, 0x0a, 0x00, 0x00, 0x46, 0xfe, 0xff, 0xff, + 0xc8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xf7, 0xff, 0xff, + 0x28, 0xf9, 0xff, 0xff, 0x9a, 0x05, 0x00, 0x00, 0x6e, 0xfe, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x73, 0x1c, 0x11, 0xe1, + 0x0c, 0x81, 0xa5, 0x43, 0xfe, 0xd5, 0xd5, 0xb2, 0x60, 0x77, 0x19, 0xdf, + 0x8a, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x47, 0xf6, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x92, 0x07, 0x00, 0x00, 0xf4, 0xf4, 0xff, 0xff, 0x55, 0xf0, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xee, 0xfc, 0x00, 0xec, 0x05, 0x16, 0xef, 0xec, + 0xe6, 0xf8, 0x03, 0x01, 0x00, 0xfa, 0xf8, 0xf5, 0xda, 0xeb, 0x27, 0x14, + 0xef, 0xde, 0xe2, 0xda, 0xf0, 0xdf, 0x32, 0x06, 0x01, 0xe6, 0xee, 0xf9, + 0x00, 0x16, 0x07, 0xe0, 0xfe, 0xff, 0xe9, 0x05, 0xe7, 0xef, 0x81, 0x1b, + 0x18, 0xea, 0xca, 0x01, 0x0f, 0x00, 0xdb, 0xf7, 0x0e, 0xec, 0x12, 0x1e, + 0x04, 0x13, 0xb2, 0xe7, 0xfd, 0x06, 0xbb, 0xe0, 0x0c, 0xec, 0xf0, 0xdf, + 0xeb, 0xf7, 0x05, 0x26, 0x19, 0xe4, 0x70, 0x1a, 0xea, 0x1e, 0x34, 0xdf, + 0x19, 0xf3, 0xf1, 0x19, 0x0e, 0x03, 0x1b, 0xe1, 0xde, 0x13, 0xf6, 0x19, + 0xff, 0xf6, 0x1a, 0x17, 0xf1, 0x1c, 0xdb, 0x1a, 0x1a, 0x20, 0xe6, 0x19, + 0xf5, 0xff, 0x97, 0x0b, 0x00, 0x00, 0xce, 0xdf, 0x0d, 0xf7, 0x15, 0xe4, + 0xed, 0xfc, 0x0d, 0xe9, 0xfb, 0xec, 0x5c, 0xfc, 0x1d, 0x02, 0x58, 0xe3, + 0xe0, 0xf4, 0x15, 0xec, 0xf9, 0x00, 0x13, 0x05, 0xec, 0x0c, 0x1c, 0x14, + 0x0c, 0xe9, 0x0a, 0xf4, 0x18, 0x00, 0xd7, 0x05, 0x27, 0x02, 0x15, 0xea, + 0xea, 0x02, 0x9b, 0x00, 0x0c, 0xfa, 0xe9, 0xea, 0xfe, 0x01, 0x14, 0xfd, + 0x0b, 0x02, 0xf0, 0xef, 0x06, 0xee, 0x01, 0x0d, 0x06, 0xe7, 0xf7, 0x11, + 0xf5, 0x0a, 0xf9, 0xf1, 0x23, 0xff, 0x0d, 0xf2, 0xec, 0x11, 0x26, 0x1d, + 0xf2, 0xea, 0x28, 0x18, 0xe0, 0xfb, 0xf3, 0xf4, 0x05, 0x1c, 0x1d, 0xfb, + 0xfd, 0x1e, 0xfc, 0x11, 0xe8, 0x06, 0x09, 0x03, 0x12, 0xf2, 0x35, 0xfb, + 0xdd, 0x1b, 0xf9, 0xef, 0xf3, 0xe7, 0x6f, 0x0c, 0x1d, 0x00, 0x43, 0xfd, + 0x0d, 0xf1, 0x0a, 0x19, 0x1a, 0xfa, 0xe0, 0x18, 0x1e, 0x13, 0x37, 0x1c, + 0x12, 0xec, 0x3a, 0x0c, 0xb6, 0xcb, 0xe6, 0x13, 0xf7, 0xeb, 0xf1, 0x05, + 0x1b, 0xfa, 0x19, 0xe5, 0xec, 0xcf, 0x0c, 0xf4, 0xe2, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0xa2, 0x8c, 0xc9, + 0x5f, 0x1d, 0xce, 0x41, 0x9f, 0xcd, 0x20, 0xb1, 0xdf, 0x53, 0x2f, 0x81, + 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe2, 0xee, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x54, 0x4f, 0x43, 0x4f, + 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xbc, 0xf9, 0xff, 0xff, + 0x48, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xca, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xba, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x07, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, + 0x54, 0x04, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, + 0xd0, 0x02, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, + 0x5c, 0x01, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0xff, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc2, 0xfb, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xba, 0x2b, 0x4f, 0x38, 0x20, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, + 0x73, 0x65, 0x5f, 0x34, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x5f, + 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2a, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x2c, 0xfd, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb9, 0x36, 0x0b, 0x3c, + 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x34, + 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x2f, 0x52, 0x65, 0x61, 0x64, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xaa, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x6c, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x9c, 0xfc, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xaa, 0x7b, 0xbe, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0xbd, 0xbd, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x33, + 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2a, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2c, 0xfe, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xe3, 0x04, 0x20, 0x39, 0x20, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, + 0x73, 0x65, 0x5f, 0x33, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x5f, + 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x92, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x94, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x76, 0x51, 0x3c, + 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x33, + 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x2f, 0x52, 0x65, 0x61, 0x64, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x12, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x6c, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0xfe, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd2, 0x91, 0x43, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x40, 0xce, 0x42, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, + 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x92, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0xb3, 0xd9, 0x38, 0x20, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x31, + 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, + 0x4d, 0x75, 0x6c, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xd5, 0x6b, 0x8a, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x31, 0x2f, 0x64, 0x65, 0x6e, + 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x2f, + 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x4f, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x8a, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x5d, 0x4f, 0xc9, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x0e, 0x86, 0xc8, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0xde, 0x0a, 0x3c, + 0x01, 0x00, 0x00, 0x00, 0x66, 0x64, 0x87, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x13, 0x42, 0x8d, 0xbf, 0x0d, 0x00, 0x00, 0x00, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x72, 0x0a, 0x00, 0x0c, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x00 +}; +const int g_model_len = 2512; diff --git a/samples/modules/tensorflow/hello_world/src/model.h b/samples/modules/tensorflow/hello_world/src/model.h new file mode 100644 index 00000000000..384ff67868f --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/model.h @@ -0,0 +1,33 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically created from a TensorFlow Lite flatbuffer using the command: + * xxd -i model.tflite > model.cc + * + * This is a standard TensorFlow Lite model file that has been converted into a + * C data array, so it can be easily compiled into a binary for devices that + * don't have a file system. + * + * See train/README.md for a full description of the creation process. + */ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ + +extern const unsigned char g_model[]; +extern const int g_model_len; + +#endif /* TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ */ diff --git a/samples/modules/tensorflow/hello_world/src/output_handler.cc b/samples/modules/tensorflow/hello_world/src/output_handler.cc new file mode 100644 index 00000000000..31778c3da7c --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/output_handler.cc @@ -0,0 +1,26 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "output_handler.h" + +void HandleOutput(tflite::ErrorReporter *error_reporter, float x_value, + float y_value) +{ + /* Log the current X and Y values */ + TF_LITE_REPORT_ERROR(error_reporter, "x_value: %f, y_value: %f\n", + static_cast < double > (x_value), + static_cast < double > (y_value)); +} diff --git a/samples/modules/tensorflow/hello_world/src/output_handler.h b/samples/modules/tensorflow/hello_world/src/output_handler.h new file mode 100644 index 00000000000..dbf51ebe8fb --- /dev/null +++ b/samples/modules/tensorflow/hello_world/src/output_handler.h @@ -0,0 +1,27 @@ +/* + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ + +#include +#include + +/* Called by the main loop to produce some output based on the x and y values */ +void HandleOutput(tflite::ErrorReporter *error_reporter, float x_value, + float y_value); + +#endif /* TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ */ diff --git a/samples/modules/tensorflow/tensorflow.rst b/samples/modules/tensorflow/tensorflow.rst new file mode 100644 index 00000000000..7cb1b72a0d4 --- /dev/null +++ b/samples/modules/tensorflow/tensorflow.rst @@ -0,0 +1,10 @@ +.. _tensorflow-samples: + +TensorFlow Samples +################## + +.. toctree:: + :maxdepth: 1 + :glob: + + **/*