diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a81c8ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,138 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..0dd9298 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,31 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-20.04 + tools: + python: "3.7" + # You can also specify other tool versions: + # nodejs: "16" + # rust: "1.55" + # golang: "1.17" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + +# If using Sphinx, optionally build your docs in additional formats such as PDF +# formats: +# - pdf + +# Optionally declare the Python requirements required to build your docs +python: + install: + - method: pip + path: . + - requirements: docs/requirements.txt \ No newline at end of file diff --git a/README.md b/README.md index 70b415e..7fe7e44 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,75 @@ # REEM -REEM (Redis Extendable Efficient Middleware) is a centralized middleware package for robotic communication. It is designed to be a single-package solution for passing information anywhere in the robot while emphasizing ease of use and efficiency. +Author: Trishul Nagenalli and Kris Hauser -To make it easy, we chose to model information as a nested data structure that closely resembles python dictionaries. To the user, working with a database feels like working with a python dictionary. Out of the box, REEM supports communicating all native python types and numpy arrays. +## About -To make it fast, we used [Redis](https://redis.io/) (an in-memory key-value database) running [ReJSON](https://oss.redislabs.com/redisjson/) (enabling Redis to store JSON data) as a central information store. To get maximum performance, we give users the power to control exactly how information is passed between the local program and Redis by defining their own encoder/decoder objects. +REEM (Redis Extendable Efficient Middleware) is a middleware package for communication across distributed systems (e.g., robots) using a centralized Redis database. It is designed to be a single-package solution for passing information anywhere in a system while emphasizing ease of use and efficiency. + +- REEM is easy to use. You can read or write data from the database using a nested data structure that feels almost like working with native Python dictionaries, lists, strings, numbers, and Numpy arrays. If you feel ReJSON is a little clumsy, REEM may be just the tool for you. +- REEM is fast. We use [Redis](https://redis.io/) (an in-memory key-value database) running [ReJSON](https://oss.redislabs.com/redisjson/) (enabling Redis to store JSON data) as a central information store. This can support hundreds of thousands of queries per second. We also support Pythonic access to array extension, length queries, +- REEM is extendable. If you want to store some complex Python object, we give users the power to control exactly how information is passed between the local program and Redis by defining custom marshallers. REEM comes with builtin marshallers for Numpy arrays. REEM currently offers two communication paradigms: -- get/set database +- get/set key-value store - publish-subscribe +In other projects, we have used these primitives implement other paradigms, such as streams, event queues, and RPC. + + +## Installation + +REEM is highly portable and runs on Python 3.3+. + To install the python package (and its dependencies), run ``` pip install reem ``` -See the docs on [read the docs](https://reem.readthedocs.io) +You will also need to have access to a Redis server with RedisJSON enabled. See the [setup tutorial](https://reem.readthedocs.io/en/latest/gettingstarted.html) for step-by-step instructions on installing and configuring a compatible local Redis server. + +## Tutorials and API documentation +See [example.py](https://www.github.com/krishauser/reem/blob/master/example.py) or the docs on [read the docs](https://reem.readthedocs.io). + + + +## Version history + +0.1.3: +- Updated to require redis-py 4.0.0+. API is still backwards-compatible with redis-py 3.5+ (which requires rejson). +- Added `with` syntax on key-value store accessors which allows you to make many updates to an object without bogging down the Redis server. Usage is `with kvs['key'] as val: foo(val)` which is equivalent to `val=kvs['key'].read(); foo(val); kvs['key'] = val` and often much faster than `foo(kvs['key'])` if `foo` performs lots of reads and writes. +- Useless `RedisInterface.initialize()` method removed. +- Accessor `KeyValueStore.get(key)` will not fail if the top-level key exists on the Redis server but hasn't been pulled in this client. +- Added new convenience structure `TolerantKeyValueStore` which will automatically create uninitialized subkeys, throttle frequent reads, and accept both `.`-separated strings and lists of indexes as keys. + +0.1.2: +- bug fixes in pub/sub implementation. +- Added `get(key,default_value)` to subkey accessor analogous to dict's `get` method. + +0.1.1: +- added `get()` and `set()` to KeyValueStore for direct access to Rejson's JSON.GET / JSON.SET. +0.1.0: fork by Kris Hauser +- Can now access items by array index. +- Much easier to work with items like normal Python objects. Can: + - Can treat accesssors as variables using `read()` and `write()`, e.g., `var = server['key']; var.read(); var.write(x)`. (See bug fix note below). + - Delete items via `del server['key']` or `del server['key']['subkey']` (uses Rejson's JSON.DEL) + - Increment/decrement values via `server['key']['subkey'] += 1` or `-=` (uses Rejson's JSON.NUMINCRBY). Note: does not work for Numpy arrays. + - Multiply/divide values via `server['key']['subkey'] *= 2` or `/=` (uses Rejson's JSON.NUMMULTBY). Note: does not work for Numpy arrays. + - Append to arrays via `server['key'].append(x)` or `server['key']['subkey'].append(x)` (uses Rejson's JSON.ARRAPPEND) + - Multiple append to arrays via `server['key'] += [x,y,z]` or `server['key']['subkey'] += [x,y,z]` (uses Rejson's JSON.ARRAPPEND) + - Get sizes of arrays/objects using `len(server['key'])` or `len(server['key']['subkey'])` (uses Rejson's JSON.OBJLEN or JSON.ARRLEN) + - Get types of items using `server['key'].type()` or `server['key']['subkey'].type()` (uses Rejson's JSON.TYPE) +- KeyValueStore, PublishSpace, SilentSubscriber, and CallbackSubscriber are now in the global reem namespace. Also, they can be given a string host rather than separately having to create a RedisInterface object. +- KeyValueStore and PublishSpace are now thread safe. (Note: not thoroughly tested yet). +- Objects retrieved by ['key'] no longer get clobbered when accessing ['subkey']. E.g., + ``` + kvs['topkey'] = {'subkey':{'foo':3}} + a = kvs['topkey'] + b = a['subkey'] + b['foo'] = 4 + print(a.read()) #prior version unexpected prints {'subkey':{'foo':3},'foo':4}, new version prints {'subkey'{'foo':4}} as expected. + ``` +- Slight performance improvements for deeply nested accesses +- Python 2 version automatically returns json objects with keys / values as str instead of unicode. +0.0.x: original from Trishul Nagenalli diff --git a/docs/_build/doctrees/advanced.doctree b/docs/_build/doctrees/advanced.doctree deleted file mode 100644 index bc967b6..0000000 Binary files a/docs/_build/doctrees/advanced.doctree and /dev/null differ diff --git a/docs/_build/doctrees/basic.doctree b/docs/_build/doctrees/basic.doctree deleted file mode 100644 index bfe0295..0000000 Binary files a/docs/_build/doctrees/basic.doctree and /dev/null differ diff --git a/docs/_build/doctrees/docs.doctree b/docs/_build/doctrees/docs.doctree deleted file mode 100644 index a277a55..0000000 Binary files a/docs/_build/doctrees/docs.doctree and /dev/null differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle deleted file mode 100644 index c8417fb..0000000 Binary files a/docs/_build/doctrees/environment.pickle and /dev/null differ diff --git a/docs/_build/doctrees/examples.doctree b/docs/_build/doctrees/examples.doctree deleted file mode 100644 index cdc7233..0000000 Binary files a/docs/_build/doctrees/examples.doctree and /dev/null differ diff --git a/docs/_build/doctrees/gettingstarted.doctree b/docs/_build/doctrees/gettingstarted.doctree deleted file mode 100644 index 57914af..0000000 Binary files a/docs/_build/doctrees/gettingstarted.doctree and /dev/null differ diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree deleted file mode 100644 index 8ea9a0c..0000000 Binary files a/docs/_build/doctrees/index.doctree and /dev/null differ diff --git a/docs/_build/doctrees/performance.doctree b/docs/_build/doctrees/performance.doctree deleted file mode 100644 index 5c83374..0000000 Binary files a/docs/_build/doctrees/performance.doctree and /dev/null differ diff --git a/docs/_build/doctrees/server-utilities.doctree b/docs/_build/doctrees/server-utilities.doctree deleted file mode 100644 index 416b12e..0000000 Binary files a/docs/_build/doctrees/server-utilities.doctree and /dev/null differ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo deleted file mode 100644 index 851c21d..0000000 --- a/docs/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c83b6e0ae8ae470d6779f033baf82a84 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_images/browser_screen_cap.png b/docs/_build/html/_images/browser_screen_cap.png deleted file mode 100644 index 542643f..0000000 Binary files a/docs/_build/html/_images/browser_screen_cap.png and /dev/null differ diff --git a/docs/_build/html/_images/numpy_get_fr.png b/docs/_build/html/_images/numpy_get_fr.png deleted file mode 100644 index 696333d..0000000 Binary files a/docs/_build/html/_images/numpy_get_fr.png and /dev/null differ diff --git a/docs/_build/html/_images/numpy_set_fr.png b/docs/_build/html/_images/numpy_set_fr.png deleted file mode 100644 index 4e7acba..0000000 Binary files a/docs/_build/html/_images/numpy_set_fr.png and /dev/null differ diff --git a/docs/_build/html/_images/pottery_comparison.png b/docs/_build/html/_images/pottery_comparison.png deleted file mode 100644 index 75b379f..0000000 Binary files a/docs/_build/html/_images/pottery_comparison.png and /dev/null differ diff --git a/docs/_build/html/_images/reem_v_pottery.png b/docs/_build/html/_images/reem_v_pottery.png deleted file mode 100644 index 08ef83b..0000000 Binary files a/docs/_build/html/_images/reem_v_pottery.png and /dev/null differ diff --git a/docs/_build/html/_images/set_numpy.png b/docs/_build/html/_images/set_numpy.png deleted file mode 100644 index cba24f1..0000000 Binary files a/docs/_build/html/_images/set_numpy.png and /dev/null differ diff --git a/docs/_build/html/_images/set_string.png b/docs/_build/html/_images/set_string.png deleted file mode 100644 index 4058c43..0000000 Binary files a/docs/_build/html/_images/set_string.png and /dev/null differ diff --git a/docs/_build/html/_images/subscriber_oh.png b/docs/_build/html/_images/subscriber_oh.png deleted file mode 100644 index 0d3b98f..0000000 Binary files a/docs/_build/html/_images/subscriber_oh.png and /dev/null differ diff --git a/docs/_build/html/_sources/advanced.rst.txt b/docs/_build/html/_sources/advanced.rst.txt deleted file mode 100644 index daab9f8..0000000 --- a/docs/_build/html/_sources/advanced.rst.txt +++ /dev/null @@ -1,38 +0,0 @@ -Advanced Usage -================================ - -This section explains less common functionality of REEM. - -Custom Datatypes -***************** - -REEM is designed to be customizable. Out of the box, it supports transferring native python types and numpy arrays. -You can, however, define how any type of data is stored in Redis using a ``Ship`` object. - -Inside the module, ``reem.ships`` is the abstract class ``SpecialDatatypeShip``. If you define your own ship, you must -subclass ``SpecialDatatypeShip`` and fill in the methods. The class's documentation is below - -.. autoclass:: reem.ships.SpecialDatatypeShip - :members: - -To use a ship, include it as an argument when creating a ``RedisInterface`` object. - -.. code-block:: python - - interface = RedisInterface(host="localhost", ships=[CustomShip()]) - - -**Numpy Arrays** - -Numpy Arrays are stored in Redis through ships. If you want to keep the default ship for numpy arrays when including -your custom ships, you must include the default numpy ship in your list of ships. - -.. code-block:: python - - interface = RedisInterface(host="localhost", ships=[reem.ships.NumpyShip(), CustomShip()]) - - -See the implementation of the Numpy Ship below - -.. literalinclude:: ../reem/ships.py - :lines: 90- \ No newline at end of file diff --git a/docs/_build/html/_sources/basic.rst.txt b/docs/_build/html/_sources/basic.rst.txt deleted file mode 100644 index 409ed72..0000000 --- a/docs/_build/html/_sources/basic.rst.txt +++ /dev/null @@ -1,218 +0,0 @@ -Basic Usage -================================ - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - -This page explains how to use database and publish/subscribe paradigms with REEM. - -Initialization -############### - -Before any information can be passed to a Redis server, we need to specify how to contact the server. -A ``RedisInterface`` object is meant to represent a connection to a specific server. Instantiate it and call initialize -before attaching any datatypes to it. You must specify the host as the IP address of the server running Redis -(or localhost). If no host is provided, **the default argument for host is localhost** - -.. code-block:: python - - from reem.connection import RedisInterface - interface = RedisInterface(host="localhost") - interface.initialize() - -Key Value Store -################# - -The ``KeyValueStore`` object is meant to be your way of interacting with Redis as a nested database server. -You should treat a ``KeyValueStore`` object as though it were a python dictionary that can -contain native python types and numpy arrays. When you set something inside this "dictionary", the corresponding -entry will be set in Redis. Reading the "dictionary" will read the corresponding entry in Redis. - -The ``KeyValueStore`` is instantiated with a ``RedisInterface`` object, identifying what Redis server it is connected -to. - -.. code-block:: python - - from reem.datatypes import KeyValueStore - server = KeyValueStore(interface) - -The below code illustrates: - -- To set an item in Redis, the syntax is identical to that setting a path in a Python dictionary -- To get an item from Redis, the syntax is the same as a dictionary's but you must call ``.read()`` on the final path. - -.. code-block:: python - - data = {'number': 1000, 'string': 'REEM'} - server["foo"] = flat_data - - bar = server["foo"].read() - # Sets bar = {'number': 1000, 'string': 'REEM'} - - bar = server["foo"]["number"].read() - # Sets bar = 1000 - - -**Limitations** - -1. Cannot use non-string Keys - -.. code-block:: python - - server["foo"] = {0:"zero", 1:"one"} # Not Okay - server["foo"] = {"0":"zero", "1":"one"} # Okay - -REEM assumes all keys are strings to avoid having to parse JSON keys to determine if they are strings or numbers. - -2. Cannot have a list with non-serializable types. - -.. code-block:: python - - server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay - server["foo"] = {"bar":[3, 4]} # Okay - -REEM does not presently check lists for non serializable types. We hope to allow this in a future release. -For now, we ask you substitute the list with a dictionary - -.. code-block:: python - - server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay - server["foo"] = {"bar":{"arr1": np.arange(3), "arr2": np.arange(4)}} # Okay - - - -Publish/Subscribe -################# - -Publishing and subscribing is implemented with a single type of publisher and two types of subscribers. - -Publisher ----------- - -Publishers are implemented with the ``PublisherSpace`` class and are instantiated with a ``RedisInterface``. -You may treat a ``PublishSpace`` like an python dictionary that you CANNOT read. - -.. code-block:: python - - from reem.datatypes import PublishSpace - publisher = PublishSpace(interface) - - -When you set something inside this "dictionary" the publisher broadcasts a message indicating what path was updated. -All subscribers listening to that path are notified and act accordingly. - -.. code-block:: python - - data = {"image": np.random.rand(640, 480, 3), "id": 0} - - # publishes raw_image - publisher["raw_image"] = data - - # publishes raw_image.id - publisher["raw_image"]["id"] = 1 - - -All limitations that apply to ``KeyValueStore`` apply to ``PublishSpace`` as well. -``PublishSpace`` is a subclass of ``KeyValueStore``. - -Subscribers ------------- - -Subscribes listen to a key on the Redis Server and will act based on changes to that key OR its sub-keys. -For example a subscriber to the key "raw_image" will be notified if "raw_image" is freshly uploaded -by a publisher and if the path "raw_image.id" is updated. - -A subscriber's ``.listen()`` method must be called for it to start listening to Redis updates. - -Subscribing has two implementations - -Silent Subscribers -^^^^^^^^^^^^^^^^^^^^ - -A silent subscriber acts like a local variable that mimics the data in Redis -underneath the key indicated by its channel. It will silently update as fast as it can without notifying the -user that an update occurred. Use it if you would like a variable that just keeps the latest copy of Redis information -at all times. - -The ``SilentSubscriber`` is initialized with a channel name and an interface. The channel represents the path inside -the RedisServer this subscriber should listen to. Initialization is as below - -.. code-block:: python - - from reem.datatypes import SilentSubscriber - subscriber = SilentSubscriber(channel="silent_channel", interface=interface) - subscriber.listen() - - -The below code illustrates how to read data from a subscriber. - -.. code-block:: python - - publisher["silent_channel"] = {"number": 5, "string":"REEM"} - time.sleep(0.01) - - foo = subscriber["number"].read() - # foo = 5 - foo = subscriber.value() - # foo = {"number": 5, "string":"REEM"} - - publisher["silent_channel"] = 5 - time.sleep(0.01) - - foo = subscriber.value() - # foo = 5 - -**Note:** The ``.read()`` method does not go to -Redis but copies the value at that path in the local variable. This is faster than the ``.read()`` method used by -the ``KeyValueStore`` which does go to Redis. - - - -Callback Subscribers -^^^^^^^^^^^^^^^^^^^^ - - -Callback Subscribers listen to a key in Redis and execute a user-specified function when an update occurs. -They are instantiated with an interface, a channel name, a function, and a dictionary specifying keyword -arguments to the function. - -Instantiation is as below - -.. code-block:: python - - def callback(data, updated_path, foo): - print("Foo = {}".format(foo)) - print("Data = {}".format(data)) - - # Initialize a callback subscriber - subscriber = CallbackSubscriber(channel="callback_channel", - interface=interface, - callback_function=callback, - kwargs={"foo":5}) - subscriber.listen() - -**The Callback Function** - -The callback function must have ``data`` and ``updated_path`` as it's first two arguments. When a publisher sets a key, -``data`` gives the entire updated data structure below the key and ``updated_path`` tells what path was updated. -Further arguments can be passed as keyword arguments set during the instantiation of subscriber. - - -If the publisher executes - -.. code-block:: python - - publisher["callback_channel"] = {"number": 5, "string": "REEM"} - publisher["callback_channel"]["number"] = 6 - -The subscriber program will have the following output: - -.. code-block:: console - - Foo = 5 - Updated Path = callback_channel - Data = {'number': 6, 'string': 'REEM'} - Foo = 5 - Updated Path = callback_channel.number - Data = {'number': 6, 'string': 'REEM'} \ No newline at end of file diff --git a/docs/_build/html/_sources/docs.rst.txt b/docs/_build/html/_sources/docs.rst.txt deleted file mode 100644 index 13a163a..0000000 --- a/docs/_build/html/_sources/docs.rst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Docs -================== - - -.. automodule:: reem.datatypes - :members: - :private-members: - :inherited-members: - - diff --git a/docs/_build/html/_sources/examples.rst.txt b/docs/_build/html/_sources/examples.rst.txt deleted file mode 100644 index 70b7987..0000000 --- a/docs/_build/html/_sources/examples.rst.txt +++ /dev/null @@ -1,64 +0,0 @@ -Examples -================== - - -Image Processing System -######################### - -Below is an example of what an image processing system might look like. In this robot, there are three components. The -robot's computation flow is as below - -1. A camera takes an image and posts it to Redis -2. A computer processes that image and posts the result to Redis. Here, the process is just to compute the mean value of the image. -3. An actuator reads the result of the computation and does something with it. Here, it just logs it. - -All the code and each component's logs can be found in the `repository `_ - -Camera -^^^^^^^^^^^^^^^^^^ -.. literalinclude:: ../examples/ImageProcessing/camera.py - -Processor -^^^^^^^^^^^^^^^^^^ -.. literalinclude:: ../examples/ImageProcessing/processor.py - -Actuator -^^^^^^^^^^^^^^^^^^ -.. literalinclude:: ../examples/ImageProcessing/actuator.py - - - -Arm Actuator -######################### - -This examples tries to mimic a system where one computer is responsible for actuating motors at a specific frequency -while the set point is controlled by another computer at a different frequency. - -We have implemented in two ways - using a database paradigm and a publish/subscribe paradigm. - -All the code and each component's logs can be found in the `repository `_ - - - -Database -^^^^^^^^^ - -Controller ------------ -.. literalinclude:: ../examples/ArmActuator/kvs/controller.py - -Actuator ------------ -.. literalinclude:: ../examples/ArmActuator/kvs/actuator.py - - -Publish/Subscribe -^^^^^^^^^^^^^^^^^^^^ - -Controller ------------ -.. literalinclude:: ../examples/ArmActuator/pubsub/controller.py - -Actuator ------------ -.. literalinclude:: ../examples/ArmActuator/pubsub/actuator.py \ No newline at end of file diff --git a/docs/_build/html/_sources/gettingstarted.rst.txt b/docs/_build/html/_sources/gettingstarted.rst.txt deleted file mode 100644 index a8453ee..0000000 --- a/docs/_build/html/_sources/gettingstarted.rst.txt +++ /dev/null @@ -1,171 +0,0 @@ -Set Up Tutorial -================================ - -In REEM, data is passed between client programs and a centralized Redis server. -This tutorial will demonstrate how to set -up the server and connect to it with a REEM client. Both the server -and client will run on the local machine. - - -Requirements: - - - Python 3 - - Linux/macOS (ReJSON requirement, though you can run ReJSON with Docker on Windows) - - -Server -############# - -This section goes through how to set up a server. REEM runs on Redis and requires the ReJSON module. We -will install both and check that they are working. - -Redis -****** - -The following script will download and build Redis with supporting packages from source inside -a folder called ``database-server``. -REEM has been tested with Redis version 5.0.4. You may want to pull the latest version of Redis in the future. Change the -versioning in the script appropriately - -DO NOT install Redis through ``apt-get install redis-server`` -This will install Redis 3 which does not support modules. You will not be able to run REEM. - -Once you download and build Redis from source, you will need to access two executables: -``redis-server`` and ``redis-cli``. The former is the executable that launches a redis-server. The latter is a -useful command line interface (cli) that allows for easy testing. The executables are located at - -``database-server/redis-5.0.4/src/redis-server`` - -``database-server/redis-5.0.4/src/redis-cli`` - -The script below gives them aliases to make things easier. Note that these aliases will disappear -when the terminal closes. - -.. code-block:: bash - - mkdir database-server - cd database-server - wget http://download.redis.io/releases/redis-5.0.4.tar.gz - tar xzf redis-5.0.4.tar.gz - cd redis-5.0.4/deps - make hiredis lua jemalloc linenoise - cd .. - make - alias redis-server=$PWD/src/redis-server - alias redis-cli=$PWD/src/redis-cli - cd .. - -Check that the version of Redis you have is 5.0.x by running ``redis-server --version`` -Now, check that the redis server will boot. Run ``redis-server`` in your terminal. The redis server will take over -your terminal. - -Open up another terminal and run ``redis-cli``. The CLI will take over that terminal and your prompt should look like -``127.0.0.1:6379>`` -Execute a basic set and get with Redis, ensuring the output looks similar to the output below: - -.. code-block:: bash - - 127.0.0.1:6379> SET key 1 - OK - 127.0.0.1:6379> GET key - "1" - 127.0.0.1:6379> - -Congratulations! You have successfully installed and ran Redis. Shutdown the Redis server (issue the ``shutdown`` command -in the cli) and exit the cli. - -ReJSON -******* -`ReJSON `_ is a third party module developed for Redis developed by Redis Labs. -It introduces a JSON datatype to Redis that is not available in standard Redis. REEM relies on it for serializable data. - -Starting from inside the ``database-server`` folder, continuing from the Redis installation script, the following will -build ReJSON from source. - -.. code-block:: bash - - git clone https://github.com/RedisLabsModules/redisjson.git - cd redisjson - make - cd .. - -The above script produces an compiled library file at ``database-server/redisjson/src/rejson.so``. Redis needs to be -told to use that library. You can tell Redis that by starting a server with a configuration file. Download this -`example `_ configuration file and place it inside -``database-server``. - -Some details about this configuration file: - -- Line 46 (in the modules section) says ``loadmodule redisjson/src/rejson.so`` specifying the compiled library for rejson -- Line 71 (in the network section) says ``bind 127.0.0.1`` to bind only to the local host network interface. - -If you later want to make this redis server accessible on a network, -you must change line 71 to bind to that interface too. -For example if the computer hosting the redis server has an ip address ``10.0.0.1`` -on the network, this line should become ``bind 127.0.0.1 10.0.0.1`` -so that it binds to the local interface and the network interface. - -Let's test the ReJSON installation. Run ``redis-server redis.conf``. This will start the Redis server with ReJSON. -Open another terminal and run ``redis-cli``. Be sure you can execute the following in that redis-cli prompt - -.. code-block:: bash - - 127.0.0.1:6379> JSON.SET foo . 0 - OK - - -Client -############# -Before you begin this part of the turtorial, make sure a redis server is available for a client to connect to. -If a server is not already running, run ``redis-server redis.conf`` in a terminal and leave that terminal be. - -Client machines connect to the server purely through Python with the REEM client. -Install REEM and it's dependencies with the below command - -.. code-block:: bash - - pip3 install reem - -Copy the below into a file and run it: - -.. code-block:: python - - from reem.connection import RedisInterface - from reem.datatypes import KeyValueStore - import numpy as np - import time - - interface = RedisInterface(host="localhost") - interface.initialize() - server = KeyValueStore(interface) - - # Set a key and read it and its subkeys - server["foo"] = {"number": 100.0, "string": "REEM"} - print("Reading Root : {}".format(server["foo"].read())) - print("Reading Subkey: {}".format(server["foo"]["number"].read())) - - # Set a new key that didn't exist before to a numpy array - server["foo"]["numpy"] = np.random.rand(3,4) - time.sleep(0.0001) # Needed on ubuntu machine for numpy set to register? - print("Reading Root : {}".format(server["foo"].read())) - print("Reading Subkey: {}".format(server["foo"]["numpy"].read())) - - -The output should appear something like the below - -.. code-block:: console - - Reading Root : {'number': 100, 'string': 'REEM'} - Reading Subkey: 100 - Reading Root : {'number': 100, 'string': 'REEM', 'numpy': array([[0.41949741, 0.40785201, 0.70637666, 0.1809309 ], - [0.37884759, 0.70176005, 0.14115555, 0.82246663], - [0.24243882, 0.86587402, 0.19852017, 0.21833667]])} - Reading Subkey: [[0.41949741 0.40785201 0.70637666 0.1809309 ] - [0.37884759 0.70176005 0.14115555 0.82246663] - [0.24243882 0.86587402 0.19852017 0.21833667]] - -The code connects to a Redis server and ``set`` s a dictionary with basic number and string data. It then -reads and prints that data. Next, it sends a numpy array to Redis and reads that back as well. It uses a KeyValueStore -object to do all this. Learn more about it in the next section. - -Congratulations! You have got REEM working on your machine! Continue to the next section to see what it can do. \ No newline at end of file diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt deleted file mode 100644 index 4f1a064..0000000 --- a/docs/_build/html/_sources/index.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -Welcome to REEM's documentation! -================================ - - -.. toctree:: - :maxdepth: 2 - - gettingstarted - basic - advanced - examples - performance - server-utilities - docs - - - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/_build/html/_sources/performance.rst.txt b/docs/_build/html/_sources/performance.rst.txt deleted file mode 100644 index 3f277b6..0000000 --- a/docs/_build/html/_sources/performance.rst.txt +++ /dev/null @@ -1,105 +0,0 @@ -Performance -=============== -The below documents REEM Performance. See -`the repository `_ for the full -source code and more information. - -Data Transfer Rates -##################### - -Both the database and pubsub paradigms use the same methods for data transfer. The below tests apply to both -even though it was conducted in the database paradigm. - -Number of Entries vs Latency -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -String Data ------------- - -In the below test, a dictionary with X string entries was written to Redis. One hundred trials were conducted. -The box-plots of their latency is below. Latency grows linearly with the amount of data sent. The source code -to generate this plot is below. - -.. image:: _static/set_string.png - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 39-49 - -Numpy Data ------------- - -In the below test, a dictionary with X numpy array entries was written to Redis. One hundred trials were conducted. -The box-plots of their latency is below. Latency grows linearly with the amount of data sent. The source code -to generate this plot is below. - -.. image:: _static/set_numpy.png - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 52-62 - - -Numpy Array Size Throughput -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Set ----------- - -A numpy array of size (N x N) was uploaded to the server as fast as possible. Frame rates are shown below - -.. image:: _static/numpy_set_fr.png - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 84-96 - - -Get ----------- - -A numpy array of size (N x N) was downloaded from the server as fast as possible. Frame rates are shown below - -.. image:: _static/numpy_get_fr.png - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 97-110 - - -Subscriber Overhead -######################## - -The below code tested what the overhead was with having multiple subscribers to a given channel. The publisher -and each subscriber was run in it's own process on the same machine. -A publisher uploaded a timestamp and subscribers calculated the difference between the timestamp and the time they -read the image. - -.. image:: _static/subscriber_oh.png - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 169-248 - - -Comparison -################# -There exist other packages that provide similar but not identical functionality to REEM. - -Potteryx -^^^^^^^^^ - -The package `potteryx `_ offers pythonic ways of using Redis data types. -It's implementation of a python dictionary for JSON-compatible data is faster than REEM. - -.. image:: _static/pottery_comparison.png - -The comparison was generated with the following code: - -.. literalinclude:: ../tests/reem_performance_measurement.py - :lines: 252-316 - -Pottery does not use ReJSON. To store nested data, ``potteryx`` serializes data deeper than one level inside a -Python dictionary to JSON. The JSON is then stored as a subkey of Redis Hash. - -Pottery will require some extra work to get non-serializable data like numpy arrays to work with it. - -REEM could potentially use Pottery in the future. Thoughts for a future implementation - -1. Need to understand how to convert encode/decode non-serializable data types to be JSON compatible -2. Edit the Reader and Writer classes to use ``potteryx`` diff --git a/docs/_build/html/_sources/server-utilities.rst.txt b/docs/_build/html/_sources/server-utilities.rst.txt deleted file mode 100644 index 1e59a24..0000000 --- a/docs/_build/html/_sources/server-utilities.rst.txt +++ /dev/null @@ -1,112 +0,0 @@ -Server Utilities -================================ - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - -REEM comes with some server-side utilities to help make debugging a little bit easier. They are located together -inside a `GitHub repository `_. It is not a PyPi package. -Download the repository and install dependencies with the below script - -.. code-block:: bash - - git clone git@github.com:tn74/reem-server.git - cd reem-server - pip3 install -r requirements.txt - -Browser -############### - -The browser allows you to view data inside a Redis server in a web format. -It is written with the python Django web framework. Make sure you have a -Redis server turned on before starting it. To start the browser's server, -run the following script starting at the ``reem-server`` directory - -.. code-block:: bash - - cd browser - python manage.py runserver - -Some Notes: - -1. The web-browser-server assumes that the Redis server is on the same machine and bound to the localhost interface. -If the browser is being launched from a different computer as the Redis server, change the REEM_HOSTNAME variable -at the bottom of the `django configuration file `_ - -2. Running ``python manage.py runserver`` starts the server on the localhost interface. If you want to connect to -this web browser from other machines, run ``python manage.py runserver 0.0.0.0:8000`` and access the browser at the -ip address of the machine running the browser and port 8000. - -3. To access data at a specific path in redis, go to ``http://localhost:8000/view/``. -For example, if you wanted to see what was stored at "foo.bar.subkey", -go to the url "http://127.0.0.1:8000/view/foo.bar.subkey" - -4. Numpy data can be viewed in two ways - - 1. A pretty printed list of numbers - 2. An image - - - If you try to view an image-sized numpy array as a list of pretty printed numbers, the server will be very slow. - - -A screen capture of what the browser looks like is below - -.. image:: _static/browser_screen_cap.png - - -Logger -########## - -We want to implement logging functionality that ultimately allows users to see how specific keys change in -Redis over time. Imagine having the above browser with a slider bar that allows you to see how a key changes as -you drag the slider. We have begun testing two ways of doing this but neither is fully functional. - - -RDB Logger -^^^^^^^^^^^ - -Redis has two natural ways of storing data to persistent memory. It can use RDB files that snapshot the database -at a specific point in time and AOF files that track -all changes to Redis in an append only fashion. - -RDB ----- -Redis can be told to save the database to an RDB file periodically but it is configured to always write to the same -file. This poses a problem if we would like to save the state of data at previous points in time. - -There is a script in the `reem-server repository `_ -that copies the redis's dump file periodically to a folder so users can save snapshots of Redis data in time. -The script is called according to the syntax - -``python reem-logger `` - -The next (unimplemented) step is to select a snapshot based on a timestamp and load a Redis server with it. After -that, we could use the REEM client to query the desired data. - -There are some existing `tools `_ -that allow the user to parse through RDB directly without starting a Redis server, but they generally -do not support parsing ReJSON commands since ReJSON is a young third-party module. - - -AOF ----- - -Ideally we would not have to copy data that doesn't change much like we do when we save so many RDB files. We would -like to be able to use the AOF file that tracks all changes made to the Redis server. It is played back by a Redis -server when it is used to restore a specific state. More research must be done into finding parsers for AOF files. - -Custom Logger -^^^^^^^^^^^^^^^ - -Some work was done on developing a custom logger. This custom program would not use a standard Redis data saving -format but would use REEM to retrieve data from Redis periodically and use numpy to store it. The user would -be able to specify a particular frequency for a given key. The code is -`online here `_ - -This `log function `_ would take in a -`key file `_ -that specified a paths and periods (representing how frequently to read a specific path in Redis) and an output -directory to store saved data. - - diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css deleted file mode 100644 index 53acd09..0000000 --- a/docs/_build/html/_static/basic.css +++ /dev/null @@ -1,748 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > p:first-child, -td > p:first-child { - margin-top: 0px; -} - -th > p:last-child, -td > p:last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist td { - vertical-align: top; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -li > p:first-child { - margin-top: 0px; -} - -li > p:last-child { - margin-bottom: 0px; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: flex; - flex-wrap: wrap; -} - -dl.field-list > dt { - flex-basis: 20%; - font-weight: bold; - word-break: break-word; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - flex-basis: 70%; - padding-left: 1em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > p:first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0.5em; - content: ":"; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_build/html/_static/browser_screen_cap.png b/docs/_build/html/_static/browser_screen_cap.png deleted file mode 100644 index 542643f..0000000 Binary files a/docs/_build/html/_static/browser_screen_cap.png and /dev/null differ diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css deleted file mode 100644 index 3c33cef..0000000 --- a/docs/_build/html/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css deleted file mode 100644 index aed8cef..0000000 --- a/docs/_build/html/_static/css/theme.css +++ /dev/null @@ -1,6 +0,0 @@ -/* sphinx_rtd_theme version 0.4.3 | MIT license */ -/* Built 20190212 16:02 */ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js deleted file mode 100644 index b33f87f..0000000 --- a/docs/_build/html/_static/doctools.js +++ /dev/null @@ -1,314 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js deleted file mode 100644 index fe1777c..0000000 --- a/docs/_build/html/_static/documentation_options.js +++ /dev/null @@ -1,10 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'v1.0', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false -}; \ No newline at end of file diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png deleted file mode 100644 index a858a41..0000000 Binary files a/docs/_build/html/_static/file.png and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf b/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf deleted file mode 100644 index 809c1f5..0000000 Binary files a/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf b/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf deleted file mode 100644 index fc981ce..0000000 Binary files a/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Inconsolata.ttf b/docs/_build/html/_static/fonts/Inconsolata.ttf deleted file mode 100644 index 4b8a36d..0000000 Binary files a/docs/_build/html/_static/fonts/Inconsolata.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato-Bold.ttf b/docs/_build/html/_static/fonts/Lato-Bold.ttf deleted file mode 100644 index 1d23c70..0000000 Binary files a/docs/_build/html/_static/fonts/Lato-Bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato-Regular.ttf b/docs/_build/html/_static/fonts/Lato-Regular.ttf deleted file mode 100644 index 0f3d0f8..0000000 Binary files a/docs/_build/html/_static/fonts/Lato-Regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.eot b/docs/_build/html/_static/fonts/Lato/lato-bold.eot deleted file mode 100644 index 3361183..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf deleted file mode 100644 index 29f691d..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff b/docs/_build/html/_static/fonts/Lato/lato-bold.woff deleted file mode 100644 index c6dff51..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 deleted file mode 100644 index bb19504..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot deleted file mode 100644 index 3d41549..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf deleted file mode 100644 index f402040..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff deleted file mode 100644 index 88ad05b..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 deleted file mode 100644 index c4e3d80..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.eot b/docs/_build/html/_static/fonts/Lato/lato-italic.eot deleted file mode 100644 index 3f82642..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf deleted file mode 100644 index b4bfc9b..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff b/docs/_build/html/_static/fonts/Lato/lato-italic.woff deleted file mode 100644 index 76114bc..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 deleted file mode 100644 index 3404f37..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.eot b/docs/_build/html/_static/fonts/Lato/lato-regular.eot deleted file mode 100644 index 11e3f2a..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf deleted file mode 100644 index 74decd9..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff b/docs/_build/html/_static/fonts/Lato/lato-regular.woff deleted file mode 100644 index ae1307f..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 deleted file mode 100644 index 3bf9843..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf deleted file mode 100644 index df5d1df..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf deleted file mode 100644 index eb52a79..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot deleted file mode 100644 index 79dc8ef..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf deleted file mode 100644 index df5d1df..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff deleted file mode 100644 index 6cb6000..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 deleted file mode 100644 index 7059e23..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot deleted file mode 100644 index 2f7ca78..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf deleted file mode 100644 index eb52a79..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff deleted file mode 100644 index f815f63..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 deleted file mode 100644 index f2c76e5..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca..0000000 Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845..0000000 --- a/docs/_build/html/_static/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a..0000000 Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 b/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc6..0000000 Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/jquery-3.2.1.js b/docs/_build/html/_static/jquery-3.2.1.js deleted file mode 100644 index d2d8ca4..0000000 --- a/docs/_build/html/_static/jquery-3.2.1.js +++ /dev/null @@ -1,10253 +0,0 @@ -/*! - * jQuery JavaScript Library v3.2.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2017-03-20T18:59Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.2.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( ">tbody", elem )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Fall back to offsetWidth/Height when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Advanced Usage

-

This section explains less common functionality of REEM.

-
-

Custom Datatypes

-

REEM is designed to be customizable. Out of the box, it supports transferring native python types and numpy arrays. -You can, however, define how any type of data is stored in Redis using a Ship object.

-

Inside the module, reem.ships is the abstract class SpecialDatatypeShip. If you define your own ship, you must -subclass SpecialDatatypeShip and fill in the methods. The class’s documentation is below

-
-
-class reem.ships.SpecialDatatypeShip
-
-
-check_fit(value)
-

Determine if this ship will handle value

-

This method returns true if value is data that this ship is supposed to handle. If this ship handled all -numpy arrays, it would check if value’s type is a numpy array.

-
-
Parameters
-

value – object to check

-
-
-

Returns: True if ship will handle value

-
- -
-
-write(key, value, client)
-

Write value to Redis at the specified key using client

-

Given a Redis client, execute any number of needed commands to store the value in Redis. You -are required to use the key given for REEM to find it. If you must store multiple pieces of information, -use a Redis Hash which acts like a one level dictionary.

-
-
Parameters
-
    -
  • key (str) – The Redis key name this ship must store data under

  • -
  • value – The value to write into Redis

  • -
  • client – A ReJSON Redis Client pipeline

  • -
-
-
-

Returns: None

-
- -
-
-read(key, client)
-

Retrieve necessary information from Redis

-

Given a Redis client, execute ONE command to retrieve all the information you need to rebuild the data -that was stored in write from Redis. This method should execute the command that allows you to retrieve -all data stored under key

-
-
Parameters
-
    -
  • key (str) – a keyname that contains data stored by write

  • -
  • client

    A ReJSON Redis Client pipeline

    -

  • -
-
-
-

Returns: None

-
- -
-
-interpret_read(responses)
-

Translate Redis data into a local object

-

Redis will reply to you with something according to what read command you executed in read. This method -takes whatever Redis replied with and turns it into an object identical to what was initially passed to -write as value.

-
-
Parameters
-

responses – Redis’s reply data based on read method

-
-
-

Returns: An object identical to what was initially written to Redis.

-
- -
-
-get_label()
-

Return a unique string identifier

-

This method should return a string that uniquely identifies this ship. REEM will use it to determine what ship -to use to decode data that is already stored in Redis.

-
-
Returns
-

the string identifier

-
-
Return type
-

str

-
-
-
- -
- -

To use a ship, include it as an argument when creating a RedisInterface object.

-
interface = RedisInterface(host="localhost", ships=[CustomShip()])
-
-
-

Numpy Arrays

-

Numpy Arrays are stored in Redis through ships. If you want to keep the default ship for numpy arrays when including -your custom ships, you must include the default numpy ship in your list of ships.

-
interface = RedisInterface(host="localhost", ships=[reem.ships.NumpyShip(), CustomShip()])
-
-
-

See the implementation of the Numpy Ship below

-
class NumpyShip(SpecialDatatypeShip):
-    def check_fit(self, value):
-        return type(value) in [np.array, np.ndarray]
-
-    def write(self, key, value, client):
-        client.hset(key, "arr", bytes(memoryview(value.data)))
-        client.hset(key, "dtype", str(value.dtype))
-        client.hset(key, "shape", str(value.shape))
-        client.hset(key, "strides", str(value.strides))
-
-    def get_label(self):
-        return "default_numpy_handler"
-
-    def read(self, key,  client):
-        client.hgetall(key)
-
-    def interpret_read(self, responses):
-        hash = responses[0]
-        dtype = eval("np.{}".format(hash[b'dtype'].decode('utf-8')))
-        shape = hash[b'shape'].decode("utf-8")[1:-1]
-        shape = tuple([int(s) for s in shape.split(",") if len(s) > 0])
-        arr = np.frombuffer(hash[b'arr'], dtype)
-        arr = np.reshape(arr, shape)
-        return arr
-
-
-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/basic.html b/docs/_build/html/basic.html deleted file mode 100644 index 9279327..0000000 --- a/docs/_build/html/basic.html +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - Basic Usage — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Basic Usage

-
-
-

This page explains how to use database and publish/subscribe paradigms with REEM.

-
-

Initialization

-

Before any information can be passed to a Redis server, we need to specify how to contact the server. -A RedisInterface object is meant to represent a connection to a specific server. Instantiate it and call initialize -before attaching any datatypes to it. You must specify the host as the IP address of the server running Redis -(or localhost). If no host is provided, the default argument for host is localhost

-
from reem.connection import RedisInterface
-interface = RedisInterface(host="localhost")
-interface.initialize()
-
-
-
-
-

Key Value Store

-

The KeyValueStore object is meant to be your way of interacting with Redis as a nested database server. -You should treat a KeyValueStore object as though it were a python dictionary that can -contain native python types and numpy arrays. When you set something inside this “dictionary”, the corresponding -entry will be set in Redis. Reading the “dictionary” will read the corresponding entry in Redis.

-

The KeyValueStore is instantiated with a RedisInterface object, identifying what Redis server it is connected -to.

-
from reem.datatypes import KeyValueStore
-server = KeyValueStore(interface)
-
-
-

The below code illustrates:

-
    -
  • To set an item in Redis, the syntax is identical to that setting a path in a Python dictionary

  • -
  • To get an item from Redis, the syntax is the same as a dictionary’s but you must call .read() on the final path.

  • -
-
data = {'number': 1000, 'string': 'REEM'}
-server["foo"] = flat_data
-
-bar = server["foo"].read()
-# Sets bar = {'number': 1000, 'string': 'REEM'}
-
-bar = server["foo"]["number"].read()
-# Sets bar = 1000
-
-
-

Limitations

-
    -
  1. Cannot use non-string Keys

  2. -
-
server["foo"] = {0:"zero", 1:"one"} # Not Okay
-server["foo"] = {"0":"zero", "1":"one"} # Okay
-
-
-

REEM assumes all keys are strings to avoid having to parse JSON keys to determine if they are strings or numbers.

-
    -
  1. Cannot have a list with non-serializable types.

  2. -
-
server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay
-server["foo"] = {"bar":[3, 4]} # Okay
-
-
-

REEM does not presently check lists for non serializable types. We hope to allow this in a future release. -For now, we ask you substitute the list with a dictionary

-
server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay
-server["foo"] = {"bar":{"arr1": np.arange(3), "arr2": np.arange(4)}} # Okay
-
-
-
-
-

Publish/Subscribe

-

Publishing and subscribing is implemented with a single type of publisher and two types of subscribers.

-
-

Publisher

-

Publishers are implemented with the PublisherSpace class and are instantiated with a RedisInterface. -You may treat a PublishSpace like an python dictionary that you CANNOT read.

-
from reem.datatypes import PublishSpace
-publisher = PublishSpace(interface)
-
-
-

When you set something inside this “dictionary” the publisher broadcasts a message indicating what path was updated. -All subscribers listening to that path are notified and act accordingly.

-
data = {"image": np.random.rand(640, 480, 3), "id": 0}
-
-# publishes raw_image
-publisher["raw_image"] = data
-
-# publishes raw_image.id
-publisher["raw_image"]["id"] = 1
-
-
-

All limitations that apply to KeyValueStore apply to PublishSpace as well. -PublishSpace is a subclass of KeyValueStore.

-
-
-

Subscribers

-

Subscribes listen to a key on the Redis Server and will act based on changes to that key OR its sub-keys. -For example a subscriber to the key “raw_image” will be notified if “raw_image” is freshly uploaded -by a publisher and if the path “raw_image.id” is updated.

-

A subscriber’s .listen() method must be called for it to start listening to Redis updates.

-

Subscribing has two implementations

-
-

Silent Subscribers

-

A silent subscriber acts like a local variable that mimics the data in Redis -underneath the key indicated by its channel. It will silently update as fast as it can without notifying the -user that an update occurred. Use it if you would like a variable that just keeps the latest copy of Redis information -at all times.

-

The SilentSubscriber is initialized with a channel name and an interface. The channel represents the path inside -the RedisServer this subscriber should listen to. Initialization is as below

-
from reem.datatypes import SilentSubscriber
-subscriber = SilentSubscriber(channel="silent_channel", interface=interface)
-subscriber.listen()
-
-
-

The below code illustrates how to read data from a subscriber.

-
publisher["silent_channel"] = {"number": 5, "string":"REEM"}
-time.sleep(0.01)
-
-foo = subscriber["number"].read()
-# foo = 5
-foo = subscriber.value()
-# foo = {"number": 5, "string":"REEM"}
-
-publisher["silent_channel"] = 5
-time.sleep(0.01)
-
-foo = subscriber.value()
-# foo = 5
-
-
-

Note: The .read() method does not go to -Redis but copies the value at that path in the local variable. This is faster than the .read() method used by -the KeyValueStore which does go to Redis.

-
-
-

Callback Subscribers

-

Callback Subscribers listen to a key in Redis and execute a user-specified function when an update occurs. -They are instantiated with an interface, a channel name, a function, and a dictionary specifying keyword -arguments to the function.

-

Instantiation is as below

-
def callback(data, updated_path, foo):
- print("Foo = {}".format(foo))
- print("Data = {}".format(data))
-
-# Initialize a callback subscriber
-subscriber = CallbackSubscriber(channel="callback_channel",
-                                interface=interface,
-                                callback_function=callback,
-                                kwargs={"foo":5})
-subscriber.listen()
-
-
-

The Callback Function

-

The callback function must have data and updated_path as it’s first two arguments. When a publisher sets a key, -data gives the entire updated data structure below the key and updated_path tells what path was updated. -Further arguments can be passed as keyword arguments set during the instantiation of subscriber.

-

If the publisher executes

-
publisher["callback_channel"] = {"number": 5, "string": "REEM"}
-publisher["callback_channel"]["number"] = 6
-
-
-

The subscriber program will have the following output:

-
Foo = 5
-Updated Path = callback_channel
-Data = {'number': 6, 'string': 'REEM'}
-Foo = 5
-Updated Path = callback_channel.number
-Data = {'number': 6, 'string': 'REEM'}
-
-
-
-
-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/docs.html b/docs/_build/html/docs.html deleted file mode 100644 index 35da1ab..0000000 --- a/docs/_build/html/docs.html +++ /dev/null @@ -1,806 +0,0 @@ - - - - - - - - - - - Docs — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Docs

-
-
-class reem.datatypes.Writer(top_key_name, interface)
-

Responsible for setting data inside Redis

-

The Writer class is an internal class that is used for all data sent to Redis (not including pub/sub messages). -Each key that will have nested data below requires a new instantiation of Writer

-
-
-top_key_name
-

The name of the Redis key under which JSON data will be stored. To Redis, -this will become a ReJSON key name. It is also used to generate the Redis key name that ship’s use to -store non JSON data.

-
-
Type
-

str

-
-
-
- -
-
-interface
-

Defines the connection to Redis this writer will use

-
-
Type
-

RedisInterface

-
-
-
- -
-
-send_to_redis(set_path, set_value)
-

Execute equivalent of JSON.SET self.top_key_name <set_path> <set_value>

-

From the user’s perspective, it executes JSON.SET self.top_key_name <set_path> <set_value> -except that set_value can be json-incompatible. This is the only public -method of this class. It determines what non-serializable types are inside set_value, stores the -serializable data as a JSON, and stores the non-serializable data using self.interface’s ships

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
Returns
-

None

-
-
-
- -
-
-_Writer__initialize_metadata()
-

Pull metadata for this key from Redis or set a default

-
-
Returns
-

None

-
-
-
- -
-
-_Writer__process_metadata(set_path, set_value)
-

Handle metadata updates

-

Given the path and value the user would like to set, check if there are non-serializable data types and update -metadata locally and in Redis. Happens without pipeline

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
Returns
-

None

-
-
-
- -
-
-_Writer__publish_non_serializables(set_path, set_value)
-

Publish JSON incompatible data to Redis

-

Given a set, publish the non-serializable components to redis, given that metadata has been updated already

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
Returns
-

None

-
-
-
- -
-
-_Writer__publish_serializables(set_path, set_value)
-

Publish the serializable portion of ``set_value

-

Take out the non-serializable part of set_value and publish it at set_path

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
-

Returns: None

-
- -
- -
-
-class reem.datatypes.Reader(top_key_name, interface)
-

Responsible for getting data from Redis

-

The Reader class is an internal class that is used for all read from Redis (not including pub/sub messages). -Each key that will have nested data below requires a new instantiation of Reader

-
-
-top_key_name
-

The name of the Redis key under which JSON data is stored

-
-
Type
-

str

-
-
-
- -
-
-interface
-

Defines the connection to Redis this reader will use

-
-
Type
-

RedisInterface

-
-
-
- -
-
-read_from_redis(read_path)
-

Read specified path from Redis

-

This is the only public method of the Reader class. It will retrieve the data stored at a specified path -from Redis. At a high level, it reads data stored with ReJSON and inserts non-JSON compatible data -at appropriate paths using the metadata associated with this key.

-
-
Parameters
-

read_path (str) – path the user wants to read

-
-
-

Returns: data stored at value in Redis

-
- -
-
-update_metadata()
-

Update the local copy of metadata if a relevant path has been updated.

-

The metadata listener is a redis client subscribed to key-space notifications. If a relevant path is updated, -this Reader’s pull_metadata flag will be turned on. If pull_metadata is True, then the reader -will fetch metadata from the Redis server.

-

Returns: None

-
- -
-
-queue_reads(read_path)
-

Queue reads in a pipeline

-

Queue all redis queries necessary to read data at path into the appropriate redis pipeline. -First, queue decoded pipeline with the ReJSON query -Next, queue all the special path reads with the non-decoded pipeline and ships

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: None

-
- -
-
-build_dictionary(read_path)
-

Execute pipelines and consolidate data into a dictionary

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: The data stored at read_path in Redis

-
- -
-
-pull_special_path(read_path)
-

Directly pull a non-JSON path

-

If the user specified path is not in JSON, this will retrieve the data directly without going through ReJSON.

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns:

-
- -
- -
-
-class reem.datatypes.KeyValueStore(interface)
-

Dictionary Like object used for get/set paradigm

-

The KeyValueStore object is one that users will frequently use. It keeps Reader and Writer objects -for each key that the user read or written to. It does not actually handle the getting and setting of data -but produces ReadablePathHandler objects that assist with path construction and call the reader and -writer’s write and read methods.

-
-
-interface
-

Defines the connection to Redis this reader will use

-
-
Type
-

RedisInterface

-
-
-
- -
-
-track_schema_changes(set_value, keys=None)
-

Performance optimization for skipping schema update checks

-

Stop checking for schema updates when setting data. Use ONLY if your data’s schema is static -and you are really trying to eek out every bit of optimization.

-
-
Parameters
-
    -
  • set_value (bool) – True/False indicating if the keys’ schema should be tracked

  • -
  • keys (List[str]) – List of keys to track. If None, all present and future keys are tracked

  • -
  • to set_value (according) –

  • -
-
-
-

Returns: None

-
- -
-
-_KeyValueStore__ensure_key_existence(key)
-

Ensure that the requested key has a reader and writer associated with it.

-

Returns: None

-
- -
- -
-
-class reem.datatypes.Publisher(top_key_name, interface)
-

Defines Publisher behavior

-

The Publisher is identical to the writer but publishes a message when it writes a value.

-
-
-send_to_redis(set_path, set_value)
-

Publisher equivalent of Writer send_to_redis

-

This is an equivalent function to Writer’s send_to_redis method but also publishes a message -indicating what channel has been updated.

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
-

Returns: None

-
- -
-
-_Writer__initialize_metadata()
-

Pull metadata for this key from Redis or set a default

-
-
Returns
-

None

-
-
-
- -
-
-_Writer__process_metadata(set_path, set_value)
-

Handle metadata updates

-

Given the path and value the user would like to set, check if there are non-serializable data types and update -metadata locally and in Redis. Happens without pipeline

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
Returns
-

None

-
-
-
- -
-
-_Writer__publish_non_serializables(set_path, set_value)
-

Publish JSON incompatible data to Redis

-

Given a set, publish the non-serializable components to redis, given that metadata has been updated already

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
Returns
-

None

-
-
-
- -
-
-_Writer__publish_serializables(set_path, set_value)
-

Publish the serializable portion of ``set_value

-

Take out the non-serializable part of set_value and publish it at set_path

-
-
Parameters
-
    -
  • set_path (str) – path underneath JSON key to set

  • -
  • set_value – value to set

  • -
-
-
-

Returns: None

-
- -
- -
-
-class reem.datatypes.PublishSpace(interface)
-

Convenience class for publishing

-

This class keeps track of Publisher objects for each key the user has published on.

-
-
-_KeyValueStore__ensure_key_existence(key)
-

Ensure that the requested key has a reader and writer associated with it.

-

Returns: None

-
- -
-
-_PublishSpace__ensure_key_existence(key)
-

Identical to KeyValueStore method of same name but does not instantiate a Reader object

-
- -
-
-track_schema_changes(set_value, keys=None)
-

Performance optimization for skipping schema update checks

-

Stop checking for schema updates when setting data. Use ONLY if your data’s schema is static -and you are really trying to eek out every bit of optimization.

-
-
Parameters
-
    -
  • set_value (bool) – True/False indicating if the keys’ schema should be tracked

  • -
  • keys (List[str]) – List of keys to track. If None, all present and future keys are tracked

  • -
  • to set_value (according) –

  • -
-
-
-

Returns: None

-
- -
- -
-
-class reem.datatypes.SilentSubscriber(channel, interface)
-

Silent Subscriber Implementation

-
-
-update_local_copy(channel, message)
-

Update the local copy of the data stored under this channel name in redis.

-
-
Parameters
-
    -
  • channel – the name of the channel that was published.

  • -
  • message – message published on that channel

  • -
-
-
-

Returns: None

-
- -
-
-listen()
-

Makes this subscriber start listening

-

Returns: None

-
- -
-
-value()
-

Get data stored at root

-

Where as the reader can do server["foo"].read() with if server is a KeyValueStore, -accessing the root value of a subscriber is not as easy. This method retrieves all data stored underneath -a top level key.

-

Returns: all data stored underneath a top level Redis key.

-
- -
-
-build_dictionary(read_path)
-

Execute pipelines and consolidate data into a dictionary

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: The data stored at read_path in Redis

-
- -
-
-pull_special_path(read_path)
-

Directly pull a non-JSON path

-

If the user specified path is not in JSON, this will retrieve the data directly without going through ReJSON.

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns:

-
- -
-
-queue_reads(read_path)
-

Queue reads in a pipeline

-

Queue all redis queries necessary to read data at path into the appropriate redis pipeline. -First, queue decoded pipeline with the ReJSON query -Next, queue all the special path reads with the non-decoded pipeline and ships

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: None

-
- -
-
-read_from_redis(read_path)
-

Read specified path from Redis

-

This is the only public method of the Reader class. It will retrieve the data stored at a specified path -from Redis. At a high level, it reads data stored with ReJSON and inserts non-JSON compatible data -at appropriate paths using the metadata associated with this key.

-
-
Parameters
-

read_path (str) – path the user wants to read

-
-
-

Returns: data stored at value in Redis

-
- -
-
-update_metadata()
-

Update the local copy of metadata if a relevant path has been updated.

-

The metadata listener is a redis client subscribed to key-space notifications. If a relevant path is updated, -this Reader’s pull_metadata flag will be turned on. If pull_metadata is True, then the reader -will fetch metadata from the Redis server.

-

Returns: None

-
- -
- -
-
-class reem.datatypes.CallbackSubscriber(channel, interface, callback_function, kwargs)
-

Callback Subscriber Implementation

-
-
-call_user_function(channel, message)
-

Wrapper callback function (wrapping user function) for this class to work with a RawSubscriber object -Fits required interface for a ChannelSubscriber callback function -:param channel: channel published to -:param message: message that was published -:return: None -:rtype: None

-
- -
-
-build_dictionary(read_path)
-

Execute pipelines and consolidate data into a dictionary

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: The data stored at read_path in Redis

-
- -
-
-listen()
-

Makes this subscriber start listening

-

Returns: None

-
- -
-
-pull_special_path(read_path)
-

Directly pull a non-JSON path

-

If the user specified path is not in JSON, this will retrieve the data directly without going through ReJSON.

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns:

-
- -
-
-queue_reads(read_path)
-

Queue reads in a pipeline

-

Queue all redis queries necessary to read data at path into the appropriate redis pipeline. -First, queue decoded pipeline with the ReJSON query -Next, queue all the special path reads with the non-decoded pipeline and ships

-
-
Parameters
-

read_path – path user wants to read

-
-
-

Returns: None

-
- -
-
-read_from_redis(read_path)
-

Read specified path from Redis

-

This is the only public method of the Reader class. It will retrieve the data stored at a specified path -from Redis. At a high level, it reads data stored with ReJSON and inserts non-JSON compatible data -at appropriate paths using the metadata associated with this key.

-
-
Parameters
-

read_path (str) – path the user wants to read

-
-
-

Returns: data stored at value in Redis

-
- -
-
-update_local_copy(channel, message)
-

Update the local copy of the data stored under this channel name in redis.

-
-
Parameters
-
    -
  • channel – the name of the channel that was published.

  • -
  • message – message published on that channel

  • -
-
-
-

Returns: None

-
- -
-
-update_metadata()
-

Update the local copy of metadata if a relevant path has been updated.

-

The metadata listener is a redis client subscribed to key-space notifications. If a relevant path is updated, -this Reader’s pull_metadata flag will be turned on. If pull_metadata is True, then the reader -will fetch metadata from the Redis server.

-

Returns: None

-
- -
-
-value()
-

Get data stored at root

-

Where as the reader can do server["foo"].read() with if server is a KeyValueStore, -accessing the root value of a subscriber is not as easy. This method retrieves all data stored underneath -a top level key.

-

Returns: all data stored underneath a top level Redis key.

-
- -
- -
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/examples.html b/docs/_build/html/examples.html deleted file mode 100644 index 2e07872..0000000 --- a/docs/_build/html/examples.html +++ /dev/null @@ -1,524 +0,0 @@ - - - - - - - - - - - Examples — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Examples

-
-

Image Processing System

-

Below is an example of what an image processing system might look like. In this robot, there are three components. The -robot’s computation flow is as below

-
    -
  1. A camera takes an image and posts it to Redis

  2. -
  3. A computer processes that image and posts the result to Redis. Here, the process is just to compute the mean value of the image.

  4. -
  5. An actuator reads the result of the computation and does something with it. Here, it just logs it.

  6. -
-

All the code and each component’s logs can be found in the repository

-
-

Camera

-
from reem.datatypes import PublishSpace
-from reem.connection import RedisInterface
-import numpy as np
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="camera.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-start_time = time.time()
-
-
-# --------------------------- Main -----------------------------------
-
-
-interface = RedisInterface(host="localhost")
-pspace = PublishSpace(interface=interface)
-
-image_count = 0
-while time.time() < start_time + TIME_TO_RUN:
-    image = np.random.rand(640, 480, 3)
-    data = {
-        "image": image,
-        "images_sent": image_count,
-        "time_stamp": time.time(),
-    }
-    pspace["raw_image"] = data
-    logger.info("Published Image {}".format(image_count))
-    image_count += 1
-
-
-
-
-

Processor

-
from reem.datatypes import PublishSpace, CallbackSubscriber
-from reem.connection import RedisInterface
-import numpy as np
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="processor.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-
-
-# --------------------------- Main -----------------------------------
-
-
-interface = RedisInterface(host="localhost")
-pspace = PublishSpace(interface=interface)
-
-
-def callback(data, updated_path):
-    pspace["processed_info"] = {
-        "mean": np.mean(data["image"]),
-        "time_stamp": time.time(),
-        "images_sent": data["images_sent"]
-    }
-    logger.info("Processed image {}".format(data["images_sent"]))
-
-
-subscriber = CallbackSubscriber(
-    channel="raw_image",
-    interface=interface,
-    callback_function=callback,
-    kwargs={}
-)
-
-subscriber.listen()
-time.sleep(TIME_TO_RUN)
-
-
-
-
-

Actuator

-
from reem.datatypes import PublishSpace, CallbackSubscriber
-from reem.connection import RedisInterface
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="actuator.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-
-
-# --------------------------- Main -----------------------------------
-
-
-interface = RedisInterface(host="localhost")
-pspace = PublishSpace(interface=interface)
-
-
-def callback(data, updated_path):
-    logger.info("Processed image {}".format(data["images_sent"]))
-
-
-subscriber = CallbackSubscriber(
-    channel="processed_info",
-    interface=interface,
-    callback_function=callback,
-    kwargs={}
-)
-
-subscriber.listen()
-time.sleep(TIME_TO_RUN)
-
-
-
-
-
-

Arm Actuator

-

This examples tries to mimic a system where one computer is responsible for actuating motors at a specific frequency -while the set point is controlled by another computer at a different frequency.

-

We have implemented in two ways - using a database paradigm and a publish/subscribe paradigm.

-

All the code and each component’s logs can be found in the repository

-
-

Database

-
-

Controller

-
from reem.datatypes import KeyValueStore, CallbackSubscriber
-from reem.connection import RedisInterface
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="controller_kvs.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-start_time = time.time()
-
-
-# --------------------------- Main -----------------------------------
-
-
-interface = RedisInterface(host="localhost")
-kvs = KeyValueStore(interface=interface)
-
-set_frequency = 100  # Hz
-set_period = 1.0/set_frequency
-
-while time.time() < start_time + TIME_TO_RUN:
-    next_iteration = time.time() + set_period
-    command = time.time()
-    kvs["set_point"] = command
-    logger.info("Wrote Set Point: {}".format(command))
-    time.sleep(max(0.0, next_iteration - time.time()))
-
-
-
-
-

Actuator

-
from reem.datatypes import KeyValueStore
-from reem.connection import RedisInterface
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="actuator_kvs.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-start_time = time.time()
-
-# --------------------------- Main -----------------------------------
-
-interface = RedisInterface(host="localhost")
-kvs = KeyValueStore(interface)
-
-polling_frequency = 1000  # Hz
-polling_period = 1.0/polling_frequency
-
-while time.time() < start_time + TIME_TO_RUN:
-    next_iteration = time.time() + polling_period
-    command = kvs["set_point"].read()
-    logger.info("Read Set Point: {}".format(command))
-    time.sleep(max(0.0, next_iteration - time.time()))
-
-
-
-
-
-

Publish/Subscribe

-
-

Controller

-
from reem.datatypes import PublishSpace
-from reem.connection import RedisInterface
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="controller_silent_subcsriber.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-start_time = time.time()
-
-
-# --------------------------- Main -----------------------------------
-
-
-interface = RedisInterface(host="localhost")
-pspace = PublishSpace(interface=interface)
-
-set_frequency = 100  # Hz
-set_period = 1.0/set_frequency
-
-while time.time() < start_time + TIME_TO_RUN:
-    next_iteration = time.time() + set_period
-    command = time.time()
-    pspace["command"] = command
-    logger.info("Published Set Point: {}".format(command))
-    time.sleep(max(0.0, next_iteration - time.time()))
-
-
-
-
-

Actuator

-
from reem.datatypes import SilentSubscriber
-from reem.connection import RedisInterface
-import time
-import logging
-
-# Logging Configuration
-logging.basicConfig(
-    format="%(asctime)20s %(filename)30s:%(lineno)3s  %(funcName)20s() %(levelname)10s     %(message)s",
-    filename="actuator_silent_subscriber.log",
-    filemode='w')
-logger = logging.getLogger("script")
-logger.setLevel(logging.INFO)
-
-TIME_TO_RUN = 5.0  # seconds
-start_time = time.time()
-
-# --------------------------- Main -----------------------------------
-
-interface = RedisInterface(host="localhost")
-subscriber = SilentSubscriber(channel="command", interface=interface)
-subscriber.listen()
-
-frequency = 1000  # Hz
-period = 1.0/frequency
-
-while time.time() < start_time + TIME_TO_RUN:
-    next_iteration = time.time() + period
-    command = subscriber.value()
-    logger.info("Read Set Point: {}".format(command))
-    time.sleep(max(0.0, next_iteration - time.time()))
-
-
-
-
-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html deleted file mode 100644 index 6a20410..0000000 --- a/docs/_build/html/genindex.html +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - - - - - Index — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- -
    - -
  • Docs »
  • - -
  • Index
  • - - -
  • - - - -
  • - -
- - -
-
-
-
- - -

Index

- -
- _ - | B - | C - | G - | I - | K - | L - | P - | Q - | R - | S - | T - | U - | V - | W - -
-

_

- - - -
- -

B

- - -
- -

C

- - - -
- -

G

- - -
- -

I

- - - -
- -

K

- - -
- -

L

- - -
- -

P

- - - -
- -

Q

- - -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

U

- - - -
- -

V

- - -
- -

W

- - - -
- - - -
- -
-
- - -
- -
-

- © Copyright 2019, Trishul Nagenalli, Dr. Kris Hauser - -

-
- Built with Sphinx using a theme provided by Read the Docs. - -
- -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/gettingstarted.html b/docs/_build/html/gettingstarted.html deleted file mode 100644 index f96a765..0000000 --- a/docs/_build/html/gettingstarted.html +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - Set Up Tutorial — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Set Up Tutorial

-

In REEM, data is passed between client programs and a centralized Redis server. -This tutorial will demonstrate how to set -up the server and connect to it with a REEM client. Both the server -and client will run on the local machine.

-

Requirements:

-
-
    -
  • Python 3

  • -
  • Linux/macOS (ReJSON requirement, though you can run ReJSON with Docker on Windows)

  • -
-
-
-

Server

-

This section goes through how to set up a server. REEM runs on Redis and requires the ReJSON module. We -will install both and check that they are working.

-
-

Redis

-

The following script will download and build Redis with supporting packages from source inside -a folder called database-server. -REEM has been tested with Redis version 5.0.4. You may want to pull the latest version of Redis in the future. Change the -versioning in the script appropriately

-

DO NOT install Redis through apt-get install redis-server -This will install Redis 3 which does not support modules. You will not be able to run REEM.

-

Once you download and build Redis from source, you will need to access two executables: -redis-server and redis-cli. The former is the executable that launches a redis-server. The latter is a -useful command line interface (cli) that allows for easy testing. The executables are located at

-

database-server/redis-5.0.4/src/redis-server

-

database-server/redis-5.0.4/src/redis-cli

-

The script below gives them aliases to make things easier. Note that these aliases will disappear -when the terminal closes.

-
mkdir database-server
-cd database-server
-wget http://download.redis.io/releases/redis-5.0.4.tar.gz
-tar xzf redis-5.0.4.tar.gz
-cd redis-5.0.4/deps
-make hiredis lua jemalloc linenoise
-cd ..
-make
-alias redis-server=$PWD/src/redis-server
-alias redis-cli=$PWD/src/redis-cli
-cd ..
-
-
-

Check that the version of Redis you have is 5.0.x by running redis-server --version -Now, check that the redis server will boot. Run redis-server in your terminal. The redis server will take over -your terminal.

-

Open up another terminal and run redis-cli. The CLI will take over that terminal and your prompt should look like -127.0.0.1:6379> -Execute a basic set and get with Redis, ensuring the output looks similar to the output below:

-
127.0.0.1:6379> SET key 1
-OK
-127.0.0.1:6379> GET key
-"1"
-127.0.0.1:6379>
-
-
-

Congratulations! You have successfully installed and ran Redis. Shutdown the Redis server (issue the shutdown command -in the cli) and exit the cli.

-
-
-

ReJSON

-

ReJSON is a third party module developed for Redis developed by Redis Labs. -It introduces a JSON datatype to Redis that is not available in standard Redis. REEM relies on it for serializable data.

-

Starting from inside the database-server folder, continuing from the Redis installation script, the following will -build ReJSON from source.

-
git clone https://github.com/RedisLabsModules/redisjson.git
-cd redisjson
-make
-cd ..
-
-
-

The above script produces an compiled library file at database-server/redisjson/src/rejson.so. Redis needs to be -told to use that library. You can tell Redis that by starting a server with a configuration file. Download this -example configuration file and place it inside -database-server.

-

Some details about this configuration file:

-
    -
  • Line 46 (in the modules section) says loadmodule redisjson/src/rejson.so specifying the compiled library for rejson

  • -
  • Line 71 (in the network section) says bind 127.0.0.1 to bind only to the local host network interface.

  • -
-

If you later want to make this redis server accessible on a network, -you must change line 71 to bind to that interface too. -For example if the computer hosting the redis server has an ip address 10.0.0.1 -on the network, this line should become bind 127.0.0.1 10.0.0.1 -so that it binds to the local interface and the network interface.

-

Let’s test the ReJSON installation. Run redis-server redis.conf. This will start the Redis server with ReJSON. -Open another terminal and run redis-cli. Be sure you can execute the following in that redis-cli prompt

-
127.0.0.1:6379> JSON.SET foo . 0
-OK
-
-
-
-
-
-

Client

-

Before you begin this part of the turtorial, make sure a redis server is available for a client to connect to. -If a server is not already running, run redis-server redis.conf in a terminal and leave that terminal be.

-

Client machines connect to the server purely through Python with the REEM client. -Install REEM and it’s dependencies with the below command

-
pip3 install reem
-
-
-

Copy the below into a file and run it:

-
from reem.connection import RedisInterface
-from reem.datatypes import KeyValueStore
-import numpy as np
-import time
-
-interface = RedisInterface(host="localhost")
-interface.initialize()
-server = KeyValueStore(interface)
-
-# Set a key and read it and its subkeys
-server["foo"] = {"number": 100.0, "string": "REEM"}
-print("Reading Root  : {}".format(server["foo"].read()))
-print("Reading Subkey: {}".format(server["foo"]["number"].read()))
-
-# Set a new key that didn't exist before to a numpy array
-server["foo"]["numpy"] = np.random.rand(3,4)
-time.sleep(0.0001)  # Needed on ubuntu machine for numpy set to register?
-print("Reading Root  : {}".format(server["foo"].read()))
-print("Reading Subkey: {}".format(server["foo"]["numpy"].read()))
-
-
-

The output should appear something like the below

-
Reading Root  : {'number': 100, 'string': 'REEM'}
-Reading Subkey: 100
-Reading Root  : {'number': 100, 'string': 'REEM', 'numpy': array([[0.41949741, 0.40785201, 0.70637666, 0.1809309 ],
-       [0.37884759, 0.70176005, 0.14115555, 0.82246663],
-       [0.24243882, 0.86587402, 0.19852017, 0.21833667]])}
-Reading Subkey: [[0.41949741 0.40785201 0.70637666 0.1809309 ]
- [0.37884759 0.70176005 0.14115555 0.82246663]
- [0.24243882 0.86587402 0.19852017 0.21833667]]
-
-
-

The code connects to a Redis server and set s a dictionary with basic number and string data. It then -reads and prints that data. Next, it sends a numpy array to Redis and reads that back as well. It uses a KeyValueStore -object to do all this. Learn more about it in the next section.

-

Congratulations! You have got REEM working on your machine! Continue to the next section to see what it can do.

-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index 0bdfe52..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - Welcome to REEM’s documentation! — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
- -
- - - - -
- -
-

- © Copyright 2019, Trishul Nagenalli, Dr. Kris Hauser - -

-
- Built with Sphinx using a theme provided by Read the Docs. - -
- -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv deleted file mode 100644 index a9e6253..0000000 Binary files a/docs/_build/html/objects.inv and /dev/null differ diff --git a/docs/_build/html/performance.html b/docs/_build/html/performance.html deleted file mode 100644 index 28955df..0000000 --- a/docs/_build/html/performance.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - - - - - - Performance — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Performance

-

The below documents REEM Performance. See -the repository for the full -source code and more information.

-
-

Data Transfer Rates

-

Both the database and pubsub paradigms use the same methods for data transfer. The below tests apply to both -even though it was conducted in the database paradigm.

-
-

Number of Entries vs Latency

-
-

String Data

-

In the below test, a dictionary with X string entries was written to Redis. One hundred trials were conducted. -The box-plots of their latency is below. Latency grows linearly with the amount of data sent. The source code -to generate this plot is below.

-_images/set_string.png -
def key_growth_strings():
-    info = {"title": "Average Latency vs Number of 100 Character String Entries", "plots": [], "x_label": "Number of Keys"}
-    for copies in [max(1, 100 * i) for i in range(5)]:
-        data = single_level_dictionary(copies=copies, data={"single_key": "".join(["A" for i in range(10**2)])})
-        p = {
-            "ticker_label": copies,
-            "times": multitrial_time_test(set, {"keys": ["key_growth"], "value": data}, iterations=100)
-        }
-        info["plots"].append(p)
-        print("Completed: {}".format(copies))
-    plot_performance(info)
-
-
-
-
-

Numpy Data

-

In the below test, a dictionary with X numpy array entries was written to Redis. One hundred trials were conducted. -The box-plots of their latency is below. Latency grows linearly with the amount of data sent. The source code -to generate this plot is below.

-_images/set_numpy.png -
def key_growth_numpy():
-    info = {"title": "Average Latency vs Number of Numpy Entries", "plots": [], "x_label": "Number of Keys"}
-    for copies in [max(1, 10 * i) for i in range(5)]:
-        data = single_level_dictionary(copies=copies, data={"single_key": np.random.rand(3, 4)})
-        p = {
-            "ticker_label": copies,
-            "times": multitrial_time_test(set, {"keys": ["key_growth_numpy"], "value": data}, iterations=100)
-        }
-        info["plots"].append(p)
-        print("Completed: {}".format(copies))
-    plot_performance(info)
-
-
-
-
-
-

Numpy Array Size Throughput

-
-

Set

-

A numpy array of size (N x N) was uploaded to the server as fast as possible. Frame rates are shown below

-_images/numpy_set_fr.png -
def numpy_set_frame_rates():
-    info = {"title": "Numpy Array Set Frame Rates", "plots": [], "x_label": "Image Shape", "y_label": "Frames/Second", "y_scale":'log'}
-    # sets = [np.random.rand(640, 480, 3), np.random.rand(720, 480, 3), np.random.rand(1080, 720, 3)]
-    sets = [np.random.rand(max(10, 200 * i), max(10, 200 * i)) for i in range(6)]
-    for arr in sets:
-        trials = multitrial_time_test(set, {"keys": ["np_frame_rate_test", "key"], "value": arr}, iterations=50)
-        trials = [1000.0/t for t in trials]
-        p = {
-            "ticker_label": arr.shape,
-            "times": trials
-        }
-        info["plots"].append(p)
-    plot_performance(info)
-
-
-
-
-

Get

-

A numpy array of size (N x N) was downloaded from the server as fast as possible. Frame rates are shown below

-_images/numpy_get_fr.png -

-
-def numpy_get_frame_rates():
-    info = {"title": "Numpy Array Get Frame Rates", "plots": [], "x_label": "Image Shape", "y_label": "Frames/Second", "y_scale":'log'}
-    # sets = [np.random.rand(640, 480, 3), np.random.rand(720, 480, 3), np.random.rand(1080, 720, 3)]
-    sets = [np.random.rand(max(10, 200 * i), max(10, 200 * i)) for i in range(6)]
-    for arr in sets:
-        kvs["read_frame_rate_test"]["subkey"] = arr
-        trials = multitrial_time_test(get, {"keys": ["read_frame_rate_test", "subkey"]}, iterations=50)
-        trials = [1000.0 / t for t in trials]
-        p = {
-            "ticker_label": arr.shape,
-            "times": trials
-        }
-
-
-
-
-
-
-

Subscriber Overhead

-

The below code tested what the overhead was with having multiple subscribers to a given channel. The publisher -and each subscriber was run in it’s own process on the same machine. -A publisher uploaded a timestamp and subscribers calculated the difference between the timestamp and the time they -read the image.

-_images/subscriber_oh.png -
# --------------------------- Subscriber Overhead Testing ---------------------------
-
-
-PULSE_GAP = 0.02
-TRIALS = 200
-
-
-def append_time_to_list(data, updated_path, times):
-    times.append(time.time() - data["timestamp"])
-
-
-def overhead_testing_subscriber(test_name, timeout=10):
-    times = []
-    interface = RedisInterface()
-    subscriber = CallbackSubscriber("overhead_test", interface, append_time_to_list, {"times": times})
-    subscriber.listen()
-    time.sleep(timeout)
-    base = os.path.dirname(os.path.abspath(__file__))
-    save_dir = os.path.join(base, "logs", "overhead_test", test_name)
-    save_path = os.path.join(save_dir, "subscriber_{}.txt".format(os.getpid()))
-    if not os.path.exists(save_dir):
-        os.makedirs(save_dir)
-    with open(save_path, "w") as f:
-        for t in times:
-            f.write("{}\n".format(t))
-
-
-def overhead_testing_publisher():
-    interface = RedisInterface()
-    publisher = PublishSpace(interface)
-    for i in range(TRIALS):
-        publisher["overhead_test"] = {"timestamp": time.time()}
-        time.sleep(PULSE_GAP)
-
-
-def generate_subscriber_overhead_data(num_subscriber_list):
-    base = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs", "overhead_test")
-    shutil.rmtree(base)
-    for num_subscribers in num_subscriber_list:
-        processes = [(overhead_testing_publisher, (), {})]
-        test_name = "subs={}".format(num_subscribers)
-        save_dir = os.path.join(base, test_name)
-        if not os.path.exists(save_dir):
-            os.makedirs(save_dir)
-
-        for i in range(num_subscribers):
-            processes.append((overhead_testing_subscriber, (test_name, PULSE_GAP * TRIALS), {}))
-
-        run_as_processes(processes)
-        print("Completed test with {} subscribers".format(num_subscribers))
-
-
-def plot_overhead_data():
-    time_data = {}
-    base = os.path.dirname(os.path.abspath(__file__))
-    save_dir = os.path.join(base, "logs", "overhead_test")
-    for dirpath, dirs, files in os.walk(save_dir):
-        if "subs" not in dirpath:
-            continue
-        num_subscribers = int(dirpath.split("subs=")[1])
-        time_data[num_subscribers] = []
-        for fpath in files:
-            with open(os.path.join(dirpath, fpath), 'r') as file:
-                for line in file:
-                    time_data[num_subscribers].append(float(line) * 1000)   # Seconds to milliseconds conversion
-    plot_info = {
-        "title": "# of Publishers vs Message Latency ({} Messages Published)".format(TRIALS),
-        "x_label": "# of Subscribers",
-        "y_label": "Latency (ms)",
-        "y_scale": "log",
-        "plots": []
-    }
-    for key, value in sorted(time_data.items(), key=lambda kv: kv[0]):
-        plot_info["plots"].append({"ticker_label": key, "times": value})
-    plot_performance(plot_info)
-
-
-def overhead_tests_main():
-    generate_subscriber_overhead_data([1, 10, 100, 1000])
-    plot_overhead_data()
-
-
-
-
-

Comparison

-

There exist other packages that provide similar but not identical functionality to REEM.

-
-

Potteryx

-

The package potteryx offers pythonic ways of using Redis data types. -It’s implementation of a python dictionary for JSON-compatible data is faster than REEM.

-_images/pottery_comparison.png -

The comparison was generated with the following code:

-

-
-def set_pottery(redis_dict, value):
-    redis_dict["data"] = value
-
-
-def get_pottery(redis_dict, keys):
-    ret = redis_dict
-    for k in keys:
-        ret = ret[k]
-    return ret
-
-
-def compare_to_potteryx():
-    client = Redis.from_url('redis://localhost:6379/')
-    pottery_dict = RedisDict(redis=client, key='pottery')
-
-    info = {"title": "REEM vs Pottery", "plots": [],
-            "x_label": "Package",
-            "y_label": "Latency (ms)"}
-
-    data = nested_level_dictionary(
-        levels=5,
-        data=single_level_dictionary(
-            copies=100,
-            data={
-                "single_key": "".join(["A" for i in range(10 ** 2)]),
-                "nested_data": {
-                    "subkey": "".join(["A" for i in range(10 ** 2)])
-                }
-            }
-        )
-    )
-    # REEM Set
-    p = {
-        "ticker_label": "REEM Set",
-        "times": multitrial_time_test(set, {"keys": ["pottery_comparison"], "value": data}, iterations=100)
-    }
-    info["plots"].append(p)
-
-    # Pottery Set
-    p = {
-        "ticker_label": "Pottery Set",
-        "times": multitrial_time_test(set_pottery, {"redis_dict": pottery_dict, "value": data}, iterations=100)
-    }
-    info["plots"].append(p)
-
-    reem_read_path = path_to_key_sequence(".pottery_comparison.sub_0.sub_1.sub_2.sub_3.sub_4.copy_0_single_key")
-    pottery_read_path = path_to_key_sequence(".data.sub_0.sub_1.sub_2.sub_3.sub_4.copy_0_single_key")
-    # REEM Get
-    p = {
-        "ticker_label": "REEM Get",
-        "times": multitrial_time_test(get, {"keys": reem_read_path}, iterations=100)
-    }
-    info["plots"].append(p)
-
-    # Pottery Get
-    p = {
-        "ticker_label": "Pottery Get",
-        "times": multitrial_time_test(get_pottery, {"redis_dict": pottery_dict, "keys": pottery_read_path}, iterations=100)
-    }
-    info["plots"].append(p)
-
-    plot_performance(info)
-
-
-
-

Pottery does not use ReJSON. To store nested data, potteryx serializes data deeper than one level inside a -Python dictionary to JSON. The JSON is then stored as a subkey of Redis Hash.

-

Pottery will require some extra work to get non-serializable data like numpy arrays to work with it.

-

REEM could potentially use Pottery in the future. Thoughts for a future implementation

-
    -
  1. Need to understand how to convert encode/decode non-serializable data types to be JSON compatible

  2. -
  3. Edit the Reader and Writer classes to use potteryx

  4. -
-
-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html deleted file mode 100644 index 3940484..0000000 --- a/docs/_build/html/py-modindex.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - Python Module Index — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- -
    - -
  • Docs »
  • - -
  • Python Module Index
  • - - -
  • - -
  • - -
- - -
-
-
-
- - -

Python Module Index

- -
- r -
- - - - - - - - - - -
 
- r
- reem -
    - reem.datatypes -
- - -
- -
-
- - -
- -
-

- © Copyright 2019, Trishul Nagenalli, Dr. Kris Hauser - -

-
- Built with Sphinx using a theme provided by Read the Docs. - -
- -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html deleted file mode 100644 index 25deef6..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - Search — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- -
    - -
  • Docs »
  • - -
  • Search
  • - - -
  • - - - -
  • - -
- - -
-
-
-
- - - - -
- -
- -
- -
-
- - -
- -
-

- © Copyright 2019, Trishul Nagenalli, Dr. Kris Hauser - -

-
- Built with Sphinx using a theme provided by Read the Docs. - -
- -
-
- -
- -
- - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js deleted file mode 100644 index c21d3e8..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["advanced","basic","docs","examples","gettingstarted","index","performance","server-utilities"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["advanced.rst","basic.rst","docs.rst","examples.rst","gettingstarted.rst","index.rst","performance.rst","server-utilities.rst"],objects:{"reem.datatypes":{CallbackSubscriber:[2,1,1,""],KeyValueStore:[2,1,1,""],PublishSpace:[2,1,1,""],Publisher:[2,1,1,""],Reader:[2,1,1,""],SilentSubscriber:[2,1,1,""],Writer:[2,1,1,""]},"reem.datatypes.CallbackSubscriber":{build_dictionary:[2,2,1,""],call_user_function:[2,2,1,""],listen:[2,2,1,""],pull_special_path:[2,2,1,""],queue_reads:[2,2,1,""],read_from_redis:[2,2,1,""],update_local_copy:[2,2,1,""],update_metadata:[2,2,1,""],value:[2,2,1,""]},"reem.datatypes.KeyValueStore":{"interface":[2,3,1,""],_KeyValueStore__ensure_key_existence:[2,2,1,""],track_schema_changes:[2,2,1,""]},"reem.datatypes.PublishSpace":{_KeyValueStore__ensure_key_existence:[2,2,1,""],_PublishSpace__ensure_key_existence:[2,2,1,""],track_schema_changes:[2,2,1,""]},"reem.datatypes.Publisher":{_Writer__initialize_metadata:[2,2,1,""],_Writer__process_metadata:[2,2,1,""],_Writer__publish_non_serializables:[2,2,1,""],_Writer__publish_serializables:[2,2,1,""],send_to_redis:[2,2,1,""]},"reem.datatypes.Reader":{"interface":[2,3,1,""],build_dictionary:[2,2,1,""],pull_special_path:[2,2,1,""],queue_reads:[2,2,1,""],read_from_redis:[2,2,1,""],top_key_name:[2,3,1,""],update_metadata:[2,2,1,""]},"reem.datatypes.SilentSubscriber":{build_dictionary:[2,2,1,""],listen:[2,2,1,""],pull_special_path:[2,2,1,""],queue_reads:[2,2,1,""],read_from_redis:[2,2,1,""],update_local_copy:[2,2,1,""],update_metadata:[2,2,1,""],value:[2,2,1,""]},"reem.datatypes.Writer":{"interface":[2,3,1,""],_Writer__initialize_metadata:[2,2,1,""],_Writer__process_metadata:[2,2,1,""],_Writer__publish_non_serializables:[2,2,1,""],_Writer__publish_serializables:[2,2,1,""],send_to_redis:[2,2,1,""],top_key_name:[2,3,1,""]},"reem.ships":{SpecialDatatypeShip:[0,1,1,""]},"reem.ships.SpecialDatatypeShip":{check_fit:[0,2,1,""],get_label:[0,2,1,""],interpret_read:[0,2,1,""],read:[0,2,1,""],write:[0,2,1,""]},reem:{datatypes:[2,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute"},terms:{"10s":3,"20s":3,"30s":3,"abstract":0,"byte":0,"class":[0,1,2,6],"default":[0,1,2],"final":1,"float":6,"function":[0,1,2,6,7],"import":[1,3,4],"int":[0,6],"new":[2,4],"public":2,"return":[0,2,6],"static":2,"true":[0,2],"try":[2,7],"while":3,For:[1,4,7],NOT:4,Not:1,ONE:0,One:6,The:[0,1,2,3,4,6,7],There:[6,7],Use:[1,2],__file__:6,_keyvaluestore__ensure_key_exist:2,_publishspace__ensure_key_exist:2,_writer__initialize_metadata:2,_writer__process_metadata:2,_writer__publish_non_serializ:2,_writer__publish_serializ:2,abl:[4,7],about:4,abov:[4,7],abspath:6,access:[2,4,7],accord:[0,2,7],accordingli:1,act:[0,1],actual:2,actuat:5,actuator_kv:3,actuator_silent_subscrib:3,address:[1,4,7],advanc:5,after:7,alia:4,alias:4,all:[0,1,2,3,4,7],allow:[0,1,4,7],alreadi:[0,2,4],also:2,alter:[],alwai:7,amount:6,ani:[0,1],anoth:[3,4],appear:4,append:[6,7],append_time_to_list:6,appli:[1,6],appropri:[2,4],apt:4,arang:1,argument:[0,1],arm:5,arr1:1,arr2:1,arr:[0,6],arrai:[0,1,4,7],asctim:3,ask:1,assist:2,associ:2,assum:[1,7],attach:1,avail:4,averag:6,avoid:1,back:[4,7],bar:[1,7],base:[0,1,6,7],basic:[4,5],basicconfig:3,becom:[2,4],been:[2,4],befor:[1,4,7],begin:4,begun:7,behavior:2,being:7,below:[0,1,2,3,4,6,7],between:[4,6,7],bind:4,bit:[2,7],bool:2,boot:4,both:[4,6],bottom:7,bound:7,box:[0,6],broadcast:1,browser:5,build:4,build_dictionari:2,calcul:6,call:[1,2,4,7],call_user_funct:2,callback:[2,3],callback_channel:1,callback_funct:[1,2,3],callbacksubscrib:[1,2,3,6],camera_data:[],can:[0,1,2,3,4,7],cannot:1,captur:7,central:4,chang:[1,4,7],channel:[1,2,3,6],channelsubscrib:2,charact:6,check:[0,1,2,4],check_fit:0,cli:4,client:[0,2,5,6,7],clone:[4,7],close:4,code:[1,3,4,6,7],com:[4,7],come:7,command:[0,3,4,7],common:0,compare_to_potteryx:6,comparison:5,compat:[2,6],compil:4,complet:6,compon:[2,3],comput:[3,4,7],conduct:6,conf:4,configur:[3,4,7],congratul:4,connect:[1,2,3,4,7],consolid:2,construct:2,contact:1,contain:[0,1],continu:[4,6],controller_kv:3,controller_silent_subcsrib:3,conveni:2,convers:6,convert:6,copi:[1,2,4,6,7],copy_0_single_kei:6,correspond:1,could:[6,7],creat:0,custom:5,customiz:0,customship:0,data:[0,1,2,3,4,5,7],databas:[1,4,6,7],datatyp:[1,2,3,4,5],debug:7,decod:[0,2,6],deeper:6,def:[0,1,3,6],default_numpy_handl:0,defin:[0,2],demonstr:4,dep:4,depend:[4,7],design:0,desir:7,detail:4,determin:[0,1,2],develop:[4,7],dictionari:[0,1,2,4,6],didn:4,differ:[3,6,7],dir:6,directli:[2,7],directori:7,dirnam:6,dirpath:6,disappear:4,django:7,doc:5,docker:4,document:[0,6],doe:[1,2,3,4,6],doesn:7,doing:7,done:7,download:[4,6,7],drag:7,dtype:0,dump:7,dure:1,each:[2,3,6],easi:[2,4],easier:[4,7],edit:6,eek:2,encod:6,ensur:[2,4],entir:1,entri:1,equival:2,eval:0,even:6,everi:2,exampl:[1,4,5,7],except:2,execut:[0,1,2,4],exist:[4,6,7],exit:4,explain:[0,1],extra:6,fals:2,fashion:7,fast:[1,6],faster:[1,6],fetch:2,file:[4,6,7],filemod:3,filenam:3,fill:0,find:[0,7],first:[1,2],fit:2,flag:2,flat_data:1,flow:3,folder:[4,7],follow:[1,4,6,7],foo:[1,2,4,7],format:[0,1,3,4,6,7],former:4,found:3,fpath:6,frame:6,framework:7,frequenc:[3,7],frequent:[2,7],freshli:1,from:[0,1,2,3,4,6,7],from_url:6,frombuff:0,full:6,fulli:7,funcnam:3,further:1,futur:[1,2,4,6],gener:[2,6,7],generate_subscriber_overhead_data:6,get:[1,2,4],get_label:0,get_potteri:6,getlogg:3,getpid:6,git:[4,7],github:[4,7],give:[1,4],given:[0,2,6,7],goe:4,going:2,got:4,grow:6,handl:[0,2],happen:2,has:[1,2,4,7],hash:[0,6],have:[1,2,3,4,6,7],help:7,here:[3,7],hgetal:0,high:2,hiredi:4,hope:1,host:[0,1,3,4],how:[0,1,4,6,7],howev:0,hset:0,http:[4,7],hundr:6,ideal:7,ident:[0,1,2,6],identifi:[0,1],illustr:1,imag:[1,5,6,7],image_count:3,images_s:3,imagin:7,implement:[0,1,2,3,6,7],includ:[0,2],incompat:2,index:5,indic:[1,2],info:[3,6],inform:[0,1,6],initi:[0,4,5],insert:2,insid:[0,1,2,4,6,7],instal:[4,7],instanti:[1,2],interact:1,interfac:[0,1,2,3,4,6,7],intern:2,interpret_read:0,introduc:4,issu:4,item:[1,6],iter:6,its:[1,4],jemalloc:4,join:6,json:[1,2,4,6],just:[1,3],keep:[0,1,2],kei:[0,2,4,5,6,7],key_growth:6,key_growth_numpi:6,key_growth_str:6,keynam:0,keyvaluestor:[1,2,3,4],keyword:1,kvs:[3,6],kwarg:[1,2,3],lab:4,lambda:6,later:4,latest:[1,4],latter:4,launch:[4,7],learn:4,leav:4,len:0,less:0,let:4,level:[0,2,6],levelnam:3,librari:4,like:[0,1,2,3,4,6,7],limit:1,line:[4,6],linearli:6,lineno:3,linenois:4,linux:4,list:[0,1,2,7],listen:[1,2,3,6],littl:7,load:7,loadmodul:4,local:[0,1,2,4],localhost:[0,1,3,4,6,7],locat:[4,7],log:[3,6,7],logger:[3,5],look:[3,4,7],lua:4,machin:[4,6,7],maco:4,made:7,mai:[1,4],main:3,make:[2,4,7],makedir:6,manag:7,mani:7,max:[3,6],mean:3,meant:1,memori:7,memoryview:0,messag:[1,2,3,6],metadata:2,method:[0,1,2,6],might:3,millisecond:6,mimic:[1,3],mkdir:4,modul:[0,4,5,7],more:[4,6,7],motor:3,much:7,multipl:[0,6],multitrial_time_test:6,must:[0,1,4,7],name:[0,1,2],nativ:[0,1],natur:7,ndarrai:0,necessari:[0,2],need:[0,1,4,6],neither:7,nest:[1,2,6],nested_data:6,nested_level_dictionari:6,network:4,next:[2,4,7],next_iter:3,non:[1,2,6],none:[0,2],nonserializ:[],note:[1,4,7],notif:2,notifi:1,now:[1,4],np_frame_rate_test:6,num_subscrib:6,num_subscriber_list:6,number:[0,1,4,7],numpi:[0,1,3,4,7],numpy_get_frame_r:6,numpy_set_frame_r:6,numpyship:0,object:[0,1,2,4],occur:1,offer:6,okai:1,onc:4,one:[0,1,2,3,6],onli:[2,4,7],onlin:7,open:[4,6],optim:2,other:[6,7],out:[0,2],output:[1,4,7],over:[4,7],overhead:5,overhead_test:6,overhead_testing_publish:6,overhead_testing_subscrib:6,overhead_tests_main:6,own:[0,6],packag:[4,6,7],page:[1,5],paradigm:[1,2,3,6],param:2,paramet:[0,2],pars:[1,7],parser:7,part:[2,4],parti:[4,7],particular:7,pass:[0,1,4],path:[1,2,6,7],path_to_key_sequ:6,perform:[2,5],period:[3,7],persist:7,perspect:2,piec:0,pip3:[4,7],pipelin:[0,2],place:4,plai:7,plot:6,plot_info:6,plot_overhead_data:6,plot_perform:6,point:[3,7],polling_frequ:3,polling_period:3,port:7,portion:2,pose:7,possibl:6,post:3,potenti:6,potteri:6,pottery_comparison:6,pottery_dict:6,pottery_read_path:6,present:[1,2],pretti:7,previou:7,print:[1,4,6,7],problem:7,process:[5,6],processed_info:3,produc:[2,4],program:[1,4,7],prompt:4,provid:[1,6],pspace:3,pub:2,publish:[2,5,6],publisherspac:1,publishspac:[1,2,3,6],pubsub:6,pull:[2,4],pull_metadata:2,pull_special_path:2,pulse_gap:6,pure:4,pwd:4,pypi:7,python:[0,1,4,6,7],queri:[2,7],queue:2,queue_read:2,ran:4,rand:[1,3,4,6],random:[1,3,4,6],rang:6,rate:5,raw_imag:[1,3],rawsubscrib:2,read:[0,1,2,3,4,6,7],read_frame_rate_test:6,read_from_redi:2,read_path:2,readablepathhandl:2,reader:[2,6],realli:2,rebuild:0,redi:[0,1,2,3,6,7],redis_dict:6,redisdict:6,redisinterfac:[0,1,2,3,4,6],redisjson:4,redislabsmodul:4,redisserv:1,reem:[0,1,2,3,4,6,7],reem_hostnam:7,reem_read_path:6,regist:4,rejson:[0,2,6,7],releas:[1,4],relev:2,reli:4,repli:0,repositori:[3,6,7],repres:[1,7],request:2,requir:[0,2,4,6,7],research:7,reshap:0,respons:[0,2,3],restor:7,result:3,ret:6,retriev:[0,2,7],rmtree:6,robot:3,root:[2,4],rtype:2,run:[1,4,6,7],run_as_process:6,runserv:7,sai:4,same:[1,2,6,7],save:7,save_dir:6,save_path:6,schema:2,screen:7,script:[3,4,7],search:5,second:[3,6,7],section:[0,4],see:[0,4,6,7],select:7,self:[0,2],send:4,send_to_redi:2,sent:[2,6],serial:6,serializ:[1,2,4,6],server:[1,2,5,6],set:[1,2,3,5],set_frequ:3,set_path:2,set_period:3,set_point:3,set_potteri:6,set_valu:2,setlevel:3,shape:[0,6],ship:[0,2],should:[0,1,2,4],shown:6,shutdown:4,shutil:6,side:7,silent:2,silent_channel:1,silentsubscrib:[1,2,3],similar:[4,6],sinc:7,singl:1,single_kei:6,single_level_dictionari:6,six:[],size:7,skip:2,sleep:[1,3,4,6],slider:7,slow:7,snapshot:7,some:[4,6,7],someth:[0,1,3,4],sort:6,sourc:[4,6],space:2,special:2,specialcaseship:[],specialdatatypeship:0,specif:[1,3,7],specifi:[0,1,2,4,7],split:[0,6],src:4,standard:[4,7],start:[1,2,4,7],start_tim:3,state:7,step:7,stop:2,store:[0,2,5,6,7],str:[0,2],stride:0,string:[0,1,4],structur:1,sub:[1,2,6],sub_0:6,sub_1:6,sub_2:6,sub_3:6,sub_4:6,subclass:[0,1],subkei:[4,6,7],subscrib:[2,5],subscriber_:6,substitut:1,successfulli:4,support:[0,4,7],suppos:0,sure:[4,7],syntax:[1,7],system:5,take:[0,2,3,4,7],tar:4,tell:[1,4],termin:4,test:[4,6,7],test_nam:6,than:[1,6],thei:[1,4,6,7],them:4,thi:[0,1,2,3,4,6,7],thing:4,third:[4,7],though:[1,4,6],thought:6,three:3,through:[0,2,4,7],ticker_label:6,time:[1,3,4,6,7],time_data:6,time_stamp:3,time_to_run:3,timeout:6,timestamp:[6,7],titl:6,tn74:7,togeth:7,told:[4,7],too:4,tool:7,top:2,top_key_nam:2,track:[2,7],track_schema_chang:2,transfer:[0,5],translat:0,treat:1,tri:3,trial:6,tupl:0,turn:[0,2,7],turtori:4,tutori:5,two:[1,3,4,7],txt:[6,7],type:[0,1,2,6],ubuntu:4,ultim:7,under:[0,2],underneath:[1,2],understand:6,unimpl:7,uniqu:0,updat:[1,2],update_local_copi:2,update_metadata:2,updated_path:[1,3,6],upload:[1,6],url:7,usag:5,use:[0,1,2,4,6,7],used:[1,2,7],useful:4,user:[1,2,7],uses:4,using:[0,2,3,6],utf:0,util:5,valu:[0,2,3,5,6],variabl:[1,7],veri:7,version:4,view:7,wai:[1,3,6,7],walk:6,want:[0,2,4,7],web:7,well:[1,4],were:[1,6],wget:4,what:[0,1,2,3,4,6,7],whatev:0,when:[0,1,2,4,7],where:[2,3],which:[0,1,2,4],window:4,without:[1,2,7],word:[],work:[2,4,6,7],would:[0,1,2,7],wrap:2,wrapper:2,write:[0,2,6,7],writer:[2,6],written:[0,2,6,7],wrote:3,x_label:6,xzf:4,y_label:6,y_scale:6,you:[0,1,2,4,7],young:7,your:[0,1,2,4],zero:1},titles:["Advanced Usage","Basic Usage","Docs","Examples","Set Up Tutorial","Welcome to REEM\u2019s documentation!","Performance","Server Utilities"],titleterms:{actuat:3,advanc:0,aof:7,arm:3,arrai:6,basic:1,browser:7,callback:1,camera:3,client:4,comparison:6,control:3,custom:[0,7],data:6,databas:3,datatyp:0,doc:2,document:5,entri:6,exampl:3,get:6,imag:3,indic:5,initi:1,kei:1,latenc:6,logger:7,number:6,numpi:6,overhead:6,perform:6,potteryx:6,process:3,processor:3,publish:[1,3],rate:6,rdb:7,redi:4,reem:5,rejson:4,server:[4,7],set:[4,6],silent:1,size:6,store:1,string:6,subscrib:[1,3,6],system:3,tabl:5,throughput:6,transfer:6,tutori:4,usag:[0,1],util:7,valu:1,welcom:5}}) \ No newline at end of file diff --git a/docs/_build/html/server-utilities.html b/docs/_build/html/server-utilities.html deleted file mode 100644 index 8e29b59..0000000 --- a/docs/_build/html/server-utilities.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - Server Utilities — REEM v1.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

Server Utilities

-
-
-

REEM comes with some server-side utilities to help make debugging a little bit easier. They are located together -inside a GitHub repository. It is not a PyPi package. -Download the repository and install dependencies with the below script

-
git clone git@github.com:tn74/reem-server.git
-cd reem-server
-pip3 install -r requirements.txt
-
-
-
-

Browser

-

The browser allows you to view data inside a Redis server in a web format. -It is written with the python Django web framework. Make sure you have a -Redis server turned on before starting it. To start the browser’s server, -run the following script starting at the reem-server directory

-
cd browser
-python manage.py runserver
-
-
-

Some Notes:

-

1. The web-browser-server assumes that the Redis server is on the same machine and bound to the localhost interface. -If the browser is being launched from a different computer as the Redis server, change the REEM_HOSTNAME variable -at the bottom of the django configuration file

-

2. Running python manage.py runserver starts the server on the localhost interface. If you want to connect to -this web browser from other machines, run python manage.py runserver 0.0.0.0:8000 and access the browser at the -ip address of the machine running the browser and port 8000.

-

3. To access data at a specific path in redis, go to http://localhost:8000/view/<reem-path>. -For example, if you wanted to see what was stored at “foo.bar.subkey”, -go to the url “http://127.0.0.1:8000/view/foo.bar.subkey

-
    -
  1. Numpy data can be viewed in two ways

    -
      -
    1. A pretty printed list of numbers

    2. -
    3. An image

    4. -
    -
      -
    • If you try to view an image-sized numpy array as a list of pretty printed numbers, the server will be very slow.

    • -
    -
  2. -
-

A screen capture of what the browser looks like is below

-_images/browser_screen_cap.png -
-
-

Logger

-

We want to implement logging functionality that ultimately allows users to see how specific keys change in -Redis over time. Imagine having the above browser with a slider bar that allows you to see how a key changes as -you drag the slider. We have begun testing two ways of doing this but neither is fully functional.

-
-

RDB Logger

-

Redis has two natural ways of storing data to persistent memory. It can use RDB files that snapshot the database -at a specific point in time and AOF files that track -all changes to Redis in an append only fashion.

-
-

RDB

-

Redis can be told to save the database to an RDB file periodically but it is configured to always write to the same -file. This poses a problem if we would like to save the state of data at previous points in time.

-

There is a script in the reem-server repository -that copies the redis’s dump file periodically to a folder so users can save snapshots of Redis data in time. -The script is called according to the syntax

-

python reem-logger <path-to-directory-of-snapshots> <path-to-redis-dump-file> <seconds-between-snapshot>

-

The next (unimplemented) step is to select a snapshot based on a timestamp and load a Redis server with it. After -that, we could use the REEM client to query the desired data.

-

There are some existing tools -that allow the user to parse through RDB directly without starting a Redis server, but they generally -do not support parsing ReJSON commands since ReJSON is a young third-party module.

-
-
-

AOF

-

Ideally we would not have to copy data that doesn’t change much like we do when we save so many RDB files. We would -like to be able to use the AOF file that tracks all changes made to the Redis server. It is played back by a Redis -server when it is used to restore a specific state. More research must be done into finding parsers for AOF files.

-
-
-
-

Custom Logger

-

Some work was done on developing a custom logger. This custom program would not use a standard Redis data saving -format but would use REEM to retrieve data from Redis periodically and use numpy to store it. The user would -be able to specify a particular frequency for a given key. The code is -online here

-

This log function would take in a -key file -that specified a paths and periods (representing how frequently to read a specific path in Redis) and an output -directory to store saved data.

-
-
-
- - -
- -
- - -
-
- -
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/docs/advanced.rst b/docs/advanced.rst index daab9f8..5fa3367 100644 --- a/docs/advanced.rst +++ b/docs/advanced.rst @@ -7,32 +7,35 @@ Custom Datatypes ***************** REEM is designed to be customizable. Out of the box, it supports transferring native python types and numpy arrays. -You can, however, define how any type of data is stored in Redis using a ``Ship`` object. +You can, however, define how any type of data is stored in Redis using a ``Marshaller`` object. -Inside the module, ``reem.ships`` is the abstract class ``SpecialDatatypeShip``. If you define your own ship, you must -subclass ``SpecialDatatypeShip`` and fill in the methods. The class's documentation is below +Inside the module ``reem.marshalling`` is the abstract class ``SpecialDatatypeMarshaller``. If you define your own marshaller, you must +subclass ``SpecialDatatypeMarshaller`` and fill in the methods. The class's documentation is below -.. autoclass:: reem.ships.SpecialDatatypeShip +.. autoclass:: reem.marshalling.SpecialDatatypeMarshaller :members: -To use a ship, include it as an argument when creating a ``RedisInterface`` object. +To use a marshaller, include it as an argument when creating a ``RedisInterface`` object. .. code-block:: python - interface = RedisInterface(host="localhost", ships=[CustomShip()]) + from reem import RedisInterface + interface = RedisInterface(host="localhost", marshallers=[CustomMarshaller()]) + +This interface object can be passed to ``KeyValueStore``, ``PublishSpace``, or the ``XSubscriber`` classes instead of an IP address. **Numpy Arrays** -Numpy Arrays are stored in Redis through ships. If you want to keep the default ship for numpy arrays when including -your custom ships, you must include the default numpy ship in your list of ships. +Numpy Arrays are stored in Redis through marshalling. If you want to keep the default marshaller for numpy arrays when including +your custom marshallers, you must include the default numpy marshaller in the initializer. .. code-block:: python - interface = RedisInterface(host="localhost", ships=[reem.ships.NumpyShip(), CustomShip()]) + interface = RedisInterface(host="localhost", marshallers=[reem.marshalling.NumpyMarshaller(), CustomMarshaller()]) -See the implementation of the Numpy Ship below +See the implementation of the Numpy marshaller below -.. literalinclude:: ../reem/ships.py - :lines: 90- \ No newline at end of file +.. literalinclude:: ../reem/marshalling.py + :lines: 116- diff --git a/docs/basic.rst b/docs/basic.rst index 409ed72..8cf0e32 100644 --- a/docs/basic.rst +++ b/docs/basic.rst @@ -7,19 +7,6 @@ Basic Usage This page explains how to use database and publish/subscribe paradigms with REEM. -Initialization -############### - -Before any information can be passed to a Redis server, we need to specify how to contact the server. -A ``RedisInterface`` object is meant to represent a connection to a specific server. Instantiate it and call initialize -before attaching any datatypes to it. You must specify the host as the IP address of the server running Redis -(or localhost). If no host is provided, **the default argument for host is localhost** - -.. code-block:: python - - from reem.connection import RedisInterface - interface = RedisInterface(host="localhost") - interface.initialize() Key Value Store ################# @@ -29,13 +16,14 @@ You should treat a ``KeyValueStore`` object as though it were a python dictionar contain native python types and numpy arrays. When you set something inside this "dictionary", the corresponding entry will be set in Redis. Reading the "dictionary" will read the corresponding entry in Redis. -The ``KeyValueStore`` is instantiated with a ``RedisInterface`` object, identifying what Redis server it is connected -to. +The ``KeyValueStore`` is instantiated with an IP address of the Redis server it is connected +to. If no host is provided, **the default argument for host is localhost** + .. code-block:: python - from reem.datatypes import KeyValueStore - server = KeyValueStore(interface) + from reem import KeyValueStore + server = KeyValueStore("localhost") The below code illustrates: @@ -90,13 +78,13 @@ Publishing and subscribing is implemented with a single type of publisher and tw Publisher ---------- -Publishers are implemented with the ``PublisherSpace`` class and are instantiated with a ``RedisInterface``. +Publishers are implemented with the ``PublisherSpace`` class and are instantiated with the address of the Redis server. You may treat a ``PublishSpace`` like an python dictionary that you CANNOT read. .. code-block:: python - from reem.datatypes import PublishSpace - publisher = PublishSpace(interface) + from reem import PublishSpace + publisher = PublishSpace("localhost") When you set something inside this "dictionary" the publisher broadcasts a message indicating what path was updated. @@ -141,7 +129,7 @@ the RedisServer this subscriber should listen to. Initialization is as below .. code-block:: python from reem.datatypes import SilentSubscriber - subscriber = SilentSubscriber(channel="silent_channel", interface=interface) + subscriber = SilentSubscriber(channel="silent_channel", interface="localhost") subscriber.listen() @@ -187,7 +175,7 @@ Instantiation is as below # Initialize a callback subscriber subscriber = CallbackSubscriber(channel="callback_channel", - interface=interface, + interface="localhost", callback_function=callback, kwargs={"foo":5}) subscriber.listen() diff --git a/docs/conf.py b/docs/conf.py index 962e2a7..8565b0d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,17 +12,23 @@ # import os import sys -sys.path.insert(0, os.path.abspath('..')) +#sys.path.insert(0, os.path.abspath('..')) + + +import reem +print(reem.__version__) +print(dir(reem)) +import reem.marshalling # -- Project information ----------------------------------------------------- project = 'REEM' -copyright = '2019, Trishul Nagenalli, Dr. Kris Hauser' -author = 'Trishul Nagenalli, Dr. Kris Hauser' +copyright = '2023, Trishul Nagenalli, Kris Hauser' +author = 'Trishul Nagenalli, Kris Hauser' # The full version, including alpha/beta/rc tags -release = 'v1.0' +release = 'v'+(reem.__version__) # -- General configuration --------------------------------------------------- @@ -42,6 +48,12 @@ # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +# Autodoc: hide private members +autodoc_default_options = { + "members": True, + "undoc-members": True, + "private-members": False +} # -- Options for HTML output ------------------------------------------------- diff --git a/docs/docs.rst b/docs/docs.rst index 13a163a..a7f09d6 100644 --- a/docs/docs.rst +++ b/docs/docs.rst @@ -1,10 +1,34 @@ -Docs +API Documentation ================== +reem +---- -.. automodule:: reem.datatypes +.. automodule:: reem + :members: + +reem.connection +--------------- + +.. automodule:: reem.connection + :members: + +reem.accessors +--------------- + +.. automodule:: reem.accessors + :members: + +reem.convenience +--------------- + +.. automodule:: reem.convenience + :members: + +reem.marshalling +---------------- + +.. automodule:: reem.marshalling :members: - :private-members: - :inherited-members: diff --git a/docs/examples.rst b/docs/examples.rst index 70b7987..daa8a1f 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -12,7 +12,7 @@ robot's computation flow is as below 2. A computer processes that image and posts the result to Redis. Here, the process is just to compute the mean value of the image. 3. An actuator reads the result of the computation and does something with it. Here, it just logs it. -All the code and each component's logs can be found in the `repository `_ +All the code and each component's logs can be found in the `repository `_ Camera ^^^^^^^^^^^^^^^^^^ @@ -36,7 +36,7 @@ while the set point is controlled by another computer at a different frequency. We have implemented in two ways - using a database paradigm and a publish/subscribe paradigm. -All the code and each component's logs can be found in the `repository `_ +All the code and each component's logs can be found in the `repository `_ diff --git a/docs/gettingstarted.rst b/docs/gettingstarted.rst index a8453ee..f417a25 100644 --- a/docs/gettingstarted.rst +++ b/docs/gettingstarted.rst @@ -9,42 +9,55 @@ and client will run on the local machine. Requirements: - - Python 3 - - Linux/macOS (ReJSON requirement, though you can run ReJSON with Docker on Windows) + - Python 3.5+ + - Linux, macOS, or Windows -Server -############# +Installing Redis and ReJSON (Linux or MacOS) +############################################ -This section goes through how to set up a server. REEM runs on Redis and requires the ReJSON module. We -will install both and check that they are working. +This section goes through how to set up a server. REEM requires both Redis and the ReJSON module. +You will need to install both and check that they are working. The below instructions will work on versions +Redis 5.0.4 and ReJSON version 2.0, but we have noticed that different versions of Redis and ReJSON may +be incompatible. -Redis -****** + +Redis install +************** + +Newer systems (Ubuntu 18.04+) +----------------------------- + +You may simply install Redis via ``sudo apt-get install redis-server``. This will install +the Redis server as a system daemon, which means you will not need to run the server explicitly. + + +Older systems (Ubuntu 16.04 and earlier) +----------------------------------------- +DO NOT install Redis through ``apt-get install redis-server``! +This will install Redis 3 which does not support modules, and you will not be able to run REEM. +Instead, follow the instructions below to install Redis from source. The following script will download and build Redis with supporting packages from source inside -a folder called ``database-server``. +a folder we will call ``rejson-server``. REEM has been tested with Redis version 5.0.4. You may want to pull the latest version of Redis in the future. Change the -versioning in the script appropriately - -DO NOT install Redis through ``apt-get install redis-server`` -This will install Redis 3 which does not support modules. You will not be able to run REEM. +versioning in the script appropriately. Once you download and build Redis from source, you will need to access two executables: ``redis-server`` and ``redis-cli``. The former is the executable that launches a redis-server. The latter is a useful command line interface (cli) that allows for easy testing. The executables are located at -``database-server/redis-5.0.4/src/redis-server`` +``rejson-server/redis-5.0.4/src/redis-server`` -``database-server/redis-5.0.4/src/redis-cli`` +``rejson-server/redis-5.0.4/src/redis-cli`` The script below gives them aliases to make things easier. Note that these aliases will disappear when the terminal closes. .. code-block:: bash - mkdir database-server - cd database-server + mkdir rejson-server + cd rejson-server wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar xzf redis-5.0.4.tar.gz cd redis-5.0.4/deps @@ -56,8 +69,7 @@ when the terminal closes. cd .. Check that the version of Redis you have is 5.0.x by running ``redis-server --version`` -Now, check that the redis server will boot. Run ``redis-server`` in your terminal. The redis server will take over -your terminal. +Now, check that the redis server will boot. Run ``redis-server`` in your terminal. The redis server will take over your terminal and run until it is killed. Open up another terminal and run ``redis-cli``. The CLI will take over that terminal and your prompt should look like ``127.0.0.1:6379>`` @@ -74,13 +86,14 @@ Execute a basic set and get with Redis, ensuring the output looks similar to the Congratulations! You have successfully installed and ran Redis. Shutdown the Redis server (issue the ``shutdown`` command in the cli) and exit the cli. -ReJSON -******* -`ReJSON `_ is a third party module developed for Redis developed by Redis Labs. -It introduces a JSON datatype to Redis that is not available in standard Redis. REEM relies on it for serializable data. -Starting from inside the ``database-server`` folder, continuing from the Redis installation script, the following will -build ReJSON from source. +Installing ReJSON +***************** +`ReJSON `_ is a third party module that introduces a JSON datatype to Redis. REEM relies on it extensively. +Its build instructions have been changing recently, so please read the official documentation for the most up-to-date instructions. + +Starting from inside the ``rejson-server`` folder, continuing from +the Redis installation script, the following will build ReJSON from source. .. code-block:: bash @@ -88,56 +101,135 @@ build ReJSON from source. cd redisjson make cd .. + wget https://raw.githubusercontent.com/tn74/reem/master/examples/redis.conf + +The above script produces a compiled library file at ``redisjson/src/rejson.so``. Redis needs to be +told to use that library file, and so the last line downloads a configuration file that enables ReJSON when Redis uses it. + +Specifically, line 46 (in the modules section) says ``loadmodule redisjson/src/rejson.so`` to specify +the compiled library for rejson. +If you've installed via ``apt-get``, you should edit the ``redis.conf`` file to change +line 46 to point to the absolute path to the compiled library file. Then, copy it to +the version that the Redis service will use via + +.. code-block:: bash + + sudo cp redis.conf /etc/redis/redis.conf + sudo nano /etc/redis/redis.conf + +Then, you will want to change the value of the ``supervised`` directive to ``systemd``. Finally, restart the service via + +.. code-block:: bash + + sudo systemctl restart redis.service -The above script produces an compiled library file at ``database-server/redisjson/src/rejson.so``. Redis needs to be -told to use that library. You can tell Redis that by starting a server with a configuration file. Download this -`example `_ configuration file and place it inside -``database-server``. +If you installed via another method, e.g. source, you will need to manually open up a terminal and run +``redis-server redis.conf``. This will start the Redis server with ReJSON. -Some details about this configuration file: +Let's test the ReJSON installation. Open another terminal and run ``redis-cli``. Be sure you can execute the following in that redis-cli prompt -- Line 46 (in the modules section) says ``loadmodule redisjson/src/rejson.so`` specifying the compiled library for rejson -- Line 71 (in the network section) says ``bind 127.0.0.1`` to bind only to the local host network interface. +.. code-block:: bash + + 127.0.0.1:6379> JSON.SET foo . 0 + OK + +You can then press Ctrl+C or enter "exit" to exit. + + +Installing Redis and ReJSON (Windows) +############################################ + +For Windows, you will use the `Windows builds of Redis `_ and `ReJSON `_ + +To install Redis, grab one of the 5.x installs from `this page `_ and install it on your machine. We have tested this to work on version 5.0.14. The files will typically be in "C:\\Program Files\\Redis", which you may want to add to your PATH for convenience. +If you have installed using the MSI installer, this will install a "Redis Windows Service" for you that will run on startup. If you used the Zip file, you will need to start the server manually. + +Next, download a release from the `ReJSON releases `_. We have tested this to work on version 1.0.6. Create a folder named rejson-server, and unzip the release into this folder. You should now have a DLL and PDB file here. + +Then, download an example redis.conf file, such as `the default here `_, and put it into rejson-server. Then, in the section labeled "MODULES", add the line "loadmodule ReJSON.dll". Save and close the file. + +Finally you will need to obtain a running Redis server configured with ReJSON. +If you want to use Redis Windows Service, replace C:\\Program Files\\Redis\\redis-windows-service.conf +with the redis.conf that you just edited, and also copy the ReJSON.dll and pdb files to C:\\Program Files\\Redis. +To make sure the changes have an effect, +restart the service by going into Services (e.g., press the Windows key and search for "services"), find Redis, and then stop and restart it. + +If you need to start the Redis server manually, open a Command Prompt and +navigate to the rejson-server folder. Enter + +.. code-block:: bash + > "C:\Program Files\Redis\redis-server.exe" redis.conf + +which will start the server. It should say "Ready to accept connections". + +To test that everything is working, open another command prompt and enter: + +.. code-block:: bash + + > "C:\Program Files\Redis\redis-cli.exe" + +And then at the prompt type: + +.. code-block:: bash + + 127.0.0.1:6379> JSON.SET foo . 0 + OK + +If you get something other than OK, you have misconfigured the server. + +That's it! Close out of the second command prompt window and continue on with the rest of the tutorial. + + +Common Redis Configuration Options +################################## + +``redis.json`` configures a lot of functionality about the Redis server. As an example, +line 71 (in the network section) says ``bind 127.0.0.1`` to bind only to the local host network interface. If you later want to make this redis server accessible on a network, you must change line 71 to bind to that interface too. -For example if the computer hosting the redis server has an ip address ``10.0.0.1`` +For example if the computer hosting the redis server has an IP address ``10.0.0.1`` on the network, this line should become ``bind 127.0.0.1 10.0.0.1`` so that it binds to the local interface and the network interface. -Let's test the ReJSON installation. Run ``redis-server redis.conf``. This will start the Redis server with ReJSON. -Open another terminal and run ``redis-cli``. Be sure you can execute the following in that redis-cli prompt +There are plenty of other resources on Redis on the web, so we will not go into more detail here. -.. code-block:: bash - 127.0.0.1:6379> JSON.SET foo . 0 - OK +Setting up REEM +############### + +The REEM client provides a convenient Python frontend to Redis / ReJSON. First, install REEM and its dependencies with the below command + +.. code-block:: bash + python -m pip install reem -Client -############# -Before you begin this part of the turtorial, make sure a redis server is available for a client to connect to. +Then, make sure a redis server is available for a client to connect to. If a server is not already running, run ``redis-server redis.conf`` in a terminal and leave that terminal be. -Client machines connect to the server purely through Python with the REEM client. -Install REEM and it's dependencies with the below command +In another window, verify that the server is running and properly configured using: .. code-block:: bash - pip3 install reem + > redis-cli -Copy the below into a file and run it: +Then, check that you can execute the following: + +.. code-block:: bash + + 127.0.0.1:6379> JSON.SET foo . 0 + OK + 127.0.0.1:6379> exit + +Now, let's test REEM. Copy the below into a file and run it: .. code-block:: python - from reem.connection import RedisInterface - from reem.datatypes import KeyValueStore + from reem import KeyValueStore import numpy as np import time - interface = RedisInterface(host="localhost") - interface.initialize() - server = KeyValueStore(interface) + server = KeyValueStore("localhost") # Set a key and read it and its subkeys server["foo"] = {"number": 100.0, "string": "REEM"} @@ -165,7 +257,7 @@ The output should appear something like the below [0.24243882 0.86587402 0.19852017 0.21833667]] The code connects to a Redis server and ``set`` s a dictionary with basic number and string data. It then -reads and prints that data. Next, it sends a numpy array to Redis and reads that back as well. It uses a KeyValueStore -object to do all this. Learn more about it in the next section. +reads and prints that data. Next, it sends a numpy array to Redis and reads that back as well. + +Congratulations! You have got REEM working on your machine! Continue to the next section to see what else REEM can do. -Congratulations! You have got REEM working on your machine! Continue to the next section to see what it can do. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 68ba70e..842c8f2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,6 +8,7 @@ To make it easy, we chose to model information as a nested data structure that c To make it fast, we used `Redis `_ (an in-memory key-value database) running `ReJSON `_ (enabling Redis to store JSON data) as a central information store. To get maximum performance, we give users the power to control exactly how information is passed between the local program and Redis by defining their own encoder/decoder objects. REEM currently offers two communication paradigms: + - get/set database - publish-subscribe diff --git a/docs/old_readme.md b/docs/old_readme.md deleted file mode 100644 index a6c3cbb..0000000 --- a/docs/old_readme.md +++ /dev/null @@ -1,411 +0,0 @@ -# REEM - -REEM (Redis Extendable Efficient Middleware) is a centralized middleware package for robotic communication. It is designed to be a single-package solution for passing information anywhere in the robot while emphasizing ease of use and efficiency. - -To make it easy, we chose to model information as a nested data structure that closely resembles python dictionaries. To the user, working with a database feels like working with a python dictionary. Out of the box, REEM supports communicating all native python types and numpy arrays. - -To make it fast, we used [Redis](https://redis.io/) (an in-memory key-value database) running [ReJSON](https://oss.redislabs.com/redisjson/) (enabling Redis to store JSON data) as a central information store. To get maximum performance, we give users the power to control exactly how information is passed between the local program and Redis by defining their own encoder/decoder objects. - -REEM currently offers two communication paradigms: -- get/set database -- publish-subscribe - -To install the python package (and its dependencies), run -``` -pip install reem rejson redis six numpy -``` -Go To: -- [Tutorial](#Tutorial) -- [Datatypes](#Datatypes) -- [Performance](#Performance) - -## Tutorial - -This tutorial will demonstrate how to set up a Redis/ReJSON database on your local computer and connect to it using REEM. - -Requirements: -- Python 3 -- Linux/macOS (ReJSON requirement, though you can run ReJSON with Docker on Windows) - - -Open a new terminal and navigate to the directory you would like to work in. **We will refer to this directory as ``.``** - -### Redis -First we will install Redis. If at any point, you are stuck in this tutorial, take a look at the [Redis Quickstart](https://redis.io/topics/quickstart) page for help. - -#### Ubuntu -Run the following commands in your terminal -```bash -mkdir database-server -cd database-server -wget http://download.redis.io/releases/redis-5.0.4.tar.gz -tar xzf redis-5.0.4.tar.gz -cd redis-5.0.4/deps -make hiredis lua jemalloc linenoise -cd .. -make -alias redis-server=$PWD/src/redis-server -alias redis-cli=$PWD/src/redis-cli -``` -Congratulations! You have installed Redis. Test your installation by running the following in your terminal -```bash -redis-server --daemonize yes -redis-cli -``` -You just started a redis server and entered the command line interface (cli) to access the server. Your prompt will look a little different now. To test if the connection is working, type in ``ping`` and you shold see that the redis server you began responds ``PONG``. Then shutdown the server by issuing the ``shutdown`` command and exit the redis-cli with ``ctrl-c``. This whole exchange should look like this: - -```bash -MacBook-Pro:redis-stable trishul$ redis-server --daemonize yes -85795:C 28 Mar 2019 14:26:28.140 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo -85795:C 28 Mar 2019 14:26:28.140 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=85795, just started -85795:C 28 Mar 2019 14:26:28.140 # Configuration loaded -MacBook-Pro:redis-stable trishul$ redis-cli -127.0.0.1:6379> ping -PONG -127.0.0.1:6379> shutdown -not connected> -MacBook-Pro:redis-stable trishul$ -``` -[//]: ![](https://i.imgur.com/OyL42kS.png) - - -[//]: #![](https://i.imgur.com/448WsNT.png) - -### ReJSON -Now we will install ReJSON. Refer to [ReJSON's Instructions](https://oss.redislabs.com/redisjson/) for additional help if necessary. -```bash -cd .. -git clone https://github.com/RedisLabsModules/redisjson.git -cd redisjson -make -cd .. -``` -ReJSON is now installed on your computer as an so file inside ``.redisjson/src/rejson.so``. We need to tell Redis to use this module. We will do this with a redis configuration file. Download [this example file](https://github.com/tn74/reem/blob/master/examples/redis.conf) configuration file and put it inside the ``database-server`` directory. Then run the following -```bash -wget https://raw.githubusercontent.com/tn74/reem/master/examples/redis.conf -redis-server redis.conf --daemonize yes -redis-cli -``` -You should see your prompt change again. Enter ``JSON.SET foo . 0`` and verify the output looks as below -``` -127.0.0.1:6379> JSON.SET foo . 0 -OK -``` -You now have a server running Redis and ReJSON! - -### Running REEM -Exit the redis-cli by entering ``ctrl-C``. In your terminal, install REEM and all of its dependencies with the following command. You may want to be in your virtual environment at this point. -```bash -pip3 install reem rejson redis six numpy -``` - -Let's try running something! - -Copy the following code into a file ``example.py`` into the directory ``.`` -```python -from reem.connections import RedisInterface -from reem.datatypes import KeyValueStore -import numpy as np -import time - -interface = RedisInterface(host="localhost") -interface.initialize() -server = KeyValueStore(interface) - -# Set a key and read it and its subkeys -server["foo"] = {"number": 100.0, "string": "REEM"} -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["number"].read())) - -# Set a new key that didn't exist before to a numpy array -server["foo"]["numpy"] = np.random.rand(3,4) -time.sleep(0.0001) # Needed on ubuntu machine for numpy set to register? -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["numpy"].read())) - -``` -In ``.``, run ``python3 example.py`` -If it runs without error, congratulations! Installation was successful. Let's look deeper at the code. - -### Initialization -```python -interface = RedisInterface(host="localhost") -interface.initialize() -server = KeyValueStore(interface) -``` -The ``interface`` variable defines what a connection to redis is going to look like. You will need to specify the host name of the redis server you wish to connect to. - -Every datatype you wish to instantiate later is going to refer to this interface to know what server it is connected to. Here, we instantiate a ``KeyValueStore `` object with the interface as the variable ``server``. A ``KeyValueStore`` object serves as your standard get and set database. - - -### Database Syntax -```python -# Set a key and read it and its subkeys -server["foo"] = {"number": 100.0, "string": "REEM"} -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["number"].read())) - -# Set a new key that didn't exist before to a numpy array -server["foo"]["numpy"] = np.random.rand(3,4) -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["numpy"].read())) -``` -In the first section of this example code, we set a top level json inside the server to be a python dictionary. Next we read exactly what we wrote. What we get back is a python dictionary identical to the one we submitted. We can also execute a read on a specific subkey of the data we set as we do in third line. - -In the second section of the code, we set a numpy array inside the redis server. Normally, numpy arrays can't be stored in JSONs because they are not serialzable. Internally, REEM handles it differently, but you don't have to worry about that. If you are interestined in handling more non-serializable data types, see the ``Ship`` class documentation, coming soon. - -Congratulations! You have completed the basic tutorial on REEM. You can explore further topics of interest to you: -- Key Value Store Paradigm -- Publish/Subscribe Paradigm - -## Datatypes -The following sections assume you are running a local redis server with rejson. See the [tutorial](#Tutorial) to get those up and running. - -## KeyValueStore Database - -The ``KeyValueStore`` object is a get and set database with nested data structures. The interface to the user is almost identical to that of a python dictionary. Each time you set something in the "dictionary", the corresponding entry is updated in the server. To read from the server, you access the entry in the "dictionary" and call ``.read()`` - -#### Set Up -```python -from reem.datatypes import KeyValueStore -from reem.connection import RedisInterface - -interface = RedisInterface(host="localhost") -interface.initialize() -server = KeyValueStore(interface) -``` -The above is all you need to start your connection to the database. See the [initialization](#Initialization) section of the tutorial for more information about the interface variable. - - -#### Basic Usage -```python -data = {'number': 1000, 'string': 'REEM'} -server["foo"] = flat_data - -bar = server["foo"].read() -# Sets bar = {'number': 1000, 'string': 'REEM'} - -bar = server["foo"]["number"].read() -# Sets bar = 1000 -``` -The first section writes a dictionary to the Redis Server. The second section demonstrates that you can read either the whole dictionary or a subkey of it. The result will be identical to what you would get if you treated server like a local dictionary. - -#### Updates -You can update and read entries as you would a normal python dictionary: - -```python -server["foo"]["new_key"] = data - -bar = server["flat_data"].read() -# bar = {'number': 1000, 'string': 'REEM', 'new_key':{'number': 1000, 'string': 'REEM'} } - -bar = server["flat_data"]["new_key"]["number"].read() -# bar = 1000 - -import numpy as np -server["foo"] = np.arange(3) - -bar = server["foo"].read() -# bar = array([0, 1, 2]) -``` - -#### Limitations - -1. Cannot use non-string Keys -```python -server["foo"] = {0:"zero", 1:"one"} # Not Okay -server["foo"] = {"0":"zero", "1":"one"} # Okay -``` -REEM currently assumes all keys are strings to avoid having to parse JSON keys to determine if they are strings or numbers. - -2. Cannot have a list with nonserializable types. -```python -server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay -server["foo"] = {"bar":[3, 4]} # Okay -``` -REEM does not presently check lists for non serializable types. We hope to allow this in a future release. For now, we ask you substitute the list with a dictionary -```python -server["foo"] = {"bar":[np.arange(3), np.arange(4)]} # Not Okay -server["foo"] = {"bar":{"arr1": np.arange(3), "arr2": np.arange(4)}} # Okay -``` - -## Publish Subscribe -The Publish-Subscribe Paradigm in REEM is designed to be as user-friendly as possible. Users publish data the same way they would set an item in a dictionary. Users subscribe to data by specifying what path inside that nested dictionary they would like to listen to. - -### Publishing -Publishing is implemented with a PublishSpace Object. It is initialized with a RedisInterface object as below: - -```python -from reem.datatypes import PublishSpace -from reem.connection import RedisInterface - -interface = RedisInterface(host="localhost") -interface.initialize() -publisher = PublishSpace(interface) -``` -Treat ``publisher`` like a dictionary. Each time you set something in ``publisher``, the corresponding entry in the server is updated and a message is published stating that path was updated. Subscribers will see the message and pull the updated data. The below code gives an example - -```python -data = {"image": np.random.rand(640, 480, 3), "id": 0} - -# publishes raw_image -publisher["raw_image"] = data - -# publishes raw_image.id -publisher["raw_image"]["id"] = 1 -``` -The ``PublishSpace`` object is implemeted exactly as a ``KeyValueStore`` object with two differences: -1. Updated paths are published -2. Cannot read from a ``PublishSpace`` object. - - -### Subscribing -Subscribes listen to a key on the Redis Server and will act based on changes to that key OR its subkeys. For example a subscriber to the key "camera_data" will be notified if "camera_data" is freshly uploaded by a publisher or if the path "camera_data.image" is updated. - -Subscribing is implented in two different ways - ``SilentSubscriber`` and ``CallbackSubscriber``. The former is designed to feel like a local variable that tracks the data in the server as closely as possible. It silently updates every time something is published. The latter allows the user to specify a function that should be called every time a message is published. - -#### SilentSubscriber - -A silent subscriber is initialized by specifying a channel name and an interface as below. Be sure to call subscriber.listen()! It engages the subscriber. Without it, the subcriber will not be tracking published updates - -```python -from reem.datatypes import PublishSpace, SilentSubscriber -from reem.connection import RedisInterface - -interface = RedisInterface(host="localhost") -interface.initialize() - -# Initialize a publisher -publisher = PublishSpace(interface) - -# Initialize a silent subscriber -subscriber = SilentSubscriber(channel="silent_channel", interface=interface) -subscriber.listen() -``` - -To read the subscribers data, access it as though it were a dictionary. If you need to access the whole data strucutre associated with this channel, call ``subscriber.value()`` -```python -publisher["silent_channel"] = {"number": 5, "string":"REEM"} -time.sleep(0.01) - -foo = subscriber["number"].read() -# foo = 5 -foo = subscriber.value() -# foo = {"number": 5, "string":"REEM"} - - -publisher["silent_channel"] = 5 -time.sleep(0.01) - -foo = subscriber.value() -# foo = 5 -``` - -#### CallbackSubscriber - -A callback subscriber allows you to call a function after every update. The function you set is required to take in keyword arguments ``data`` and ``updated_path`` that give information about the update. The behavior of the callback subscriber is as follows: -1. Listen to channel -2. Hear ``updated_path`` was modified in the server -3. Pull new data at ``updated_path`` -4. Insert new data into local copy -5. Call user function with arguments - - ``data`` - all data underneath this channel name in the server - - Includes what was updated and what was there before - - ``updated_path`` - the path that was modified by the recent publish - - ``**kwargs`` - unpacked keyword arguments that user provided with instantiation of subscriber. - -The initialization of a ``CallbackSubscriber`` is as below: -```python -from reem.datatypes import PublishSpace, CallbackSubscriber -from reem.connection import RedisInterface - -interface = RedisInterface(host="localhost") -interface.initialize() - -# Initialize a publisher -publisher = PublishSpace(interface) - - -# Callback Function -def callback(data, updated_path, foo): - print("Foo = {}".format(foo)) - print("Data = {}".format(data)) - -# # Initialize a callback subscriber -subscriber = CallbackSubscriber(channel="callback_channel", - interface=interface, - callback_function=callback, - kwargs={"foo":5}) -subscriber.listen() -``` -The execution of the callback function happens in a secondary thread. When the following commands are executed by the publisher, the subscriber will automatically listen and act. - -```python -publisher["callback_channel"] = {"number": 5, "string": "REEM"} -publisher["callback_channel"]["number"] = 6 -``` -The standard out of the above execution is -``` -Foo = 5 -Updated Path = callback_channel -Data = {'number': 6, 'string': 'REEM'} -Foo = 5 -Updated Path = callback_channel.number -Data = {'number': 6, 'string': 'REEM'} -``` - -## Performance - -Below we give some performance metrics to help you understand if REEM will meet your needs. - -### KeyValueStore -![](https://i.imgur.com/k3EjhdZ.png) - -In this graph, a dictionary of the form ``{"string1": "<100-character-string>", "string2": "<100-character-string>", ...}`` was transmitted. The number of ``stringN`` keys present in the dictionary is the number specified on the x axis. - -![](https://i.imgur.com/JIxhafF.png) -This graph is identical to the last except 3x4 numpy arrays were transmitted in place of the 100 character strings. Notice that data is more rapidly transmitted as a string than as a numpy array. - -In both the above graphs, we notice that time to set an entry in the databse is linearly proportional to the amount of data transmitted. This principle applies to reads and more heavily nested dictionaries as well. That is, a key buried ten layers deep in the dictionary will not take noticeably longer to transmit than a key at the first level **given** that the quantity of information transmitted remains constant. - -![](https://i.imgur.com/5FaPm0F.png) -This graph illustrates the speed at which single numpy arrays are transimtted to Redis. Note that this example was conducted where a single python thread blasted numpy arrays to redis as fast as it could. There was no one reading it simultaneously. Noticeably, however, we see that we can set 100x100 numpy arrays at a frequency around 1 kHz in isolation. - - -![](https://i.imgur.com/45ZwFxb.png) -This graph is the complement to the graph before it, but we read numpy arrays instead of writing them here. - -![](https://i.imgur.com/T7MlnK0.png) -We explored the performance of setting a entire dictionary vs setting a single key inside the dictionary to determine if one was faster. Testing on both numpy arrays and normal strings, we see that it does not make a difference if the amount of data transmitted is constant. - -![](https://i.imgur.com/DbB97Il.png) -![](https://i.imgur.com/qCnorVt.png) - -The above graphs serve to demonstrate how not to transmit data. If you would like to send or receive 100 strings, you have three possible methods: -- As a dictionary: ``{"1": "string1", "2":"string2", ...}`` -- As a list: ``["string1", "2":"string2", ...]`` -- As individual keys: - ```python - foo["1"] = "string1" - foo["2"] = "string2" - ... - ``` -The graphs demonstrate you should try to set as much data as you can in one go. Setting data as individual keys creates unnecessary overhead. - -### Publish Subscribe -Since the publish-subscribe features uses the key-value store for its back-end, all the previous graphs still hold. The primary concern with publish subscribe is understanding what overhead you will create by having multiple subscribers. - -![](https://i.imgur.com/hDhvXCq.png) -The above graph illustrates the transmission time from a publisher to n subscribers where n is on the x-axis. The data demonstrates essentially linear growwth. On average, the time it takes a message to go from the publisher to the subscriber is linearly proportional to the number of subscribers to that channel. - - - - diff --git a/docs/requirements.txt b/docs/requirements.txt index e07c41c..2fd8af0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,83 +1,8 @@ -alabaster==0.7.12 -appnope==0.1.0 -atomicwrites==1.3.0 -attrs==18.2.0 -Babel==2.6.0 -backcall==0.1.0 -bleach==3.1.0 -certifi==2019.3.9 -chardet==3.0.4 -cycler==0.10.0 -decorator==4.3.2 -defusedxml==0.5.0 -docutils==0.14 -entrypoints==0.3 -idna==2.8 -imagesize==1.1.0 -ipykernel==5.1.0 -ipython==7.2.0 -ipython-genutils==0.2.0 -ipywidgets==7.4.2 -jedi==0.13.2 -Jinja2==2.10.1 -jsonschema==2.6.0 -jupyter-client==5.2.4 -jupyter-console==6.0.0 -jupyter-core==4.4.0 -kiwisolver==1.0.1 -MarkupSafe==1.1.0 -matplotlib==3.0.2 -mistune==0.8.4 -more-itertools==5.0.0 -murmurhash3==2.3.5 -nbconvert==5.4.0 -nbformat==4.4.0 -notebook==5.7.8 -numpy==1.16.0 -packaging==19.0 -pandocfilters==1.4.2 -parso==0.3.2 -pexpect==4.6.0 -pickleshare==0.7.5 -Pillow==5.4.1 -pkginfo==1.5.0.1 -pluggy==0.8.1 -pottery==0.61 -prometheus-client==0.5.0 -prompt-toolkit==2.0.8 -ptyprocess==0.6.0 -py==1.7.0 -Pygments==2.3.1 -pyparsing==2.3.1 -pytest==4.2.0 -python-dateutil==2.7.5 -pytz==2019.1 -pyzmq==17.1.2 -qtconsole==4.4.3 -readme-renderer==24.0 -redis==3.0.1 -rejson==0.3.0 -requests==2.21.0 -requests-toolbelt==0.9.1 -scipy==1.2.0 -Send2Trash==1.5.0 -six==1.12.0 -snowballstemmer==1.2.1 -Sphinx==2.0.1 -sphinx-rtd-theme==0.4.3 -sphinxcontrib-applehelp==1.0.1 -sphinxcontrib-devhelp==1.0.1 -sphinxcontrib-htmlhelp==1.0.2 -sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.2 -sphinxcontrib-serializinghtml==1.1.3 -terminado==0.8.1 -testpath==0.4.2 -tornado==5.1.1 -tqdm==4.31.1 -traitlets==4.3.2 -twine==1.13.0 -urllib3==1.25.2 -wcwidth==0.1.7 -webencodings==0.5.1 -widgetsnbextension==3.4.2 +sphinx==4.2.0 +sphinx_rtd_theme==1.0.0 +readthedocs-sphinx-search==0.1.1 +redis>=3.0.1,<4.0.0 +rejson>=0.3.0 +setuptools +six +numpy diff --git a/docs/server-utilities.rst b/docs/server-utilities.rst index 6679f35..6e26a2e 100644 --- a/docs/server-utilities.rst +++ b/docs/server-utilities.rst @@ -6,7 +6,7 @@ Server Utilities :caption: Contents: REEM comes with some server-side utilities to help make debugging a little bit easier. They are located together -inside a `GitHub repository `_. It is not a PyPi package. +inside a `GitHub repository `_. It is not a PyPi package. Download the repository and install dependencies with the below script .. code-block:: bash diff --git a/example.py b/example.py index f41155d..5b75d8b 100644 --- a/example.py +++ b/example.py @@ -1,17 +1,62 @@ -from reem.connection import RedisInterface -from reem.datatypes import KeyValueStore +from __future__ import print_function + +from reem import KeyValueStore import numpy as np -interface = RedisInterface(host="localhost") -interface.initialize() -server = KeyValueStore(interface) +server = KeyValueStore("localhost") + +try: + server['foo']['bar'] = 12345 + print("ERROR: set subkey without top level key existing") +except Exception: + pass # Set a key and read it and its subkeys server["foo"] = {"number": 100.0, "string": "REEM"} -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["number"].read())) +print("Printing Root :",server["foo"]) +print("Reading Root :",server["foo"].read()) +print("Reading Subkey:",server["foo"]["number"].read()) # Set a new key that didn't exist before to a numpy array -server["foo"]["numpy"] = np.random.rand(3,4) -print("Reading Root : {}".format(server["foo"].read())) -print("Reading Subkey: {}".format(server["foo"]["numpy"].read())) +#server["foo"]["numpy"] = np.random.rand(3,4) +var = server["foo"]["numpy"] +var.write(np.random.rand(3,4)) +print("Reading Root :",server["foo"].read()) +#print("Reading Subkey: {}".format(server["foo"]["numpy"].read())) + +del server["foo"]["numpy"] +print("After delete ['foo']['numpy']:",server["foo"].read()) + +del server["foo"]["string"] +print("After delete ['foo']['string']:",server["foo"].read()) + +del server["foo"] +try: + val = server["foo"].read() + print("['foo'] was not deleted successfully! ",val) +except Exception: + print("['foo'] was deleted successfully:") + +server['foo'] = {'bar':[0,1,2,3,4,5]} +print("Resetting to",server['foo'].read()) +print("Reading array index:",server["foo"]['bar'][2].read()) +server['foo']['bar'].append(6) +print("After appending 6:",server['foo'].read()) +server['foo']['bar'] += [7,8,9] +print("After adding [7,8,9]:",server['foo'].read()) + +del server["foo"]['bar'][2] +print("After delete ['foo']['bar'][2]:",server["foo"].read()) + +server['foo'] = [0,1,2,3,4,5] +print("Resetting to:",server['foo'].read()) +print("Reading array index:",server["foo"][2].read()) +server['foo'].append(6) +print("After appending 6:",server['foo'].read()) +print("Length of ['foo']:",len(server['foo'])) +for i in range(len(server['foo'])): + server['foo'][i] *= 2 +print("After multiplying everything by 2:",server['foo'].read()) + +del server["foo"][2] +print("After delete ['foo'][2]:",server["foo"].read()) \ No newline at end of file diff --git a/examples/ArmActuator/kvs/actuator.py b/examples/ArmActuator/kvs/actuator.py index eac533c..53fcc73 100644 --- a/examples/ArmActuator/kvs/actuator.py +++ b/examples/ArmActuator/kvs/actuator.py @@ -1,5 +1,4 @@ -from reem.datatypes import KeyValueStore -from reem.connection import RedisInterface +from reem import KeyValueStore import time import logging @@ -16,8 +15,7 @@ # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -kvs = KeyValueStore(interface) +kvs = KeyValueStore('localhost') polling_frequency = 1000 # Hz polling_period = 1.0/polling_frequency diff --git a/examples/ArmActuator/pubsub/actuator.py b/examples/ArmActuator/pubsub/actuator.py index a99077f..069ad70 100644 --- a/examples/ArmActuator/pubsub/actuator.py +++ b/examples/ArmActuator/pubsub/actuator.py @@ -1,5 +1,4 @@ -from reem.datatypes import SilentSubscriber -from reem.connection import RedisInterface +from reem.connection import SilentSubscriber import time import logging @@ -11,20 +10,22 @@ logger = logging.getLogger("script") logger.setLevel(logging.INFO) -TIME_TO_RUN = 5.0 # seconds +TIME_TO_RUN = 10.0 # seconds start_time = time.time() # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -subscriber = SilentSubscriber(channel="command", interface=interface) +subscriber = SilentSubscriber(channel="command", interface="localhost") subscriber.listen() -frequency = 1000 # Hz +frequency = 100 # Hz period = 1.0/frequency +print("Reading from channel 'command' for",TIME_TO_RUN,"seconds...") +print("(Run controller.py at the same time)") while time.time() < start_time + TIME_TO_RUN: next_iteration = time.time() + period command = subscriber.value() - logger.info("Read Set Point: {}".format(command)) - time.sleep(max(0.0, next_iteration - time.time())) \ No newline at end of file + logger.info("Read Set Point: {} at time {}".format(command,time.time())) + time.sleep(max(0.0, next_iteration - time.time())) +print("Quitting.") \ No newline at end of file diff --git a/examples/ArmActuator/pubsub/actuator_silent_subscriber.log b/examples/ArmActuator/pubsub/actuator_silent_subscriber.log index 8b9b976..ec973c7 100644 --- a/examples/ArmActuator/pubsub/actuator_silent_subscriber.log +++ b/examples/ArmActuator/pubsub/actuator_silent_subscriber.log @@ -1,3953 +1,985 @@ -2019-04-30 12:33:30,639 actuator.py: 29 () INFO Read Set Point: {} -2019-04-30 12:33:30,640 actuator.py: 29 () INFO Read Set Point: {} -2019-04-30 12:33:30,641 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,643 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,644 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,645 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,646 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,647 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,648 actuator.py: 29 () INFO Read Set Point: 1556642010.637842 -2019-04-30 12:33:30,650 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,651 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,652 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,653 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,655 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,656 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,657 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,659 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,660 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,661 actuator.py: 29 () INFO Read Set Point: 1556642010.648921 -2019-04-30 12:33:30,662 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,664 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,665 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,666 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,668 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,669 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,670 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,672 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,673 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,674 actuator.py: 29 () INFO Read Set Point: 1556642010.66139 -2019-04-30 12:33:30,676 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,677 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,678 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,680 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,681 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,682 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,683 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,685 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,686 actuator.py: 29 () INFO Read Set Point: 1556642010.673711 -2019-04-30 12:33:30,687 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,688 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,690 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,691 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,692 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,694 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,695 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,696 actuator.py: 29 () INFO Read Set Point: 1556642010.68611 -2019-04-30 12:33:30,698 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,699 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,700 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,702 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,703 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,704 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,705 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,707 actuator.py: 29 () INFO Read Set Point: 1556642010.696861 -2019-04-30 12:33:30,708 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,709 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,711 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,712 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,713 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,715 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,716 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,717 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,719 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,720 actuator.py: 29 () INFO Read Set Point: 1556642010.707187 -2019-04-30 12:33:30,721 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,722 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,724 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,725 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,726 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,728 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,729 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,730 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,731 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,733 actuator.py: 29 () INFO Read Set Point: 1556642010.719605 -2019-04-30 12:33:30,734 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,735 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,736 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,738 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,739 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,740 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,742 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,743 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,744 actuator.py: 29 () INFO Read Set Point: 1556642010.731908 -2019-04-30 12:33:30,746 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,747 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,748 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,749 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,751 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,752 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,753 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,755 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,756 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,757 actuator.py: 29 () INFO Read Set Point: 1556642010.7443478 -2019-04-30 12:33:30,759 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,760 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,761 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,763 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,764 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,765 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,766 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,768 actuator.py: 29 () INFO Read Set Point: 1556642010.756654 -2019-04-30 12:33:30,769 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,770 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,772 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,773 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,774 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,776 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,777 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,778 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,779 actuator.py: 29 () INFO Read Set Point: 1556642010.766927 -2019-04-30 12:33:30,781 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,782 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,783 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,785 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,786 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,787 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,788 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,790 actuator.py: 29 () INFO Read Set Point: 1556642010.778594 -2019-04-30 12:33:30,791 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,792 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,794 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,795 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,796 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,797 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,799 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,800 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,801 actuator.py: 29 () INFO Read Set Point: 1556642010.788906 -2019-04-30 12:33:30,802 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,804 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,805 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,806 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,808 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,809 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,810 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,812 actuator.py: 29 () INFO Read Set Point: 1556642010.801311 -2019-04-30 12:33:30,813 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,814 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,816 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,817 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,818 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,820 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,821 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,822 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,824 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,825 actuator.py: 29 () INFO Read Set Point: 1556642010.8121731 -2019-04-30 12:33:30,827 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,828 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,829 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,831 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,832 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,833 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,834 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,836 actuator.py: 29 () INFO Read Set Point: 1556642010.824543 -2019-04-30 12:33:30,837 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,838 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,840 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,841 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,842 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,844 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,845 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,846 actuator.py: 29 () INFO Read Set Point: 1556642010.836122 -2019-04-30 12:33:30,847 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,849 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,850 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,851 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,853 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,854 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,855 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,857 actuator.py: 29 () INFO Read Set Point: 1556642010.846477 -2019-04-30 12:33:30,858 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,859 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,861 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,862 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,863 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,865 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,866 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,867 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,868 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,870 actuator.py: 29 () INFO Read Set Point: 1556642010.8570209 -2019-04-30 12:33:30,871 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,872 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,873 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,875 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,876 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,877 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,879 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,880 actuator.py: 29 () INFO Read Set Point: 1556642010.869432 -2019-04-30 12:33:30,881 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,883 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,884 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,885 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,887 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,888 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,889 actuator.py: 29 () INFO Read Set Point: 1556642010.879483 -2019-04-30 12:33:30,890 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,892 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,893 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,894 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,896 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,897 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,898 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,900 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,901 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,902 actuator.py: 29 () INFO Read Set Point: 1556642010.8895922 -2019-04-30 12:33:30,903 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,904 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,906 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,907 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,908 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,910 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,911 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,912 actuator.py: 29 () INFO Read Set Point: 1556642010.9020002 -2019-04-30 12:33:30,913 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,914 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,916 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,917 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,918 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,920 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,921 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,922 actuator.py: 29 () INFO Read Set Point: 1556642010.912299 -2019-04-30 12:33:30,924 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,925 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,926 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,927 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,928 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,930 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,931 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,932 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,933 actuator.py: 29 () INFO Read Set Point: 1556642010.922592 -2019-04-30 12:33:30,935 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,936 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,937 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,939 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,940 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,941 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,943 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,944 actuator.py: 29 () INFO Read Set Point: 1556642010.93392 -2019-04-30 12:33:30,945 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,946 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,948 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,949 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,950 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,952 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,953 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,954 actuator.py: 29 () INFO Read Set Point: 1556642010.94425 -2019-04-30 12:33:30,955 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,957 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,958 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,959 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,960 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,961 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,962 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,964 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,965 actuator.py: 29 () INFO Read Set Point: 1556642010.954496 -2019-04-30 12:33:30,966 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,967 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,968 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,970 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,971 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,972 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,973 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,975 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,976 actuator.py: 29 () INFO Read Set Point: 1556642010.965387 -2019-04-30 12:33:30,977 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,978 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,980 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,981 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,982 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,983 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,985 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,986 actuator.py: 29 () INFO Read Set Point: 1556642010.9762402 -2019-04-30 12:33:30,987 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,988 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,989 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,991 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,992 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,993 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,994 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,996 actuator.py: 29 () INFO Read Set Point: 1556642010.986271 -2019-04-30 12:33:30,997 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:30,998 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,000 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,001 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,002 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,003 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,005 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,006 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,007 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,008 actuator.py: 29 () INFO Read Set Point: 1556642010.99649 -2019-04-30 12:33:31,009 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,010 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,012 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,013 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,014 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,015 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,017 actuator.py: 29 () INFO Read Set Point: 1556642011.0066829 -2019-04-30 12:33:31,018 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,019 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,020 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,022 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,023 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,024 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,025 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,026 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,028 actuator.py: 29 () INFO Read Set Point: 1556642011.0171149 -2019-04-30 12:33:31,029 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,030 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,031 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,033 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,034 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,035 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,037 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,038 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,039 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,041 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,042 actuator.py: 29 () INFO Read Set Point: 1556642011.028086 -2019-04-30 12:33:31,043 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,044 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,045 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,047 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,048 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,049 actuator.py: 29 () INFO Read Set Point: 1556642011.03936 -2019-04-30 12:33:31,050 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,052 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,053 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,054 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,056 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,057 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,058 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,059 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,060 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,062 actuator.py: 29 () INFO Read Set Point: 1556642011.049609 -2019-04-30 12:33:31,063 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,064 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,066 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,067 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,068 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,069 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,070 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,072 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,073 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,074 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,076 actuator.py: 29 () INFO Read Set Point: 1556642011.062019 -2019-04-30 12:33:31,077 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,078 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,079 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,081 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,082 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,083 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,084 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,086 actuator.py: 29 () INFO Read Set Point: 1556642011.07426 -2019-04-30 12:33:31,087 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,088 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,090 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,091 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,092 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,093 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,095 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,096 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,097 actuator.py: 29 () INFO Read Set Point: 1556642011.086259 -2019-04-30 12:33:31,098 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,100 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,101 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,102 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,104 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,105 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,106 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,107 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,108 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,110 actuator.py: 29 () INFO Read Set Point: 1556642011.097636 -2019-04-30 12:33:31,111 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,112 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,114 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,115 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,116 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,118 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,119 actuator.py: 29 () INFO Read Set Point: 1556642011.109231 -2019-04-30 12:33:31,120 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,122 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,123 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,124 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,125 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,127 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,128 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,129 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,130 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,132 actuator.py: 29 () INFO Read Set Point: 1556642011.1194072 -2019-04-30 12:33:31,133 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,134 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,136 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,137 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,138 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,139 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,141 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,142 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,143 actuator.py: 29 () INFO Read Set Point: 1556642011.131767 -2019-04-30 12:33:31,145 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,146 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,147 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,148 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,150 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,151 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,152 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,154 actuator.py: 29 () INFO Read Set Point: 1556642011.14257 -2019-04-30 12:33:31,155 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,156 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,157 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,159 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,160 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,161 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,162 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,163 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,165 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,166 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,167 actuator.py: 29 () INFO Read Set Point: 1556642011.154115 -2019-04-30 12:33:31,168 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,169 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,170 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,172 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,173 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,174 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,175 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,176 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,178 actuator.py: 29 () INFO Read Set Point: 1556642011.166475 -2019-04-30 12:33:31,179 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,180 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,181 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,183 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,184 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,185 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,187 actuator.py: 29 () INFO Read Set Point: 1556642011.176982 -2019-04-30 12:33:31,188 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,189 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,191 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,192 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,193 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,194 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,196 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,197 actuator.py: 29 () INFO Read Set Point: 1556642011.1872342 -2019-04-30 12:33:31,198 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,200 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,201 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,202 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,203 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,205 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,206 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,207 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,209 actuator.py: 29 () INFO Read Set Point: 1556642011.197335 -2019-04-30 12:33:31,210 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,211 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,212 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,214 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,215 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,216 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,218 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,219 actuator.py: 29 () INFO Read Set Point: 1556642011.207563 -2019-04-30 12:33:31,220 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,221 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,223 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,224 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,225 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,226 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,228 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,229 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,230 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,231 actuator.py: 29 () INFO Read Set Point: 1556642011.2195961 -2019-04-30 12:33:31,233 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,234 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,235 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,237 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,238 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,239 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,240 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,241 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,243 actuator.py: 29 () INFO Read Set Point: 1556642011.231485 -2019-04-30 12:33:31,244 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,245 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,246 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,247 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,249 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,250 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,251 actuator.py: 29 () INFO Read Set Point: 1556642011.2415628 -2019-04-30 12:33:31,252 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,254 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,255 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,256 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,257 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,258 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,260 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,261 actuator.py: 29 () INFO Read Set Point: 1556642011.25162 -2019-04-30 12:33:31,262 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,263 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,264 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,266 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,267 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,268 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,269 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,270 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,272 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,273 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,274 actuator.py: 29 () INFO Read Set Point: 1556642011.26177 -2019-04-30 12:33:31,275 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,277 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,278 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,279 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,280 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,281 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,283 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,284 actuator.py: 29 () INFO Read Set Point: 1556642011.27331 -2019-04-30 12:33:31,285 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,286 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,287 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,288 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,290 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,291 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,292 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,293 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,294 actuator.py: 29 () INFO Read Set Point: 1556642011.284259 -2019-04-30 12:33:31,296 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,297 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,298 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,299 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,300 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,301 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,302 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,304 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,305 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,306 actuator.py: 29 () INFO Read Set Point: 1556642011.29491 -2019-04-30 12:33:31,307 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,309 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,310 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,311 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,312 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,313 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,315 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,316 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,317 actuator.py: 29 () INFO Read Set Point: 1556642011.306504 -2019-04-30 12:33:31,318 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,319 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,321 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,322 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,323 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,324 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,325 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,326 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,328 actuator.py: 29 () INFO Read Set Point: 1556642011.3174222 -2019-04-30 12:33:31,329 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,330 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,331 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,332 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,333 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,334 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,336 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,337 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,338 actuator.py: 29 () INFO Read Set Point: 1556642011.328023 -2019-04-30 12:33:31,339 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,340 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,341 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,343 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,344 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,345 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,346 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,347 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,349 actuator.py: 29 () INFO Read Set Point: 1556642011.33839 -2019-04-30 12:33:31,350 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,351 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,352 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,353 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,355 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,356 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,357 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,358 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,359 actuator.py: 29 () INFO Read Set Point: 1556642011.349149 -2019-04-30 12:33:31,360 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,361 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,363 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,364 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,365 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,366 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,367 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,368 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,369 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,371 actuator.py: 29 () INFO Read Set Point: 1556642011.359297 -2019-04-30 12:33:31,372 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,373 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,374 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,376 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,377 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,378 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,379 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,380 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,381 actuator.py: 29 () INFO Read Set Point: 1556642011.370995 -2019-04-30 12:33:31,382 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,383 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,384 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,385 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,386 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,388 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,389 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,390 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,391 actuator.py: 29 () INFO Read Set Point: 1556642011.381707 -2019-04-30 12:33:31,392 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,393 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,395 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,396 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,397 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,398 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,399 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,401 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,402 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,403 actuator.py: 29 () INFO Read Set Point: 1556642011.391768 -2019-04-30 12:33:31,404 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,405 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,406 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,408 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,409 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,410 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,411 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,412 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,414 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,415 actuator.py: 29 () INFO Read Set Point: 1556642011.40312 -2019-04-30 12:33:31,416 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,417 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,418 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,419 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,420 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,422 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,423 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,424 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,425 actuator.py: 29 () INFO Read Set Point: 1556642011.415095 -2019-04-30 12:33:31,427 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,428 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,429 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,430 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,432 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,433 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,434 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,435 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,437 actuator.py: 29 () INFO Read Set Point: 1556642011.425956 -2019-04-30 12:33:31,438 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,439 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,440 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,442 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,443 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,444 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,446 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,447 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,448 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,449 actuator.py: 29 () INFO Read Set Point: 1556642011.43648 -2019-04-30 12:33:31,451 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,452 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,453 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,455 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,456 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,457 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,459 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,460 actuator.py: 29 () INFO Read Set Point: 1556642011.448865 -2019-04-30 12:33:31,461 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,462 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,464 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,465 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,466 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,468 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,469 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,470 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,472 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,473 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,474 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,475 actuator.py: 29 () INFO Read Set Point: 1556642011.460385 -2019-04-30 12:33:31,476 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,477 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,479 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,480 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,481 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,482 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,484 actuator.py: 29 () INFO Read Set Point: 1556642011.472786 -2019-04-30 12:33:31,485 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,486 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,488 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,489 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,490 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,492 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,493 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,494 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,495 actuator.py: 29 () INFO Read Set Point: 1556642011.4832902 -2019-04-30 12:33:31,497 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,498 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,499 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,500 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,501 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,503 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,504 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,505 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,506 actuator.py: 29 () INFO Read Set Point: 1556642011.495723 -2019-04-30 12:33:31,508 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,509 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,510 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,511 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,513 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,514 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,515 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,516 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,518 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,519 actuator.py: 29 () INFO Read Set Point: 1556642011.507064 -2019-04-30 12:33:31,520 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,522 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,523 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,524 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,525 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,526 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,527 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,529 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,530 actuator.py: 29 () INFO Read Set Point: 1556642011.519475 -2019-04-30 12:33:31,531 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,532 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,533 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,535 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,536 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,537 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,538 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,540 actuator.py: 29 () INFO Read Set Point: 1556642011.529553 -2019-04-30 12:33:31,541 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,543 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,544 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,545 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,546 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,547 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,549 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,550 actuator.py: 29 () INFO Read Set Point: 1556642011.539586 -2019-04-30 12:33:31,551 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,553 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,554 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,555 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,557 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,558 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,559 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,561 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,562 actuator.py: 29 () INFO Read Set Point: 1556642011.549661 -2019-04-30 12:33:31,563 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,565 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,566 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,567 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,569 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,570 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,571 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,572 actuator.py: 29 () INFO Read Set Point: 1556642011.561462 -2019-04-30 12:33:31,574 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,575 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,576 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,578 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,579 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,580 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,582 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,583 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,584 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,585 actuator.py: 29 () INFO Read Set Point: 1556642011.571851 -2019-04-30 12:33:31,586 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,587 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,589 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,590 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,591 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,593 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,594 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,595 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,597 actuator.py: 29 () INFO Read Set Point: 1556642011.5841558 -2019-04-30 12:33:31,598 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,599 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,600 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,602 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,603 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,604 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,606 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,607 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,608 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,609 actuator.py: 29 () INFO Read Set Point: 1556642011.596552 -2019-04-30 12:33:31,611 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,612 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,613 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,615 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,616 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,617 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,618 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,620 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,621 actuator.py: 29 () INFO Read Set Point: 1556642011.608874 -2019-04-30 12:33:31,623 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,624 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,625 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,627 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,628 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,629 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,631 actuator.py: 29 () INFO Read Set Point: 1556642011.620915 -2019-04-30 12:33:31,632 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,633 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,635 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,636 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,637 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,639 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,640 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,641 actuator.py: 29 () INFO Read Set Point: 1556642011.631113 -2019-04-30 12:33:31,642 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,644 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,645 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,646 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,647 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,648 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,650 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,651 actuator.py: 29 () INFO Read Set Point: 1556642011.641428 -2019-04-30 12:33:31,652 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,653 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,655 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,656 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,657 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,659 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,660 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,661 actuator.py: 29 () INFO Read Set Point: 1556642011.6515222 -2019-04-30 12:33:31,662 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,664 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,665 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,666 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,668 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,669 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,670 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,672 actuator.py: 29 () INFO Read Set Point: 1556642011.661612 -2019-04-30 12:33:31,673 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,674 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,676 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,677 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,678 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,680 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,681 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,682 actuator.py: 29 () INFO Read Set Point: 1556642011.672152 -2019-04-30 12:33:31,683 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,685 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,686 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,687 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,689 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,690 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,691 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,693 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,694 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,695 actuator.py: 29 () INFO Read Set Point: 1556642011.682624 -2019-04-30 12:33:31,696 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,698 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,699 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,700 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,701 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,703 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,704 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,705 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,706 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,707 actuator.py: 29 () INFO Read Set Point: 1556642011.6949272 -2019-04-30 12:33:31,709 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,710 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,711 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,712 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,714 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,715 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,716 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,717 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,719 actuator.py: 29 () INFO Read Set Point: 1556642011.707131 -2019-04-30 12:33:31,720 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,721 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,722 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,724 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,725 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,727 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,728 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,729 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,730 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,732 actuator.py: 29 () INFO Read Set Point: 1556642011.719177 -2019-04-30 12:33:31,733 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,734 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,735 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,736 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,738 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,739 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,740 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,741 actuator.py: 29 () INFO Read Set Point: 1556642011.731214 -2019-04-30 12:33:31,743 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,744 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,745 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,746 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,748 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,749 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,750 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,751 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,752 actuator.py: 29 () INFO Read Set Point: 1556642011.742149 -2019-04-30 12:33:31,753 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,755 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,756 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,757 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,758 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,759 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,761 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,762 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,763 actuator.py: 29 () INFO Read Set Point: 1556642011.752715 -2019-04-30 12:33:31,765 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,766 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,767 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,769 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,770 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,771 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,772 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,774 actuator.py: 29 () INFO Read Set Point: 1556642011.763766 -2019-04-30 12:33:31,775 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,776 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,777 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,778 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,779 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,781 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,782 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,783 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,784 actuator.py: 29 () INFO Read Set Point: 1556642011.774098 -2019-04-30 12:33:31,785 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,787 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,788 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,789 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,790 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,791 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,792 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,793 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,795 actuator.py: 29 () INFO Read Set Point: 1556642011.7842119 -2019-04-30 12:33:31,796 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,797 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,798 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,800 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,801 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,802 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,804 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,805 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,806 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,807 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,808 actuator.py: 29 () INFO Read Set Point: 1556642011.795017 -2019-04-30 12:33:31,810 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,811 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,812 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,813 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,815 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,816 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,817 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,818 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,820 actuator.py: 29 () INFO Read Set Point: 1556642011.8070688 -2019-04-30 12:33:31,821 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,822 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,823 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,825 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,826 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,827 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,828 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,830 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,831 actuator.py: 29 () INFO Read Set Point: 1556642011.819288 -2019-04-30 12:33:31,832 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,833 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,835 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,836 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,837 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,838 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,840 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,841 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,842 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,843 actuator.py: 29 () INFO Read Set Point: 1556642011.8314319 -2019-04-30 12:33:31,844 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,846 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,847 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,848 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,850 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,851 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,852 actuator.py: 29 () INFO Read Set Point: 1556642011.842606 -2019-04-30 12:33:31,854 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,855 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,856 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,857 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,858 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,860 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,861 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,862 actuator.py: 29 () INFO Read Set Point: 1556642011.852694 -2019-04-30 12:33:31,864 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,865 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,866 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,868 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,869 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,870 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,871 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,873 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,874 actuator.py: 29 () INFO Read Set Point: 1556642011.8628852 -2019-04-30 12:33:31,875 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,877 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,878 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,879 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,881 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,882 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,883 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,884 actuator.py: 29 () INFO Read Set Point: 1556642011.874641 -2019-04-30 12:33:31,885 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,887 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,888 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,889 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,891 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,892 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,893 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,894 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,895 actuator.py: 29 () INFO Read Set Point: 1556642011.884732 -2019-04-30 12:33:31,897 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,898 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,899 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,900 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,901 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,902 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,904 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,905 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,906 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,907 actuator.py: 29 () INFO Read Set Point: 1556642011.8958 -2019-04-30 12:33:31,908 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,909 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,911 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,912 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,913 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,914 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,916 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,917 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,918 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,919 actuator.py: 29 () INFO Read Set Point: 1556642011.907222 -2019-04-30 12:33:31,920 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,922 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,923 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,924 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,925 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,926 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,928 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,929 actuator.py: 29 () INFO Read Set Point: 1556642011.918658 -2019-04-30 12:33:31,930 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,931 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,933 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,934 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,935 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,937 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,938 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,939 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,941 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,942 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,943 actuator.py: 29 () INFO Read Set Point: 1556642011.9293828 -2019-04-30 12:33:31,944 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,945 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,947 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,948 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,949 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,950 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,952 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,953 actuator.py: 29 () INFO Read Set Point: 1556642011.941053 -2019-04-30 12:33:31,954 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,955 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,956 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,958 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,959 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,960 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,961 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,963 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,964 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,965 actuator.py: 29 () INFO Read Set Point: 1556642011.9530659 -2019-04-30 12:33:31,966 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,968 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,969 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,970 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,971 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,973 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,974 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,975 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,976 actuator.py: 29 () INFO Read Set Point: 1556642011.964304 -2019-04-30 12:33:31,977 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,979 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,980 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,981 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,982 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,984 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,985 actuator.py: 29 () INFO Read Set Point: 1556642011.974935 -2019-04-30 12:33:31,986 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,988 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,989 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,990 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,991 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,992 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,993 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,995 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,996 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,997 actuator.py: 29 () INFO Read Set Point: 1556642011.9854841 -2019-04-30 12:33:31,999 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,000 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,001 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,002 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,004 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,005 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,006 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,008 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,008 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,010 actuator.py: 29 () INFO Read Set Point: 1556642011.9977632 -2019-04-30 12:33:32,011 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,012 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,013 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,014 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,016 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,017 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,018 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,019 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,021 actuator.py: 29 () INFO Read Set Point: 1556642012.0090392 -2019-04-30 12:33:32,022 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,023 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,024 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,025 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,027 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,028 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,029 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,030 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,031 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,033 actuator.py: 29 () INFO Read Set Point: 1556642012.021003 -2019-04-30 12:33:32,034 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,035 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,036 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,038 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,039 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,040 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,041 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,043 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,044 actuator.py: 29 () INFO Read Set Point: 1556642012.0330229 -2019-04-30 12:33:32,045 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,046 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,048 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,049 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,050 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,051 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,053 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,054 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,055 actuator.py: 29 () INFO Read Set Point: 1556642012.043095 -2019-04-30 12:33:32,056 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,057 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,059 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,060 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,061 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,063 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,064 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,065 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,066 actuator.py: 29 () INFO Read Set Point: 1556642012.054816 -2019-04-30 12:33:32,067 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,069 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,070 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,071 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,072 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,074 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,075 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,076 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,078 actuator.py: 29 () INFO Read Set Point: 1556642012.065377 -2019-04-30 12:33:32,079 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,080 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,081 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,083 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,084 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,085 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,086 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,088 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,089 actuator.py: 29 () INFO Read Set Point: 1556642012.0767949 -2019-04-30 12:33:32,090 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,091 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,093 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,094 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,095 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,097 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,098 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,099 actuator.py: 29 () INFO Read Set Point: 1556642012.088423 -2019-04-30 12:33:32,100 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,102 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,103 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,104 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,105 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,107 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,108 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,109 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,110 actuator.py: 29 () INFO Read Set Point: 1556642012.099613 -2019-04-30 12:33:32,111 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,113 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,114 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,115 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,116 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,118 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,119 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,120 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,121 actuator.py: 29 () INFO Read Set Point: 1556642012.109911 -2019-04-30 12:33:32,123 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,124 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,125 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,126 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,128 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,129 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,130 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,131 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,132 actuator.py: 29 () INFO Read Set Point: 1556642012.1210082 -2019-04-30 12:33:32,134 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,135 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,136 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,137 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,138 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,140 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,141 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,142 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,143 actuator.py: 29 () INFO Read Set Point: 1556642012.131615 -2019-04-30 12:33:32,145 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,146 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,147 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,148 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,150 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,151 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,152 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,154 actuator.py: 29 () INFO Read Set Point: 1556642012.14331 -2019-04-30 12:33:32,155 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,156 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,157 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,158 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,160 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,161 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,162 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,163 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,165 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,166 actuator.py: 29 () INFO Read Set Point: 1556642012.1539981 -2019-04-30 12:33:32,167 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,169 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,170 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,171 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,172 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,174 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,175 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,176 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,178 actuator.py: 29 () INFO Read Set Point: 1556642012.1664279 -2019-04-30 12:33:32,179 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,180 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,181 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,183 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,184 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,185 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,187 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,188 actuator.py: 29 () INFO Read Set Point: 1556642012.1766982 -2019-04-30 12:33:32,189 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,190 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,191 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,193 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,194 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,195 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,197 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,198 actuator.py: 29 () INFO Read Set Point: 1556642012.187878 -2019-04-30 12:33:32,199 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,200 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,202 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,203 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,204 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,205 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,207 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,208 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,209 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,210 actuator.py: 29 () INFO Read Set Point: 1556642012.198113 -2019-04-30 12:33:32,212 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,213 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,214 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,215 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,217 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,218 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,219 actuator.py: 29 () INFO Read Set Point: 1556642012.209358 -2019-04-30 12:33:32,220 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,222 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,223 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,224 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,226 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,227 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,228 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,229 actuator.py: 29 () INFO Read Set Point: 1556642012.219717 -2019-04-30 12:33:32,231 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,232 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,233 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,235 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,236 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,237 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,238 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,240 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,241 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,242 actuator.py: 29 () INFO Read Set Point: 1556642012.2299662 -2019-04-30 12:33:32,244 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,245 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,246 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,247 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,249 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,250 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,251 actuator.py: 29 () INFO Read Set Point: 1556642012.240879 -2019-04-30 12:33:32,253 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,254 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,255 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,256 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,258 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,259 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,260 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,261 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,263 actuator.py: 29 () INFO Read Set Point: 1556642012.251948 -2019-04-30 12:33:32,264 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,265 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,267 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,268 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,269 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,270 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,272 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,273 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,274 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,275 actuator.py: 29 () INFO Read Set Point: 1556642012.263175 -2019-04-30 12:33:32,276 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,278 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,279 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,280 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,281 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,283 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,284 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,286 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,287 actuator.py: 29 () INFO Read Set Point: 1556642012.274057 -2019-04-30 12:33:32,288 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,289 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,291 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,292 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,293 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,294 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,295 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,297 actuator.py: 29 () INFO Read Set Point: 1556642012.286144 -2019-04-30 12:33:32,298 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,300 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,301 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,302 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,304 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,305 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,306 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,307 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,308 actuator.py: 29 () INFO Read Set Point: 1556642012.29656 -2019-04-30 12:33:32,309 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,311 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,312 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,313 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,315 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,316 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,317 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,319 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,320 actuator.py: 29 () INFO Read Set Point: 1556642012.307735 -2019-04-30 12:33:32,321 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,322 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,323 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,324 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,326 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,327 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,328 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,329 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,330 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,331 actuator.py: 29 () INFO Read Set Point: 1556642012.319846 -2019-04-30 12:33:32,332 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,334 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,335 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,336 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,337 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,338 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,339 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,340 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,341 actuator.py: 29 () INFO Read Set Point: 1556642012.331411 -2019-04-30 12:33:32,343 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,344 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,345 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,346 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,347 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,348 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,350 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,351 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,352 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,353 actuator.py: 29 () INFO Read Set Point: 1556642012.341921 -2019-04-30 12:33:32,354 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,355 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,357 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,358 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,359 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,360 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,362 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,363 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,364 actuator.py: 29 () INFO Read Set Point: 1556642012.352928 -2019-04-30 12:33:32,365 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,366 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,367 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,369 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,370 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,371 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,372 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,374 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,375 actuator.py: 29 () INFO Read Set Point: 1556642012.3645701 -2019-04-30 12:33:32,376 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,377 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,379 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,380 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,381 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,382 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,384 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,385 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,386 actuator.py: 29 () INFO Read Set Point: 1556642012.375125 -2019-04-30 12:33:32,387 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,388 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,390 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,391 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,392 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,393 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,395 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,396 actuator.py: 29 () INFO Read Set Point: 1556642012.386444 -2019-04-30 12:33:32,397 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,399 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,400 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,401 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,402 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,403 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,405 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,406 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,407 actuator.py: 29 () INFO Read Set Point: 1556642012.3965068 -2019-04-30 12:33:32,408 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,410 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,411 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,412 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,413 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,415 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,416 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,417 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,418 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,419 actuator.py: 29 () INFO Read Set Point: 1556642012.407723 -2019-04-30 12:33:32,421 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,422 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,423 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,424 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,426 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,427 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,428 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,430 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,431 actuator.py: 29 () INFO Read Set Point: 1556642012.420054 -2019-04-30 12:33:32,432 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,433 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,434 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,436 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,437 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,438 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,439 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,440 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,442 actuator.py: 29 () INFO Read Set Point: 1556642012.431294 -2019-04-30 12:33:32,443 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,444 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,446 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,447 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,448 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,449 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,451 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,452 actuator.py: 29 () INFO Read Set Point: 1556642012.4420621 -2019-04-30 12:33:32,453 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,455 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,456 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,457 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,459 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,460 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,461 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,463 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,464 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,465 actuator.py: 29 () INFO Read Set Point: 1556642012.452576 -2019-04-30 12:33:32,466 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,468 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,469 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,470 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,472 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,473 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,474 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,476 actuator.py: 29 () INFO Read Set Point: 1556642012.465028 -2019-04-30 12:33:32,477 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,478 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,480 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,481 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,482 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,483 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,485 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,486 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,487 actuator.py: 29 () INFO Read Set Point: 1556642012.476086 -2019-04-30 12:33:32,489 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,490 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,491 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,492 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,494 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,495 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,496 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,497 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,498 actuator.py: 29 () INFO Read Set Point: 1556642012.487807 -2019-04-30 12:33:32,499 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,500 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,501 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,502 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,503 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,504 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,505 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,507 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,508 actuator.py: 29 () INFO Read Set Point: 1556642012.49793 -2019-04-30 12:33:32,509 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,510 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,512 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,513 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,514 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,515 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,517 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,518 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,519 actuator.py: 29 () INFO Read Set Point: 1556642012.508557 -2019-04-30 12:33:32,521 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,522 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,523 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,524 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,525 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,526 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,528 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,529 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,530 actuator.py: 29 () INFO Read Set Point: 1556642012.519797 -2019-04-30 12:33:32,531 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,533 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,534 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,535 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,536 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,537 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,538 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,540 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,541 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,542 actuator.py: 29 () INFO Read Set Point: 1556642012.530603 -2019-04-30 12:33:32,544 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,545 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,546 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,547 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,548 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,550 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,551 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,552 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,553 actuator.py: 29 () INFO Read Set Point: 1556642012.5410502 -2019-04-30 12:33:32,555 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,556 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,557 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,558 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,560 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,561 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,562 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,563 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,565 actuator.py: 29 () INFO Read Set Point: 1556642012.5531461 -2019-04-30 12:33:32,566 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,567 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,568 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,570 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,571 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,572 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,574 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,575 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,576 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,577 actuator.py: 29 () INFO Read Set Point: 1556642012.565048 -2019-04-30 12:33:32,578 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,580 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,581 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,582 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,583 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,585 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,586 actuator.py: 29 () INFO Read Set Point: 1556642012.575339 -2019-04-30 12:33:32,587 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,588 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,590 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,591 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,592 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,593 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,594 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,596 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,597 actuator.py: 29 () INFO Read Set Point: 1556642012.586257 -2019-04-30 12:33:32,598 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,599 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,601 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,602 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,603 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,605 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,606 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,607 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,608 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,609 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,610 actuator.py: 29 () INFO Read Set Point: 1556642012.597507 -2019-04-30 12:33:32,612 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,613 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,614 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,616 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,617 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,618 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,619 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,621 actuator.py: 29 () INFO Read Set Point: 1556642012.609898 -2019-04-30 12:33:32,622 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,623 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,624 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,626 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,627 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,628 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,629 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,631 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,632 actuator.py: 29 () INFO Read Set Point: 1556642012.621158 -2019-04-30 12:33:32,633 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,635 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,636 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,637 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,638 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,640 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,641 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,642 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,643 actuator.py: 29 () INFO Read Set Point: 1556642012.632137 -2019-04-30 12:33:32,645 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,646 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,647 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,649 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,650 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,651 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,652 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,654 actuator.py: 29 () INFO Read Set Point: 1556642012.6423502 -2019-04-30 12:33:32,655 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,656 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,657 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,658 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,659 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,661 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,662 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,663 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,664 actuator.py: 29 () INFO Read Set Point: 1556642012.653128 -2019-04-30 12:33:32,666 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,667 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,668 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,669 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,671 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,672 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,673 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,675 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,676 actuator.py: 29 () INFO Read Set Point: 1556642012.664084 -2019-04-30 12:33:32,677 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,678 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,680 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,681 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,682 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,684 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,685 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,686 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,687 actuator.py: 29 () INFO Read Set Point: 1556642012.675071 -2019-04-30 12:33:32,688 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,690 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,691 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,692 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,693 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,695 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,696 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,697 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,699 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,700 actuator.py: 29 () INFO Read Set Point: 1556642012.687139 -2019-04-30 12:33:32,701 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,702 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,704 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,705 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,706 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,708 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,709 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,710 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,711 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,712 actuator.py: 29 () INFO Read Set Point: 1556642012.699481 -2019-04-30 12:33:32,714 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,715 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,716 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,718 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,719 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,720 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,722 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,723 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,724 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,725 actuator.py: 29 () INFO Read Set Point: 1556642012.711806 -2019-04-30 12:33:32,726 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,728 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,729 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,730 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,732 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,733 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,734 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,735 actuator.py: 29 () INFO Read Set Point: 1556642012.723619 -2019-04-30 12:33:32,737 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,738 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,739 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,740 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,741 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,743 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,744 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,745 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,746 actuator.py: 29 () INFO Read Set Point: 1556642012.735805 -2019-04-30 12:33:32,748 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,749 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,750 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,752 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,753 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,754 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,755 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,756 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,758 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,759 actuator.py: 29 () INFO Read Set Point: 1556642012.74687 -2019-04-30 12:33:32,760 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,761 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,763 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,764 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,765 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,767 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,768 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,769 actuator.py: 29 () INFO Read Set Point: 1556642012.758083 -2019-04-30 12:33:32,770 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,772 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,773 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,774 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,775 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,777 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,778 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,779 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,781 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,782 actuator.py: 29 () INFO Read Set Point: 1556642012.769855 -2019-04-30 12:33:32,783 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,784 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,786 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,787 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,788 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,790 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,791 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,792 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,793 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,794 actuator.py: 29 () INFO Read Set Point: 1556642012.78228 -2019-04-30 12:33:32,796 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,797 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,798 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,799 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,801 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,802 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,803 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,805 actuator.py: 29 () INFO Read Set Point: 1556642012.793986 -2019-04-30 12:33:32,806 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,807 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,808 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,809 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,811 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,812 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,813 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,815 actuator.py: 29 () INFO Read Set Point: 1556642012.804981 -2019-04-30 12:33:32,816 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,817 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,819 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,820 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,821 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,822 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,823 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,825 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,826 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,827 actuator.py: 29 () INFO Read Set Point: 1556642012.81514 -2019-04-30 12:33:32,828 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,830 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,831 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,832 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,833 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,835 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,836 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,837 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,838 actuator.py: 29 () INFO Read Set Point: 1556642012.8263218 -2019-04-30 12:33:32,840 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,841 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,842 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,843 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,845 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,846 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,847 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,848 actuator.py: 29 () INFO Read Set Point: 1556642012.8380108 -2019-04-30 12:33:32,850 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,851 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,852 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,853 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,855 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,856 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,857 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,858 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,859 actuator.py: 29 () INFO Read Set Point: 1556642012.848214 -2019-04-30 12:33:32,861 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,862 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,863 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,865 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,866 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,867 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,869 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,870 actuator.py: 29 () INFO Read Set Point: 1556642012.8587148 -2019-04-30 12:33:32,871 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,872 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,873 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,874 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,876 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,877 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,878 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,880 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,881 actuator.py: 29 () INFO Read Set Point: 1556642012.870368 -2019-04-30 12:33:32,882 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,884 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,885 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,886 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,887 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,889 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,890 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,891 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,892 actuator.py: 29 () INFO Read Set Point: 1556642012.880529 -2019-04-30 12:33:32,893 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,895 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,896 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,897 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,898 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,900 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,901 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,902 actuator.py: 29 () INFO Read Set Point: 1556642012.8908029 -2019-04-30 12:33:32,903 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,905 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,906 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,907 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,908 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,909 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,910 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,911 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,913 actuator.py: 29 () INFO Read Set Point: 1556642012.901351 -2019-04-30 12:33:32,914 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,915 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,917 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,918 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,919 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,920 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,922 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,923 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,924 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,925 actuator.py: 29 () INFO Read Set Point: 1556642012.913184 -2019-04-30 12:33:32,926 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,927 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,929 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,930 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,931 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,932 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,934 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,935 actuator.py: 29 () INFO Read Set Point: 1556642012.9250822 -2019-04-30 12:33:32,936 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,937 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,939 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,940 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,941 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,942 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,944 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,945 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,946 actuator.py: 29 () INFO Read Set Point: 1556642012.935431 -2019-04-30 12:33:32,947 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,949 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,950 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,951 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,953 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,954 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,955 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,956 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,958 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,959 actuator.py: 29 () INFO Read Set Point: 1556642012.946589 -2019-04-30 12:33:32,960 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,961 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,962 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,964 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,965 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,966 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,968 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,969 actuator.py: 29 () INFO Read Set Point: 1556642012.958401 -2019-04-30 12:33:32,970 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,972 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,973 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,974 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,975 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,976 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,978 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,979 actuator.py: 29 () INFO Read Set Point: 1556642012.9694011 -2019-04-30 12:33:32,980 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,982 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,983 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,984 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,986 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,987 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,988 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,990 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,991 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,992 actuator.py: 29 () INFO Read Set Point: 1556642012.9795 -2019-04-30 12:33:32,993 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:32,994 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:32,995 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:32,997 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:32,998 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:32,999 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:33,001 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:33,002 actuator.py: 29 () INFO Read Set Point: 1556642012.991366 -2019-04-30 12:33:33,003 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,004 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,005 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,007 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,008 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,009 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,010 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,011 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,013 actuator.py: 29 () INFO Read Set Point: 1556642013.0018718 -2019-04-30 12:33:33,014 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,015 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,017 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,018 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,019 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,020 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,022 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,023 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,024 actuator.py: 29 () INFO Read Set Point: 1556642013.013152 -2019-04-30 12:33:33,026 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,027 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,028 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,029 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,031 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,032 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,033 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,035 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,036 actuator.py: 29 () INFO Read Set Point: 1556642013.023314 -2019-04-30 12:33:33,037 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,038 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,040 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,041 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,042 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,043 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,044 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,045 actuator.py: 29 () INFO Read Set Point: 1556642013.035418 -2019-04-30 12:33:33,046 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,048 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,049 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,050 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,051 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,052 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,053 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,054 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,055 actuator.py: 29 () INFO Read Set Point: 1556642013.045449 -2019-04-30 12:33:33,057 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,058 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,059 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,060 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,061 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,062 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,063 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,064 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,066 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,067 actuator.py: 29 () INFO Read Set Point: 1556642013.055991 -2019-04-30 12:33:33,068 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,069 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,070 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,072 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,073 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,074 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,075 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,076 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,077 actuator.py: 29 () INFO Read Set Point: 1556642013.0673568 -2019-04-30 12:33:33,079 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,080 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,081 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,082 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,084 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,085 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,086 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,088 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,089 actuator.py: 29 () INFO Read Set Point: 1556642013.077881 -2019-04-30 12:33:33,090 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,091 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,092 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,094 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,095 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,096 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,097 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,098 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,100 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,101 actuator.py: 29 () INFO Read Set Point: 1556642013.089407 -2019-04-30 12:33:33,102 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,103 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,105 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,106 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,107 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,108 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,110 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,111 actuator.py: 29 () INFO Read Set Point: 1556642013.100181 -2019-04-30 12:33:33,112 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,114 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,115 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,116 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,117 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,119 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,120 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,121 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,122 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,124 actuator.py: 29 () INFO Read Set Point: 1556642013.1114602 -2019-04-30 12:33:33,125 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,126 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,127 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,129 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,130 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,131 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,132 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,133 actuator.py: 29 () INFO Read Set Point: 1556642013.123901 -2019-04-30 12:33:33,135 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,136 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,137 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,138 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,140 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,141 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,142 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,143 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,144 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,146 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,147 actuator.py: 29 () INFO Read Set Point: 1556642013.1340742 -2019-04-30 12:33:33,148 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,149 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,150 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,152 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,153 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,154 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,155 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,156 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,158 actuator.py: 29 () INFO Read Set Point: 1556642013.14648 -2019-04-30 12:33:33,159 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,160 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,161 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,163 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,164 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,165 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,166 actuator.py: 29 () INFO Read Set Point: 1556642013.156596 -2019-04-30 12:33:33,168 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,169 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,170 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,172 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,173 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,174 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,175 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,176 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,177 actuator.py: 29 () INFO Read Set Point: 1556642013.1668181 -2019-04-30 12:33:33,178 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,180 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,181 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,182 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,183 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,185 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,186 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,187 actuator.py: 29 () INFO Read Set Point: 1556642013.176878 -2019-04-30 12:33:33,189 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,190 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,191 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,192 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,194 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,195 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,196 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,197 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,199 actuator.py: 29 () INFO Read Set Point: 1556642013.187892 -2019-04-30 12:33:33,200 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,201 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,203 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,204 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,205 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,206 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,208 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,209 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,210 actuator.py: 29 () INFO Read Set Point: 1556642013.1981351 -2019-04-30 12:33:33,212 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,213 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,214 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,215 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,217 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,218 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,219 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,221 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,222 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,223 actuator.py: 29 () INFO Read Set Point: 1556642013.210548 -2019-04-30 12:33:33,224 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,225 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,227 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,228 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,229 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,231 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,232 actuator.py: 29 () INFO Read Set Point: 1556642013.221139 -2019-04-30 12:33:33,233 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,234 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,236 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,237 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,238 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,240 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,241 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,242 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,243 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,244 actuator.py: 29 () INFO Read Set Point: 1556642013.231827 -2019-04-30 12:33:33,245 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,247 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,248 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,249 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,250 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,252 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,253 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,254 actuator.py: 29 () INFO Read Set Point: 1556642013.243426 -2019-04-30 12:33:33,255 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,256 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,258 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,259 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,260 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,262 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,263 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,264 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,265 actuator.py: 29 () INFO Read Set Point: 1556642013.253834 -2019-04-30 12:33:33,266 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,268 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,269 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,270 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,272 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,273 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,274 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,276 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,277 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,278 actuator.py: 29 () INFO Read Set Point: 1556642013.2657971 -2019-04-30 12:33:33,280 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,281 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,282 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,283 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,285 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,286 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,287 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,289 actuator.py: 29 () INFO Read Set Point: 1556642013.277765 -2019-04-30 12:33:33,290 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,291 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,293 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,294 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,295 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,296 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,298 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,299 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,300 actuator.py: 29 () INFO Read Set Point: 1556642013.288181 -2019-04-30 12:33:33,302 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,303 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,304 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,305 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,307 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,308 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,309 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,311 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,312 actuator.py: 29 () INFO Read Set Point: 1556642013.300616 -2019-04-30 12:33:33,313 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,314 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,316 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,317 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,318 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,320 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,321 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,322 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,323 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,325 actuator.py: 29 () INFO Read Set Point: 1556642013.312217 -2019-04-30 12:33:33,326 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,327 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,328 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,330 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,331 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,332 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,334 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,335 actuator.py: 29 () INFO Read Set Point: 1556642013.3245661 -2019-04-30 12:33:33,336 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,337 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,339 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,340 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,341 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,343 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,344 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,345 actuator.py: 29 () INFO Read Set Point: 1556642013.334879 -2019-04-30 12:33:33,346 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,348 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,349 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,350 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,352 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,353 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,354 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,355 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,357 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,358 actuator.py: 29 () INFO Read Set Point: 1556642013.3451688 -2019-04-30 12:33:33,359 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,361 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,362 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,363 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,364 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,365 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,367 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,368 actuator.py: 29 () INFO Read Set Point: 1556642013.3574872 -2019-04-30 12:33:33,369 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,371 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,372 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,373 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,375 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,376 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,377 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,378 actuator.py: 29 () INFO Read Set Point: 1556642013.368565 -2019-04-30 12:33:33,380 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,381 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,382 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,384 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,385 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,386 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,388 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,389 actuator.py: 29 () INFO Read Set Point: 1556642013.3788958 -2019-04-30 12:33:33,390 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,391 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,393 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,394 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,395 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,397 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,398 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,399 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,401 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,402 actuator.py: 29 () INFO Read Set Point: 1556642013.389298 -2019-04-30 12:33:33,403 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,404 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,405 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,407 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,408 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,409 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,410 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,411 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,413 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,414 actuator.py: 29 () INFO Read Set Point: 1556642013.401551 -2019-04-30 12:33:33,415 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,417 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,418 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,419 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,420 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,422 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,423 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,424 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,426 actuator.py: 29 () INFO Read Set Point: 1556642013.413931 -2019-04-30 12:33:33,427 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,428 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,429 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,431 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,432 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,433 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,434 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,436 actuator.py: 29 () INFO Read Set Point: 1556642013.425898 -2019-04-30 12:33:33,437 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,438 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,440 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,441 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,442 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,443 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,445 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,446 actuator.py: 29 () INFO Read Set Point: 1556642013.436239 -2019-04-30 12:33:33,447 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,448 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,450 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,451 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,452 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,453 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,455 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,456 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,457 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,458 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,459 actuator.py: 29 () INFO Read Set Point: 1556642013.446336 -2019-04-30 12:33:33,461 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,462 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,463 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,465 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,466 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,467 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,468 actuator.py: 29 () INFO Read Set Point: 1556642013.458787 -2019-04-30 12:33:33,470 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,471 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,472 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,474 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,475 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,476 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,477 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,479 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,480 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,481 actuator.py: 29 () INFO Read Set Point: 1556642013.468854 -2019-04-30 12:33:33,483 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,484 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,485 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,487 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,488 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,489 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,490 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,491 actuator.py: 29 () INFO Read Set Point: 1556642013.481308 -2019-04-30 12:33:33,493 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,494 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,495 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,497 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,498 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,499 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,500 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,502 actuator.py: 29 () INFO Read Set Point: 1556642013.491877 -2019-04-30 12:33:33,503 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,504 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,505 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,507 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,508 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,509 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,510 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,512 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,513 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,515 actuator.py: 29 () INFO Read Set Point: 1556642013.502111 -2019-04-30 12:33:33,516 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,517 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,518 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,520 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,521 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,522 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,524 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,525 actuator.py: 29 () INFO Read Set Point: 1556642013.513994 -2019-04-30 12:33:33,526 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,527 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,529 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,530 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,531 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,533 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,534 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,535 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,536 actuator.py: 29 () INFO Read Set Point: 1556642013.52412 -2019-04-30 12:33:33,538 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,539 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,540 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,542 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,543 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,544 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,545 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,547 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,548 actuator.py: 29 () INFO Read Set Point: 1556642013.5365179 -2019-04-30 12:33:33,550 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,551 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,552 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,553 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,554 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,555 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,557 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,558 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,559 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,561 actuator.py: 29 () INFO Read Set Point: 1556642013.5481012 -2019-04-30 12:33:33,562 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,563 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,564 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,565 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,567 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,568 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,569 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,570 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,572 actuator.py: 29 () INFO Read Set Point: 1556642013.560412 -2019-04-30 12:33:33,573 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,574 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,575 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,576 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,578 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,579 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,580 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,581 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,582 actuator.py: 29 () INFO Read Set Point: 1556642013.5720792 -2019-04-30 12:33:33,584 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,585 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,586 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,587 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,589 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,590 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,591 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,592 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,594 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,595 actuator.py: 29 () INFO Read Set Point: 1556642013.583158 -2019-04-30 12:33:33,596 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,598 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,599 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,600 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,601 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,602 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,604 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,605 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,606 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,607 actuator.py: 29 () INFO Read Set Point: 1556642013.595445 -2019-04-30 12:33:33,608 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,610 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,611 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,612 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,613 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,615 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,616 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,617 actuator.py: 29 () INFO Read Set Point: 1556642013.607739 -2019-04-30 12:33:33,618 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,620 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,621 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,622 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,623 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,624 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,626 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,627 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,628 actuator.py: 29 () INFO Read Set Point: 1556642013.61779 -2019-04-30 12:33:33,629 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,630 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,632 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,633 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,634 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,635 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,637 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,638 actuator.py: 29 () INFO Read Set Point: 1556642013.628504 -2019-04-30 12:33:33,639 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,640 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,642 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,643 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,644 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,645 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,647 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,648 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,649 actuator.py: 29 () INFO Read Set Point: 1556642013.638592 -2019-04-30 12:33:33,651 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,652 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,653 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,654 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,655 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,656 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,658 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,659 actuator.py: 29 () INFO Read Set Point: 1556642013.649009 -2019-04-30 12:33:33,660 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,661 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,663 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,664 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,665 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,666 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,668 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,669 actuator.py: 29 () INFO Read Set Point: 1556642013.6594748 -2019-04-30 12:33:33,670 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,672 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,673 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,674 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,675 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,676 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,678 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,679 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,680 actuator.py: 29 () INFO Read Set Point: 1556642013.66957 -2019-04-30 12:33:33,681 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,683 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,684 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,685 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,686 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,688 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,689 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,690 actuator.py: 29 () INFO Read Set Point: 1556642013.680521 -2019-04-30 12:33:33,691 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,693 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,694 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,695 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,696 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,698 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,699 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,700 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,702 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,703 actuator.py: 29 () INFO Read Set Point: 1556642013.6906729 -2019-04-30 12:33:33,704 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,705 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,707 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,708 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,709 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,711 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,712 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,713 actuator.py: 29 () INFO Read Set Point: 1556642013.703181 -2019-04-30 12:33:33,714 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,716 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,717 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,718 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,720 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,721 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,722 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,724 actuator.py: 29 () INFO Read Set Point: 1556642013.7137 -2019-04-30 12:33:33,725 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,726 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,728 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,729 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,730 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,732 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,733 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,734 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,735 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,737 actuator.py: 29 () INFO Read Set Point: 1556642013.724014 -2019-04-30 12:33:33,738 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,739 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,741 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,742 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,743 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,744 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,746 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,747 actuator.py: 29 () INFO Read Set Point: 1556642013.736115 -2019-04-30 12:33:33,748 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,750 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,751 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,752 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,753 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,755 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,756 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,757 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,758 actuator.py: 29 () INFO Read Set Point: 1556642013.747301 -2019-04-30 12:33:33,760 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,761 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,762 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,764 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,765 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,766 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,767 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,769 actuator.py: 29 () INFO Read Set Point: 1556642013.757878 -2019-04-30 12:33:33,770 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,771 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,773 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,774 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,775 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,777 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,778 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,779 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,781 actuator.py: 29 () INFO Read Set Point: 1556642013.768091 -2019-04-30 12:33:33,782 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,783 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,784 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,786 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,787 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,788 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,790 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,791 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,792 actuator.py: 29 () INFO Read Set Point: 1556642013.7804658 -2019-04-30 12:33:33,793 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,794 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,796 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,797 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,798 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,800 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,801 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,802 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,803 actuator.py: 29 () INFO Read Set Point: 1556642013.791327 -2019-04-30 12:33:33,805 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,806 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,807 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,808 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,810 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,811 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,812 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,814 actuator.py: 29 () INFO Read Set Point: 1556642013.802645 -2019-04-30 12:33:33,815 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,816 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,818 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,819 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,820 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,822 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,823 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,824 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,825 actuator.py: 29 () INFO Read Set Point: 1556642013.8139231 -2019-04-30 12:33:33,827 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,828 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,829 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,830 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,831 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,833 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,834 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,835 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,836 actuator.py: 29 () INFO Read Set Point: 1556642013.8245828 -2019-04-30 12:33:33,838 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,839 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,840 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,841 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,842 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,843 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,845 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,846 actuator.py: 29 () INFO Read Set Point: 1556642013.835493 -2019-04-30 12:33:33,847 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,848 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,850 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,851 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,852 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,853 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,855 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,856 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,857 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,858 actuator.py: 29 () INFO Read Set Point: 1556642013.846438 -2019-04-30 12:33:33,860 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,861 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,862 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,863 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,864 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,866 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,867 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,868 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,869 actuator.py: 29 () INFO Read Set Point: 1556642013.857732 -2019-04-30 12:33:33,871 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,874 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,875 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,876 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,877 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,878 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,879 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,881 actuator.py: 29 () INFO Read Set Point: 1556642013.870002 -2019-04-30 12:33:33,882 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,883 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,884 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,886 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,887 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,888 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,890 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,894 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,895 actuator.py: 29 () INFO Read Set Point: 1556642013.881315 -2019-04-30 12:33:33,896 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,897 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,899 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,900 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,906 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,908 actuator.py: 29 () INFO Read Set Point: 1556642013.894261 -2019-04-30 12:33:33,909 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,910 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,911 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,913 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,914 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,915 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,916 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,917 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,919 actuator.py: 29 () INFO Read Set Point: 1556642013.9076748 -2019-04-30 12:33:33,920 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,921 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,922 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,923 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,925 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,926 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,927 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,928 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,929 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,930 actuator.py: 29 () INFO Read Set Point: 1556642013.9192052 -2019-04-30 12:33:33,932 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,933 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,934 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,935 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,936 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,938 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,939 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,940 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,941 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,942 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,944 actuator.py: 29 () INFO Read Set Point: 1556642013.931006 -2019-04-30 12:33:33,945 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,946 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,947 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,948 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,949 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,951 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,952 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,953 actuator.py: 29 () INFO Read Set Point: 1556642013.941698 -2019-04-30 12:33:33,954 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,956 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,957 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,958 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,959 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,960 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,962 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,963 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,964 actuator.py: 29 () INFO Read Set Point: 1556642013.952802 -2019-04-30 12:33:33,965 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,966 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,968 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,969 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,970 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,971 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,973 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,974 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,975 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,976 actuator.py: 29 () INFO Read Set Point: 1556642013.964084 -2019-04-30 12:33:33,978 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,979 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,980 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,981 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,983 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,984 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,985 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,986 actuator.py: 29 () INFO Read Set Point: 1556642013.975858 -2019-04-30 12:33:33,988 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,989 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,990 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,991 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,992 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,993 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,995 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,996 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,997 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,998 actuator.py: 29 () INFO Read Set Point: 1556642013.986586 -2019-04-30 12:33:33,999 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,000 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,002 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,003 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,004 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,005 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,007 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,008 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,009 actuator.py: 29 () INFO Read Set Point: 1556642013.997566 -2019-04-30 12:33:34,010 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,011 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,013 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,014 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,015 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,016 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,018 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,019 actuator.py: 29 () INFO Read Set Point: 1556642014.008119 -2019-04-30 12:33:34,020 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,021 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,022 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,024 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,025 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,026 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,027 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,029 actuator.py: 29 () INFO Read Set Point: 1556642014.0189161 -2019-04-30 12:33:34,030 actuator.py: 29 () INFO Read Set Point: 1556642014.029043 -2019-04-30 12:33:34,031 actuator.py: 29 () INFO Read Set Point: 1556642014.029043 -2019-04-30 12:33:34,037 actuator.py: 29 () INFO Read Set Point: 1556642014.029043 -2019-04-30 12:33:34,038 actuator.py: 29 () INFO Read Set Point: 1556642014.029043 -2019-04-30 12:33:34,039 actuator.py: 29 () INFO Read Set Point: 1556642014.029043 -2019-04-30 12:33:34,040 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,042 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,044 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,046 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,047 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,048 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,050 actuator.py: 29 () INFO Read Set Point: 1556642014.0395231 -2019-04-30 12:33:34,052 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,054 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,055 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,056 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,057 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,058 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,059 actuator.py: 29 () INFO Read Set Point: 1556642014.049901 -2019-04-30 12:33:34,061 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,063 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,066 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,068 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,069 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,070 actuator.py: 29 () INFO Read Set Point: 1556642014.059924 -2019-04-30 12:33:34,071 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,073 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,074 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,075 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,076 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,077 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,079 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,080 actuator.py: 29 () INFO Read Set Point: 1556642014.069961 -2019-04-30 12:33:34,082 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,083 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,084 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,086 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,087 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,090 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,093 actuator.py: 29 () INFO Read Set Point: 1556642014.080909 -2019-04-30 12:33:34,094 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,098 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,099 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,101 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,102 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,103 actuator.py: 29 () INFO Read Set Point: 1556642014.093285 -2019-04-30 12:33:34,109 actuator.py: 29 () INFO Read Set Point: 1556642014.103838 -2019-04-30 12:33:34,110 actuator.py: 29 () INFO Read Set Point: 1556642014.103838 -2019-04-30 12:33:34,112 actuator.py: 29 () INFO Read Set Point: 1556642014.103838 -2019-04-30 12:33:34,113 actuator.py: 29 () INFO Read Set Point: 1556642014.103838 -2019-04-30 12:33:34,114 actuator.py: 29 () INFO Read Set Point: 1556642014.103838 -2019-04-30 12:33:34,115 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,117 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,118 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,119 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,120 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,121 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,126 actuator.py: 29 () INFO Read Set Point: 1556642014.114508 -2019-04-30 12:33:34,128 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,129 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,130 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,131 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,133 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,135 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,136 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,137 actuator.py: 29 () INFO Read Set Point: 1556642014.1269 -2019-04-30 12:33:34,138 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,139 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,141 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,142 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,143 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,144 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,146 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,147 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,148 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,149 actuator.py: 29 () INFO Read Set Point: 1556642014.13695 -2019-04-30 12:33:34,151 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,152 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,153 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,155 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,156 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,157 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,158 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,160 actuator.py: 29 () INFO Read Set Point: 1556642014.148621 -2019-04-30 12:33:34,161 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,162 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,163 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,164 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,166 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,167 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,168 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,169 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,171 actuator.py: 29 () INFO Read Set Point: 1556642014.159053 -2019-04-30 12:33:34,172 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,173 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,174 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,175 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,177 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,178 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,179 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,180 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,182 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,183 actuator.py: 29 () INFO Read Set Point: 1556642014.1713011 -2019-04-30 12:33:34,184 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,185 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,186 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,188 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,189 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,190 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,191 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,193 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,194 actuator.py: 29 () INFO Read Set Point: 1556642014.183275 -2019-04-30 12:33:34,195 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,196 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,197 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,199 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,200 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,201 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,202 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,204 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,205 actuator.py: 29 () INFO Read Set Point: 1556642014.194361 -2019-04-30 12:33:34,206 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,207 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,208 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,210 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,211 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,212 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,213 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,214 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,216 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,217 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,218 actuator.py: 29 () INFO Read Set Point: 1556642014.2054772 -2019-04-30 12:33:34,219 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,220 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,222 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,223 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,224 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,225 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,227 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,228 actuator.py: 29 () INFO Read Set Point: 1556642014.217867 -2019-04-30 12:33:34,229 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,230 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,232 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,233 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,234 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,235 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,237 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,238 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,239 actuator.py: 29 () INFO Read Set Point: 1556642014.228375 -2019-04-30 12:33:34,240 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,241 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,243 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,244 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,245 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,246 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,248 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,249 actuator.py: 29 () INFO Read Set Point: 1556642014.239299 -2019-04-30 12:33:34,250 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,251 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,253 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,254 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,255 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,256 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,257 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,258 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,260 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,261 actuator.py: 29 () INFO Read Set Point: 1556642014.249342 -2019-04-30 12:33:34,262 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,263 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,265 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,266 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,267 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,268 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,269 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,270 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,272 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,273 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,274 actuator.py: 29 () INFO Read Set Point: 1556642014.261367 -2019-04-30 12:33:34,275 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,276 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,277 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,279 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,280 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,281 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,282 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,284 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,285 actuator.py: 29 () INFO Read Set Point: 1556642014.2731059 -2019-04-30 12:33:34,286 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,287 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,288 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,289 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,291 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,292 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,293 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,294 actuator.py: 29 () INFO Read Set Point: 1556642014.2845492 -2019-04-30 12:33:34,296 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,297 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,298 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,299 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,300 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,302 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,303 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,304 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,305 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,307 actuator.py: 29 () INFO Read Set Point: 1556642014.2948742 -2019-04-30 12:33:34,308 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,309 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,310 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,312 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,313 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,314 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,315 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,316 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,318 actuator.py: 29 () INFO Read Set Point: 1556642014.306113 -2019-04-30 12:33:34,319 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,320 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,321 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,322 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,323 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,325 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,326 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,327 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,328 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,330 actuator.py: 29 () INFO Read Set Point: 1556642014.31801 -2019-04-30 12:33:34,331 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,332 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,333 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,335 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,336 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,337 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,338 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,339 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,341 actuator.py: 29 () INFO Read Set Point: 1556642014.3300312 -2019-04-30 12:33:34,342 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,343 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,344 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,346 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,347 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,348 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,349 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,350 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,351 actuator.py: 29 () INFO Read Set Point: 1556642014.341054 -2019-04-30 12:33:34,353 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,354 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,355 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,356 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,357 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,359 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,360 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,361 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,362 actuator.py: 29 () INFO Read Set Point: 1556642014.351905 -2019-04-30 12:33:34,364 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,365 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,366 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,367 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,369 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,370 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,371 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,372 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,373 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,375 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,376 actuator.py: 29 () INFO Read Set Point: 1556642014.3630998 -2019-04-30 12:33:34,377 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,378 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,379 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,381 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,382 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,383 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,384 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,386 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,387 actuator.py: 29 () INFO Read Set Point: 1556642014.375107 -2019-04-30 12:33:34,388 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,389 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,391 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,392 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,393 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,394 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,395 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,397 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,398 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,399 actuator.py: 29 () INFO Read Set Point: 1556642014.386677 -2019-04-30 12:33:34,400 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,402 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,403 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,404 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,405 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,407 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,408 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,409 actuator.py: 29 () INFO Read Set Point: 1556642014.3990169 -2019-04-30 12:33:34,410 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,412 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,413 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,414 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,415 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,417 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,418 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,419 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,420 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,422 actuator.py: 29 () INFO Read Set Point: 1556642014.409473 -2019-04-30 12:33:34,423 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,424 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,425 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,426 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,428 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,429 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,430 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,431 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,432 actuator.py: 29 () INFO Read Set Point: 1556642014.421547 -2019-04-30 12:33:34,433 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,435 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,436 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,437 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,438 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,440 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,441 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,442 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,443 actuator.py: 29 () INFO Read Set Point: 1556642014.431971 -2019-04-30 12:33:34,445 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,446 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,447 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,448 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,449 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,451 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,452 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,453 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,454 actuator.py: 29 () INFO Read Set Point: 1556642014.442989 -2019-04-30 12:33:34,456 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,457 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,458 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,459 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,461 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,462 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,463 actuator.py: 29 () INFO Read Set Point: 1556642014.453134 -2019-04-30 12:33:34,464 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,465 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,467 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,468 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,469 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,471 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,472 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,473 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,474 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,476 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,477 actuator.py: 29 () INFO Read Set Point: 1556642014.463455 -2019-04-30 12:33:34,478 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,480 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,481 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,482 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,483 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,485 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,486 actuator.py: 29 () INFO Read Set Point: 1556642014.474818 -2019-04-30 12:33:34,487 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,488 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,490 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,491 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,492 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,493 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,495 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,496 actuator.py: 29 () INFO Read Set Point: 1556642014.485104 -2019-04-30 12:33:34,497 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,499 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,500 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,501 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,502 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,504 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,505 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,506 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,507 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,509 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,510 actuator.py: 29 () INFO Read Set Point: 1556642014.495714 -2019-04-30 12:33:34,511 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,512 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,513 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,515 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,516 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,517 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,518 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,520 actuator.py: 29 () INFO Read Set Point: 1556642014.508099 -2019-04-30 12:33:34,521 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,522 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,523 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,525 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,526 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,527 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,528 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,530 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,531 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,532 actuator.py: 29 () INFO Read Set Point: 1556642014.520098 -2019-04-30 12:33:34,533 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,535 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,536 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,537 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,539 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,540 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,541 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,542 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,543 actuator.py: 29 () INFO Read Set Point: 1556642014.5313852 -2019-04-30 12:33:34,544 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,546 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,547 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,548 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,550 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,551 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,552 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,553 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,555 actuator.py: 29 () INFO Read Set Point: 1556642014.542188 -2019-04-30 12:33:34,556 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,557 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,558 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,560 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,561 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,562 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,564 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,565 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,566 actuator.py: 29 () INFO Read Set Point: 1556642014.553534 -2019-04-30 12:33:34,567 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,568 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,570 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,571 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,572 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,574 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,575 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,576 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,577 actuator.py: 29 () INFO Read Set Point: 1556642014.565738 -2019-04-30 12:33:34,579 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,580 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,581 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,583 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,584 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,585 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,586 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,588 actuator.py: 29 () INFO Read Set Point: 1556642014.578049 -2019-04-30 12:33:34,589 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,590 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,591 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,593 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,594 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,595 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,597 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,598 actuator.py: 29 () INFO Read Set Point: 1556642014.588166 -2019-04-30 12:33:34,599 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,600 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,602 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,603 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,604 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,606 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,607 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,608 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,610 actuator.py: 29 () INFO Read Set Point: 1556642014.598352 -2019-04-30 12:33:34,611 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,612 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,613 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,615 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,616 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,617 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,618 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,620 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,621 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,622 actuator.py: 29 () INFO Read Set Point: 1556642014.609984 -2019-04-30 12:33:34,624 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,625 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,626 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,628 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,629 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,630 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,631 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,633 actuator.py: 29 () INFO Read Set Point: 1556642014.622442 -2019-04-30 12:33:34,634 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,635 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,637 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,638 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,639 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,640 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,642 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,643 actuator.py: 29 () INFO Read Set Point: 1556642014.6333609 -2019-04-30 12:33:34,644 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,646 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,647 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,648 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,649 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,651 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,652 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,653 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,655 actuator.py: 29 () INFO Read Set Point: 1556642014.6435552 -2019-04-30 12:33:34,656 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,657 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,658 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,659 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,661 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,662 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,663 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,665 actuator.py: 29 () INFO Read Set Point: 1556642014.654952 -2019-04-30 12:33:34,666 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,667 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,668 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,670 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,671 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,672 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,674 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,675 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,676 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,677 actuator.py: 29 () INFO Read Set Point: 1556642014.6649852 -2019-04-30 12:33:34,679 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,680 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,681 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,682 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,684 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,685 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,686 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,688 actuator.py: 29 () INFO Read Set Point: 1556642014.677433 -2019-04-30 12:33:34,689 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,690 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,692 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,693 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,694 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,695 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,697 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,698 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,699 actuator.py: 29 () INFO Read Set Point: 1556642014.6881752 -2019-04-30 12:33:34,700 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,702 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,703 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,704 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,705 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,706 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,708 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,709 actuator.py: 29 () INFO Read Set Point: 1556642014.698487 -2019-04-30 12:33:34,710 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,712 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,713 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,714 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,715 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,717 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,718 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,719 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,721 actuator.py: 29 () INFO Read Set Point: 1556642014.709574 -2019-04-30 12:33:34,722 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,723 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,724 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,726 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,727 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,728 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,730 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,731 actuator.py: 29 () INFO Read Set Point: 1556642014.720751 -2019-04-30 12:33:34,732 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,734 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,735 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,736 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,738 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,739 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,740 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,741 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,742 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,744 actuator.py: 29 () INFO Read Set Point: 1556642014.731425 -2019-04-30 12:33:34,745 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,746 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,747 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,749 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,750 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,751 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,753 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,754 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,755 actuator.py: 29 () INFO Read Set Point: 1556642014.7438378 -2019-04-30 12:33:34,756 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,758 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,759 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,760 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,762 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,763 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,764 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,765 actuator.py: 29 () INFO Read Set Point: 1556642014.754199 -2019-04-30 12:33:34,767 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,768 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,769 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,770 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,772 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,773 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,774 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,776 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,777 actuator.py: 29 () INFO Read Set Point: 1556642014.764603 -2019-04-30 12:33:34,778 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,779 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,780 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,782 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,783 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,784 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,786 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,787 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,788 actuator.py: 29 () INFO Read Set Point: 1556642014.776999 -2019-04-30 12:33:34,789 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,791 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,792 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,793 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,794 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,796 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,797 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,798 actuator.py: 29 () INFO Read Set Point: 1556642014.787193 -2019-04-30 12:33:34,799 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,801 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,802 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,803 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,804 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,805 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,807 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,808 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,809 actuator.py: 29 () INFO Read Set Point: 1556642014.797332 -2019-04-30 12:33:34,811 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,812 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,813 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,814 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,816 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,817 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,818 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,819 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,821 actuator.py: 29 () INFO Read Set Point: 1556642014.809738 -2019-04-30 12:33:34,822 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,823 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,824 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,826 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,827 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,828 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,830 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,831 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,832 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,833 actuator.py: 29 () INFO Read Set Point: 1556642014.820606 -2019-04-30 12:33:34,835 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,836 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,837 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,838 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,840 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,841 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,842 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,843 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,845 actuator.py: 29 () INFO Read Set Point: 1556642014.832809 -2019-04-30 12:33:34,846 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,847 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,848 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,850 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,851 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,852 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,853 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,855 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,856 actuator.py: 29 () INFO Read Set Point: 1556642014.844026 -2019-04-30 12:33:34,857 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,858 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,860 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,861 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,862 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,864 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,865 actuator.py: 29 () INFO Read Set Point: 1556642014.8551118 -2019-04-30 12:33:34,866 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,868 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,869 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,870 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,871 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,872 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,874 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,875 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,876 actuator.py: 29 () INFO Read Set Point: 1556642014.865231 -2019-04-30 12:33:34,878 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,879 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,880 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,882 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,883 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,884 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,885 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,887 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,888 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,889 actuator.py: 29 () INFO Read Set Point: 1556642014.875821 -2019-04-30 12:33:34,890 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,892 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,893 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,894 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,895 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,897 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,898 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,899 actuator.py: 29 () INFO Read Set Point: 1556642014.88819 -2019-04-30 12:33:34,900 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,901 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,903 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,904 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,905 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,907 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,908 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,909 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,911 actuator.py: 29 () INFO Read Set Point: 1556642014.8983512 -2019-04-30 12:33:34,912 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,913 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,914 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,915 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,917 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,918 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,919 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,921 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,922 actuator.py: 29 () INFO Read Set Point: 1556642014.910122 -2019-04-30 12:33:34,923 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,924 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,926 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,927 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,928 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,930 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,931 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,932 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,933 actuator.py: 29 () INFO Read Set Point: 1556642014.922441 -2019-04-30 12:33:34,935 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,936 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,937 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,939 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,940 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,941 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,942 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,944 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,945 actuator.py: 29 () INFO Read Set Point: 1556642014.9330502 -2019-04-30 12:33:34,946 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,947 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,949 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,950 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,951 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,952 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,953 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,955 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,956 actuator.py: 29 () INFO Read Set Point: 1556642014.9451861 -2019-04-30 12:33:34,957 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,959 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,960 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,961 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,963 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,964 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,965 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,966 actuator.py: 29 () INFO Read Set Point: 1556642014.9564412 -2019-04-30 12:33:34,968 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,969 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,970 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,972 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,973 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,974 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,975 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,977 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,978 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,979 actuator.py: 29 () INFO Read Set Point: 1556642014.9665549 -2019-04-30 12:33:34,981 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,982 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,983 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,985 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,986 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,987 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,989 actuator.py: 29 () INFO Read Set Point: 1556642014.978969 -2019-04-30 12:33:34,990 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,991 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,992 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,994 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,995 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,996 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,997 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:34,999 actuator.py: 29 () INFO Read Set Point: 1556642014.989064 -2019-04-30 12:33:35,000 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,001 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,002 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,004 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,005 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,006 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,008 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,009 actuator.py: 29 () INFO Read Set Point: 1556642014.999239 -2019-04-30 12:33:35,010 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,012 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,013 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,014 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,015 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,017 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,018 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,019 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,021 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,022 actuator.py: 29 () INFO Read Set Point: 1556642015.009432 -2019-04-30 12:33:35,023 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,024 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,026 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,027 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,028 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,030 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,031 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,032 actuator.py: 29 () INFO Read Set Point: 1556642015.021861 -2019-04-30 12:33:35,033 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,035 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,036 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,037 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,039 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,040 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,041 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,043 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,044 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,045 actuator.py: 29 () INFO Read Set Point: 1556642015.032126 -2019-04-30 12:33:35,046 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,048 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,049 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,050 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,052 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,053 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,054 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,055 actuator.py: 29 () INFO Read Set Point: 1556642015.0444539 -2019-04-30 12:33:35,056 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,058 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,059 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,060 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,062 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,063 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,064 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,066 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,067 actuator.py: 29 () INFO Read Set Point: 1556642015.054525 -2019-04-30 12:33:35,068 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,069 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,071 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,072 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,073 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,075 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,076 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,077 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,078 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,080 actuator.py: 29 () INFO Read Set Point: 1556642015.066947 -2019-04-30 12:33:35,081 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,082 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,084 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,085 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,086 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,088 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,089 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,090 actuator.py: 29 () INFO Read Set Point: 1556642015.079339 -2019-04-30 12:33:35,091 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,093 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,094 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,095 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,097 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,098 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,099 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,100 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,102 actuator.py: 29 () INFO Read Set Point: 1556642015.089879 -2019-04-30 12:33:35,103 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,104 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,105 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,107 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,108 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,109 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,110 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,112 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,113 actuator.py: 29 () INFO Read Set Point: 1556642015.10224 -2019-04-30 12:33:35,114 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,115 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,117 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,118 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,119 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,121 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,122 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,123 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,125 actuator.py: 29 () INFO Read Set Point: 1556642015.113298 -2019-04-30 12:33:35,126 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,127 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,129 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,130 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,131 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,132 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,134 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,135 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,136 actuator.py: 29 () INFO Read Set Point: 1556642015.125103 -2019-04-30 12:33:35,138 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,139 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,140 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,142 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,143 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,144 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,145 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,147 actuator.py: 29 () INFO Read Set Point: 1556642015.1361878 -2019-04-30 12:33:35,148 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,149 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,151 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,152 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,153 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,155 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,156 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,157 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,159 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,160 actuator.py: 29 () INFO Read Set Point: 1556642015.146889 -2019-04-30 12:33:35,161 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,162 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,163 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,165 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,166 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,167 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,169 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,170 actuator.py: 29 () INFO Read Set Point: 1556642015.159244 -2019-04-30 12:33:35,171 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,172 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,174 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,175 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,176 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,178 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,179 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,180 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,182 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,183 actuator.py: 29 () INFO Read Set Point: 1556642015.170196 -2019-04-30 12:33:35,184 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,186 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,187 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,188 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,190 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,191 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,192 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,193 actuator.py: 29 () INFO Read Set Point: 1556642015.1825862 -2019-04-30 12:33:35,194 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,196 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,197 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,198 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,200 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,201 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,202 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,204 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,205 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,206 actuator.py: 29 () INFO Read Set Point: 1556642015.193739 -2019-04-30 12:33:35,207 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,209 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,210 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,211 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,212 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,214 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,215 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,216 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,218 actuator.py: 29 () INFO Read Set Point: 1556642015.206187 -2019-04-30 12:33:35,219 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,220 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,221 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,223 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,224 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,225 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,227 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,228 actuator.py: 29 () INFO Read Set Point: 1556642015.2175412 -2019-04-30 12:33:35,229 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,230 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,232 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,233 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,234 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,236 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,237 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,238 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,240 actuator.py: 29 () INFO Read Set Point: 1556642015.2276878 -2019-04-30 12:33:35,241 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,242 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,243 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,244 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,246 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,247 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,248 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,250 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,251 actuator.py: 29 () INFO Read Set Point: 1556642015.240045 -2019-04-30 12:33:35,252 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,253 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,255 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,256 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,257 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,259 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,260 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,261 actuator.py: 29 () INFO Read Set Point: 1556642015.251227 -2019-04-30 12:33:35,263 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,264 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,265 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,267 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,268 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,269 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,270 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,272 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,273 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,274 actuator.py: 29 () INFO Read Set Point: 1556642015.261461 -2019-04-30 12:33:35,275 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,276 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,278 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,279 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,280 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,282 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,283 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,284 actuator.py: 29 () INFO Read Set Point: 1556642015.273866 -2019-04-30 12:33:35,285 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,287 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,288 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,289 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,291 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,292 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,293 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,294 actuator.py: 29 () INFO Read Set Point: 1556642015.284169 -2019-04-30 12:33:35,295 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,297 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,298 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,299 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,300 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,301 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,303 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,304 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,305 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,307 actuator.py: 29 () INFO Read Set Point: 1556642015.294562 -2019-04-30 12:33:35,308 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,309 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,310 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,311 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,313 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,314 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,315 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,317 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,318 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,319 actuator.py: 29 () INFO Read Set Point: 1556642015.306716 -2019-04-30 12:33:35,321 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,322 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,323 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,324 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,325 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,327 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,328 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,329 actuator.py: 29 () INFO Read Set Point: 1556642015.31915 -2019-04-30 12:33:35,331 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,332 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,333 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,334 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,336 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,337 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,338 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,340 actuator.py: 29 () INFO Read Set Point: 1556642015.3298 -2019-04-30 12:33:35,341 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,342 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,344 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,345 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,346 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,348 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,349 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,350 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,351 actuator.py: 29 () INFO Read Set Point: 1556642015.3401349 -2019-04-30 12:33:35,352 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,354 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,355 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,356 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,358 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,359 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,360 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,362 actuator.py: 29 () INFO Read Set Point: 1556642015.3516958 -2019-04-30 12:33:35,363 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,364 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,365 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,367 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,368 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,369 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,371 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,372 actuator.py: 29 () INFO Read Set Point: 1556642015.3619251 -2019-04-30 12:33:35,373 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,375 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,376 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,377 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,379 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,380 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,381 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,382 actuator.py: 29 () INFO Read Set Point: 1556642015.3724349 -2019-04-30 12:33:35,384 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,385 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,386 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,388 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,389 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,390 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,391 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,393 actuator.py: 29 () INFO Read Set Point: 1556642015.382505 -2019-04-30 12:33:35,394 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,395 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,397 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,398 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,399 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,400 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,402 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,403 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,404 actuator.py: 29 () INFO Read Set Point: 1556642015.393193 -2019-04-30 12:33:35,406 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,407 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,408 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,410 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,411 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,412 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,414 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,415 actuator.py: 29 () INFO Read Set Point: 1556642015.403925 -2019-04-30 12:33:35,416 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,417 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,419 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,420 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,421 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,423 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,424 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,425 actuator.py: 29 () INFO Read Set Point: 1556642015.414052 -2019-04-30 12:33:35,426 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,428 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,429 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,430 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,431 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,433 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,434 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,435 actuator.py: 29 () INFO Read Set Point: 1556642015.424394 -2019-04-30 12:33:35,437 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,438 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,439 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,440 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,442 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,443 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,444 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,446 actuator.py: 29 () INFO Read Set Point: 1556642015.4356449 -2019-04-30 12:33:35,447 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,448 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,449 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,450 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,452 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,453 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,454 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,455 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,457 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,458 actuator.py: 29 () INFO Read Set Point: 1556642015.4459689 -2019-04-30 12:33:35,459 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,461 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,462 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,463 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,464 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,466 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,467 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,468 actuator.py: 29 () INFO Read Set Point: 1556642015.458427 -2019-04-30 12:33:35,469 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,471 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,472 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,473 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,475 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,476 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,477 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,479 actuator.py: 29 () INFO Read Set Point: 1556642015.46862 -2019-04-30 12:33:35,480 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,481 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,483 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,484 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,485 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,486 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,488 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,489 actuator.py: 29 () INFO Read Set Point: 1556642015.479052 -2019-04-30 12:33:35,490 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,492 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,493 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,494 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,496 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,497 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,498 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,499 actuator.py: 29 () INFO Read Set Point: 1556642015.489347 -2019-04-30 12:33:35,501 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,502 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,503 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,505 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,506 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,507 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,509 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,510 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,511 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,513 actuator.py: 29 () INFO Read Set Point: 1556642015.499907 -2019-04-30 12:33:35,514 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,515 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,517 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,518 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,519 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,521 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,522 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,523 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,525 actuator.py: 29 () INFO Read Set Point: 1556642015.5121112 -2019-04-30 12:33:35,526 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,527 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,528 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,530 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,531 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,532 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,533 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,535 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,536 actuator.py: 29 () INFO Read Set Point: 1556642015.5245068 -2019-04-30 12:33:35,537 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,538 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,540 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,541 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,542 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,544 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,545 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,546 actuator.py: 29 () INFO Read Set Point: 1556642015.536163 -2019-04-30 12:33:35,548 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,549 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,550 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,552 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,553 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,554 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,556 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,557 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,558 actuator.py: 29 () INFO Read Set Point: 1556642015.5468202 -2019-04-30 12:33:35,559 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,561 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,562 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,563 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,564 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,566 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,567 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,568 actuator.py: 29 () INFO Read Set Point: 1556642015.5572999 -2019-04-30 12:33:35,570 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,571 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,572 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,573 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,575 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,576 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,577 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,578 actuator.py: 29 () INFO Read Set Point: 1556642015.567565 -2019-04-30 12:33:35,580 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,581 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,582 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,583 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,584 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,586 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,587 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,588 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,590 actuator.py: 29 () INFO Read Set Point: 1556642015.577636 -2019-04-30 12:33:35,591 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,592 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,594 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,595 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,596 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,597 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,598 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,600 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,601 actuator.py: 29 () INFO Read Set Point: 1556642015.588661 -2019-04-30 12:33:35,602 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,604 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,605 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,606 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,608 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,609 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,610 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,612 actuator.py: 29 () INFO Read Set Point: 1556642015.600776 -2019-04-30 12:33:35,613 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,614 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,616 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,617 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,618 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,619 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,621 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,622 actuator.py: 29 () INFO Read Set Point: 1556642015.6121678 -2019-04-30 12:33:35,623 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,625 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,626 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,627 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,628 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,630 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,631 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 -2019-04-30 12:33:35,632 actuator.py: 29 () INFO Read Set Point: 1556642015.6225028 +2022-05-11 12:32:06,380 actuator.py: 29 () INFO Read Set Point: {} at time 1652286726.3803878 +2022-05-11 12:32:06,390 actuator.py: 29 () INFO Read Set Point: {} at time 1652286726.3905773 +2022-05-11 12:32:06,401 actuator.py: 29 () INFO Read Set Point: 1652286726.3991275 at time 1652286726.4009562 +2022-05-11 12:32:06,411 actuator.py: 29 () INFO Read Set Point: 1652286726.4091723 at time 1652286726.4110718 +2022-05-11 12:32:06,421 actuator.py: 29 () INFO Read Set Point: 1652286726.4191148 at time 1652286726.421212 +2022-05-11 12:32:06,431 actuator.py: 29 () INFO Read Set Point: 1652286726.4291704 at time 1652286726.4313579 +2022-05-11 12:32:06,441 actuator.py: 29 () INFO Read Set Point: 1652286726.439171 at time 1652286726.441501 +2022-05-11 12:32:06,451 actuator.py: 29 () INFO Read Set Point: 1652286726.4491699 at time 1652286726.4516435 +2022-05-11 12:32:06,461 actuator.py: 29 () INFO Read Set Point: 1652286726.4591594 at time 1652286726.4617827 +2022-05-11 12:32:06,471 actuator.py: 29 () INFO Read Set Point: 1652286726.4691672 at time 1652286726.4719222 +2022-05-11 12:32:06,482 actuator.py: 29 () INFO Read Set Point: 1652286726.479173 at time 1652286726.4820619 +2022-05-11 12:32:06,492 actuator.py: 29 () INFO Read Set Point: 1652286726.48917 at time 1652286726.4922054 +2022-05-11 12:32:06,502 actuator.py: 29 () INFO Read Set Point: 1652286726.4991717 at time 1652286726.502352 +2022-05-11 12:32:06,512 actuator.py: 29 () INFO Read Set Point: 1652286726.5091674 at time 1652286726.5124931 +2022-05-11 12:32:06,522 actuator.py: 29 () INFO Read Set Point: 1652286726.5191693 at time 1652286726.5226333 +2022-05-11 12:32:06,532 actuator.py: 29 () INFO Read Set Point: 1652286726.5291684 at time 1652286726.5327744 +2022-05-11 12:32:06,542 actuator.py: 29 () INFO Read Set Point: 1652286726.5391693 at time 1652286726.5429144 +2022-05-11 12:32:06,553 actuator.py: 29 () INFO Read Set Point: 1652286726.5491664 at time 1652286726.5530593 +2022-05-11 12:32:06,563 actuator.py: 29 () INFO Read Set Point: 1652286726.559168 at time 1652286726.5631242 +2022-05-11 12:32:06,573 actuator.py: 29 () INFO Read Set Point: 1652286726.569168 at time 1652286726.573265 +2022-05-11 12:32:06,583 actuator.py: 29 () INFO Read Set Point: 1652286726.5791752 at time 1652286726.5833547 +2022-05-11 12:32:06,593 actuator.py: 29 () INFO Read Set Point: 1652286726.5891693 at time 1652286726.593468 +2022-05-11 12:32:06,603 actuator.py: 29 () INFO Read Set Point: 1652286726.5991657 at time 1652286726.6036153 +2022-05-11 12:32:06,613 actuator.py: 29 () INFO Read Set Point: 1652286726.6091673 at time 1652286726.6137555 +2022-05-11 12:32:06,623 actuator.py: 29 () INFO Read Set Point: 1652286726.6191723 at time 1652286726.6238954 +2022-05-11 12:32:06,634 actuator.py: 29 () INFO Read Set Point: 1652286726.6291707 at time 1652286726.6340377 +2022-05-11 12:32:06,644 actuator.py: 29 () INFO Read Set Point: 1652286726.6391704 at time 1652286726.6441824 +2022-05-11 12:32:06,654 actuator.py: 29 () INFO Read Set Point: 1652286726.6491735 at time 1652286726.654323 +2022-05-11 12:32:06,664 actuator.py: 29 () INFO Read Set Point: 1652286726.6591678 at time 1652286726.664462 +2022-05-11 12:32:06,674 actuator.py: 29 () INFO Read Set Point: 1652286726.6691701 at time 1652286726.6746063 +2022-05-11 12:32:06,684 actuator.py: 29 () INFO Read Set Point: 1652286726.6791704 at time 1652286726.684749 +2022-05-11 12:32:06,694 actuator.py: 29 () INFO Read Set Point: 1652286726.6891673 at time 1652286726.6948905 +2022-05-11 12:32:06,705 actuator.py: 29 () INFO Read Set Point: 1652286726.699171 at time 1652286726.7050323 +2022-05-11 12:32:06,715 actuator.py: 29 () INFO Read Set Point: 1652286726.709168 at time 1652286726.715178 +2022-05-11 12:32:06,725 actuator.py: 29 () INFO Read Set Point: 1652286726.7191224 at time 1652286726.7253206 +2022-05-11 12:32:06,735 actuator.py: 29 () INFO Read Set Point: 1652286726.7291706 at time 1652286726.7354636 +2022-05-11 12:32:06,745 actuator.py: 29 () INFO Read Set Point: 1652286726.739174 at time 1652286726.7456028 +2022-05-11 12:32:06,755 actuator.py: 29 () INFO Read Set Point: 1652286726.7491667 at time 1652286726.755745 +2022-05-11 12:32:06,765 actuator.py: 29 () INFO Read Set Point: 1652286726.7591689 at time 1652286726.7658849 +2022-05-11 12:32:06,776 actuator.py: 29 () INFO Read Set Point: 1652286726.7691705 at time 1652286726.7760293 +2022-05-11 12:32:06,786 actuator.py: 29 () INFO Read Set Point: 1652286726.7791681 at time 1652286726.7861686 +2022-05-11 12:32:06,796 actuator.py: 29 () INFO Read Set Point: 1652286726.7891698 at time 1652286726.7963119 +2022-05-11 12:32:06,806 actuator.py: 29 () INFO Read Set Point: 1652286726.7991686 at time 1652286726.806417 +2022-05-11 12:32:06,816 actuator.py: 29 () INFO Read Set Point: 1652286726.8091671 at time 1652286726.8165593 +2022-05-11 12:32:06,826 actuator.py: 29 () INFO Read Set Point: 1652286726.8191717 at time 1652286726.8267004 +2022-05-11 12:32:06,836 actuator.py: 29 () INFO Read Set Point: 1652286726.8291645 at time 1652286726.8368416 +2022-05-11 12:32:06,847 actuator.py: 29 () INFO Read Set Point: 1652286726.8391788 at time 1652286726.8469856 +2022-05-11 12:32:06,857 actuator.py: 29 () INFO Read Set Point: 1652286726.8491664 at time 1652286726.8571243 +2022-05-11 12:32:06,867 actuator.py: 29 () INFO Read Set Point: 1652286726.8591764 at time 1652286726.8672082 +2022-05-11 12:32:06,877 actuator.py: 29 () INFO Read Set Point: 1652286726.8691685 at time 1652286726.877351 +2022-05-11 12:32:06,887 actuator.py: 29 () INFO Read Set Point: 1652286726.879172 at time 1652286726.8874836 +2022-05-11 12:32:06,897 actuator.py: 29 () INFO Read Set Point: 1652286726.8891683 at time 1652286726.8976233 +2022-05-11 12:32:06,907 actuator.py: 29 () INFO Read Set Point: 1652286726.8991692 at time 1652286726.907756 +2022-05-11 12:32:06,917 actuator.py: 29 () INFO Read Set Point: 1652286726.9091656 at time 1652286726.9178982 +2022-05-11 12:32:06,928 actuator.py: 29 () INFO Read Set Point: 1652286726.9191678 at time 1652286726.9280427 +2022-05-11 12:32:06,938 actuator.py: 29 () INFO Read Set Point: 1652286726.9291658 at time 1652286726.9381845 +2022-05-11 12:32:06,948 actuator.py: 29 () INFO Read Set Point: 1652286726.939172 at time 1652286726.9483237 +2022-05-11 12:32:06,958 actuator.py: 29 () INFO Read Set Point: 1652286726.9491699 at time 1652286726.958452 +2022-05-11 12:32:06,968 actuator.py: 29 () INFO Read Set Point: 1652286726.9591215 at time 1652286726.9685931 +2022-05-11 12:32:06,978 actuator.py: 29 () INFO Read Set Point: 1652286726.969116 at time 1652286726.978733 +2022-05-11 12:32:06,988 actuator.py: 29 () INFO Read Set Point: 1652286726.9791906 at time 1652286726.9888692 +2022-05-11 12:32:06,999 actuator.py: 29 () INFO Read Set Point: 1652286726.989174 at time 1652286726.9990103 +2022-05-11 12:32:07,009 actuator.py: 29 () INFO Read Set Point: 1652286726.9991634 at time 1652286727.0091548 +2022-05-11 12:32:07,019 actuator.py: 29 () INFO Read Set Point: 1652286727.0092008 at time 1652286727.0192413 +2022-05-11 12:32:07,029 actuator.py: 29 () INFO Read Set Point: 1652286727.0191631 at time 1652286727.029377 +2022-05-11 12:32:07,039 actuator.py: 29 () INFO Read Set Point: 1652286727.029167 at time 1652286727.03951 +2022-05-11 12:32:07,049 actuator.py: 29 () INFO Read Set Point: 1652286727.039171 at time 1652286727.0496438 +2022-05-11 12:32:07,059 actuator.py: 29 () INFO Read Set Point: 1652286727.0491695 at time 1652286727.059785 +2022-05-11 12:32:07,070 actuator.py: 29 () INFO Read Set Point: 1652286727.059169 at time 1652286727.070366 +2022-05-11 12:32:07,080 actuator.py: 29 () INFO Read Set Point: 1652286727.0691652 at time 1652286727.0805006 +2022-05-11 12:32:07,090 actuator.py: 29 () INFO Read Set Point: 1652286727.0891693 at time 1652286727.090827 +2022-05-11 12:32:07,101 actuator.py: 29 () INFO Read Set Point: 1652286727.099168 at time 1652286727.100967 +2022-05-11 12:32:07,111 actuator.py: 29 () INFO Read Set Point: 1652286727.109164 at time 1652286727.1111119 +2022-05-11 12:32:07,121 actuator.py: 29 () INFO Read Set Point: 1652286727.1191206 at time 1652286727.1212566 +2022-05-11 12:32:07,131 actuator.py: 29 () INFO Read Set Point: 1652286727.1291687 at time 1652286727.1313987 +2022-05-11 12:32:07,141 actuator.py: 29 () INFO Read Set Point: 1652286727.1391754 at time 1652286727.1415389 +2022-05-11 12:32:07,151 actuator.py: 29 () INFO Read Set Point: 1652286727.1491678 at time 1652286727.1516862 +2022-05-11 12:32:07,161 actuator.py: 29 () INFO Read Set Point: 1652286727.1591184 at time 1652286727.1618314 +2022-05-11 12:32:07,172 actuator.py: 29 () INFO Read Set Point: 1652286727.1691673 at time 1652286727.171969 +2022-05-11 12:32:07,182 actuator.py: 29 () INFO Read Set Point: 1652286727.1791532 at time 1652286727.1821094 +2022-05-11 12:32:07,192 actuator.py: 29 () INFO Read Set Point: 1652286727.1891673 at time 1652286727.1922507 +2022-05-11 12:32:07,202 actuator.py: 29 () INFO Read Set Point: 1652286727.1991673 at time 1652286727.202391 +2022-05-11 12:32:07,212 actuator.py: 29 () INFO Read Set Point: 1652286727.2091703 at time 1652286727.2125328 +2022-05-11 12:32:07,222 actuator.py: 29 () INFO Read Set Point: 1652286727.2191677 at time 1652286727.222661 +2022-05-11 12:32:07,232 actuator.py: 29 () INFO Read Set Point: 1652286727.2291691 at time 1652286727.232804 +2022-05-11 12:32:07,243 actuator.py: 29 () INFO Read Set Point: 1652286727.2391694 at time 1652286727.2429469 +2022-05-11 12:32:07,253 actuator.py: 29 () INFO Read Set Point: 1652286727.249167 at time 1652286727.2530992 +2022-05-11 12:32:07,263 actuator.py: 29 () INFO Read Set Point: 1652286727.259155 at time 1652286727.2632346 +2022-05-11 12:32:07,273 actuator.py: 29 () INFO Read Set Point: 1652286727.2691686 at time 1652286727.2733727 +2022-05-11 12:32:07,283 actuator.py: 29 () INFO Read Set Point: 1652286727.2791612 at time 1652286727.2835145 +2022-05-11 12:32:07,293 actuator.py: 29 () INFO Read Set Point: 1652286727.2891798 at time 1652286727.2936556 +2022-05-11 12:32:07,303 actuator.py: 29 () INFO Read Set Point: 1652286727.2991714 at time 1652286727.303784 +2022-05-11 12:32:07,313 actuator.py: 29 () INFO Read Set Point: 1652286727.3091536 at time 1652286727.3139253 +2022-05-11 12:32:07,324 actuator.py: 29 () INFO Read Set Point: 1652286727.3191695 at time 1652286727.3240676 +2022-05-11 12:32:07,334 actuator.py: 29 () INFO Read Set Point: 1652286727.329168 at time 1652286727.3342056 +2022-05-11 12:32:07,344 actuator.py: 29 () INFO Read Set Point: 1652286727.339175 at time 1652286727.3443453 +2022-05-11 12:32:07,354 actuator.py: 29 () INFO Read Set Point: 1652286727.3491695 at time 1652286727.3544858 +2022-05-11 12:32:07,364 actuator.py: 29 () INFO Read Set Point: 1652286727.359167 at time 1652286727.364627 +2022-05-11 12:32:07,374 actuator.py: 29 () INFO Read Set Point: 1652286727.3691676 at time 1652286727.3747663 +2022-05-11 12:32:07,384 actuator.py: 29 () INFO Read Set Point: 1652286727.3791723 at time 1652286727.384907 +2022-05-11 12:32:07,395 actuator.py: 29 () INFO Read Set Point: 1652286727.3891454 at time 1652286727.3950586 +2022-05-11 12:32:07,405 actuator.py: 29 () INFO Read Set Point: 1652286727.3991673 at time 1652286727.405194 +2022-05-11 12:32:07,415 actuator.py: 29 () INFO Read Set Point: 1652286727.4091675 at time 1652286727.415337 +2022-05-11 12:32:07,425 actuator.py: 29 () INFO Read Set Point: 1652286727.4191778 at time 1652286727.4254775 +2022-05-11 12:32:07,435 actuator.py: 29 () INFO Read Set Point: 1652286727.4291677 at time 1652286727.4356167 +2022-05-11 12:32:07,445 actuator.py: 29 () INFO Read Set Point: 1652286727.439117 at time 1652286727.4457576 +2022-05-11 12:32:07,455 actuator.py: 29 () INFO Read Set Point: 1652286727.449163 at time 1652286727.455856 +2022-05-11 12:32:07,466 actuator.py: 29 () INFO Read Set Point: 1652286727.4591684 at time 1652286727.4659956 +2022-05-11 12:32:07,476 actuator.py: 29 () INFO Read Set Point: 1652286727.4691672 at time 1652286727.476133 +2022-05-11 12:32:07,486 actuator.py: 29 () INFO Read Set Point: 1652286727.47916 at time 1652286727.4862683 +2022-05-11 12:32:07,496 actuator.py: 29 () INFO Read Set Point: 1652286727.489118 at time 1652286727.496407 +2022-05-11 12:32:07,506 actuator.py: 29 () INFO Read Set Point: 1652286727.4991684 at time 1652286727.506541 +2022-05-11 12:32:07,516 actuator.py: 29 () INFO Read Set Point: 1652286727.5091677 at time 1652286727.5166836 +2022-05-11 12:32:07,526 actuator.py: 29 () INFO Read Set Point: 1652286727.519173 at time 1652286727.5268111 +2022-05-11 12:32:07,537 actuator.py: 29 () INFO Read Set Point: 1652286727.5291672 at time 1652286727.5369465 +2022-05-11 12:32:07,547 actuator.py: 29 () INFO Read Set Point: 1652286727.5391204 at time 1652286727.5470872 +2022-05-11 12:32:07,557 actuator.py: 29 () INFO Read Set Point: 1652286727.549171 at time 1652286727.5572326 +2022-05-11 12:32:07,567 actuator.py: 29 () INFO Read Set Point: 1652286727.559163 at time 1652286727.5673494 +2022-05-11 12:32:07,577 actuator.py: 29 () INFO Read Set Point: 1652286727.5691693 at time 1652286727.5774753 +2022-05-11 12:32:07,587 actuator.py: 29 () INFO Read Set Point: 1652286727.5791702 at time 1652286727.5876064 +2022-05-11 12:32:07,597 actuator.py: 29 () INFO Read Set Point: 1652286727.5891373 at time 1652286727.5977476 +2022-05-11 12:32:07,607 actuator.py: 29 () INFO Read Set Point: 1652286727.5991704 at time 1652286727.607882 +2022-05-11 12:32:07,618 actuator.py: 29 () INFO Read Set Point: 1652286727.6091678 at time 1652286727.6180243 +2022-05-11 12:32:07,628 actuator.py: 29 () INFO Read Set Point: 1652286727.619167 at time 1652286727.6281636 +2022-05-11 12:32:07,638 actuator.py: 29 () INFO Read Set Point: 1652286727.629154 at time 1652286727.6383033 +2022-05-11 12:32:07,648 actuator.py: 29 () INFO Read Set Point: 1652286727.6391377 at time 1652286727.6484454 +2022-05-11 12:32:07,658 actuator.py: 29 () INFO Read Set Point: 1652286727.6491077 at time 1652286727.6585896 +2022-05-11 12:32:07,668 actuator.py: 29 () INFO Read Set Point: 1652286727.659111 at time 1652286727.6687293 +2022-05-11 12:32:07,678 actuator.py: 29 () INFO Read Set Point: 1652286727.6691115 at time 1652286727.6788695 +2022-05-11 12:32:07,689 actuator.py: 29 () INFO Read Set Point: 1652286727.6791642 at time 1652286727.6889625 +2022-05-11 12:32:07,699 actuator.py: 29 () INFO Read Set Point: 1652286727.6891625 at time 1652286727.6991045 +2022-05-11 12:32:07,709 actuator.py: 29 () INFO Read Set Point: 1652286727.6991558 at time 1652286727.709235 +2022-05-11 12:32:07,719 actuator.py: 29 () INFO Read Set Point: 1652286727.7090914 at time 1652286727.7193706 +2022-05-11 12:32:07,729 actuator.py: 29 () INFO Read Set Point: 1652286727.7191617 at time 1652286727.7295074 +2022-05-11 12:32:07,739 actuator.py: 29 () INFO Read Set Point: 1652286727.7291703 at time 1652286727.7396452 +2022-05-11 12:32:07,749 actuator.py: 29 () INFO Read Set Point: 1652286727.7391684 at time 1652286727.7498016 +2022-05-11 12:32:07,760 actuator.py: 29 () INFO Read Set Point: 1652286727.7491143 at time 1652286727.7604258 +2022-05-11 12:32:07,770 actuator.py: 29 () INFO Read Set Point: 1652286727.7591753 at time 1652286727.770557 +2022-05-11 12:32:07,780 actuator.py: 29 () INFO Read Set Point: 1652286727.7791572 at time 1652286727.7808838 +2022-05-11 12:32:07,791 actuator.py: 29 () INFO Read Set Point: 1652286727.7891643 at time 1652286727.791048 +2022-05-11 12:32:07,801 actuator.py: 29 () INFO Read Set Point: 1652286727.799167 at time 1652286727.801168 +2022-05-11 12:32:07,811 actuator.py: 29 () INFO Read Set Point: 1652286727.8091497 at time 1652286727.811305 +2022-05-11 12:32:07,821 actuator.py: 29 () INFO Read Set Point: 1652286727.8191772 at time 1652286727.8214464 +2022-05-11 12:32:07,831 actuator.py: 29 () INFO Read Set Point: 1652286727.8291569 at time 1652286727.8315923 +2022-05-11 12:32:07,841 actuator.py: 29 () INFO Read Set Point: 1652286727.8391666 at time 1652286727.8417304 +2022-05-11 12:32:07,851 actuator.py: 29 () INFO Read Set Point: 1652286727.8491619 at time 1652286727.8518782 +2022-05-11 12:32:07,862 actuator.py: 29 () INFO Read Set Point: 1652286727.859174 at time 1652286727.8620174 +2022-05-11 12:32:07,872 actuator.py: 29 () INFO Read Set Point: 1652286727.8691695 at time 1652286727.8721092 +2022-05-11 12:32:07,882 actuator.py: 29 () INFO Read Set Point: 1652286727.8791654 at time 1652286727.8822486 +2022-05-11 12:32:07,892 actuator.py: 29 () INFO Read Set Point: 1652286727.8891711 at time 1652286727.8923912 +2022-05-11 12:32:07,902 actuator.py: 29 () INFO Read Set Point: 1652286727.8991694 at time 1652286727.9025302 +2022-05-11 12:32:07,912 actuator.py: 29 () INFO Read Set Point: 1652286727.9091208 at time 1652286727.9126742 +2022-05-11 12:32:07,922 actuator.py: 29 () INFO Read Set Point: 1652286727.9191701 at time 1652286727.9228146 +2022-05-11 12:32:07,933 actuator.py: 29 () INFO Read Set Point: 1652286727.9291656 at time 1652286727.9329548 +2022-05-11 12:32:07,943 actuator.py: 29 () INFO Read Set Point: 1652286727.9391696 at time 1652286727.9431005 +2022-05-11 12:32:07,953 actuator.py: 29 () INFO Read Set Point: 1652286727.949166 at time 1652286727.9532387 +2022-05-11 12:32:07,963 actuator.py: 29 () INFO Read Set Point: 1652286727.9591668 at time 1652286727.9633803 +2022-05-11 12:32:07,973 actuator.py: 29 () INFO Read Set Point: 1652286727.9691691 at time 1652286727.9735205 +2022-05-11 12:32:07,983 actuator.py: 29 () INFO Read Set Point: 1652286727.979128 at time 1652286727.9836633 +2022-05-11 12:32:07,993 actuator.py: 29 () INFO Read Set Point: 1652286727.9891684 at time 1652286727.9938035 +2022-05-11 12:32:08,004 actuator.py: 29 () INFO Read Set Point: 1652286727.999169 at time 1652286728.003946 +2022-05-11 12:32:08,014 actuator.py: 29 () INFO Read Set Point: 1652286728.0091307 at time 1652286728.014089 +2022-05-11 12:32:08,024 actuator.py: 29 () INFO Read Set Point: 1652286728.019169 at time 1652286728.0242317 +2022-05-11 12:32:08,034 actuator.py: 29 () INFO Read Set Point: 1652286728.0291703 at time 1652286728.0343757 +2022-05-11 12:32:08,044 actuator.py: 29 () INFO Read Set Point: 1652286728.03917 at time 1652286728.0445158 +2022-05-11 12:32:08,054 actuator.py: 29 () INFO Read Set Point: 1652286728.0491662 at time 1652286728.0546646 +2022-05-11 12:32:08,064 actuator.py: 29 () INFO Read Set Point: 1652286728.0591693 at time 1652286728.0648024 +2022-05-11 12:32:08,074 actuator.py: 29 () INFO Read Set Point: 1652286728.069167 at time 1652286728.0749378 +2022-05-11 12:32:08,085 actuator.py: 29 () INFO Read Set Point: 1652286728.079172 at time 1652286728.0850785 +2022-05-11 12:32:08,095 actuator.py: 29 () INFO Read Set Point: 1652286728.0891666 at time 1652286728.0952177 +2022-05-11 12:32:08,105 actuator.py: 29 () INFO Read Set Point: 1652286728.0991125 at time 1652286728.1053298 +2022-05-11 12:32:08,115 actuator.py: 29 () INFO Read Set Point: 1652286728.1091695 at time 1652286728.1154728 +2022-05-11 12:32:08,125 actuator.py: 29 () INFO Read Set Point: 1652286728.1191692 at time 1652286728.125613 +2022-05-11 12:32:08,135 actuator.py: 29 () INFO Read Set Point: 1652286728.1291656 at time 1652286728.135758 +2022-05-11 12:32:08,145 actuator.py: 29 () INFO Read Set Point: 1652286728.139168 at time 1652286728.145892 +2022-05-11 12:32:08,156 actuator.py: 29 () INFO Read Set Point: 1652286728.1491613 at time 1652286728.1560388 +2022-05-11 12:32:08,166 actuator.py: 29 () INFO Read Set Point: 1652286728.1591687 at time 1652286728.1661773 +2022-05-11 12:32:08,176 actuator.py: 29 () INFO Read Set Point: 1652286728.1691585 at time 1652286728.176313 +2022-05-11 12:32:08,186 actuator.py: 29 () INFO Read Set Point: 1652286728.1791203 at time 1652286728.1864533 +2022-05-11 12:32:08,196 actuator.py: 29 () INFO Read Set Point: 1652286728.189175 at time 1652286728.196599 +2022-05-11 12:32:08,206 actuator.py: 29 () INFO Read Set Point: 1652286728.199118 at time 1652286728.2067416 +2022-05-11 12:32:08,216 actuator.py: 29 () INFO Read Set Point: 1652286728.209168 at time 1652286728.2168841 +2022-05-11 12:32:08,227 actuator.py: 29 () INFO Read Set Point: 1652286728.2191656 at time 1652286728.2270405 +2022-05-11 12:32:08,237 actuator.py: 29 () INFO Read Set Point: 1652286728.2291727 at time 1652286728.2371716 +2022-05-11 12:32:08,247 actuator.py: 29 () INFO Read Set Point: 1652286728.239171 at time 1652286728.2473068 +2022-05-11 12:32:08,257 actuator.py: 29 () INFO Read Set Point: 1652286728.2491715 at time 1652286728.2574527 +2022-05-11 12:32:08,267 actuator.py: 29 () INFO Read Set Point: 1652286728.259155 at time 1652286728.2676 +2022-05-11 12:32:08,277 actuator.py: 29 () INFO Read Set Point: 1652286728.2691693 at time 1652286728.2777405 +2022-05-11 12:32:08,287 actuator.py: 29 () INFO Read Set Point: 1652286728.2791724 at time 1652286728.2878816 +2022-05-11 12:32:08,298 actuator.py: 29 () INFO Read Set Point: 1652286728.2891674 at time 1652286728.298008 +2022-05-11 12:32:08,308 actuator.py: 29 () INFO Read Set Point: 1652286728.2991667 at time 1652286728.3081472 +2022-05-11 12:32:08,318 actuator.py: 29 () INFO Read Set Point: 1652286728.309169 at time 1652286728.3182895 +2022-05-11 12:32:08,328 actuator.py: 29 () INFO Read Set Point: 1652286728.319172 at time 1652286728.3284338 +2022-05-11 12:32:08,338 actuator.py: 29 () INFO Read Set Point: 1652286728.3291728 at time 1652286728.338576 +2022-05-11 12:32:08,348 actuator.py: 29 () INFO Read Set Point: 1652286728.3391206 at time 1652286728.3487155 +2022-05-11 12:32:08,358 actuator.py: 29 () INFO Read Set Point: 1652286728.349137 at time 1652286728.3588817 +2022-05-11 12:32:08,369 actuator.py: 29 () INFO Read Set Point: 1652286728.3591666 at time 1652286728.3690207 +2022-05-11 12:32:08,379 actuator.py: 29 () INFO Read Set Point: 1652286728.3691661 at time 1652286728.3791645 +2022-05-11 12:32:08,389 actuator.py: 29 () INFO Read Set Point: 1652286728.3791697 at time 1652286728.3893006 +2022-05-11 12:32:08,399 actuator.py: 29 () INFO Read Set Point: 1652286728.3891692 at time 1652286728.39943 +2022-05-11 12:32:08,409 actuator.py: 29 () INFO Read Set Point: 1652286728.3991683 at time 1652286728.409564 +2022-05-11 12:32:08,419 actuator.py: 29 () INFO Read Set Point: 1652286728.4091673 at time 1652286728.4197233 +2022-05-11 12:32:08,430 actuator.py: 29 () INFO Read Set Point: 1652286728.4191694 at time 1652286728.4303553 +2022-05-11 12:32:08,440 actuator.py: 29 () INFO Read Set Point: 1652286728.4391835 at time 1652286728.440715 +2022-05-11 12:32:08,450 actuator.py: 29 () INFO Read Set Point: 1652286728.4491172 at time 1652286728.4508574 +2022-05-11 12:32:08,461 actuator.py: 29 () INFO Read Set Point: 1652286728.4591658 at time 1652286728.461001 +2022-05-11 12:32:08,471 actuator.py: 29 () INFO Read Set Point: 1652286728.4691756 at time 1652286728.4711397 +2022-05-11 12:32:08,481 actuator.py: 29 () INFO Read Set Point: 1652286728.4791837 at time 1652286728.4812896 +2022-05-11 12:32:08,491 actuator.py: 29 () INFO Read Set Point: 1652286728.4891167 at time 1652286728.4914315 +2022-05-11 12:32:08,501 actuator.py: 29 () INFO Read Set Point: 1652286728.4991677 at time 1652286728.501572 +2022-05-11 12:32:08,511 actuator.py: 29 () INFO Read Set Point: 1652286728.5091655 at time 1652286728.5117266 +2022-05-11 12:32:08,521 actuator.py: 29 () INFO Read Set Point: 1652286728.5191808 at time 1652286728.5218732 +2022-05-11 12:32:08,532 actuator.py: 29 () INFO Read Set Point: 1652286728.529137 at time 1652286728.5320125 +2022-05-11 12:32:08,542 actuator.py: 29 () INFO Read Set Point: 1652286728.539167 at time 1652286728.5421653 +2022-05-11 12:32:08,552 actuator.py: 29 () INFO Read Set Point: 1652286728.5491648 at time 1652286728.5523038 +2022-05-11 12:32:08,562 actuator.py: 29 () INFO Read Set Point: 1652286728.5591674 at time 1652286728.5624454 +2022-05-11 12:32:08,572 actuator.py: 29 () INFO Read Set Point: 1652286728.569163 at time 1652286728.572585 +2022-05-11 12:32:08,582 actuator.py: 29 () INFO Read Set Point: 1652286728.579167 at time 1652286728.582728 +2022-05-11 12:32:08,592 actuator.py: 29 () INFO Read Set Point: 1652286728.58917 at time 1652286728.5928693 +2022-05-11 12:32:08,603 actuator.py: 29 () INFO Read Set Point: 1652286728.5991678 at time 1652286728.6030111 +2022-05-11 12:32:08,613 actuator.py: 29 () INFO Read Set Point: 1652286728.6091666 at time 1652286728.613162 +2022-05-11 12:32:08,623 actuator.py: 29 () INFO Read Set Point: 1652286728.619173 at time 1652286728.6233153 +2022-05-11 12:32:08,633 actuator.py: 29 () INFO Read Set Point: 1652286728.6291654 at time 1652286728.633459 +2022-05-11 12:32:08,643 actuator.py: 29 () INFO Read Set Point: 1652286728.6391683 at time 1652286728.6436028 +2022-05-11 12:32:08,653 actuator.py: 29 () INFO Read Set Point: 1652286728.649166 at time 1652286728.653744 +2022-05-11 12:32:08,663 actuator.py: 29 () INFO Read Set Point: 1652286728.6591678 at time 1652286728.6638873 +2022-05-11 12:32:08,674 actuator.py: 29 () INFO Read Set Point: 1652286728.6691709 at time 1652286728.674031 +2022-05-11 12:32:08,684 actuator.py: 29 () INFO Read Set Point: 1652286728.6791594 at time 1652286728.6841748 +2022-05-11 12:32:08,694 actuator.py: 29 () INFO Read Set Point: 1652286728.6891634 at time 1652286728.6943178 +2022-05-11 12:32:08,704 actuator.py: 29 () INFO Read Set Point: 1652286728.6991668 at time 1652286728.7044742 +2022-05-11 12:32:08,714 actuator.py: 29 () INFO Read Set Point: 1652286728.7091208 at time 1652286728.7146323 +2022-05-11 12:32:08,724 actuator.py: 29 () INFO Read Set Point: 1652286728.7191617 at time 1652286728.7247732 +2022-05-11 12:32:08,734 actuator.py: 29 () INFO Read Set Point: 1652286728.7291658 at time 1652286728.7349162 +2022-05-11 12:32:08,745 actuator.py: 29 () INFO Read Set Point: 1652286728.7391698 at time 1652286728.745059 +2022-05-11 12:32:08,755 actuator.py: 29 () INFO Read Set Point: 1652286728.7491667 at time 1652286728.7551916 +2022-05-11 12:32:08,765 actuator.py: 29 () INFO Read Set Point: 1652286728.7591724 at time 1652286728.76533 +2022-05-11 12:32:08,775 actuator.py: 29 () INFO Read Set Point: 1652286728.7691176 at time 1652286728.7754765 +2022-05-11 12:32:08,785 actuator.py: 29 () INFO Read Set Point: 1652286728.7791681 at time 1652286728.7856085 +2022-05-11 12:32:08,796 actuator.py: 29 () INFO Read Set Point: 1652286728.789117 at time 1652286728.795962 +2022-05-11 12:32:08,806 actuator.py: 29 () INFO Read Set Point: 1652286728.800247 at time 1652286728.806057 +2022-05-11 12:32:08,816 actuator.py: 29 () INFO Read Set Point: 1652286728.8091397 at time 1652286728.8162024 +2022-05-11 12:32:08,826 actuator.py: 29 () INFO Read Set Point: 1652286728.8191874 at time 1652286728.8263378 +2022-05-11 12:32:08,836 actuator.py: 29 () INFO Read Set Point: 1652286728.8291261 at time 1652286728.8364213 +2022-05-11 12:32:08,846 actuator.py: 29 () INFO Read Set Point: 1652286728.83912 at time 1652286728.8465571 +2022-05-11 12:32:08,856 actuator.py: 29 () INFO Read Set Point: 1652286728.849168 at time 1652286728.8568 +2022-05-11 12:32:08,867 actuator.py: 29 () INFO Read Set Point: 1652286728.8591697 at time 1652286728.8669295 +2022-05-11 12:32:08,877 actuator.py: 29 () INFO Read Set Point: 1652286728.8691607 at time 1652286728.877079 +2022-05-11 12:32:08,890 actuator.py: 29 () INFO Read Set Point: 1652286728.8791134 at time 1652286728.890564 +2022-05-11 12:32:08,900 actuator.py: 29 () INFO Read Set Point: 1652286728.8791134 at time 1652286728.9006586 +2022-05-11 12:32:08,910 actuator.py: 29 () INFO Read Set Point: 1652286728.8999949 at time 1652286728.9107692 +2022-05-11 12:32:08,921 actuator.py: 29 () INFO Read Set Point: 1652286728.8999949 at time 1652286728.9211516 +2022-05-11 12:32:08,931 actuator.py: 29 () INFO Read Set Point: 1652286728.9200835 at time 1652286728.9318964 +2022-05-11 12:32:08,942 actuator.py: 29 () INFO Read Set Point: 1652286728.9300876 at time 1652286728.9424815 +2022-05-11 12:32:08,953 actuator.py: 29 () INFO Read Set Point: 1652286728.950081 at time 1652286728.9530535 +2022-05-11 12:32:08,963 actuator.py: 29 () INFO Read Set Point: 1652286728.9600835 at time 1652286728.963308 +2022-05-11 12:32:08,973 actuator.py: 29 () INFO Read Set Point: 1652286728.9700787 at time 1652286728.9733994 +2022-05-11 12:32:08,983 actuator.py: 29 () INFO Read Set Point: 1652286728.9800947 at time 1652286728.983489 +2022-05-11 12:32:08,993 actuator.py: 29 () INFO Read Set Point: 1652286728.9900792 at time 1652286728.9936192 +2022-05-11 12:32:09,003 actuator.py: 29 () INFO Read Set Point: 1652286729.0001135 at time 1652286729.0037398 +2022-05-11 12:32:09,013 actuator.py: 29 () INFO Read Set Point: 1652286729.0101244 at time 1652286729.0138807 +2022-05-11 12:32:09,024 actuator.py: 29 () INFO Read Set Point: 1652286729.0201263 at time 1652286729.0240135 +2022-05-11 12:32:09,034 actuator.py: 29 () INFO Read Set Point: 1652286729.0300782 at time 1652286729.0341418 +2022-05-11 12:32:09,044 actuator.py: 29 () INFO Read Set Point: 1652286729.0401149 at time 1652286729.0442526 +2022-05-11 12:32:09,054 actuator.py: 29 () INFO Read Set Point: 1652286729.0501227 at time 1652286729.0543792 +2022-05-11 12:32:09,064 actuator.py: 29 () INFO Read Set Point: 1652286729.0601144 at time 1652286729.0645092 +2022-05-11 12:32:09,074 actuator.py: 29 () INFO Read Set Point: 1652286729.070136 at time 1652286729.0746467 +2022-05-11 12:32:09,084 actuator.py: 29 () INFO Read Set Point: 1652286729.0801392 at time 1652286729.0847847 +2022-05-11 12:32:09,094 actuator.py: 29 () INFO Read Set Point: 1652286729.0901158 at time 1652286729.0949259 +2022-05-11 12:32:09,105 actuator.py: 29 () INFO Read Set Point: 1652286729.1000733 at time 1652286729.1050243 +2022-05-11 12:32:09,115 actuator.py: 29 () INFO Read Set Point: 1652286729.1100714 at time 1652286729.115069 +2022-05-11 12:32:09,125 actuator.py: 29 () INFO Read Set Point: 1652286729.1200728 at time 1652286729.1252034 +2022-05-11 12:32:09,135 actuator.py: 29 () INFO Read Set Point: 1652286729.130115 at time 1652286729.1353443 +2022-05-11 12:32:09,145 actuator.py: 29 () INFO Read Set Point: 1652286729.1401186 at time 1652286729.1454709 +2022-05-11 12:32:09,155 actuator.py: 29 () INFO Read Set Point: 1652286729.150084 at time 1652286729.1556041 +2022-05-11 12:32:09,165 actuator.py: 29 () INFO Read Set Point: 1652286729.1601148 at time 1652286729.1657412 +2022-05-11 12:32:09,175 actuator.py: 29 () INFO Read Set Point: 1652286729.1701167 at time 1652286729.1758304 +2022-05-11 12:32:09,186 actuator.py: 29 () INFO Read Set Point: 1652286729.1801226 at time 1652286729.1859493 +2022-05-11 12:32:09,196 actuator.py: 29 () INFO Read Set Point: 1652286729.190091 at time 1652286729.1960838 +2022-05-11 12:32:09,206 actuator.py: 29 () INFO Read Set Point: 1652286729.200074 at time 1652286729.2062094 +2022-05-11 12:32:09,216 actuator.py: 29 () INFO Read Set Point: 1652286729.210115 at time 1652286729.2162995 +2022-05-11 12:32:09,226 actuator.py: 29 () INFO Read Set Point: 1652286729.2201211 at time 1652286729.2264261 +2022-05-11 12:32:09,236 actuator.py: 29 () INFO Read Set Point: 1652286729.230116 at time 1652286729.2365396 +2022-05-11 12:32:09,246 actuator.py: 29 () INFO Read Set Point: 1652286729.240117 at time 1652286729.24663 +2022-05-11 12:32:09,256 actuator.py: 29 () INFO Read Set Point: 1652286729.250089 at time 1652286729.2567704 +2022-05-11 12:32:09,266 actuator.py: 29 () INFO Read Set Point: 1652286729.2601242 at time 1652286729.2668726 +2022-05-11 12:32:09,277 actuator.py: 29 () INFO Read Set Point: 1652286729.270091 at time 1652286729.2770498 +2022-05-11 12:32:09,287 actuator.py: 29 () INFO Read Set Point: 1652286729.2800732 at time 1652286729.2871828 +2022-05-11 12:32:09,297 actuator.py: 29 () INFO Read Set Point: 1652286729.2900856 at time 1652286729.2973027 +2022-05-11 12:32:09,307 actuator.py: 29 () INFO Read Set Point: 1652286729.3000848 at time 1652286729.3074048 +2022-05-11 12:32:09,317 actuator.py: 29 () INFO Read Set Point: 1652286729.31012 at time 1652286729.3175204 +2022-05-11 12:32:09,327 actuator.py: 29 () INFO Read Set Point: 1652286729.320128 at time 1652286729.3276193 +2022-05-11 12:32:09,337 actuator.py: 29 () INFO Read Set Point: 1652286729.3300745 at time 1652286729.3377385 +2022-05-11 12:32:09,347 actuator.py: 29 () INFO Read Set Point: 1652286729.3401022 at time 1652286729.347849 +2022-05-11 12:32:09,358 actuator.py: 29 () INFO Read Set Point: 1652286729.3501353 at time 1652286729.3579693 +2022-05-11 12:32:09,368 actuator.py: 29 () INFO Read Set Point: 1652286729.3601182 at time 1652286729.3680646 +2022-05-11 12:32:09,378 actuator.py: 29 () INFO Read Set Point: 1652286729.370097 at time 1652286729.3781996 +2022-05-11 12:32:09,388 actuator.py: 29 () INFO Read Set Point: 1652286729.380088 at time 1652286729.388316 +2022-05-11 12:32:09,398 actuator.py: 29 () INFO Read Set Point: 1652286729.3900728 at time 1652286729.3984535 +2022-05-11 12:32:09,408 actuator.py: 29 () INFO Read Set Point: 1652286729.4001126 at time 1652286729.4086006 +2022-05-11 12:32:09,418 actuator.py: 29 () INFO Read Set Point: 1652286729.4100933 at time 1652286729.4187624 +2022-05-11 12:32:09,428 actuator.py: 29 () INFO Read Set Point: 1652286729.4201274 at time 1652286729.4288993 +2022-05-11 12:32:09,439 actuator.py: 29 () INFO Read Set Point: 1652286729.4301121 at time 1652286729.439047 +2022-05-11 12:32:09,449 actuator.py: 29 () INFO Read Set Point: 1652286729.440076 at time 1652286729.4491267 +2022-05-11 12:32:09,459 actuator.py: 29 () INFO Read Set Point: 1652286729.4501104 at time 1652286729.4592373 +2022-05-11 12:32:09,469 actuator.py: 29 () INFO Read Set Point: 1652286729.4600835 at time 1652286729.4693463 +2022-05-11 12:32:09,479 actuator.py: 29 () INFO Read Set Point: 1652286729.4700723 at time 1652286729.479478 +2022-05-11 12:32:09,489 actuator.py: 29 () INFO Read Set Point: 1652286729.4800713 at time 1652286729.4896247 +2022-05-11 12:32:09,499 actuator.py: 29 () INFO Read Set Point: 1652286729.4900837 at time 1652286729.4997258 +2022-05-11 12:32:09,509 actuator.py: 29 () INFO Read Set Point: 1652286729.5001185 at time 1652286729.5098495 +2022-05-11 12:32:09,520 actuator.py: 29 () INFO Read Set Point: 1652286729.510121 at time 1652286729.5201545 +2022-05-11 12:32:09,530 actuator.py: 29 () INFO Read Set Point: 1652286729.520083 at time 1652286729.5300741 +2022-05-11 12:32:09,540 actuator.py: 29 () INFO Read Set Point: 1652286729.530083 at time 1652286729.5402167 +2022-05-11 12:32:09,550 actuator.py: 29 () INFO Read Set Point: 1652286729.540086 at time 1652286729.5503197 +2022-05-11 12:32:09,560 actuator.py: 29 () INFO Read Set Point: 1652286729.550074 at time 1652286729.5604587 +2022-05-11 12:32:09,570 actuator.py: 29 () INFO Read Set Point: 1652286729.5601304 at time 1652286729.5705936 +2022-05-11 12:32:09,580 actuator.py: 29 () INFO Read Set Point: 1652286729.5701208 at time 1652286729.580741 +2022-05-11 12:32:09,591 actuator.py: 29 () INFO Read Set Point: 1652286729.5801208 at time 1652286729.5912817 +2022-05-11 12:32:09,601 actuator.py: 29 () INFO Read Set Point: 1652286729.60012 at time 1652286729.6017003 +2022-05-11 12:32:09,611 actuator.py: 29 () INFO Read Set Point: 1652286729.6100743 at time 1652286729.611849 +2022-05-11 12:32:09,622 actuator.py: 29 () INFO Read Set Point: 1652286729.6201308 at time 1652286729.6219993 +2022-05-11 12:32:09,632 actuator.py: 29 () INFO Read Set Point: 1652286729.6301193 at time 1652286729.6321418 +2022-05-11 12:32:09,642 actuator.py: 29 () INFO Read Set Point: 1652286729.640121 at time 1652286729.6422844 +2022-05-11 12:32:09,652 actuator.py: 29 () INFO Read Set Point: 1652286729.650111 at time 1652286729.6524253 +2022-05-11 12:32:09,662 actuator.py: 29 () INFO Read Set Point: 1652286729.6601207 at time 1652286729.662574 +2022-05-11 12:32:09,672 actuator.py: 29 () INFO Read Set Point: 1652286729.6701233 at time 1652286729.672716 +2022-05-11 12:32:09,682 actuator.py: 29 () INFO Read Set Point: 1652286729.6801143 at time 1652286729.682854 +2022-05-11 12:32:09,693 actuator.py: 29 () INFO Read Set Point: 1652286729.690119 at time 1652286729.6929948 +2022-05-11 12:32:09,703 actuator.py: 29 () INFO Read Set Point: 1652286729.700115 at time 1652286729.7031372 +2022-05-11 12:32:09,713 actuator.py: 29 () INFO Read Set Point: 1652286729.7101169 at time 1652286729.713383 +2022-05-11 12:32:09,723 actuator.py: 29 () INFO Read Set Point: 1652286729.7200801 at time 1652286729.7235389 +2022-05-11 12:32:09,733 actuator.py: 29 () INFO Read Set Point: 1652286729.7301302 at time 1652286729.7336805 +2022-05-11 12:32:09,744 actuator.py: 29 () INFO Read Set Point: 1652286729.740123 at time 1652286729.7438073 +2022-05-11 12:32:09,754 actuator.py: 29 () INFO Read Set Point: 1652286729.7501278 at time 1652286729.753928 +2022-05-11 12:32:09,764 actuator.py: 29 () INFO Read Set Point: 1652286729.7501278 at time 1652286729.7646906 +2022-05-11 12:32:09,774 actuator.py: 29 () INFO Read Set Point: 1652286729.770117 at time 1652286729.7747943 +2022-05-11 12:32:09,784 actuator.py: 29 () INFO Read Set Point: 1652286729.78014 at time 1652286729.7849166 +2022-05-11 12:32:09,795 actuator.py: 29 () INFO Read Set Point: 1652286729.7901213 at time 1652286729.7950451 +2022-05-11 12:32:09,805 actuator.py: 29 () INFO Read Set Point: 1652286729.800075 at time 1652286729.805133 +2022-05-11 12:32:09,815 actuator.py: 29 () INFO Read Set Point: 1652286729.8101182 at time 1652286729.8152475 +2022-05-11 12:32:09,825 actuator.py: 29 () INFO Read Set Point: 1652286729.8201194 at time 1652286729.8253353 +2022-05-11 12:32:09,835 actuator.py: 29 () INFO Read Set Point: 1652286729.8301024 at time 1652286729.8354983 +2022-05-11 12:32:09,845 actuator.py: 29 () INFO Read Set Point: 1652286729.8401272 at time 1652286729.8456354 +2022-05-11 12:32:09,855 actuator.py: 29 () INFO Read Set Point: 1652286729.8501282 at time 1652286729.8557763 +2022-05-11 12:32:09,865 actuator.py: 29 () INFO Read Set Point: 1652286729.8601232 at time 1652286729.865918 +2022-05-11 12:32:09,876 actuator.py: 29 () INFO Read Set Point: 1652286729.870068 at time 1652286729.8760598 +2022-05-11 12:32:09,886 actuator.py: 29 () INFO Read Set Point: 1652286729.880119 at time 1652286729.886199 +2022-05-11 12:32:09,896 actuator.py: 29 () INFO Read Set Point: 1652286729.8901165 at time 1652286729.8963368 +2022-05-11 12:32:09,906 actuator.py: 29 () INFO Read Set Point: 1652286729.9001184 at time 1652286729.9064786 +2022-05-11 12:32:09,916 actuator.py: 29 () INFO Read Set Point: 1652286729.9101188 at time 1652286729.916625 +2022-05-11 12:32:09,926 actuator.py: 29 () INFO Read Set Point: 1652286729.9200869 at time 1652286729.926766 +2022-05-11 12:32:09,936 actuator.py: 29 () INFO Read Set Point: 1652286729.9301174 at time 1652286729.9369009 +2022-05-11 12:32:09,947 actuator.py: 29 () INFO Read Set Point: 1652286729.9401183 at time 1652286729.947053 +2022-05-11 12:32:09,957 actuator.py: 29 () INFO Read Set Point: 1652286729.9501207 at time 1652286729.9571931 +2022-05-11 12:32:09,967 actuator.py: 29 () INFO Read Set Point: 1652286729.9601183 at time 1652286729.9673364 +2022-05-11 12:32:09,977 actuator.py: 29 () INFO Read Set Point: 1652286729.9700875 at time 1652286729.9774837 +2022-05-11 12:32:09,987 actuator.py: 29 () INFO Read Set Point: 1652286729.980126 at time 1652286729.987623 +2022-05-11 12:32:09,997 actuator.py: 29 () INFO Read Set Point: 1652286729.9901183 at time 1652286729.9977582 +2022-05-11 12:32:10,007 actuator.py: 29 () INFO Read Set Point: 1652286730.0001202 at time 1652286730.007902 +2022-05-11 12:32:10,018 actuator.py: 29 () INFO Read Set Point: 1652286730.0101144 at time 1652286730.0180507 +2022-05-11 12:32:10,028 actuator.py: 29 () INFO Read Set Point: 1652286730.0201676 at time 1652286730.028194 +2022-05-11 12:32:10,038 actuator.py: 29 () INFO Read Set Point: 1652286730.0301204 at time 1652286730.0383291 +2022-05-11 12:32:10,048 actuator.py: 29 () INFO Read Set Point: 1652286730.0401254 at time 1652286730.0484698 +2022-05-11 12:32:10,058 actuator.py: 29 () INFO Read Set Point: 1652286730.05019 at time 1652286730.0586212 +2022-05-11 12:32:10,068 actuator.py: 29 () INFO Read Set Point: 1652286730.0600948 at time 1652286730.0687625 +2022-05-11 12:32:10,078 actuator.py: 29 () INFO Read Set Point: 1652286730.0701194 at time 1652286730.0789027 +2022-05-11 12:32:10,089 actuator.py: 29 () INFO Read Set Point: 1652286730.0801208 at time 1652286730.089043 +2022-05-11 12:32:10,099 actuator.py: 29 () INFO Read Set Point: 1652286730.0900733 at time 1652286730.0991843 +2022-05-11 12:32:10,109 actuator.py: 29 () INFO Read Set Point: 1652286730.1001198 at time 1652286730.1093264 +2022-05-11 12:32:10,119 actuator.py: 29 () INFO Read Set Point: 1652286730.110126 at time 1652286730.1194632 +2022-05-11 12:32:10,129 actuator.py: 29 () INFO Read Set Point: 1652286730.1200721 at time 1652286730.1296031 +2022-05-11 12:32:10,139 actuator.py: 29 () INFO Read Set Point: 1652286730.1301098 at time 1652286730.139745 +2022-05-11 12:32:10,149 actuator.py: 29 () INFO Read Set Point: 1652286730.140105 at time 1652286730.1498847 +2022-05-11 12:32:10,160 actuator.py: 29 () INFO Read Set Point: 1652286730.1501126 at time 1652286730.1600337 +2022-05-11 12:32:10,170 actuator.py: 29 () INFO Read Set Point: 1652286730.1601129 at time 1652286730.1701684 +2022-05-11 12:32:10,180 actuator.py: 29 () INFO Read Set Point: 1652286730.1701186 at time 1652286730.1803071 +2022-05-11 12:32:10,190 actuator.py: 29 () INFO Read Set Point: 1652286730.1801174 at time 1652286730.1904426 +2022-05-11 12:32:10,200 actuator.py: 29 () INFO Read Set Point: 1652286730.1901152 at time 1652286730.20058 +2022-05-11 12:32:10,210 actuator.py: 29 () INFO Read Set Point: 1652286730.200119 at time 1652286730.2106957 +2022-05-11 12:32:10,220 actuator.py: 29 () INFO Read Set Point: 1652286730.2101176 at time 1652286730.2208345 +2022-05-11 12:32:10,231 actuator.py: 29 () INFO Read Set Point: 1652286730.2201247 at time 1652286730.2309577 +2022-05-11 12:32:10,241 actuator.py: 29 () INFO Read Set Point: 1652286730.2300997 at time 1652286730.24115 +2022-05-11 12:32:10,251 actuator.py: 29 () INFO Read Set Point: 1652286730.2401266 at time 1652286730.2512624 +2022-05-11 12:32:10,261 actuator.py: 29 () INFO Read Set Point: 1652286730.2501197 at time 1652286730.2613513 +2022-05-11 12:32:10,271 actuator.py: 29 () INFO Read Set Point: 1652286730.270122 at time 1652286730.271673 +2022-05-11 12:32:10,281 actuator.py: 29 () INFO Read Set Point: 1652286730.2801206 at time 1652286730.281766 +2022-05-11 12:32:10,291 actuator.py: 29 () INFO Read Set Point: 1652286730.2901213 at time 1652286730.2918599 +2022-05-11 12:32:10,302 actuator.py: 29 () INFO Read Set Point: 1652286730.3001194 at time 1652286730.3020005 +2022-05-11 12:32:10,312 actuator.py: 29 () INFO Read Set Point: 1652286730.3101192 at time 1652286730.3121414 +2022-05-11 12:32:10,322 actuator.py: 29 () INFO Read Set Point: 1652286730.320118 at time 1652286730.322289 +2022-05-11 12:32:10,332 actuator.py: 29 () INFO Read Set Point: 1652286730.3301182 at time 1652286730.3324292 +2022-05-11 12:32:10,342 actuator.py: 29 () INFO Read Set Point: 1652286730.3401222 at time 1652286730.3425741 +2022-05-11 12:32:10,352 actuator.py: 29 () INFO Read Set Point: 1652286730.3501215 at time 1652286730.352732 +2022-05-11 12:32:10,362 actuator.py: 29 () INFO Read Set Point: 1652286730.3601215 at time 1652286730.3628683 +2022-05-11 12:32:10,373 actuator.py: 29 () INFO Read Set Point: 1652286730.3700922 at time 1652286730.3730004 +2022-05-11 12:32:10,383 actuator.py: 29 () INFO Read Set Point: 1652286730.3800843 at time 1652286730.3831222 +2022-05-11 12:32:10,393 actuator.py: 29 () INFO Read Set Point: 1652286730.390079 at time 1652286730.3932533 +2022-05-11 12:32:10,403 actuator.py: 29 () INFO Read Set Point: 1652286730.4000823 at time 1652286730.4033818 +2022-05-11 12:32:10,413 actuator.py: 29 () INFO Read Set Point: 1652286730.410083 at time 1652286730.413476 +2022-05-11 12:32:10,423 actuator.py: 29 () INFO Read Set Point: 1652286730.4200826 at time 1652286730.4236102 +2022-05-11 12:32:10,433 actuator.py: 29 () INFO Read Set Point: 1652286730.4300814 at time 1652286730.433743 +2022-05-11 12:32:10,443 actuator.py: 29 () INFO Read Set Point: 1652286730.4400828 at time 1652286730.4438972 +2022-05-11 12:32:10,454 actuator.py: 29 () INFO Read Set Point: 1652286730.4500823 at time 1652286730.454029 +2022-05-11 12:32:10,464 actuator.py: 29 () INFO Read Set Point: 1652286730.460082 at time 1652286730.464147 +2022-05-11 12:32:10,474 actuator.py: 29 () INFO Read Set Point: 1652286730.470083 at time 1652286730.4742851 +2022-05-11 12:32:10,484 actuator.py: 29 () INFO Read Set Point: 1652286730.4800828 at time 1652286730.4843802 +2022-05-11 12:32:10,494 actuator.py: 29 () INFO Read Set Point: 1652286730.4900813 at time 1652286730.4945138 +2022-05-11 12:32:10,504 actuator.py: 29 () INFO Read Set Point: 1652286730.5000894 at time 1652286730.5046458 +2022-05-11 12:32:10,514 actuator.py: 29 () INFO Read Set Point: 1652286730.5100899 at time 1652286730.5147908 +2022-05-11 12:32:10,525 actuator.py: 29 () INFO Read Set Point: 1652286730.5200918 at time 1652286730.5249326 +2022-05-11 12:32:10,535 actuator.py: 29 () INFO Read Set Point: 1652286730.5300918 at time 1652286730.5350738 +2022-05-11 12:32:10,545 actuator.py: 29 () INFO Read Set Point: 1652286730.5400927 at time 1652286730.5451734 +2022-05-11 12:32:10,555 actuator.py: 29 () INFO Read Set Point: 1652286730.5500937 at time 1652286730.5552707 +2022-05-11 12:32:10,565 actuator.py: 29 () INFO Read Set Point: 1652286730.5600877 at time 1652286730.5653734 +2022-05-11 12:32:10,575 actuator.py: 29 () INFO Read Set Point: 1652286730.5701218 at time 1652286730.5754852 +2022-05-11 12:32:10,585 actuator.py: 29 () INFO Read Set Point: 1652286730.5800753 at time 1652286730.585643 +2022-05-11 12:32:10,595 actuator.py: 29 () INFO Read Set Point: 1652286730.5900867 at time 1652286730.5957932 +2022-05-11 12:32:10,606 actuator.py: 29 () INFO Read Set Point: 1652286730.6000822 at time 1652286730.6059463 +2022-05-11 12:32:10,616 actuator.py: 29 () INFO Read Set Point: 1652286730.610082 at time 1652286730.616077 +2022-05-11 12:32:10,626 actuator.py: 29 () INFO Read Set Point: 1652286730.6201236 at time 1652286730.6261795 +2022-05-11 12:32:10,636 actuator.py: 29 () INFO Read Set Point: 1652286730.6300757 at time 1652286730.636312 +2022-05-11 12:32:10,646 actuator.py: 29 () INFO Read Set Point: 1652286730.6400757 at time 1652286730.646408 +2022-05-11 12:32:10,656 actuator.py: 29 () INFO Read Set Point: 1652286730.6500742 at time 1652286730.6565187 +2022-05-11 12:32:10,666 actuator.py: 29 () INFO Read Set Point: 1652286730.6601174 at time 1652286730.6667304 +2022-05-11 12:32:10,676 actuator.py: 29 () INFO Read Set Point: 1652286730.6700885 at time 1652286730.676832 +2022-05-11 12:32:10,687 actuator.py: 29 () INFO Read Set Point: 1652286730.6800885 at time 1652286730.6869607 +2022-05-11 12:32:10,697 actuator.py: 29 () INFO Read Set Point: 1652286730.6901119 at time 1652286730.6970956 +2022-05-11 12:32:10,707 actuator.py: 29 () INFO Read Set Point: 1652286730.7001116 at time 1652286730.7071953 +2022-05-11 12:32:10,717 actuator.py: 29 () INFO Read Set Point: 1652286730.7101183 at time 1652286730.7173312 +2022-05-11 12:32:10,727 actuator.py: 29 () INFO Read Set Point: 1652286730.7200835 at time 1652286730.7274642 +2022-05-11 12:32:10,737 actuator.py: 29 () INFO Read Set Point: 1652286730.7333298 at time 1652286730.7375743 +2022-05-11 12:32:10,747 actuator.py: 29 () INFO Read Set Point: 1652286730.740083 at time 1652286730.7477088 +2022-05-11 12:32:10,757 actuator.py: 29 () INFO Read Set Point: 1652286730.7500854 at time 1652286730.7578182 +2022-05-11 12:32:10,768 actuator.py: 29 () INFO Read Set Point: 1652286730.7600904 at time 1652286730.7679539 +2022-05-11 12:32:10,778 actuator.py: 29 () INFO Read Set Point: 1652286730.7700872 at time 1652286730.7780933 +2022-05-11 12:32:10,788 actuator.py: 29 () INFO Read Set Point: 1652286730.780078 at time 1652286730.7881978 +2022-05-11 12:32:10,798 actuator.py: 29 () INFO Read Set Point: 1652286730.7901258 at time 1652286730.798358 +2022-05-11 12:32:10,808 actuator.py: 29 () INFO Read Set Point: 1652286730.8001273 at time 1652286730.8084397 +2022-05-11 12:32:10,818 actuator.py: 29 () INFO Read Set Point: 1652286730.8101223 at time 1652286730.8185833 +2022-05-11 12:32:10,828 actuator.py: 29 () INFO Read Set Point: 1652286730.8200817 at time 1652286730.828725 +2022-05-11 12:32:10,838 actuator.py: 29 () INFO Read Set Point: 1652286730.8301218 at time 1652286730.8388405 +2022-05-11 12:32:10,849 actuator.py: 29 () INFO Read Set Point: 1652286730.8400826 at time 1652286730.8489847 +2022-05-11 12:32:10,859 actuator.py: 29 () INFO Read Set Point: 1652286730.8501194 at time 1652286730.859132 +2022-05-11 12:32:10,869 actuator.py: 29 () INFO Read Set Point: 1652286730.8601167 at time 1652286730.8692744 +2022-05-11 12:32:10,879 actuator.py: 29 () INFO Read Set Point: 1652286730.8701155 at time 1652286730.879417 +2022-05-11 12:32:10,889 actuator.py: 29 () INFO Read Set Point: 1652286730.8801181 at time 1652286730.8895128 +2022-05-11 12:32:10,899 actuator.py: 29 () INFO Read Set Point: 1652286730.8901186 at time 1652286730.8996584 +2022-05-11 12:32:10,909 actuator.py: 29 () INFO Read Set Point: 1652286730.9001124 at time 1652286730.9098 +2022-05-11 12:32:10,919 actuator.py: 29 () INFO Read Set Point: 1652286730.910118 at time 1652286730.9198976 +2022-05-11 12:32:10,930 actuator.py: 29 () INFO Read Set Point: 1652286730.9201121 at time 1652286730.9300354 +2022-05-11 12:32:10,940 actuator.py: 29 () INFO Read Set Point: 1652286730.9301076 at time 1652286730.9401276 +2022-05-11 12:32:10,950 actuator.py: 29 () INFO Read Set Point: 1652286730.9400783 at time 1652286730.9502213 +2022-05-11 12:32:10,960 actuator.py: 29 () INFO Read Set Point: 1652286730.9501045 at time 1652286730.960311 +2022-05-11 12:32:10,970 actuator.py: 29 () INFO Read Set Point: 1652286730.960113 at time 1652286730.9704056 +2022-05-11 12:32:10,980 actuator.py: 29 () INFO Read Set Point: 1652286730.9701133 at time 1652286730.9805086 +2022-05-11 12:32:10,990 actuator.py: 29 () INFO Read Set Point: 1652286730.9801128 at time 1652286730.9906032 +2022-05-11 12:32:11,000 actuator.py: 29 () INFO Read Set Point: 1652286730.990113 at time 1652286731.0007539 +2022-05-11 12:32:11,011 actuator.py: 29 () INFO Read Set Point: 1652286731.0001235 at time 1652286731.0115004 +2022-05-11 12:32:11,021 actuator.py: 29 () INFO Read Set Point: 1652286731.010119 at time 1652286731.0216098 +2022-05-11 12:32:11,032 actuator.py: 29 () INFO Read Set Point: 1652286731.0301132 at time 1652286731.0319996 +2022-05-11 12:32:11,042 actuator.py: 29 () INFO Read Set Point: 1652286731.0400765 at time 1652286731.0420945 +2022-05-11 12:32:11,052 actuator.py: 29 () INFO Read Set Point: 1652286731.050108 at time 1652286731.0522366 +2022-05-11 12:32:11,062 actuator.py: 29 () INFO Read Set Point: 1652286731.060083 at time 1652286731.06237 +2022-05-11 12:32:11,072 actuator.py: 29 () INFO Read Set Point: 1652286731.0700748 at time 1652286731.0725114 +2022-05-11 12:32:11,082 actuator.py: 29 () INFO Read Set Point: 1652286731.0800805 at time 1652286731.082644 +2022-05-11 12:32:11,092 actuator.py: 29 () INFO Read Set Point: 1652286731.0901139 at time 1652286731.092732 +2022-05-11 12:32:11,102 actuator.py: 29 () INFO Read Set Point: 1652286731.1000786 at time 1652286731.102823 +2022-05-11 12:32:11,113 actuator.py: 29 () INFO Read Set Point: 1652286731.1100864 at time 1652286731.1129706 +2022-05-11 12:32:11,123 actuator.py: 29 () INFO Read Set Point: 1652286731.1201198 at time 1652286731.1231143 +2022-05-11 12:32:11,133 actuator.py: 29 () INFO Read Set Point: 1652286731.1301122 at time 1652286731.1332512 +2022-05-11 12:32:11,143 actuator.py: 29 () INFO Read Set Point: 1652286731.1400795 at time 1652286731.1433933 +2022-05-11 12:32:11,153 actuator.py: 29 () INFO Read Set Point: 1652286731.1500735 at time 1652286731.1535337 +2022-05-11 12:32:11,163 actuator.py: 29 () INFO Read Set Point: 1652286731.160121 at time 1652286731.1636708 +2022-05-11 12:32:11,173 actuator.py: 29 () INFO Read Set Point: 1652286731.1701171 at time 1652286731.1738088 +2022-05-11 12:32:11,184 actuator.py: 29 () INFO Read Set Point: 1652286731.1800797 at time 1652286731.1839428 +2022-05-11 12:32:11,194 actuator.py: 29 () INFO Read Set Point: 1652286731.1901195 at time 1652286731.194086 +2022-05-11 12:32:11,204 actuator.py: 29 () INFO Read Set Point: 1652286731.2001054 at time 1652286731.204232 +2022-05-11 12:32:11,214 actuator.py: 29 () INFO Read Set Point: 1652286731.210116 at time 1652286731.2143233 +2022-05-11 12:32:11,224 actuator.py: 29 () INFO Read Set Point: 1652286731.2200794 at time 1652286731.2244625 +2022-05-11 12:32:11,234 actuator.py: 29 () INFO Read Set Point: 1652286731.2301242 at time 1652286731.234597 +2022-05-11 12:32:11,244 actuator.py: 29 () INFO Read Set Point: 1652286731.2400694 at time 1652286731.244737 +2022-05-11 12:32:11,254 actuator.py: 29 () INFO Read Set Point: 1652286731.2500782 at time 1652286731.254875 +2022-05-11 12:32:11,265 actuator.py: 29 () INFO Read Set Point: 1652286731.2601054 at time 1652286731.2650127 +2022-05-11 12:32:11,275 actuator.py: 29 () INFO Read Set Point: 1652286731.2701178 at time 1652286731.2751498 +2022-05-11 12:32:11,285 actuator.py: 29 () INFO Read Set Point: 1652286731.2801135 at time 1652286731.2852414 +2022-05-11 12:32:11,295 actuator.py: 29 () INFO Read Set Point: 1652286731.2901194 at time 1652286731.2953846 +2022-05-11 12:32:11,305 actuator.py: 29 () INFO Read Set Point: 1652286731.300115 at time 1652286731.3055282 +2022-05-11 12:32:11,315 actuator.py: 29 () INFO Read Set Point: 1652286731.3101232 at time 1652286731.3156722 +2022-05-11 12:32:11,325 actuator.py: 29 () INFO Read Set Point: 1652286731.3201065 at time 1652286731.3258142 +2022-05-11 12:32:11,336 actuator.py: 29 () INFO Read Set Point: 1652286731.3301215 at time 1652286731.3359582 +2022-05-11 12:32:11,346 actuator.py: 29 () INFO Read Set Point: 1652286731.3401184 at time 1652286731.346097 +2022-05-11 12:32:11,356 actuator.py: 29 () INFO Read Set Point: 1652286731.350125 at time 1652286731.3562346 +2022-05-11 12:32:11,366 actuator.py: 29 () INFO Read Set Point: 1652286731.3601203 at time 1652286731.3663738 +2022-05-11 12:32:11,376 actuator.py: 29 () INFO Read Set Point: 1652286731.3701148 at time 1652286731.376514 +2022-05-11 12:32:11,386 actuator.py: 29 () INFO Read Set Point: 1652286731.3800828 at time 1652286731.3866518 +2022-05-11 12:32:11,396 actuator.py: 29 () INFO Read Set Point: 1652286731.3901143 at time 1652286731.3967648 +2022-05-11 12:32:11,406 actuator.py: 29 () INFO Read Set Point: 1652286731.4001176 at time 1652286731.4068997 +2022-05-11 12:32:11,417 actuator.py: 29 () INFO Read Set Point: 1652286731.4101143 at time 1652286731.4170492 +2022-05-11 12:32:11,427 actuator.py: 29 () INFO Read Set Point: 1652286731.4201202 at time 1652286731.4271939 +2022-05-11 12:32:11,437 actuator.py: 29 () INFO Read Set Point: 1652286731.4301252 at time 1652286731.4373353 +2022-05-11 12:32:11,447 actuator.py: 29 () INFO Read Set Point: 1652286731.4401128 at time 1652286731.4474764 +2022-05-11 12:32:11,457 actuator.py: 29 () INFO Read Set Point: 1652286731.45012 at time 1652286731.4576197 +2022-05-11 12:32:11,467 actuator.py: 29 () INFO Read Set Point: 1652286731.4601114 at time 1652286731.4677608 +2022-05-11 12:32:11,477 actuator.py: 29 () INFO Read Set Point: 1652286731.4701164 at time 1652286731.4779038 +2022-05-11 12:32:11,488 actuator.py: 29 () INFO Read Set Point: 1652286731.480124 at time 1652286731.488048 +2022-05-11 12:32:11,498 actuator.py: 29 () INFO Read Set Point: 1652286731.4901164 at time 1652286731.498189 +2022-05-11 12:32:11,508 actuator.py: 29 () INFO Read Set Point: 1652286731.500118 at time 1652286731.5083306 +2022-05-11 12:32:11,518 actuator.py: 29 () INFO Read Set Point: 1652286731.5101178 at time 1652286731.518472 +2022-05-11 12:32:11,528 actuator.py: 29 () INFO Read Set Point: 1652286731.5201163 at time 1652286731.528615 +2022-05-11 12:32:11,538 actuator.py: 29 () INFO Read Set Point: 1652286731.5301151 at time 1652286731.5387533 +2022-05-11 12:32:11,548 actuator.py: 29 () INFO Read Set Point: 1652286731.5401156 at time 1652286731.5489006 +2022-05-11 12:32:11,559 actuator.py: 29 () INFO Read Set Point: 1652286731.5501187 at time 1652286731.5590549 +2022-05-11 12:32:11,569 actuator.py: 29 () INFO Read Set Point: 1652286731.5601156 at time 1652286731.569197 +2022-05-11 12:32:11,579 actuator.py: 29 () INFO Read Set Point: 1652286731.570117 at time 1652286731.5793388 +2022-05-11 12:32:11,589 actuator.py: 29 () INFO Read Set Point: 1652286731.5801175 at time 1652286731.5894806 +2022-05-11 12:32:11,599 actuator.py: 29 () INFO Read Set Point: 1652286731.5901172 at time 1652286731.599623 +2022-05-11 12:32:11,609 actuator.py: 29 () INFO Read Set Point: 1652286731.6000638 at time 1652286731.6097655 +2022-05-11 12:32:11,619 actuator.py: 29 () INFO Read Set Point: 1652286731.6100748 at time 1652286731.6198764 +2022-05-11 12:32:11,630 actuator.py: 29 () INFO Read Set Point: 1652286731.620068 at time 1652286731.630012 +2022-05-11 12:32:11,640 actuator.py: 29 () INFO Read Set Point: 1652286731.6300738 at time 1652286731.640133 +2022-05-11 12:32:11,650 actuator.py: 29 () INFO Read Set Point: 1652286731.640121 at time 1652286731.6502297 +2022-05-11 12:32:11,660 actuator.py: 29 () INFO Read Set Point: 1652286731.6501176 at time 1652286731.6603296 +2022-05-11 12:32:11,670 actuator.py: 29 () INFO Read Set Point: 1652286731.660116 at time 1652286731.6704311 +2022-05-11 12:32:11,680 actuator.py: 29 () INFO Read Set Point: 1652286731.6701171 at time 1652286731.6805298 +2022-05-11 12:32:11,690 actuator.py: 29 () INFO Read Set Point: 1652286731.6801107 at time 1652286731.6906357 +2022-05-11 12:32:11,700 actuator.py: 29 () INFO Read Set Point: 1652286731.6901157 at time 1652286731.7007372 +2022-05-11 12:32:11,711 actuator.py: 29 () INFO Read Set Point: 1652286731.7001152 at time 1652286731.7112992 +2022-05-11 12:32:11,721 actuator.py: 29 () INFO Read Set Point: 1652286731.7101161 at time 1652286731.721386 +2022-05-11 12:32:11,731 actuator.py: 29 () INFO Read Set Point: 1652286731.7201161 at time 1652286731.7314796 +2022-05-11 12:32:11,741 actuator.py: 29 () INFO Read Set Point: 1652286731.7401168 at time 1652286731.7417693 +2022-05-11 12:32:11,751 actuator.py: 29 () INFO Read Set Point: 1652286731.7500594 at time 1652286731.7519062 +2022-05-11 12:32:11,762 actuator.py: 29 () INFO Read Set Point: 1652286731.7601151 at time 1652286731.761988 +2022-05-11 12:32:11,772 actuator.py: 29 () INFO Read Set Point: 1652286731.7701159 at time 1652286731.772074 +2022-05-11 12:32:11,782 actuator.py: 29 () INFO Read Set Point: 1652286731.7801187 at time 1652286731.7821867 +2022-05-11 12:32:11,792 actuator.py: 29 () INFO Read Set Point: 1652286731.7901223 at time 1652286731.7923033 +2022-05-11 12:32:11,802 actuator.py: 29 () INFO Read Set Point: 1652286731.8001184 at time 1652286731.8024507 +2022-05-11 12:32:11,812 actuator.py: 29 () INFO Read Set Point: 1652286731.8101182 at time 1652286731.8125818 +2022-05-11 12:32:11,822 actuator.py: 29 () INFO Read Set Point: 1652286731.8201153 at time 1652286731.8227255 +2022-05-11 12:32:11,832 actuator.py: 29 () INFO Read Set Point: 1652286731.8301182 at time 1652286731.832867 +2022-05-11 12:32:11,843 actuator.py: 29 () INFO Read Set Point: 1652286731.8401208 at time 1652286731.8430111 +2022-05-11 12:32:11,853 actuator.py: 29 () INFO Read Set Point: 1652286731.8501184 at time 1652286731.8531523 +2022-05-11 12:32:11,863 actuator.py: 29 () INFO Read Set Point: 1652286731.8601174 at time 1652286731.8632398 +2022-05-11 12:32:11,873 actuator.py: 29 () INFO Read Set Point: 1652286731.8701212 at time 1652286731.8733788 +2022-05-11 12:32:11,883 actuator.py: 29 () INFO Read Set Point: 1652286731.8801186 at time 1652286731.8835058 +2022-05-11 12:32:11,893 actuator.py: 29 () INFO Read Set Point: 1652286731.8901157 at time 1652286731.8936477 +2022-05-11 12:32:11,903 actuator.py: 29 () INFO Read Set Point: 1652286731.9001176 at time 1652286731.9037397 +2022-05-11 12:32:11,913 actuator.py: 29 () INFO Read Set Point: 1652286731.9101186 at time 1652286731.9138694 +2022-05-11 12:32:11,924 actuator.py: 29 () INFO Read Set Point: 1652286731.9201183 at time 1652286731.92401 +2022-05-11 12:32:11,934 actuator.py: 29 () INFO Read Set Point: 1652286731.9301176 at time 1652286731.9341524 +2022-05-11 12:32:11,944 actuator.py: 29 () INFO Read Set Point: 1652286731.9401157 at time 1652286731.944296 +2022-05-11 12:32:11,954 actuator.py: 29 () INFO Read Set Point: 1652286731.9501255 at time 1652286731.9544368 +2022-05-11 12:32:11,964 actuator.py: 29 () INFO Read Set Point: 1652286731.9601216 at time 1652286731.9645834 +2022-05-11 12:32:11,974 actuator.py: 29 () INFO Read Set Point: 1652286731.9701188 at time 1652286731.9747217 +2022-05-11 12:32:11,984 actuator.py: 29 () INFO Read Set Point: 1652286731.9801197 at time 1652286731.9848642 +2022-05-11 12:32:11,995 actuator.py: 29 () INFO Read Set Point: 1652286731.9901223 at time 1652286731.9950058 +2022-05-11 12:32:12,005 actuator.py: 29 () INFO Read Set Point: 1652286732.0001194 at time 1652286732.0051486 +2022-05-11 12:32:12,015 actuator.py: 29 () INFO Read Set Point: 1652286732.0101213 at time 1652286732.0152926 +2022-05-11 12:32:12,025 actuator.py: 29 () INFO Read Set Point: 1652286732.020105 at time 1652286732.0254345 +2022-05-11 12:32:12,035 actuator.py: 29 () INFO Read Set Point: 1652286732.0301192 at time 1652286732.03558 +2022-05-11 12:32:12,045 actuator.py: 29 () INFO Read Set Point: 1652286732.0401106 at time 1652286732.0457218 +2022-05-11 12:32:12,055 actuator.py: 29 () INFO Read Set Point: 1652286732.050118 at time 1652286732.0558627 +2022-05-11 12:32:12,066 actuator.py: 29 () INFO Read Set Point: 1652286732.0601163 at time 1652286732.066008 +2022-05-11 12:32:12,076 actuator.py: 29 () INFO Read Set Point: 1652286732.0701187 at time 1652286732.0761485 +2022-05-11 12:32:12,086 actuator.py: 29 () INFO Read Set Point: 1652286732.080118 at time 1652286732.0862892 +2022-05-11 12:32:12,096 actuator.py: 29 () INFO Read Set Point: 1652286732.090105 at time 1652286732.0964355 +2022-05-11 12:32:12,106 actuator.py: 29 () INFO Read Set Point: 1652286732.1001182 at time 1652286732.1065762 +2022-05-11 12:32:12,116 actuator.py: 29 () INFO Read Set Point: 1652286732.1101155 at time 1652286732.1167176 +2022-05-11 12:32:12,126 actuator.py: 29 () INFO Read Set Point: 1652286732.120118 at time 1652286732.1268613 +2022-05-11 12:32:12,137 actuator.py: 29 () INFO Read Set Point: 1652286732.1301217 at time 1652286732.1369991 +2022-05-11 12:32:12,147 actuator.py: 29 () INFO Read Set Point: 1652286732.1401181 at time 1652286732.1471431 +2022-05-11 12:32:12,157 actuator.py: 29 () INFO Read Set Point: 1652286732.150117 at time 1652286732.157283 +2022-05-11 12:32:12,167 actuator.py: 29 () INFO Read Set Point: 1652286732.1601253 at time 1652286732.167422 +2022-05-11 12:32:12,177 actuator.py: 29 () INFO Read Set Point: 1652286732.1700811 at time 1652286732.1775599 +2022-05-11 12:32:12,187 actuator.py: 29 () INFO Read Set Point: 1652286732.1800852 at time 1652286732.1876938 +2022-05-11 12:32:12,197 actuator.py: 29 () INFO Read Set Point: 1652286732.1900878 at time 1652286732.197801 +2022-05-11 12:32:12,208 actuator.py: 29 () INFO Read Set Point: 1652286732.2001243 at time 1652286732.2079387 +2022-05-11 12:32:12,218 actuator.py: 29 () INFO Read Set Point: 1652286732.2101147 at time 1652286732.2180777 +2022-05-11 12:32:12,228 actuator.py: 29 () INFO Read Set Point: 1652286732.2201185 at time 1652286732.2282255 +2022-05-11 12:32:12,238 actuator.py: 29 () INFO Read Set Point: 1652286732.2301202 at time 1652286732.2383654 +2022-05-11 12:32:12,248 actuator.py: 29 () INFO Read Set Point: 1652286732.2401097 at time 1652286732.2485182 +2022-05-11 12:32:12,258 actuator.py: 29 () INFO Read Set Point: 1652286732.2501204 at time 1652286732.2586594 +2022-05-11 12:32:12,268 actuator.py: 29 () INFO Read Set Point: 1652286732.260074 at time 1652286732.2688043 +2022-05-11 12:32:12,279 actuator.py: 29 () INFO Read Set Point: 1652286732.270117 at time 1652286732.2789488 +2022-05-11 12:32:12,289 actuator.py: 29 () INFO Read Set Point: 1652286732.2801166 at time 1652286732.2890916 +2022-05-11 12:32:12,299 actuator.py: 29 () INFO Read Set Point: 1652286732.2901134 at time 1652286732.2992408 +2022-05-11 12:32:12,309 actuator.py: 29 () INFO Read Set Point: 1652286732.3001158 at time 1652286732.3093402 +2022-05-11 12:32:12,319 actuator.py: 29 () INFO Read Set Point: 1652286732.310118 at time 1652286732.3194287 +2022-05-11 12:32:12,329 actuator.py: 29 () INFO Read Set Point: 1652286732.3200674 at time 1652286732.3295712 +2022-05-11 12:32:12,339 actuator.py: 29 () INFO Read Set Point: 1652286732.330072 at time 1652286732.3397117 +2022-05-11 12:32:12,349 actuator.py: 29 () INFO Read Set Point: 1652286732.3401062 at time 1652286732.349857 +2022-05-11 12:32:12,360 actuator.py: 29 () INFO Read Set Point: 1652286732.3501055 at time 1652286732.3599808 +2022-05-11 12:32:12,370 actuator.py: 29 () INFO Read Set Point: 1652286732.360107 at time 1652286732.3701181 +2022-05-11 12:32:12,380 actuator.py: 29 () INFO Read Set Point: 1652286732.3701286 at time 1652286732.380256 +2022-05-11 12:32:12,390 actuator.py: 29 () INFO Read Set Point: 1652286732.3801231 at time 1652286732.3903897 +2022-05-11 12:32:12,400 actuator.py: 29 () INFO Read Set Point: 1652286732.3901155 at time 1652286732.4005237 +2022-05-11 12:32:12,410 actuator.py: 29 () INFO Read Set Point: 1652286732.4001234 at time 1652286732.4106598 +2022-05-11 12:32:12,420 actuator.py: 29 () INFO Read Set Point: 1652286732.4101183 at time 1652286732.420812 +2022-05-11 12:32:12,431 actuator.py: 29 () INFO Read Set Point: 1652286732.4201171 at time 1652286732.4313264 +2022-05-11 12:32:12,441 actuator.py: 29 () INFO Read Set Point: 1652286732.4301205 at time 1652286732.4414203 +2022-05-11 12:32:12,451 actuator.py: 29 () INFO Read Set Point: 1652286732.4501138 at time 1652286732.4517114 +2022-05-11 12:32:12,461 actuator.py: 29 () INFO Read Set Point: 1652286732.460113 at time 1652286732.4618545 +2022-05-11 12:32:12,471 actuator.py: 29 () INFO Read Set Point: 1652286732.4701073 at time 1652286732.4719448 +2022-05-11 12:32:12,482 actuator.py: 29 () INFO Read Set Point: 1652286732.480118 at time 1652286732.4820867 +2022-05-11 12:32:12,492 actuator.py: 29 () INFO Read Set Point: 1652286732.4901216 at time 1652286732.4922297 +2022-05-11 12:32:12,502 actuator.py: 29 () INFO Read Set Point: 1652286732.5001123 at time 1652286732.5023627 +2022-05-11 12:32:12,512 actuator.py: 29 () INFO Read Set Point: 1652286732.5101159 at time 1652286732.512504 +2022-05-11 12:32:12,522 actuator.py: 29 () INFO Read Set Point: 1652286732.5201097 at time 1652286732.5226455 +2022-05-11 12:32:12,532 actuator.py: 29 () INFO Read Set Point: 1652286732.5301154 at time 1652286732.5327907 +2022-05-11 12:32:12,542 actuator.py: 29 () INFO Read Set Point: 1652286732.5401185 at time 1652286732.5429304 +2022-05-11 12:32:12,553 actuator.py: 29 () INFO Read Set Point: 1652286732.5501232 at time 1652286732.553073 +2022-05-11 12:32:12,563 actuator.py: 29 () INFO Read Set Point: 1652286732.5601182 at time 1652286732.563216 +2022-05-11 12:32:12,573 actuator.py: 29 () INFO Read Set Point: 1652286732.5701182 at time 1652286732.5733552 +2022-05-11 12:32:12,583 actuator.py: 29 () INFO Read Set Point: 1652286732.5801156 at time 1652286732.5834894 +2022-05-11 12:32:12,593 actuator.py: 29 () INFO Read Set Point: 1652286732.590118 at time 1652286732.5936303 +2022-05-11 12:32:12,603 actuator.py: 29 () INFO Read Set Point: 1652286732.6001184 at time 1652286732.6037788 +2022-05-11 12:32:12,613 actuator.py: 29 () INFO Read Set Point: 1652286732.6101174 at time 1652286732.6139183 +2022-05-11 12:32:12,624 actuator.py: 29 () INFO Read Set Point: 1652286732.620116 at time 1652286732.624064 +2022-05-11 12:32:12,634 actuator.py: 29 () INFO Read Set Point: 1652286732.6301153 at time 1652286732.6342 +2022-05-11 12:32:12,644 actuator.py: 29 () INFO Read Set Point: 1652286732.6401157 at time 1652286732.644343 +2022-05-11 12:32:12,654 actuator.py: 29 () INFO Read Set Point: 1652286732.650116 at time 1652286732.6544824 +2022-05-11 12:32:12,664 actuator.py: 29 () INFO Read Set Point: 1652286732.660118 at time 1652286732.6646185 +2022-05-11 12:32:12,674 actuator.py: 29 () INFO Read Set Point: 1652286732.6701124 at time 1652286732.674758 +2022-05-11 12:32:12,684 actuator.py: 29 () INFO Read Set Point: 1652286732.680118 at time 1652286732.6848974 +2022-05-11 12:32:12,695 actuator.py: 29 () INFO Read Set Point: 1652286732.6901183 at time 1652286732.6950524 +2022-05-11 12:32:12,705 actuator.py: 29 () INFO Read Set Point: 1652286732.7001162 at time 1652286732.705191 +2022-05-11 12:32:12,715 actuator.py: 29 () INFO Read Set Point: 1652286732.7101152 at time 1652286732.7153325 +2022-05-11 12:32:12,725 actuator.py: 29 () INFO Read Set Point: 1652286732.720116 at time 1652286732.7254734 +2022-05-11 12:32:12,735 actuator.py: 29 () INFO Read Set Point: 1652286732.7301168 at time 1652286732.735619 +2022-05-11 12:32:12,745 actuator.py: 29 () INFO Read Set Point: 1652286732.740121 at time 1652286732.7457557 +2022-05-11 12:32:12,755 actuator.py: 29 () INFO Read Set Point: 1652286732.750116 at time 1652286732.7558901 +2022-05-11 12:32:12,766 actuator.py: 29 () INFO Read Set Point: 1652286732.7601175 at time 1652286732.7660317 +2022-05-11 12:32:12,776 actuator.py: 29 () INFO Read Set Point: 1652286732.7701225 at time 1652286732.7761755 +2022-05-11 12:32:12,786 actuator.py: 29 () INFO Read Set Point: 1652286732.7801163 at time 1652286732.7863138 +2022-05-11 12:32:12,796 actuator.py: 29 () INFO Read Set Point: 1652286732.7901156 at time 1652286732.7964551 +2022-05-11 12:32:12,806 actuator.py: 29 () INFO Read Set Point: 1652286732.8001163 at time 1652286732.8065915 +2022-05-11 12:32:12,816 actuator.py: 29 () INFO Read Set Point: 1652286732.810117 at time 1652286732.816731 +2022-05-11 12:32:12,826 actuator.py: 29 () INFO Read Set Point: 1652286732.8201177 at time 1652286732.826871 +2022-05-11 12:32:12,837 actuator.py: 29 () INFO Read Set Point: 1652286732.830116 at time 1652286732.8370094 +2022-05-11 12:32:12,847 actuator.py: 29 () INFO Read Set Point: 1652286732.8401148 at time 1652286732.847154 +2022-05-11 12:32:12,857 actuator.py: 29 () INFO Read Set Point: 1652286732.8501153 at time 1652286732.8572962 +2022-05-11 12:32:12,867 actuator.py: 29 () INFO Read Set Point: 1652286732.8601205 at time 1652286732.867437 +2022-05-11 12:32:12,877 actuator.py: 29 () INFO Read Set Point: 1652286732.8701143 at time 1652286732.8775773 +2022-05-11 12:32:12,887 actuator.py: 29 () INFO Read Set Point: 1652286732.8801181 at time 1652286732.8877194 +2022-05-11 12:32:12,897 actuator.py: 29 () INFO Read Set Point: 1652286732.890116 at time 1652286732.8978596 +2022-05-11 12:32:12,908 actuator.py: 29 () INFO Read Set Point: 1652286732.9001107 at time 1652286732.9079993 +2022-05-11 12:32:12,918 actuator.py: 29 () INFO Read Set Point: 1652286732.9101176 at time 1652286732.9181406 +2022-05-11 12:32:12,928 actuator.py: 29 () INFO Read Set Point: 1652286732.9201162 at time 1652286732.9282818 +2022-05-11 12:32:12,938 actuator.py: 29 () INFO Read Set Point: 1652286732.9301155 at time 1652286732.9384232 +2022-05-11 12:32:12,948 actuator.py: 29 () INFO Read Set Point: 1652286732.9401107 at time 1652286732.9485672 +2022-05-11 12:32:12,958 actuator.py: 29 () INFO Read Set Point: 1652286732.9501083 at time 1652286732.9587057 +2022-05-11 12:32:12,968 actuator.py: 29 () INFO Read Set Point: 1652286732.9601133 at time 1652286732.9688377 +2022-05-11 12:32:12,979 actuator.py: 29 () INFO Read Set Point: 1652286732.9700778 at time 1652286732.978942 +2022-05-11 12:32:12,989 actuator.py: 29 () INFO Read Set Point: 1652286732.9800813 at time 1652286732.9890804 +2022-05-11 12:32:12,999 actuator.py: 29 () INFO Read Set Point: 1652286732.990092 at time 1652286732.999177 +2022-05-11 12:32:13,009 actuator.py: 29 () INFO Read Set Point: 1652286733.0001135 at time 1652286733.0093217 +2022-05-11 12:32:13,019 actuator.py: 29 () INFO Read Set Point: 1652286733.0101132 at time 1652286733.0194604 +2022-05-11 12:32:13,029 actuator.py: 29 () INFO Read Set Point: 1652286733.0201201 at time 1652286733.029605 +2022-05-11 12:32:13,039 actuator.py: 29 () INFO Read Set Point: 1652286733.0301113 at time 1652286733.039743 +2022-05-11 12:32:13,049 actuator.py: 29 () INFO Read Set Point: 1652286733.0400665 at time 1652286733.0498853 +2022-05-11 12:32:13,060 actuator.py: 29 () INFO Read Set Point: 1652286733.0501044 at time 1652286733.0600278 +2022-05-11 12:32:13,070 actuator.py: 29 () INFO Read Set Point: 1652286733.0601034 at time 1652286733.0701635 +2022-05-11 12:32:13,080 actuator.py: 29 () INFO Read Set Point: 1652286733.0701153 at time 1652286733.0803013 +2022-05-11 12:32:13,090 actuator.py: 29 () INFO Read Set Point: 1652286733.0801194 at time 1652286733.090438 +2022-05-11 12:32:13,100 actuator.py: 29 () INFO Read Set Point: 1652286733.0901208 at time 1652286733.10058 +2022-05-11 12:32:13,110 actuator.py: 29 () INFO Read Set Point: 1652286733.1001167 at time 1652286733.110688 +2022-05-11 12:32:13,120 actuator.py: 29 () INFO Read Set Point: 1652286733.1101208 at time 1652286733.120793 +2022-05-11 12:32:13,131 actuator.py: 29 () INFO Read Set Point: 1652286733.120104 at time 1652286733.1313548 +2022-05-11 12:32:13,141 actuator.py: 29 () INFO Read Set Point: 1652286733.1301174 at time 1652286733.1414607 +2022-05-11 12:32:13,151 actuator.py: 29 () INFO Read Set Point: 1652286733.1501162 at time 1652286733.1518202 +2022-05-11 12:32:13,162 actuator.py: 29 () INFO Read Set Point: 1652286733.1601171 at time 1652286733.1619556 +2022-05-11 12:32:13,172 actuator.py: 29 () INFO Read Set Point: 1652286733.170118 at time 1652286733.172095 +2022-05-11 12:32:13,182 actuator.py: 29 () INFO Read Set Point: 1652286733.1801248 at time 1652286733.1822352 +2022-05-11 12:32:13,192 actuator.py: 29 () INFO Read Set Point: 1652286733.190117 at time 1652286733.1923764 +2022-05-11 12:32:13,202 actuator.py: 29 () INFO Read Set Point: 1652286733.200119 at time 1652286733.2025213 +2022-05-11 12:32:13,212 actuator.py: 29 () INFO Read Set Point: 1652286733.21012 at time 1652286733.2126596 +2022-05-11 12:32:13,222 actuator.py: 29 () INFO Read Set Point: 1652286733.2201164 at time 1652286733.2228003 +2022-05-11 12:32:13,232 actuator.py: 29 () INFO Read Set Point: 1652286733.230123 at time 1652286733.2329414 +2022-05-11 12:32:13,243 actuator.py: 29 () INFO Read Set Point: 1652286733.2401202 at time 1652286733.2430837 +2022-05-11 12:32:13,253 actuator.py: 29 () INFO Read Set Point: 1652286733.2501187 at time 1652286733.2532237 +2022-05-11 12:32:13,263 actuator.py: 29 () INFO Read Set Point: 1652286733.26012 at time 1652286733.2633169 +2022-05-11 12:32:13,273 actuator.py: 29 () INFO Read Set Point: 1652286733.2701178 at time 1652286733.2734568 +2022-05-11 12:32:13,283 actuator.py: 29 () INFO Read Set Point: 1652286733.280121 at time 1652286733.2835915 +2022-05-11 12:32:13,293 actuator.py: 29 () INFO Read Set Point: 1652286733.2901182 at time 1652286733.2937362 +2022-05-11 12:32:13,303 actuator.py: 29 () INFO Read Set Point: 1652286733.3001132 at time 1652286733.3038816 +2022-05-11 12:32:13,314 actuator.py: 29 () INFO Read Set Point: 1652286733.3101192 at time 1652286733.3140216 +2022-05-11 12:32:13,324 actuator.py: 29 () INFO Read Set Point: 1652286733.3201256 at time 1652286733.324161 +2022-05-11 12:32:13,334 actuator.py: 29 () INFO Read Set Point: 1652286733.330118 at time 1652286733.3343031 +2022-05-11 12:32:13,344 actuator.py: 29 () INFO Read Set Point: 1652286733.34012 at time 1652286733.344443 +2022-05-11 12:32:13,354 actuator.py: 29 () INFO Read Set Point: 1652286733.3501139 at time 1652286733.354586 +2022-05-11 12:32:13,364 actuator.py: 29 () INFO Read Set Point: 1652286733.3601184 at time 1652286733.3647242 +2022-05-11 12:32:13,374 actuator.py: 29 () INFO Read Set Point: 1652286733.370125 at time 1652286733.3748593 +2022-05-11 12:32:13,385 actuator.py: 29 () INFO Read Set Point: 1652286733.3801172 at time 1652286733.3850029 +2022-05-11 12:32:13,395 actuator.py: 29 () INFO Read Set Point: 1652286733.3901196 at time 1652286733.3951445 +2022-05-11 12:32:13,405 actuator.py: 29 () INFO Read Set Point: 1652286733.4001212 at time 1652286733.4052887 +2022-05-11 12:32:13,415 actuator.py: 29 () INFO Read Set Point: 1652286733.4101036 at time 1652286733.4154356 +2022-05-11 12:32:13,425 actuator.py: 29 () INFO Read Set Point: 1652286733.4200664 at time 1652286733.4255757 +2022-05-11 12:32:13,435 actuator.py: 29 () INFO Read Set Point: 1652286733.4301078 at time 1652286733.4356656 +2022-05-11 12:32:13,445 actuator.py: 29 () INFO Read Set Point: 1652286733.4401205 at time 1652286733.4458106 +2022-05-11 12:32:13,456 actuator.py: 29 () INFO Read Set Point: 1652286733.4501188 at time 1652286733.4559546 +2022-05-11 12:32:13,466 actuator.py: 29 () INFO Read Set Point: 1652286733.460119 at time 1652286733.4660943 +2022-05-11 12:32:13,476 actuator.py: 29 () INFO Read Set Point: 1652286733.4701133 at time 1652286733.476236 +2022-05-11 12:32:13,486 actuator.py: 29 () INFO Read Set Point: 1652286733.4801195 at time 1652286733.4863782 +2022-05-11 12:32:13,496 actuator.py: 29 () INFO Read Set Point: 1652286733.4901156 at time 1652286733.4965212 +2022-05-11 12:32:13,506 actuator.py: 29 () INFO Read Set Point: 1652286733.500117 at time 1652286733.5066643 +2022-05-11 12:32:13,516 actuator.py: 29 () INFO Read Set Point: 1652286733.5101178 at time 1652286733.5168061 +2022-05-11 12:32:13,527 actuator.py: 29 () INFO Read Set Point: 1652286733.520099 at time 1652286733.5269487 +2022-05-11 12:32:13,537 actuator.py: 29 () INFO Read Set Point: 1652286733.530118 at time 1652286733.5370908 +2022-05-11 12:32:13,547 actuator.py: 29 () INFO Read Set Point: 1652286733.5401192 at time 1652286733.5472336 +2022-05-11 12:32:13,557 actuator.py: 29 () INFO Read Set Point: 1652286733.550117 at time 1652286733.557375 +2022-05-11 12:32:13,567 actuator.py: 29 () INFO Read Set Point: 1652286733.5601184 at time 1652286733.5675175 +2022-05-11 12:32:13,577 actuator.py: 29 () INFO Read Set Point: 1652286733.570116 at time 1652286733.577663 +2022-05-11 12:32:13,587 actuator.py: 29 () INFO Read Set Point: 1652286733.580115 at time 1652286733.5878067 +2022-05-11 12:32:13,598 actuator.py: 29 () INFO Read Set Point: 1652286733.590118 at time 1652286733.597948 +2022-05-11 12:32:13,608 actuator.py: 29 () INFO Read Set Point: 1652286733.6001155 at time 1652286733.6080897 +2022-05-11 12:32:13,618 actuator.py: 29 () INFO Read Set Point: 1652286733.6101158 at time 1652286733.6182334 +2022-05-11 12:32:13,628 actuator.py: 29 () INFO Read Set Point: 1652286733.6201208 at time 1652286733.628374 +2022-05-11 12:32:13,638 actuator.py: 29 () INFO Read Set Point: 1652286733.6301165 at time 1652286733.6385155 +2022-05-11 12:32:13,648 actuator.py: 29 () INFO Read Set Point: 1652286733.6401284 at time 1652286733.6486607 +2022-05-11 12:32:13,658 actuator.py: 29 () INFO Read Set Point: 1652286733.6501164 at time 1652286733.6588023 +2022-05-11 12:32:13,669 actuator.py: 29 () INFO Read Set Point: 1652286733.660118 at time 1652286733.6689448 +2022-05-11 12:32:13,679 actuator.py: 29 () INFO Read Set Point: 1652286733.6701164 at time 1652286733.679089 +2022-05-11 12:32:13,689 actuator.py: 29 () INFO Read Set Point: 1652286733.680117 at time 1652286733.6892312 +2022-05-11 12:32:13,699 actuator.py: 29 () INFO Read Set Point: 1652286733.6901138 at time 1652286733.699365 +2022-05-11 12:32:13,709 actuator.py: 29 () INFO Read Set Point: 1652286733.7001173 at time 1652286733.7095091 +2022-05-11 12:32:13,719 actuator.py: 29 () INFO Read Set Point: 1652286733.71012 at time 1652286733.7196555 +2022-05-11 12:32:13,729 actuator.py: 29 () INFO Read Set Point: 1652286733.7201126 at time 1652286733.7297952 +2022-05-11 12:32:13,739 actuator.py: 29 () INFO Read Set Point: 1652286733.7301054 at time 1652286733.7399383 +2022-05-11 12:32:13,750 actuator.py: 29 () INFO Read Set Point: 1652286733.740107 at time 1652286733.750088 +2022-05-11 12:32:13,760 actuator.py: 29 () INFO Read Set Point: 1652286733.7501044 at time 1652286733.7602303 +2022-05-11 12:32:13,770 actuator.py: 29 () INFO Read Set Point: 1652286733.7601218 at time 1652286733.7703733 +2022-05-11 12:32:13,780 actuator.py: 29 () INFO Read Set Point: 1652286733.770083 at time 1652286733.7805114 +2022-05-11 12:32:13,790 actuator.py: 29 () INFO Read Set Point: 1652286733.78008 at time 1652286733.7906542 +2022-05-11 12:32:13,800 actuator.py: 29 () INFO Read Set Point: 1652286733.7900956 at time 1652286733.8007581 +2022-05-11 12:32:13,811 actuator.py: 29 () INFO Read Set Point: 1652286733.800117 at time 1652286733.811053 +2022-05-11 12:32:13,821 actuator.py: 29 () INFO Read Set Point: 1652286733.8101094 at time 1652286733.8214297 +2022-05-11 12:32:13,831 actuator.py: 29 () INFO Read Set Point: 1652286733.8201165 at time 1652286733.831635 +2022-05-11 12:32:13,841 actuator.py: 29 () INFO Read Set Point: 1652286733.8401163 at time 1652286733.8417792 +2022-05-11 12:32:13,851 actuator.py: 29 () INFO Read Set Point: 1652286733.8501127 at time 1652286733.8519173 +2022-05-11 12:32:13,862 actuator.py: 29 () INFO Read Set Point: 1652286733.860114 at time 1652286733.8620577 +2022-05-11 12:32:13,872 actuator.py: 29 () INFO Read Set Point: 1652286733.870115 at time 1652286733.872194 +2022-05-11 12:32:13,882 actuator.py: 29 () INFO Read Set Point: 1652286733.8801184 at time 1652286733.8823335 +2022-05-11 12:32:13,892 actuator.py: 29 () INFO Read Set Point: 1652286733.890117 at time 1652286733.8924663 +2022-05-11 12:32:13,902 actuator.py: 29 () INFO Read Set Point: 1652286733.900114 at time 1652286733.9026122 +2022-05-11 12:32:13,912 actuator.py: 29 () INFO Read Set Point: 1652286733.9101136 at time 1652286733.9127448 +2022-05-11 12:32:13,922 actuator.py: 29 () INFO Read Set Point: 1652286733.9201167 at time 1652286733.9228845 +2022-05-11 12:32:13,933 actuator.py: 29 () INFO Read Set Point: 1652286733.930117 at time 1652286733.9330268 +2022-05-11 12:32:13,943 actuator.py: 29 () INFO Read Set Point: 1652286733.9401171 at time 1652286733.9431748 +2022-05-11 12:32:13,953 actuator.py: 29 () INFO Read Set Point: 1652286733.9501143 at time 1652286733.9533138 +2022-05-11 12:32:13,963 actuator.py: 29 () INFO Read Set Point: 1652286733.9601111 at time 1652286733.9634564 +2022-05-11 12:32:13,973 actuator.py: 29 () INFO Read Set Point: 1652286733.9701152 at time 1652286733.9735994 +2022-05-11 12:32:13,983 actuator.py: 29 () INFO Read Set Point: 1652286733.9801168 at time 1652286733.9837418 +2022-05-11 12:32:13,993 actuator.py: 29 () INFO Read Set Point: 1652286733.9901166 at time 1652286733.9938815 +2022-05-11 12:32:14,004 actuator.py: 29 () INFO Read Set Point: 1652286734.0001152 at time 1652286734.004028 +2022-05-11 12:32:14,014 actuator.py: 29 () INFO Read Set Point: 1652286734.010116 at time 1652286734.0141659 +2022-05-11 12:32:14,024 actuator.py: 29 () INFO Read Set Point: 1652286734.0201192 at time 1652286734.0243084 +2022-05-11 12:32:14,034 actuator.py: 29 () INFO Read Set Point: 1652286734.0301144 at time 1652286734.034449 +2022-05-11 12:32:14,044 actuator.py: 29 () INFO Read Set Point: 1652286734.0401168 at time 1652286734.0445952 +2022-05-11 12:32:14,054 actuator.py: 29 () INFO Read Set Point: 1652286734.050113 at time 1652286734.0547378 +2022-05-11 12:32:14,064 actuator.py: 29 () INFO Read Set Point: 1652286734.060119 at time 1652286734.064879 +2022-05-11 12:32:14,075 actuator.py: 29 () INFO Read Set Point: 1652286734.0701132 at time 1652286734.0750134 +2022-05-11 12:32:14,085 actuator.py: 29 () INFO Read Set Point: 1652286734.0801132 at time 1652286734.0851529 +2022-05-11 12:32:14,095 actuator.py: 29 () INFO Read Set Point: 1652286734.090114 at time 1652286734.0952892 +2022-05-11 12:32:14,105 actuator.py: 29 () INFO Read Set Point: 1652286734.1001155 at time 1652286734.1054327 +2022-05-11 12:32:14,115 actuator.py: 29 () INFO Read Set Point: 1652286734.1101148 at time 1652286734.1155796 +2022-05-11 12:32:14,125 actuator.py: 29 () INFO Read Set Point: 1652286734.1201138 at time 1652286734.125724 +2022-05-11 12:32:14,135 actuator.py: 29 () INFO Read Set Point: 1652286734.1301208 at time 1652286734.1358669 +2022-05-11 12:32:14,146 actuator.py: 29 () INFO Read Set Point: 1652286734.1401205 at time 1652286734.1460097 +2022-05-11 12:32:14,156 actuator.py: 29 () INFO Read Set Point: 1652286734.1501162 at time 1652286734.1561556 +2022-05-11 12:32:14,166 actuator.py: 29 () INFO Read Set Point: 1652286734.1601164 at time 1652286734.1662934 +2022-05-11 12:32:14,176 actuator.py: 29 () INFO Read Set Point: 1652286734.1701136 at time 1652286734.176422 +2022-05-11 12:32:14,186 actuator.py: 29 () INFO Read Set Point: 1652286734.1801167 at time 1652286734.1865692 +2022-05-11 12:32:14,196 actuator.py: 29 () INFO Read Set Point: 1652286734.190114 at time 1652286734.1967103 +2022-05-11 12:32:14,206 actuator.py: 29 () INFO Read Set Point: 1652286734.2001133 at time 1652286734.2068512 +2022-05-11 12:32:14,217 actuator.py: 29 () INFO Read Set Point: 1652286734.2101142 at time 1652286734.2169778 +2022-05-11 12:32:14,227 actuator.py: 29 () INFO Read Set Point: 1652286734.2201157 at time 1652286734.2271223 +2022-05-11 12:32:14,237 actuator.py: 29 () INFO Read Set Point: 1652286734.2301137 at time 1652286734.2372632 +2022-05-11 12:32:14,247 actuator.py: 29 () INFO Read Set Point: 1652286734.2401152 at time 1652286734.247404 +2022-05-11 12:32:14,257 actuator.py: 29 () INFO Read Set Point: 1652286734.250111 at time 1652286734.2575512 +2022-05-11 12:32:14,267 actuator.py: 29 () INFO Read Set Point: 1652286734.2601159 at time 1652286734.2676916 +2022-05-11 12:32:14,277 actuator.py: 29 () INFO Read Set Point: 1652286734.270119 at time 1652286734.2778301 +2022-05-11 12:32:14,288 actuator.py: 29 () INFO Read Set Point: 1652286734.280114 at time 1652286734.2879736 +2022-05-11 12:32:14,298 actuator.py: 29 () INFO Read Set Point: 1652286734.2901134 at time 1652286734.298115 +2022-05-11 12:32:14,308 actuator.py: 29 () INFO Read Set Point: 1652286734.300121 at time 1652286734.3082576 +2022-05-11 12:32:14,318 actuator.py: 29 () INFO Read Set Point: 1652286734.3101132 at time 1652286734.3183973 +2022-05-11 12:32:14,328 actuator.py: 29 () INFO Read Set Point: 1652286734.3201187 at time 1652286734.3285398 +2022-05-11 12:32:14,338 actuator.py: 29 () INFO Read Set Point: 1652286734.330113 at time 1652286734.3386858 +2022-05-11 12:32:14,348 actuator.py: 29 () INFO Read Set Point: 1652286734.3401082 at time 1652286734.348827 +2022-05-11 12:32:14,359 actuator.py: 29 () INFO Read Set Point: 1652286734.3501163 at time 1652286734.358976 +2022-05-11 12:32:14,369 actuator.py: 29 () INFO Read Set Point: 1652286734.3601136 at time 1652286734.3691163 +2022-05-11 12:32:14,379 actuator.py: 29 () INFO Read Set Point: 1652286734.3701117 at time 1652286734.37926 +2022-05-11 12:32:14,389 actuator.py: 29 () INFO Read Set Point: 1652286734.380114 at time 1652286734.389405 +2022-05-11 12:32:14,399 actuator.py: 29 () INFO Read Set Point: 1652286734.390073 at time 1652286734.3995466 +2022-05-11 12:32:14,409 actuator.py: 29 () INFO Read Set Point: 1652286734.400063 at time 1652286734.409692 +2022-05-11 12:32:14,419 actuator.py: 29 () INFO Read Set Point: 1652286734.4100628 at time 1652286734.4198365 +2022-05-11 12:32:14,430 actuator.py: 29 () INFO Read Set Point: 1652286734.4200718 at time 1652286734.4299774 +2022-05-11 12:32:14,440 actuator.py: 29 () INFO Read Set Point: 1652286734.4300694 at time 1652286734.4401295 +2022-05-11 12:32:14,450 actuator.py: 29 () INFO Read Set Point: 1652286734.4401178 at time 1652286734.45023 +2022-05-11 12:32:14,460 actuator.py: 29 () INFO Read Set Point: 1652286734.4501169 at time 1652286734.4603314 +2022-05-11 12:32:14,470 actuator.py: 29 () INFO Read Set Point: 1652286734.4601173 at time 1652286734.4704325 +2022-05-11 12:32:14,480 actuator.py: 29 () INFO Read Set Point: 1652286734.4701202 at time 1652286734.4805334 +2022-05-11 12:32:14,490 actuator.py: 29 () INFO Read Set Point: 1652286734.4801102 at time 1652286734.490638 +2022-05-11 12:32:14,500 actuator.py: 29 () INFO Read Set Point: 1652286734.4901094 at time 1652286734.5007305 +2022-05-11 12:32:14,510 actuator.py: 29 () INFO Read Set Point: 1652286734.5001178 at time 1652286734.510844 +2022-05-11 12:32:14,521 actuator.py: 29 () INFO Read Set Point: 1652286734.5101166 at time 1652286734.5213933 +2022-05-11 12:32:14,531 actuator.py: 29 () INFO Read Set Point: 1652286734.5301135 at time 1652286734.5318484 +2022-05-11 12:32:14,542 actuator.py: 29 () INFO Read Set Point: 1652286734.5401175 at time 1652286734.5419898 +2022-05-11 12:32:14,552 actuator.py: 29 () INFO Read Set Point: 1652286734.5501132 at time 1652286734.5521288 +2022-05-11 12:32:14,562 actuator.py: 29 () INFO Read Set Point: 1652286734.5601156 at time 1652286734.5622733 +2022-05-11 12:32:14,572 actuator.py: 29 () INFO Read Set Point: 1652286734.5700753 at time 1652286734.5724149 +2022-05-11 12:32:14,582 actuator.py: 29 () INFO Read Set Point: 1652286734.5800781 at time 1652286734.582553 +2022-05-11 12:32:14,592 actuator.py: 29 () INFO Read Set Point: 1652286734.5900838 at time 1652286734.5926907 +2022-05-11 12:32:14,602 actuator.py: 29 () INFO Read Set Point: 1652286734.6001155 at time 1652286734.6028266 +2022-05-11 12:32:14,612 actuator.py: 29 () INFO Read Set Point: 1652286734.6101186 at time 1652286734.6129384 +2022-05-11 12:32:14,623 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6230814 +2022-05-11 12:32:14,633 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6332197 +2022-05-11 12:32:14,643 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.643325 +2022-05-11 12:32:14,653 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6534724 +2022-05-11 12:32:14,663 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6636138 +2022-05-11 12:32:14,673 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6737554 +2022-05-11 12:32:14,683 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.683904 +2022-05-11 12:32:14,694 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.6940563 +2022-05-11 12:32:14,704 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.7041976 +2022-05-11 12:32:14,714 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.714349 +2022-05-11 12:32:14,724 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.7245018 +2022-05-11 12:32:14,734 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.7346492 +2022-05-11 12:32:14,744 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.744813 +2022-05-11 12:32:14,755 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.754954 +2022-05-11 12:32:14,765 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.7650943 +2022-05-11 12:32:14,775 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.775238 +2022-05-11 12:32:14,785 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.785377 +2022-05-11 12:32:14,795 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.7955225 +2022-05-11 12:32:14,805 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.805665 +2022-05-11 12:32:14,815 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.815807 +2022-05-11 12:32:14,826 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.82596 +2022-05-11 12:32:14,836 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.8360994 +2022-05-11 12:32:14,846 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.8462398 +2022-05-11 12:32:14,856 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.8563814 +2022-05-11 12:32:14,866 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.8665233 +2022-05-11 12:32:14,876 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.876667 +2022-05-11 12:32:14,886 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.886808 +2022-05-11 12:32:14,897 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.8969474 +2022-05-11 12:32:14,907 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9070911 +2022-05-11 12:32:14,917 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.917238 +2022-05-11 12:32:14,927 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.927387 +2022-05-11 12:32:14,937 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.93753 +2022-05-11 12:32:14,947 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.947672 +2022-05-11 12:32:14,957 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9578164 +2022-05-11 12:32:14,968 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9679549 +2022-05-11 12:32:14,978 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9780943 +2022-05-11 12:32:14,988 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9882333 +2022-05-11 12:32:14,998 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286734.9983747 +2022-05-11 12:32:15,008 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0085204 +2022-05-11 12:32:15,018 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0186663 +2022-05-11 12:32:15,028 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0288067 +2022-05-11 12:32:15,039 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0389442 +2022-05-11 12:32:15,049 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0490844 +2022-05-11 12:32:15,059 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0592253 +2022-05-11 12:32:15,069 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.069363 +2022-05-11 12:32:15,079 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0795076 +2022-05-11 12:32:15,089 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0896497 +2022-05-11 12:32:15,099 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.0997922 +2022-05-11 12:32:15,109 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.109929 +2022-05-11 12:32:15,120 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1200747 +2022-05-11 12:32:15,130 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1302166 +2022-05-11 12:32:15,140 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1403599 +2022-05-11 12:32:15,150 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.150498 +2022-05-11 12:32:15,160 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1606376 +2022-05-11 12:32:15,170 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1707816 +2022-05-11 12:32:15,180 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1809216 +2022-05-11 12:32:15,191 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.1910622 +2022-05-11 12:32:15,201 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.201203 +2022-05-11 12:32:15,211 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.2112944 +2022-05-11 12:32:15,221 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.2214408 +2022-05-11 12:32:15,231 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.231575 +2022-05-11 12:32:15,241 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.2417123 +2022-05-11 12:32:15,251 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.251855 +2022-05-11 12:32:15,262 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.2620022 +2022-05-11 12:32:15,272 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.2721407 +2022-05-11 12:32:15,282 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.282277 +2022-05-11 12:32:15,292 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.292418 +2022-05-11 12:32:15,302 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3025599 +2022-05-11 12:32:15,312 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3126996 +2022-05-11 12:32:15,322 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3228095 +2022-05-11 12:32:15,333 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3329506 +2022-05-11 12:32:15,343 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.343093 +2022-05-11 12:32:15,353 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3532343 +2022-05-11 12:32:15,363 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3633814 +2022-05-11 12:32:15,373 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3735242 +2022-05-11 12:32:15,383 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.3836625 +2022-05-11 12:32:15,393 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.393805 +2022-05-11 12:32:15,403 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4038908 +2022-05-11 12:32:15,414 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4140303 +2022-05-11 12:32:15,424 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4241743 +2022-05-11 12:32:15,434 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4343174 +2022-05-11 12:32:15,444 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4444597 +2022-05-11 12:32:15,454 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4546003 +2022-05-11 12:32:15,464 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4646838 +2022-05-11 12:32:15,474 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4748216 +2022-05-11 12:32:15,484 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.4849281 +2022-05-11 12:32:15,495 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.495068 +2022-05-11 12:32:15,505 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5052097 +2022-05-11 12:32:15,515 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5153003 +2022-05-11 12:32:15,525 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5254455 +2022-05-11 12:32:15,535 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5355859 +2022-05-11 12:32:15,545 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5457277 +2022-05-11 12:32:15,555 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5558672 +2022-05-11 12:32:15,566 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5659688 +2022-05-11 12:32:15,576 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.576108 +2022-05-11 12:32:15,586 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.586249 +2022-05-11 12:32:15,596 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.5963929 +2022-05-11 12:32:15,606 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.606538 +2022-05-11 12:32:15,616 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6166792 +2022-05-11 12:32:15,626 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6268263 +2022-05-11 12:32:15,637 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6369665 +2022-05-11 12:32:15,647 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.647118 +2022-05-11 12:32:15,657 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6572628 +2022-05-11 12:32:15,667 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6673715 +2022-05-11 12:32:15,677 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.6775124 +2022-05-11 12:32:15,687 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.687652 +2022-05-11 12:32:15,697 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.697795 +2022-05-11 12:32:15,707 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7079368 +2022-05-11 12:32:15,718 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7180758 +2022-05-11 12:32:15,728 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7282166 +2022-05-11 12:32:15,738 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7383544 +2022-05-11 12:32:15,748 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7484956 +2022-05-11 12:32:15,758 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7586353 +2022-05-11 12:32:15,768 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7687743 +2022-05-11 12:32:15,778 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7789135 +2022-05-11 12:32:15,789 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7890522 +2022-05-11 12:32:15,799 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.7991953 +2022-05-11 12:32:15,809 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8093376 +2022-05-11 12:32:15,819 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8194892 +2022-05-11 12:32:15,829 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.829628 +2022-05-11 12:32:15,839 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.839712 +2022-05-11 12:32:15,849 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8498576 +2022-05-11 12:32:15,860 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.860003 +2022-05-11 12:32:15,870 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8701403 +2022-05-11 12:32:15,880 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8802924 +2022-05-11 12:32:15,890 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.8904312 +2022-05-11 12:32:15,900 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9005733 +2022-05-11 12:32:15,910 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.910714 +2022-05-11 12:32:15,920 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9208593 +2022-05-11 12:32:15,931 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9309988 +2022-05-11 12:32:15,941 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9411395 +2022-05-11 12:32:15,951 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9512835 +2022-05-11 12:32:15,961 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9614222 +2022-05-11 12:32:15,971 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.9715593 +2022-05-11 12:32:15,981 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.981705 +2022-05-11 12:32:15,991 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286735.991846 +2022-05-11 12:32:16,002 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.0019858 +2022-05-11 12:32:16,012 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.0121257 +2022-05-11 12:32:16,022 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.022226 +2022-05-11 12:32:16,032 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.0323653 +2022-05-11 12:32:16,042 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.042505 +2022-05-11 12:32:16,052 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.0526454 +2022-05-11 12:32:16,062 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.062782 +2022-05-11 12:32:16,072 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.072921 +2022-05-11 12:32:16,083 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.083069 +2022-05-11 12:32:16,093 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.0932107 +2022-05-11 12:32:16,103 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1033022 +2022-05-11 12:32:16,113 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1134448 +2022-05-11 12:32:16,123 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1235936 +2022-05-11 12:32:16,133 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1337376 +2022-05-11 12:32:16,143 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.143883 +2022-05-11 12:32:16,154 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1540256 +2022-05-11 12:32:16,164 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1641662 +2022-05-11 12:32:16,174 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.174303 +2022-05-11 12:32:16,184 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.1844356 +2022-05-11 12:32:16,194 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.19457 +2022-05-11 12:32:16,204 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2047124 +2022-05-11 12:32:16,214 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2148461 +2022-05-11 12:32:16,225 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2249892 +2022-05-11 12:32:16,235 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2351336 +2022-05-11 12:32:16,245 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2452688 +2022-05-11 12:32:16,255 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2554119 +2022-05-11 12:32:16,265 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2655523 +2022-05-11 12:32:16,275 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2756987 +2022-05-11 12:32:16,285 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.285842 +2022-05-11 12:32:16,296 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.2959852 +2022-05-11 12:32:16,306 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.3061273 +2022-05-11 12:32:16,316 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.316271 +2022-05-11 12:32:16,326 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.326413 +2022-05-11 12:32:16,336 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.3365538 +2022-05-11 12:32:16,346 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.346651 +2022-05-11 12:32:16,356 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.356795 +2022-05-11 12:32:16,366 actuator.py: 29 () INFO Read Set Point: 1652286734.6201165 at time 1652286736.3669422 diff --git a/examples/ArmActuator/pubsub/controller.py b/examples/ArmActuator/pubsub/controller.py index c2e8782..d22b285 100644 --- a/examples/ArmActuator/pubsub/controller.py +++ b/examples/ArmActuator/pubsub/controller.py @@ -1,5 +1,4 @@ -from reem.datatypes import PublishSpace -from reem.connection import RedisInterface +from reem import PublishSpace import time import logging @@ -11,22 +10,33 @@ logger = logging.getLogger("script") logger.setLevel(logging.INFO) -TIME_TO_RUN = 5.0 # seconds -start_time = time.time() +TIME_TO_RUN = 10.0 # seconds # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -pspace = PublishSpace(interface=interface) +pspace = PublishSpace("localhost") set_frequency = 100 # Hz set_period = 1.0/set_frequency +print("Writting to channel 'command' for",TIME_TO_RUN,"seconds...") +print("(Run actuator.py at the same time)") +num_messages = 0 +start_time = time.time() +next_iteration = time.time() while time.time() < start_time + TIME_TO_RUN: - next_iteration = time.time() + set_period + #this does the publishing command = time.time() pspace["command"] = command logger.info("Published Set Point: {}".format(command)) - time.sleep(max(0.0, next_iteration - time.time())) \ No newline at end of file + + #intelligently sleeps + next_iteration += set_period + t_now = time.time() + time.sleep(max(0.0, next_iteration - t_now)) + if next_iteration < t_now: + next_iteration = t_now + set_period + num_messages += 1 +print("Quitting, published",num_messages,"messages") \ No newline at end of file diff --git a/examples/ArmActuator/pubsub/controller_silent_subcsriber.log b/examples/ArmActuator/pubsub/controller_silent_subcsriber.log index f091254..8498ffb 100644 --- a/examples/ArmActuator/pubsub/controller_silent_subcsriber.log +++ b/examples/ArmActuator/pubsub/controller_silent_subcsriber.log @@ -1,448 +1,999 @@ -2019-04-30 12:33:30,639 controller.py: 31 () INFO Published Set Point: 1556642010.637842 -2019-04-30 12:33:30,649 controller.py: 31 () INFO Published Set Point: 1556642010.648921 -2019-04-30 12:33:30,662 controller.py: 31 () INFO Published Set Point: 1556642010.66139 -2019-04-30 12:33:30,674 controller.py: 31 () INFO Published Set Point: 1556642010.673711 -2019-04-30 12:33:30,686 controller.py: 31 () INFO Published Set Point: 1556642010.68611 -2019-04-30 12:33:30,697 controller.py: 31 () INFO Published Set Point: 1556642010.696861 -2019-04-30 12:33:30,707 controller.py: 31 () INFO Published Set Point: 1556642010.707187 -2019-04-30 12:33:30,720 controller.py: 31 () INFO Published Set Point: 1556642010.719605 -2019-04-30 12:33:30,732 controller.py: 31 () INFO Published Set Point: 1556642010.731908 -2019-04-30 12:33:30,745 controller.py: 31 () INFO Published Set Point: 1556642010.7443478 -2019-04-30 12:33:30,757 controller.py: 31 () INFO Published Set Point: 1556642010.756654 -2019-04-30 12:33:30,767 controller.py: 31 () INFO Published Set Point: 1556642010.766927 -2019-04-30 12:33:30,779 controller.py: 31 () INFO Published Set Point: 1556642010.778594 -2019-04-30 12:33:30,789 controller.py: 31 () INFO Published Set Point: 1556642010.788906 -2019-04-30 12:33:30,802 controller.py: 31 () INFO Published Set Point: 1556642010.801311 -2019-04-30 12:33:30,812 controller.py: 31 () INFO Published Set Point: 1556642010.8121731 -2019-04-30 12:33:30,825 controller.py: 31 () INFO Published Set Point: 1556642010.824543 -2019-04-30 12:33:30,836 controller.py: 31 () INFO Published Set Point: 1556642010.836122 -2019-04-30 12:33:30,847 controller.py: 31 () INFO Published Set Point: 1556642010.846477 -2019-04-30 12:33:30,857 controller.py: 31 () INFO Published Set Point: 1556642010.8570209 -2019-04-30 12:33:30,870 controller.py: 31 () INFO Published Set Point: 1556642010.869432 -2019-04-30 12:33:30,880 controller.py: 31 () INFO Published Set Point: 1556642010.879483 -2019-04-30 12:33:30,890 controller.py: 31 () INFO Published Set Point: 1556642010.8895922 -2019-04-30 12:33:30,902 controller.py: 31 () INFO Published Set Point: 1556642010.9020002 -2019-04-30 12:33:30,912 controller.py: 31 () INFO Published Set Point: 1556642010.912299 -2019-04-30 12:33:30,923 controller.py: 31 () INFO Published Set Point: 1556642010.922592 -2019-04-30 12:33:30,934 controller.py: 31 () INFO Published Set Point: 1556642010.93392 -2019-04-30 12:33:30,944 controller.py: 31 () INFO Published Set Point: 1556642010.94425 -2019-04-30 12:33:30,955 controller.py: 31 () INFO Published Set Point: 1556642010.954496 -2019-04-30 12:33:30,966 controller.py: 31 () INFO Published Set Point: 1556642010.965387 -2019-04-30 12:33:30,976 controller.py: 31 () INFO Published Set Point: 1556642010.9762402 -2019-04-30 12:33:30,986 controller.py: 31 () INFO Published Set Point: 1556642010.986271 -2019-04-30 12:33:30,997 controller.py: 31 () INFO Published Set Point: 1556642010.99649 -2019-04-30 12:33:31,008 controller.py: 31 () INFO Published Set Point: 1556642011.0066829 -2019-04-30 12:33:31,017 controller.py: 31 () INFO Published Set Point: 1556642011.0171149 -2019-04-30 12:33:31,028 controller.py: 31 () INFO Published Set Point: 1556642011.028086 -2019-04-30 12:33:31,040 controller.py: 31 () INFO Published Set Point: 1556642011.03936 -2019-04-30 12:33:31,050 controller.py: 31 () INFO Published Set Point: 1556642011.049609 -2019-04-30 12:33:31,062 controller.py: 31 () INFO Published Set Point: 1556642011.062019 -2019-04-30 12:33:31,075 controller.py: 31 () INFO Published Set Point: 1556642011.07426 -2019-04-30 12:33:31,086 controller.py: 31 () INFO Published Set Point: 1556642011.086259 -2019-04-30 12:33:31,098 controller.py: 31 () INFO Published Set Point: 1556642011.097636 -2019-04-30 12:33:31,110 controller.py: 31 () INFO Published Set Point: 1556642011.109231 -2019-04-30 12:33:31,120 controller.py: 31 () INFO Published Set Point: 1556642011.1194072 -2019-04-30 12:33:31,132 controller.py: 31 () INFO Published Set Point: 1556642011.131767 -2019-04-30 12:33:31,143 controller.py: 31 () INFO Published Set Point: 1556642011.14257 -2019-04-30 12:33:31,154 controller.py: 31 () INFO Published Set Point: 1556642011.154115 -2019-04-30 12:33:31,167 controller.py: 31 () INFO Published Set Point: 1556642011.166475 -2019-04-30 12:33:31,177 controller.py: 31 () INFO Published Set Point: 1556642011.176982 -2019-04-30 12:33:31,187 controller.py: 31 () INFO Published Set Point: 1556642011.1872342 -2019-04-30 12:33:31,197 controller.py: 31 () INFO Published Set Point: 1556642011.197335 -2019-04-30 12:33:31,208 controller.py: 31 () INFO Published Set Point: 1556642011.207563 -2019-04-30 12:33:31,220 controller.py: 31 () INFO Published Set Point: 1556642011.2195961 -2019-04-30 12:33:31,232 controller.py: 31 () INFO Published Set Point: 1556642011.231485 -2019-04-30 12:33:31,242 controller.py: 31 () INFO Published Set Point: 1556642011.2415628 -2019-04-30 12:33:31,252 controller.py: 31 () INFO Published Set Point: 1556642011.25162 -2019-04-30 12:33:31,262 controller.py: 31 () INFO Published Set Point: 1556642011.26177 -2019-04-30 12:33:31,274 controller.py: 31 () INFO Published Set Point: 1556642011.27331 -2019-04-30 12:33:31,284 controller.py: 31 () INFO Published Set Point: 1556642011.284259 -2019-04-30 12:33:31,295 controller.py: 31 () INFO Published Set Point: 1556642011.29491 -2019-04-30 12:33:31,306 controller.py: 31 () INFO Published Set Point: 1556642011.306504 -2019-04-30 12:33:31,317 controller.py: 31 () INFO Published Set Point: 1556642011.3174222 -2019-04-30 12:33:31,328 controller.py: 31 () INFO Published Set Point: 1556642011.328023 -2019-04-30 12:33:31,338 controller.py: 31 () INFO Published Set Point: 1556642011.33839 -2019-04-30 12:33:31,349 controller.py: 31 () INFO Published Set Point: 1556642011.349149 -2019-04-30 12:33:31,359 controller.py: 31 () INFO Published Set Point: 1556642011.359297 -2019-04-30 12:33:31,371 controller.py: 31 () INFO Published Set Point: 1556642011.370995 -2019-04-30 12:33:31,382 controller.py: 31 () INFO Published Set Point: 1556642011.381707 -2019-04-30 12:33:31,392 controller.py: 31 () INFO Published Set Point: 1556642011.391768 -2019-04-30 12:33:31,403 controller.py: 31 () INFO Published Set Point: 1556642011.40312 -2019-04-30 12:33:31,415 controller.py: 31 () INFO Published Set Point: 1556642011.415095 -2019-04-30 12:33:31,426 controller.py: 31 () INFO Published Set Point: 1556642011.425956 -2019-04-30 12:33:31,437 controller.py: 31 () INFO Published Set Point: 1556642011.43648 -2019-04-30 12:33:31,449 controller.py: 31 () INFO Published Set Point: 1556642011.448865 -2019-04-30 12:33:31,461 controller.py: 31 () INFO Published Set Point: 1556642011.460385 -2019-04-30 12:33:31,474 controller.py: 31 () INFO Published Set Point: 1556642011.472786 -2019-04-30 12:33:31,484 controller.py: 31 () INFO Published Set Point: 1556642011.4832902 -2019-04-30 12:33:31,496 controller.py: 31 () INFO Published Set Point: 1556642011.495723 -2019-04-30 12:33:31,507 controller.py: 31 () INFO Published Set Point: 1556642011.507064 -2019-04-30 12:33:31,520 controller.py: 31 () INFO Published Set Point: 1556642011.519475 -2019-04-30 12:33:31,530 controller.py: 31 () INFO Published Set Point: 1556642011.529553 -2019-04-30 12:33:31,540 controller.py: 31 () INFO Published Set Point: 1556642011.539586 -2019-04-30 12:33:31,550 controller.py: 31 () INFO Published Set Point: 1556642011.549661 -2019-04-30 12:33:31,562 controller.py: 31 () INFO Published Set Point: 1556642011.561462 -2019-04-30 12:33:31,572 controller.py: 31 () INFO Published Set Point: 1556642011.571851 -2019-04-30 12:33:31,584 controller.py: 31 () INFO Published Set Point: 1556642011.5841558 -2019-04-30 12:33:31,597 controller.py: 31 () INFO Published Set Point: 1556642011.596552 -2019-04-30 12:33:31,609 controller.py: 31 () INFO Published Set Point: 1556642011.608874 -2019-04-30 12:33:31,621 controller.py: 31 () INFO Published Set Point: 1556642011.620915 -2019-04-30 12:33:31,631 controller.py: 31 () INFO Published Set Point: 1556642011.631113 -2019-04-30 12:33:31,642 controller.py: 31 () INFO Published Set Point: 1556642011.641428 -2019-04-30 12:33:31,652 controller.py: 31 () INFO Published Set Point: 1556642011.6515222 -2019-04-30 12:33:31,662 controller.py: 31 () INFO Published Set Point: 1556642011.661612 -2019-04-30 12:33:31,672 controller.py: 31 () INFO Published Set Point: 1556642011.672152 -2019-04-30 12:33:31,683 controller.py: 31 () INFO Published Set Point: 1556642011.682624 -2019-04-30 12:33:31,695 controller.py: 31 () INFO Published Set Point: 1556642011.6949272 -2019-04-30 12:33:31,707 controller.py: 31 () INFO Published Set Point: 1556642011.707131 -2019-04-30 12:33:31,719 controller.py: 31 () INFO Published Set Point: 1556642011.719177 -2019-04-30 12:33:31,731 controller.py: 31 () INFO Published Set Point: 1556642011.731214 -2019-04-30 12:33:31,742 controller.py: 31 () INFO Published Set Point: 1556642011.742149 -2019-04-30 12:33:31,753 controller.py: 31 () INFO Published Set Point: 1556642011.752715 -2019-04-30 12:33:31,764 controller.py: 31 () INFO Published Set Point: 1556642011.763766 -2019-04-30 12:33:31,774 controller.py: 31 () INFO Published Set Point: 1556642011.774098 -2019-04-30 12:33:31,784 controller.py: 31 () INFO Published Set Point: 1556642011.7842119 -2019-04-30 12:33:31,795 controller.py: 31 () INFO Published Set Point: 1556642011.795017 -2019-04-30 12:33:31,808 controller.py: 31 () INFO Published Set Point: 1556642011.8070688 -2019-04-30 12:33:31,819 controller.py: 31 () INFO Published Set Point: 1556642011.819288 -2019-04-30 12:33:31,832 controller.py: 31 () INFO Published Set Point: 1556642011.8314319 -2019-04-30 12:33:31,843 controller.py: 31 () INFO Published Set Point: 1556642011.842606 -2019-04-30 12:33:31,853 controller.py: 31 () INFO Published Set Point: 1556642011.852694 -2019-04-30 12:33:31,863 controller.py: 31 () INFO Published Set Point: 1556642011.8628852 -2019-04-30 12:33:31,875 controller.py: 31 () INFO Published Set Point: 1556642011.874641 -2019-04-30 12:33:31,885 controller.py: 31 () INFO Published Set Point: 1556642011.884732 -2019-04-30 12:33:31,896 controller.py: 31 () INFO Published Set Point: 1556642011.8958 -2019-04-30 12:33:31,907 controller.py: 31 () INFO Published Set Point: 1556642011.907222 -2019-04-30 12:33:31,919 controller.py: 31 () INFO Published Set Point: 1556642011.918658 -2019-04-30 12:33:31,929 controller.py: 31 () INFO Published Set Point: 1556642011.9293828 -2019-04-30 12:33:31,942 controller.py: 31 () INFO Published Set Point: 1556642011.941053 -2019-04-30 12:33:31,953 controller.py: 31 () INFO Published Set Point: 1556642011.9530659 -2019-04-30 12:33:31,965 controller.py: 31 () INFO Published Set Point: 1556642011.964304 -2019-04-30 12:33:31,976 controller.py: 31 () INFO Published Set Point: 1556642011.974935 -2019-04-30 12:33:31,986 controller.py: 31 () INFO Published Set Point: 1556642011.9854841 -2019-04-30 12:33:31,998 controller.py: 31 () INFO Published Set Point: 1556642011.9977632 -2019-04-30 12:33:32,009 controller.py: 31 () INFO Published Set Point: 1556642012.0090392 -2019-04-30 12:33:32,021 controller.py: 31 () INFO Published Set Point: 1556642012.021003 -2019-04-30 12:33:32,033 controller.py: 31 () INFO Published Set Point: 1556642012.0330229 -2019-04-30 12:33:32,043 controller.py: 31 () INFO Published Set Point: 1556642012.043095 -2019-04-30 12:33:32,055 controller.py: 31 () INFO Published Set Point: 1556642012.054816 -2019-04-30 12:33:32,066 controller.py: 31 () INFO Published Set Point: 1556642012.065377 -2019-04-30 12:33:32,077 controller.py: 31 () INFO Published Set Point: 1556642012.0767949 -2019-04-30 12:33:32,089 controller.py: 31 () INFO Published Set Point: 1556642012.088423 -2019-04-30 12:33:32,100 controller.py: 31 () INFO Published Set Point: 1556642012.099613 -2019-04-30 12:33:32,111 controller.py: 31 () INFO Published Set Point: 1556642012.109911 -2019-04-30 12:33:32,121 controller.py: 31 () INFO Published Set Point: 1556642012.1210082 -2019-04-30 12:33:32,132 controller.py: 31 () INFO Published Set Point: 1556642012.131615 -2019-04-30 12:33:32,144 controller.py: 31 () INFO Published Set Point: 1556642012.14331 -2019-04-30 12:33:32,154 controller.py: 31 () INFO Published Set Point: 1556642012.1539981 -2019-04-30 12:33:32,167 controller.py: 31 () INFO Published Set Point: 1556642012.1664279 -2019-04-30 12:33:32,177 controller.py: 31 () INFO Published Set Point: 1556642012.1766982 -2019-04-30 12:33:32,188 controller.py: 31 () INFO Published Set Point: 1556642012.187878 -2019-04-30 12:33:32,198 controller.py: 31 () INFO Published Set Point: 1556642012.198113 -2019-04-30 12:33:32,210 controller.py: 31 () INFO Published Set Point: 1556642012.209358 -2019-04-30 12:33:32,220 controller.py: 31 () INFO Published Set Point: 1556642012.219717 -2019-04-30 12:33:32,230 controller.py: 31 () INFO Published Set Point: 1556642012.2299662 -2019-04-30 12:33:32,242 controller.py: 31 () INFO Published Set Point: 1556642012.240879 -2019-04-30 12:33:32,252 controller.py: 31 () INFO Published Set Point: 1556642012.251948 -2019-04-30 12:33:32,263 controller.py: 31 () INFO Published Set Point: 1556642012.263175 -2019-04-30 12:33:32,275 controller.py: 31 () INFO Published Set Point: 1556642012.274057 -2019-04-30 12:33:32,286 controller.py: 31 () INFO Published Set Point: 1556642012.286144 -2019-04-30 12:33:32,297 controller.py: 31 () INFO Published Set Point: 1556642012.29656 -2019-04-30 12:33:32,309 controller.py: 31 () INFO Published Set Point: 1556642012.307735 -2019-04-30 12:33:32,320 controller.py: 31 () INFO Published Set Point: 1556642012.319846 -2019-04-30 12:33:32,331 controller.py: 31 () INFO Published Set Point: 1556642012.331411 -2019-04-30 12:33:32,342 controller.py: 31 () INFO Published Set Point: 1556642012.341921 -2019-04-30 12:33:32,353 controller.py: 31 () INFO Published Set Point: 1556642012.352928 -2019-04-30 12:33:32,364 controller.py: 31 () INFO Published Set Point: 1556642012.3645701 -2019-04-30 12:33:32,375 controller.py: 31 () INFO Published Set Point: 1556642012.375125 -2019-04-30 12:33:32,386 controller.py: 31 () INFO Published Set Point: 1556642012.386444 -2019-04-30 12:33:32,396 controller.py: 31 () INFO Published Set Point: 1556642012.3965068 -2019-04-30 12:33:32,408 controller.py: 31 () INFO Published Set Point: 1556642012.407723 -2019-04-30 12:33:32,420 controller.py: 31 () INFO Published Set Point: 1556642012.420054 -2019-04-30 12:33:32,431 controller.py: 31 () INFO Published Set Point: 1556642012.431294 -2019-04-30 12:33:32,442 controller.py: 31 () INFO Published Set Point: 1556642012.4420621 -2019-04-30 12:33:32,453 controller.py: 31 () INFO Published Set Point: 1556642012.452576 -2019-04-30 12:33:32,465 controller.py: 31 () INFO Published Set Point: 1556642012.465028 -2019-04-30 12:33:32,476 controller.py: 31 () INFO Published Set Point: 1556642012.476086 -2019-04-30 12:33:32,488 controller.py: 31 () INFO Published Set Point: 1556642012.487807 -2019-04-30 12:33:32,498 controller.py: 31 () INFO Published Set Point: 1556642012.49793 -2019-04-30 12:33:32,509 controller.py: 31 () INFO Published Set Point: 1556642012.508557 -2019-04-30 12:33:32,520 controller.py: 31 () INFO Published Set Point: 1556642012.519797 -2019-04-30 12:33:32,531 controller.py: 31 () INFO Published Set Point: 1556642012.530603 -2019-04-30 12:33:32,542 controller.py: 31 () INFO Published Set Point: 1556642012.5410502 -2019-04-30 12:33:32,553 controller.py: 31 () INFO Published Set Point: 1556642012.5531461 -2019-04-30 12:33:32,565 controller.py: 31 () INFO Published Set Point: 1556642012.565048 -2019-04-30 12:33:32,576 controller.py: 31 () INFO Published Set Point: 1556642012.575339 -2019-04-30 12:33:32,586 controller.py: 31 () INFO Published Set Point: 1556642012.586257 -2019-04-30 12:33:32,598 controller.py: 31 () INFO Published Set Point: 1556642012.597507 -2019-04-30 12:33:32,610 controller.py: 31 () INFO Published Set Point: 1556642012.609898 -2019-04-30 12:33:32,621 controller.py: 31 () INFO Published Set Point: 1556642012.621158 -2019-04-30 12:33:32,632 controller.py: 31 () INFO Published Set Point: 1556642012.632137 -2019-04-30 12:33:32,643 controller.py: 31 () INFO Published Set Point: 1556642012.6423502 -2019-04-30 12:33:32,653 controller.py: 31 () INFO Published Set Point: 1556642012.653128 -2019-04-30 12:33:32,664 controller.py: 31 () INFO Published Set Point: 1556642012.664084 -2019-04-30 12:33:32,677 controller.py: 31 () INFO Published Set Point: 1556642012.675071 -2019-04-30 12:33:32,688 controller.py: 31 () INFO Published Set Point: 1556642012.687139 -2019-04-30 12:33:32,700 controller.py: 31 () INFO Published Set Point: 1556642012.699481 -2019-04-30 12:33:32,712 controller.py: 31 () INFO Published Set Point: 1556642012.711806 -2019-04-30 12:33:32,724 controller.py: 31 () INFO Published Set Point: 1556642012.723619 -2019-04-30 12:33:32,736 controller.py: 31 () INFO Published Set Point: 1556642012.735805 -2019-04-30 12:33:32,747 controller.py: 31 () INFO Published Set Point: 1556642012.74687 -2019-04-30 12:33:32,758 controller.py: 31 () INFO Published Set Point: 1556642012.758083 -2019-04-30 12:33:32,770 controller.py: 31 () INFO Published Set Point: 1556642012.769855 -2019-04-30 12:33:32,783 controller.py: 31 () INFO Published Set Point: 1556642012.78228 -2019-04-30 12:33:32,794 controller.py: 31 () INFO Published Set Point: 1556642012.793986 -2019-04-30 12:33:32,805 controller.py: 31 () INFO Published Set Point: 1556642012.804981 -2019-04-30 12:33:32,815 controller.py: 31 () INFO Published Set Point: 1556642012.81514 -2019-04-30 12:33:32,827 controller.py: 31 () INFO Published Set Point: 1556642012.8263218 -2019-04-30 12:33:32,838 controller.py: 31 () INFO Published Set Point: 1556642012.8380108 -2019-04-30 12:33:32,848 controller.py: 31 () INFO Published Set Point: 1556642012.848214 -2019-04-30 12:33:32,859 controller.py: 31 () INFO Published Set Point: 1556642012.8587148 -2019-04-30 12:33:32,870 controller.py: 31 () INFO Published Set Point: 1556642012.870368 -2019-04-30 12:33:32,881 controller.py: 31 () INFO Published Set Point: 1556642012.880529 -2019-04-30 12:33:32,892 controller.py: 31 () INFO Published Set Point: 1556642012.8908029 -2019-04-30 12:33:32,902 controller.py: 31 () INFO Published Set Point: 1556642012.901351 -2019-04-30 12:33:32,913 controller.py: 31 () INFO Published Set Point: 1556642012.913184 -2019-04-30 12:33:32,926 controller.py: 31 () INFO Published Set Point: 1556642012.9250822 -2019-04-30 12:33:32,936 controller.py: 31 () INFO Published Set Point: 1556642012.935431 -2019-04-30 12:33:32,947 controller.py: 31 () INFO Published Set Point: 1556642012.946589 -2019-04-30 12:33:32,959 controller.py: 31 () INFO Published Set Point: 1556642012.958401 -2019-04-30 12:33:32,970 controller.py: 31 () INFO Published Set Point: 1556642012.9694011 -2019-04-30 12:33:32,980 controller.py: 31 () INFO Published Set Point: 1556642012.9795 -2019-04-30 12:33:32,992 controller.py: 31 () INFO Published Set Point: 1556642012.991366 -2019-04-30 12:33:33,002 controller.py: 31 () INFO Published Set Point: 1556642013.0018718 -2019-04-30 12:33:33,013 controller.py: 31 () INFO Published Set Point: 1556642013.013152 -2019-04-30 12:33:33,024 controller.py: 31 () INFO Published Set Point: 1556642013.023314 -2019-04-30 12:33:33,036 controller.py: 31 () INFO Published Set Point: 1556642013.035418 -2019-04-30 12:33:33,046 controller.py: 31 () INFO Published Set Point: 1556642013.045449 -2019-04-30 12:33:33,056 controller.py: 31 () INFO Published Set Point: 1556642013.055991 -2019-04-30 12:33:33,067 controller.py: 31 () INFO Published Set Point: 1556642013.0673568 -2019-04-30 12:33:33,078 controller.py: 31 () INFO Published Set Point: 1556642013.077881 -2019-04-30 12:33:33,089 controller.py: 31 () INFO Published Set Point: 1556642013.089407 -2019-04-30 12:33:33,100 controller.py: 31 () INFO Published Set Point: 1556642013.100181 -2019-04-30 12:33:33,111 controller.py: 31 () INFO Published Set Point: 1556642013.1114602 -2019-04-30 12:33:33,124 controller.py: 31 () INFO Published Set Point: 1556642013.123901 -2019-04-30 12:33:33,134 controller.py: 31 () INFO Published Set Point: 1556642013.1340742 -2019-04-30 12:33:33,147 controller.py: 31 () INFO Published Set Point: 1556642013.14648 -2019-04-30 12:33:33,157 controller.py: 31 () INFO Published Set Point: 1556642013.156596 -2019-04-30 12:33:33,167 controller.py: 31 () INFO Published Set Point: 1556642013.1668181 -2019-04-30 12:33:33,177 controller.py: 31 () INFO Published Set Point: 1556642013.176878 -2019-04-30 12:33:33,188 controller.py: 31 () INFO Published Set Point: 1556642013.187892 -2019-04-30 12:33:33,198 controller.py: 31 () INFO Published Set Point: 1556642013.1981351 -2019-04-30 12:33:33,211 controller.py: 31 () INFO Published Set Point: 1556642013.210548 -2019-04-30 12:33:33,222 controller.py: 31 () INFO Published Set Point: 1556642013.221139 -2019-04-30 12:33:33,232 controller.py: 31 () INFO Published Set Point: 1556642013.231827 -2019-04-30 12:33:33,244 controller.py: 31 () INFO Published Set Point: 1556642013.243426 -2019-04-30 12:33:33,254 controller.py: 31 () INFO Published Set Point: 1556642013.253834 -2019-04-30 12:33:33,266 controller.py: 31 () INFO Published Set Point: 1556642013.2657971 -2019-04-30 12:33:33,278 controller.py: 31 () INFO Published Set Point: 1556642013.277765 -2019-04-30 12:33:33,288 controller.py: 31 () INFO Published Set Point: 1556642013.288181 -2019-04-30 12:33:33,301 controller.py: 31 () INFO Published Set Point: 1556642013.300616 -2019-04-30 12:33:33,312 controller.py: 31 () INFO Published Set Point: 1556642013.312217 -2019-04-30 12:33:33,325 controller.py: 31 () INFO Published Set Point: 1556642013.3245661 -2019-04-30 12:33:33,335 controller.py: 31 () INFO Published Set Point: 1556642013.334879 -2019-04-30 12:33:33,345 controller.py: 31 () INFO Published Set Point: 1556642013.3451688 -2019-04-30 12:33:33,358 controller.py: 31 () INFO Published Set Point: 1556642013.3574872 -2019-04-30 12:33:33,369 controller.py: 31 () INFO Published Set Point: 1556642013.368565 -2019-04-30 12:33:33,379 controller.py: 31 () INFO Published Set Point: 1556642013.3788958 -2019-04-30 12:33:33,389 controller.py: 31 () INFO Published Set Point: 1556642013.389298 -2019-04-30 12:33:33,402 controller.py: 31 () INFO Published Set Point: 1556642013.401551 -2019-04-30 12:33:33,414 controller.py: 31 () INFO Published Set Point: 1556642013.413931 -2019-04-30 12:33:33,426 controller.py: 31 () INFO Published Set Point: 1556642013.425898 -2019-04-30 12:33:33,436 controller.py: 31 () INFO Published Set Point: 1556642013.436239 -2019-04-30 12:33:33,446 controller.py: 31 () INFO Published Set Point: 1556642013.446336 -2019-04-30 12:33:33,459 controller.py: 31 () INFO Published Set Point: 1556642013.458787 -2019-04-30 12:33:33,469 controller.py: 31 () INFO Published Set Point: 1556642013.468854 -2019-04-30 12:33:33,482 controller.py: 31 () INFO Published Set Point: 1556642013.481308 -2019-04-30 12:33:33,492 controller.py: 31 () INFO Published Set Point: 1556642013.491877 -2019-04-30 12:33:33,502 controller.py: 31 () INFO Published Set Point: 1556642013.502111 -2019-04-30 12:33:33,514 controller.py: 31 () INFO Published Set Point: 1556642013.513994 -2019-04-30 12:33:33,524 controller.py: 31 () INFO Published Set Point: 1556642013.52412 -2019-04-30 12:33:33,537 controller.py: 31 () INFO Published Set Point: 1556642013.5365179 -2019-04-30 12:33:33,548 controller.py: 31 () INFO Published Set Point: 1556642013.5481012 -2019-04-30 12:33:33,560 controller.py: 31 () INFO Published Set Point: 1556642013.560412 -2019-04-30 12:33:33,572 controller.py: 31 () INFO Published Set Point: 1556642013.5720792 -2019-04-30 12:33:33,583 controller.py: 31 () INFO Published Set Point: 1556642013.583158 -2019-04-30 12:33:33,595 controller.py: 31 () INFO Published Set Point: 1556642013.595445 -2019-04-30 12:33:33,608 controller.py: 31 () INFO Published Set Point: 1556642013.607739 -2019-04-30 12:33:33,618 controller.py: 31 () INFO Published Set Point: 1556642013.61779 -2019-04-30 12:33:33,629 controller.py: 31 () INFO Published Set Point: 1556642013.628504 -2019-04-30 12:33:33,639 controller.py: 31 () INFO Published Set Point: 1556642013.638592 -2019-04-30 12:33:33,650 controller.py: 31 () INFO Published Set Point: 1556642013.649009 -2019-04-30 12:33:33,660 controller.py: 31 () INFO Published Set Point: 1556642013.6594748 -2019-04-30 12:33:33,670 controller.py: 31 () INFO Published Set Point: 1556642013.66957 -2019-04-30 12:33:33,681 controller.py: 31 () INFO Published Set Point: 1556642013.680521 -2019-04-30 12:33:33,691 controller.py: 31 () INFO Published Set Point: 1556642013.6906729 -2019-04-30 12:33:33,703 controller.py: 31 () INFO Published Set Point: 1556642013.703181 -2019-04-30 12:33:33,714 controller.py: 31 () INFO Published Set Point: 1556642013.7137 -2019-04-30 12:33:33,724 controller.py: 31 () INFO Published Set Point: 1556642013.724014 -2019-04-30 12:33:33,736 controller.py: 31 () INFO Published Set Point: 1556642013.736115 -2019-04-30 12:33:33,748 controller.py: 31 () INFO Published Set Point: 1556642013.747301 -2019-04-30 12:33:33,758 controller.py: 31 () INFO Published Set Point: 1556642013.757878 -2019-04-30 12:33:33,768 controller.py: 31 () INFO Published Set Point: 1556642013.768091 -2019-04-30 12:33:33,781 controller.py: 31 () INFO Published Set Point: 1556642013.7804658 -2019-04-30 12:33:33,792 controller.py: 31 () INFO Published Set Point: 1556642013.791327 -2019-04-30 12:33:33,803 controller.py: 31 () INFO Published Set Point: 1556642013.802645 -2019-04-30 12:33:33,814 controller.py: 31 () INFO Published Set Point: 1556642013.8139231 -2019-04-30 12:33:33,825 controller.py: 31 () INFO Published Set Point: 1556642013.8245828 -2019-04-30 12:33:33,836 controller.py: 31 () INFO Published Set Point: 1556642013.835493 -2019-04-30 12:33:33,847 controller.py: 31 () INFO Published Set Point: 1556642013.846438 -2019-04-30 12:33:33,858 controller.py: 31 () INFO Published Set Point: 1556642013.857732 -2019-04-30 12:33:33,870 controller.py: 31 () INFO Published Set Point: 1556642013.870002 -2019-04-30 12:33:33,881 controller.py: 31 () INFO Published Set Point: 1556642013.881315 -2019-04-30 12:33:33,895 controller.py: 31 () INFO Published Set Point: 1556642013.894261 -2019-04-30 12:33:33,908 controller.py: 31 () INFO Published Set Point: 1556642013.9076748 -2019-04-30 12:33:33,919 controller.py: 31 () INFO Published Set Point: 1556642013.9192052 -2019-04-30 12:33:33,931 controller.py: 31 () INFO Published Set Point: 1556642013.931006 -2019-04-30 12:33:33,943 controller.py: 31 () INFO Published Set Point: 1556642013.941698 -2019-04-30 12:33:33,953 controller.py: 31 () INFO Published Set Point: 1556642013.952802 -2019-04-30 12:33:33,964 controller.py: 31 () INFO Published Set Point: 1556642013.964084 -2019-04-30 12:33:33,976 controller.py: 31 () INFO Published Set Point: 1556642013.975858 -2019-04-30 12:33:33,987 controller.py: 31 () INFO Published Set Point: 1556642013.986586 -2019-04-30 12:33:33,998 controller.py: 31 () INFO Published Set Point: 1556642013.997566 -2019-04-30 12:33:34,009 controller.py: 31 () INFO Published Set Point: 1556642014.008119 -2019-04-30 12:33:34,019 controller.py: 31 () INFO Published Set Point: 1556642014.0189161 -2019-04-30 12:33:34,029 controller.py: 31 () INFO Published Set Point: 1556642014.029043 -2019-04-30 12:33:34,040 controller.py: 31 () INFO Published Set Point: 1556642014.0395231 -2019-04-30 12:33:34,050 controller.py: 31 () INFO Published Set Point: 1556642014.049901 -2019-04-30 12:33:34,060 controller.py: 31 () INFO Published Set Point: 1556642014.059924 -2019-04-30 12:33:34,070 controller.py: 31 () INFO Published Set Point: 1556642014.069961 -2019-04-30 12:33:34,081 controller.py: 31 () INFO Published Set Point: 1556642014.080909 -2019-04-30 12:33:34,093 controller.py: 31 () INFO Published Set Point: 1556642014.093285 -2019-04-30 12:33:34,104 controller.py: 31 () INFO Published Set Point: 1556642014.103838 -2019-04-30 12:33:34,114 controller.py: 31 () INFO Published Set Point: 1556642014.114508 -2019-04-30 12:33:34,127 controller.py: 31 () INFO Published Set Point: 1556642014.1269 -2019-04-30 12:33:34,137 controller.py: 31 () INFO Published Set Point: 1556642014.13695 -2019-04-30 12:33:34,149 controller.py: 31 () INFO Published Set Point: 1556642014.148621 -2019-04-30 12:33:34,159 controller.py: 31 () INFO Published Set Point: 1556642014.159053 -2019-04-30 12:33:34,171 controller.py: 31 () INFO Published Set Point: 1556642014.1713011 -2019-04-30 12:33:34,183 controller.py: 31 () INFO Published Set Point: 1556642014.183275 -2019-04-30 12:33:34,194 controller.py: 31 () INFO Published Set Point: 1556642014.194361 -2019-04-30 12:33:34,205 controller.py: 31 () INFO Published Set Point: 1556642014.2054772 -2019-04-30 12:33:34,218 controller.py: 31 () INFO Published Set Point: 1556642014.217867 -2019-04-30 12:33:34,228 controller.py: 31 () INFO Published Set Point: 1556642014.228375 -2019-04-30 12:33:34,239 controller.py: 31 () INFO Published Set Point: 1556642014.239299 -2019-04-30 12:33:34,249 controller.py: 31 () INFO Published Set Point: 1556642014.249342 -2019-04-30 12:33:34,261 controller.py: 31 () INFO Published Set Point: 1556642014.261367 -2019-04-30 12:33:34,274 controller.py: 31 () INFO Published Set Point: 1556642014.2731059 -2019-04-30 12:33:34,285 controller.py: 31 () INFO Published Set Point: 1556642014.2845492 -2019-04-30 12:33:34,295 controller.py: 31 () INFO Published Set Point: 1556642014.2948742 -2019-04-30 12:33:34,307 controller.py: 31 () INFO Published Set Point: 1556642014.306113 -2019-04-30 12:33:34,318 controller.py: 31 () INFO Published Set Point: 1556642014.31801 -2019-04-30 12:33:34,330 controller.py: 31 () INFO Published Set Point: 1556642014.3300312 -2019-04-30 12:33:34,341 controller.py: 31 () INFO Published Set Point: 1556642014.341054 -2019-04-30 12:33:34,352 controller.py: 31 () INFO Published Set Point: 1556642014.351905 -2019-04-30 12:33:34,363 controller.py: 31 () INFO Published Set Point: 1556642014.3630998 -2019-04-30 12:33:34,375 controller.py: 31 () INFO Published Set Point: 1556642014.375107 -2019-04-30 12:33:34,387 controller.py: 31 () INFO Published Set Point: 1556642014.386677 -2019-04-30 12:33:34,399 controller.py: 31 () INFO Published Set Point: 1556642014.3990169 -2019-04-30 12:33:34,409 controller.py: 31 () INFO Published Set Point: 1556642014.409473 -2019-04-30 12:33:34,422 controller.py: 31 () INFO Published Set Point: 1556642014.421547 -2019-04-30 12:33:34,432 controller.py: 31 () INFO Published Set Point: 1556642014.431971 -2019-04-30 12:33:34,443 controller.py: 31 () INFO Published Set Point: 1556642014.442989 -2019-04-30 12:33:34,454 controller.py: 31 () INFO Published Set Point: 1556642014.453134 -2019-04-30 12:33:34,464 controller.py: 31 () INFO Published Set Point: 1556642014.463455 -2019-04-30 12:33:34,476 controller.py: 31 () INFO Published Set Point: 1556642014.474818 -2019-04-30 12:33:34,485 controller.py: 31 () INFO Published Set Point: 1556642014.485104 -2019-04-30 12:33:34,496 controller.py: 31 () INFO Published Set Point: 1556642014.495714 -2019-04-30 12:33:34,509 controller.py: 31 () INFO Published Set Point: 1556642014.508099 -2019-04-30 12:33:34,520 controller.py: 31 () INFO Published Set Point: 1556642014.520098 -2019-04-30 12:33:34,532 controller.py: 31 () INFO Published Set Point: 1556642014.5313852 -2019-04-30 12:33:34,543 controller.py: 31 () INFO Published Set Point: 1556642014.542188 -2019-04-30 12:33:34,554 controller.py: 31 () INFO Published Set Point: 1556642014.553534 -2019-04-30 12:33:34,566 controller.py: 31 () INFO Published Set Point: 1556642014.565738 -2019-04-30 12:33:34,578 controller.py: 31 () INFO Published Set Point: 1556642014.578049 -2019-04-30 12:33:34,588 controller.py: 31 () INFO Published Set Point: 1556642014.588166 -2019-04-30 12:33:34,598 controller.py: 31 () INFO Published Set Point: 1556642014.598352 -2019-04-30 12:33:34,610 controller.py: 31 () INFO Published Set Point: 1556642014.609984 -2019-04-30 12:33:34,623 controller.py: 31 () INFO Published Set Point: 1556642014.622442 -2019-04-30 12:33:34,633 controller.py: 31 () INFO Published Set Point: 1556642014.6333609 -2019-04-30 12:33:34,644 controller.py: 31 () INFO Published Set Point: 1556642014.6435552 -2019-04-30 12:33:34,655 controller.py: 31 () INFO Published Set Point: 1556642014.654952 -2019-04-30 12:33:34,665 controller.py: 31 () INFO Published Set Point: 1556642014.6649852 -2019-04-30 12:33:34,678 controller.py: 31 () INFO Published Set Point: 1556642014.677433 -2019-04-30 12:33:34,688 controller.py: 31 () INFO Published Set Point: 1556642014.6881752 -2019-04-30 12:33:34,699 controller.py: 31 () INFO Published Set Point: 1556642014.698487 -2019-04-30 12:33:34,710 controller.py: 31 () INFO Published Set Point: 1556642014.709574 -2019-04-30 12:33:34,721 controller.py: 31 () INFO Published Set Point: 1556642014.720751 -2019-04-30 12:33:34,732 controller.py: 31 () INFO Published Set Point: 1556642014.731425 -2019-04-30 12:33:34,744 controller.py: 31 () INFO Published Set Point: 1556642014.7438378 -2019-04-30 12:33:34,755 controller.py: 31 () INFO Published Set Point: 1556642014.754199 -2019-04-30 12:33:34,765 controller.py: 31 () INFO Published Set Point: 1556642014.764603 -2019-04-30 12:33:34,777 controller.py: 31 () INFO Published Set Point: 1556642014.776999 -2019-04-30 12:33:34,788 controller.py: 31 () INFO Published Set Point: 1556642014.787193 -2019-04-30 12:33:34,798 controller.py: 31 () INFO Published Set Point: 1556642014.797332 -2019-04-30 12:33:34,810 controller.py: 31 () INFO Published Set Point: 1556642014.809738 -2019-04-30 12:33:34,821 controller.py: 31 () INFO Published Set Point: 1556642014.820606 -2019-04-30 12:33:34,833 controller.py: 31 () INFO Published Set Point: 1556642014.832809 -2019-04-30 12:33:34,844 controller.py: 31 () INFO Published Set Point: 1556642014.844026 -2019-04-30 12:33:34,855 controller.py: 31 () INFO Published Set Point: 1556642014.8551118 -2019-04-30 12:33:34,865 controller.py: 31 () INFO Published Set Point: 1556642014.865231 -2019-04-30 12:33:34,876 controller.py: 31 () INFO Published Set Point: 1556642014.875821 -2019-04-30 12:33:34,889 controller.py: 31 () INFO Published Set Point: 1556642014.88819 -2019-04-30 12:33:34,899 controller.py: 31 () INFO Published Set Point: 1556642014.8983512 -2019-04-30 12:33:34,910 controller.py: 31 () INFO Published Set Point: 1556642014.910122 -2019-04-30 12:33:34,923 controller.py: 31 () INFO Published Set Point: 1556642014.922441 -2019-04-30 12:33:34,933 controller.py: 31 () INFO Published Set Point: 1556642014.9330502 -2019-04-30 12:33:34,945 controller.py: 31 () INFO Published Set Point: 1556642014.9451861 -2019-04-30 12:33:34,957 controller.py: 31 () INFO Published Set Point: 1556642014.9564412 -2019-04-30 12:33:34,967 controller.py: 31 () INFO Published Set Point: 1556642014.9665549 -2019-04-30 12:33:34,979 controller.py: 31 () INFO Published Set Point: 1556642014.978969 -2019-04-30 12:33:34,989 controller.py: 31 () INFO Published Set Point: 1556642014.989064 -2019-04-30 12:33:34,999 controller.py: 31 () INFO Published Set Point: 1556642014.999239 -2019-04-30 12:33:35,010 controller.py: 31 () INFO Published Set Point: 1556642015.009432 -2019-04-30 12:33:35,022 controller.py: 31 () INFO Published Set Point: 1556642015.021861 -2019-04-30 12:33:35,032 controller.py: 31 () INFO Published Set Point: 1556642015.032126 -2019-04-30 12:33:35,045 controller.py: 31 () INFO Published Set Point: 1556642015.0444539 -2019-04-30 12:33:35,055 controller.py: 31 () INFO Published Set Point: 1556642015.054525 -2019-04-30 12:33:35,067 controller.py: 31 () INFO Published Set Point: 1556642015.066947 -2019-04-30 12:33:35,080 controller.py: 31 () INFO Published Set Point: 1556642015.079339 -2019-04-30 12:33:35,090 controller.py: 31 () INFO Published Set Point: 1556642015.089879 -2019-04-30 12:33:35,102 controller.py: 31 () INFO Published Set Point: 1556642015.10224 -2019-04-30 12:33:35,113 controller.py: 31 () INFO Published Set Point: 1556642015.113298 -2019-04-30 12:33:35,125 controller.py: 31 () INFO Published Set Point: 1556642015.125103 -2019-04-30 12:33:35,137 controller.py: 31 () INFO Published Set Point: 1556642015.1361878 -2019-04-30 12:33:35,147 controller.py: 31 () INFO Published Set Point: 1556642015.146889 -2019-04-30 12:33:35,159 controller.py: 31 () INFO Published Set Point: 1556642015.159244 -2019-04-30 12:33:35,170 controller.py: 31 () INFO Published Set Point: 1556642015.170196 -2019-04-30 12:33:35,183 controller.py: 31 () INFO Published Set Point: 1556642015.1825862 -2019-04-30 12:33:35,194 controller.py: 31 () INFO Published Set Point: 1556642015.193739 -2019-04-30 12:33:35,206 controller.py: 31 () INFO Published Set Point: 1556642015.206187 -2019-04-30 12:33:35,218 controller.py: 31 () INFO Published Set Point: 1556642015.2175412 -2019-04-30 12:33:35,228 controller.py: 31 () INFO Published Set Point: 1556642015.2276878 -2019-04-30 12:33:35,240 controller.py: 31 () INFO Published Set Point: 1556642015.240045 -2019-04-30 12:33:35,251 controller.py: 31 () INFO Published Set Point: 1556642015.251227 -2019-04-30 12:33:35,262 controller.py: 31 () INFO Published Set Point: 1556642015.261461 -2019-04-30 12:33:35,274 controller.py: 31 () INFO Published Set Point: 1556642015.273866 -2019-04-30 12:33:35,284 controller.py: 31 () INFO Published Set Point: 1556642015.284169 -2019-04-30 12:33:35,295 controller.py: 31 () INFO Published Set Point: 1556642015.294562 -2019-04-30 12:33:35,307 controller.py: 31 () INFO Published Set Point: 1556642015.306716 -2019-04-30 12:33:35,319 controller.py: 31 () INFO Published Set Point: 1556642015.31915 -2019-04-30 12:33:35,330 controller.py: 31 () INFO Published Set Point: 1556642015.3298 -2019-04-30 12:33:35,340 controller.py: 31 () INFO Published Set Point: 1556642015.3401349 -2019-04-30 12:33:35,352 controller.py: 31 () INFO Published Set Point: 1556642015.3516958 -2019-04-30 12:33:35,362 controller.py: 31 () INFO Published Set Point: 1556642015.3619251 -2019-04-30 12:33:35,373 controller.py: 31 () INFO Published Set Point: 1556642015.3724349 -2019-04-30 12:33:35,383 controller.py: 31 () INFO Published Set Point: 1556642015.382505 -2019-04-30 12:33:35,393 controller.py: 31 () INFO Published Set Point: 1556642015.393193 -2019-04-30 12:33:35,404 controller.py: 31 () INFO Published Set Point: 1556642015.403925 -2019-04-30 12:33:35,414 controller.py: 31 () INFO Published Set Point: 1556642015.414052 -2019-04-30 12:33:35,425 controller.py: 31 () INFO Published Set Point: 1556642015.424394 -2019-04-30 12:33:35,436 controller.py: 31 () INFO Published Set Point: 1556642015.4356449 -2019-04-30 12:33:35,446 controller.py: 31 () INFO Published Set Point: 1556642015.4459689 -2019-04-30 12:33:35,459 controller.py: 31 () INFO Published Set Point: 1556642015.458427 -2019-04-30 12:33:35,469 controller.py: 31 () INFO Published Set Point: 1556642015.46862 -2019-04-30 12:33:35,479 controller.py: 31 () INFO Published Set Point: 1556642015.479052 -2019-04-30 12:33:35,489 controller.py: 31 () INFO Published Set Point: 1556642015.489347 -2019-04-30 12:33:35,500 controller.py: 31 () INFO Published Set Point: 1556642015.499907 -2019-04-30 12:33:35,512 controller.py: 31 () INFO Published Set Point: 1556642015.5121112 -2019-04-30 12:33:35,525 controller.py: 31 () INFO Published Set Point: 1556642015.5245068 -2019-04-30 12:33:35,536 controller.py: 31 () INFO Published Set Point: 1556642015.536163 -2019-04-30 12:33:35,547 controller.py: 31 () INFO Published Set Point: 1556642015.5468202 -2019-04-30 12:33:35,558 controller.py: 31 () INFO Published Set Point: 1556642015.5572999 -2019-04-30 12:33:35,568 controller.py: 31 () INFO Published Set Point: 1556642015.567565 -2019-04-30 12:33:35,578 controller.py: 31 () INFO Published Set Point: 1556642015.577636 -2019-04-30 12:33:35,590 controller.py: 31 () INFO Published Set Point: 1556642015.588661 -2019-04-30 12:33:35,601 controller.py: 31 () INFO Published Set Point: 1556642015.600776 -2019-04-30 12:33:35,612 controller.py: 31 () INFO Published Set Point: 1556642015.6121678 -2019-04-30 12:33:35,623 controller.py: 31 () INFO Published Set Point: 1556642015.6225028 +2022-05-11 12:32:04,630 controller.py: 33 () INFO Published Set Point: 1652286724.6290288 +2022-05-11 12:32:04,640 controller.py: 33 () INFO Published Set Point: 1652286724.6391141 +2022-05-11 12:32:04,650 controller.py: 33 () INFO Published Set Point: 1652286724.6491737 +2022-05-11 12:32:04,660 controller.py: 33 () INFO Published Set Point: 1652286724.6591551 +2022-05-11 12:32:04,670 controller.py: 33 () INFO Published Set Point: 1652286724.6691322 +2022-05-11 12:32:04,680 controller.py: 33 () INFO Published Set Point: 1652286724.679174 +2022-05-11 12:32:04,690 controller.py: 33 () INFO Published Set Point: 1652286724.6891685 +2022-05-11 12:32:04,700 controller.py: 33 () INFO Published Set Point: 1652286724.6991694 +2022-05-11 12:32:04,710 controller.py: 33 () INFO Published Set Point: 1652286724.709183 +2022-05-11 12:32:04,720 controller.py: 33 () INFO Published Set Point: 1652286724.7191296 +2022-05-11 12:32:04,730 controller.py: 33 () INFO Published Set Point: 1652286724.729169 +2022-05-11 12:32:04,740 controller.py: 33 () INFO Published Set Point: 1652286724.7391725 +2022-05-11 12:32:04,750 controller.py: 33 () INFO Published Set Point: 1652286724.7491715 +2022-05-11 12:32:04,760 controller.py: 33 () INFO Published Set Point: 1652286724.7591662 +2022-05-11 12:32:04,770 controller.py: 33 () INFO Published Set Point: 1652286724.7691717 +2022-05-11 12:32:04,780 controller.py: 33 () INFO Published Set Point: 1652286724.7791727 +2022-05-11 12:32:04,790 controller.py: 33 () INFO Published Set Point: 1652286724.789124 +2022-05-11 12:32:04,800 controller.py: 33 () INFO Published Set Point: 1652286724.7991216 +2022-05-11 12:32:04,810 controller.py: 33 () INFO Published Set Point: 1652286724.8091712 +2022-05-11 12:32:04,820 controller.py: 33 () INFO Published Set Point: 1652286724.8191748 +2022-05-11 12:32:04,830 controller.py: 33 () INFO Published Set Point: 1652286724.8291304 +2022-05-11 12:32:04,840 controller.py: 33 () INFO Published Set Point: 1652286724.8391712 +2022-05-11 12:32:04,850 controller.py: 33 () INFO Published Set Point: 1652286724.8491716 +2022-05-11 12:32:04,860 controller.py: 33 () INFO Published Set Point: 1652286724.8591719 +2022-05-11 12:32:04,870 controller.py: 33 () INFO Published Set Point: 1652286724.869167 +2022-05-11 12:32:04,880 controller.py: 33 () INFO Published Set Point: 1652286724.8791268 +2022-05-11 12:32:04,890 controller.py: 33 () INFO Published Set Point: 1652286724.8891678 +2022-05-11 12:32:04,900 controller.py: 33 () INFO Published Set Point: 1652286724.8991718 +2022-05-11 12:32:04,910 controller.py: 33 () INFO Published Set Point: 1652286724.9091692 +2022-05-11 12:32:04,920 controller.py: 33 () INFO Published Set Point: 1652286724.91917 +2022-05-11 12:32:04,930 controller.py: 33 () INFO Published Set Point: 1652286724.9291246 +2022-05-11 12:32:04,940 controller.py: 33 () INFO Published Set Point: 1652286724.939171 +2022-05-11 12:32:04,950 controller.py: 33 () INFO Published Set Point: 1652286724.9491293 +2022-05-11 12:32:04,960 controller.py: 33 () INFO Published Set Point: 1652286724.9591725 +2022-05-11 12:32:04,970 controller.py: 33 () INFO Published Set Point: 1652286724.9691453 +2022-05-11 12:32:04,980 controller.py: 33 () INFO Published Set Point: 1652286724.9791293 +2022-05-11 12:32:04,990 controller.py: 33 () INFO Published Set Point: 1652286724.9891462 +2022-05-11 12:32:05,000 controller.py: 33 () INFO Published Set Point: 1652286724.9991245 +2022-05-11 12:32:05,010 controller.py: 33 () INFO Published Set Point: 1652286725.0091703 +2022-05-11 12:32:05,020 controller.py: 33 () INFO Published Set Point: 1652286725.01917 +2022-05-11 12:32:05,030 controller.py: 33 () INFO Published Set Point: 1652286725.0291727 +2022-05-11 12:32:05,040 controller.py: 33 () INFO Published Set Point: 1652286725.039128 +2022-05-11 12:32:05,050 controller.py: 33 () INFO Published Set Point: 1652286725.0491745 +2022-05-11 12:32:05,060 controller.py: 33 () INFO Published Set Point: 1652286725.0591712 +2022-05-11 12:32:05,070 controller.py: 33 () INFO Published Set Point: 1652286725.069172 +2022-05-11 12:32:05,080 controller.py: 33 () INFO Published Set Point: 1652286725.0791712 +2022-05-11 12:32:05,090 controller.py: 33 () INFO Published Set Point: 1652286725.0891666 +2022-05-11 12:32:05,100 controller.py: 33 () INFO Published Set Point: 1652286725.0991702 +2022-05-11 12:32:05,109 controller.py: 33 () INFO Published Set Point: 1652286725.109122 +2022-05-11 12:32:05,120 controller.py: 33 () INFO Published Set Point: 1652286725.1191742 +2022-05-11 12:32:05,130 controller.py: 33 () INFO Published Set Point: 1652286725.1291406 +2022-05-11 12:32:05,140 controller.py: 33 () INFO Published Set Point: 1652286725.1391711 +2022-05-11 12:32:05,149 controller.py: 33 () INFO Published Set Point: 1652286725.1491282 +2022-05-11 12:32:05,160 controller.py: 33 () INFO Published Set Point: 1652286725.1591783 +2022-05-11 12:32:05,170 controller.py: 33 () INFO Published Set Point: 1652286725.1691294 +2022-05-11 12:32:05,180 controller.py: 33 () INFO Published Set Point: 1652286725.1791363 +2022-05-11 12:32:05,190 controller.py: 33 () INFO Published Set Point: 1652286725.1891165 +2022-05-11 12:32:05,200 controller.py: 33 () INFO Published Set Point: 1652286725.1991715 +2022-05-11 12:32:05,210 controller.py: 33 () INFO Published Set Point: 1652286725.20917 +2022-05-11 12:32:05,220 controller.py: 33 () INFO Published Set Point: 1652286725.2191734 +2022-05-11 12:32:05,230 controller.py: 33 () INFO Published Set Point: 1652286725.2291758 +2022-05-11 12:32:05,240 controller.py: 33 () INFO Published Set Point: 1652286725.2391727 +2022-05-11 12:32:05,250 controller.py: 33 () INFO Published Set Point: 1652286725.2491672 +2022-05-11 12:32:05,260 controller.py: 33 () INFO Published Set Point: 1652286725.2591681 +2022-05-11 12:32:05,270 controller.py: 33 () INFO Published Set Point: 1652286725.2691507 +2022-05-11 12:32:05,280 controller.py: 33 () INFO Published Set Point: 1652286725.2791593 +2022-05-11 12:32:05,290 controller.py: 33 () INFO Published Set Point: 1652286725.2891243 +2022-05-11 12:32:05,300 controller.py: 33 () INFO Published Set Point: 1652286725.299129 +2022-05-11 12:32:05,310 controller.py: 33 () INFO Published Set Point: 1652286725.3091705 +2022-05-11 12:32:05,320 controller.py: 33 () INFO Published Set Point: 1652286725.319174 +2022-05-11 12:32:05,330 controller.py: 33 () INFO Published Set Point: 1652286725.3291707 +2022-05-11 12:32:05,340 controller.py: 33 () INFO Published Set Point: 1652286725.3391707 +2022-05-11 12:32:05,350 controller.py: 33 () INFO Published Set Point: 1652286725.349169 +2022-05-11 12:32:05,360 controller.py: 33 () INFO Published Set Point: 1652286725.3591774 +2022-05-11 12:32:05,370 controller.py: 33 () INFO Published Set Point: 1652286725.3691678 +2022-05-11 12:32:05,380 controller.py: 33 () INFO Published Set Point: 1652286725.3791645 +2022-05-11 12:32:05,390 controller.py: 33 () INFO Published Set Point: 1652286725.389168 +2022-05-11 12:32:05,400 controller.py: 33 () INFO Published Set Point: 1652286725.3991718 +2022-05-11 12:32:05,410 controller.py: 33 () INFO Published Set Point: 1652286725.4091702 +2022-05-11 12:32:05,420 controller.py: 33 () INFO Published Set Point: 1652286725.4191737 +2022-05-11 12:32:05,430 controller.py: 33 () INFO Published Set Point: 1652286725.429168 +2022-05-11 12:32:05,440 controller.py: 33 () INFO Published Set Point: 1652286725.4391706 +2022-05-11 12:32:05,450 controller.py: 33 () INFO Published Set Point: 1652286725.4491675 +2022-05-11 12:32:05,460 controller.py: 33 () INFO Published Set Point: 1652286725.4591715 +2022-05-11 12:32:05,470 controller.py: 33 () INFO Published Set Point: 1652286725.469166 +2022-05-11 12:32:05,480 controller.py: 33 () INFO Published Set Point: 1652286725.4791677 +2022-05-11 12:32:05,490 controller.py: 33 () INFO Published Set Point: 1652286725.489169 +2022-05-11 12:32:05,500 controller.py: 33 () INFO Published Set Point: 1652286725.4991686 +2022-05-11 12:32:05,510 controller.py: 33 () INFO Published Set Point: 1652286725.5091681 +2022-05-11 12:32:05,520 controller.py: 33 () INFO Published Set Point: 1652286725.519164 +2022-05-11 12:32:05,530 controller.py: 33 () INFO Published Set Point: 1652286725.5291667 +2022-05-11 12:32:05,540 controller.py: 33 () INFO Published Set Point: 1652286725.5391626 +2022-05-11 12:32:05,550 controller.py: 33 () INFO Published Set Point: 1652286725.5491707 +2022-05-11 12:32:05,560 controller.py: 33 () INFO Published Set Point: 1652286725.5591707 +2022-05-11 12:32:05,570 controller.py: 33 () INFO Published Set Point: 1652286725.5691686 +2022-05-11 12:32:05,580 controller.py: 33 () INFO Published Set Point: 1652286725.5791738 +2022-05-11 12:32:05,590 controller.py: 33 () INFO Published Set Point: 1652286725.5891702 +2022-05-11 12:32:05,600 controller.py: 33 () INFO Published Set Point: 1652286725.599161 +2022-05-11 12:32:05,610 controller.py: 33 () INFO Published Set Point: 1652286725.6091716 +2022-05-11 12:32:05,620 controller.py: 33 () INFO Published Set Point: 1652286725.61916 +2022-05-11 12:32:05,630 controller.py: 33 () INFO Published Set Point: 1652286725.6291692 +2022-05-11 12:32:05,639 controller.py: 33 () INFO Published Set Point: 1652286725.6391613 +2022-05-11 12:32:05,650 controller.py: 33 () INFO Published Set Point: 1652286725.6491716 +2022-05-11 12:32:05,660 controller.py: 33 () INFO Published Set Point: 1652286725.659171 +2022-05-11 12:32:05,670 controller.py: 33 () INFO Published Set Point: 1652286725.6691675 +2022-05-11 12:32:05,680 controller.py: 33 () INFO Published Set Point: 1652286725.6791768 +2022-05-11 12:32:05,689 controller.py: 33 () INFO Published Set Point: 1652286725.6891687 +2022-05-11 12:32:05,700 controller.py: 33 () INFO Published Set Point: 1652286725.69917 +2022-05-11 12:32:05,710 controller.py: 33 () INFO Published Set Point: 1652286725.709168 +2022-05-11 12:32:05,720 controller.py: 33 () INFO Published Set Point: 1652286725.719173 +2022-05-11 12:32:05,730 controller.py: 33 () INFO Published Set Point: 1652286725.729168 +2022-05-11 12:32:05,740 controller.py: 33 () INFO Published Set Point: 1652286725.7391567 +2022-05-11 12:32:05,750 controller.py: 33 () INFO Published Set Point: 1652286725.749172 +2022-05-11 12:32:05,760 controller.py: 33 () INFO Published Set Point: 1652286725.7591252 +2022-05-11 12:32:05,770 controller.py: 33 () INFO Published Set Point: 1652286725.7691586 +2022-05-11 12:32:05,780 controller.py: 33 () INFO Published Set Point: 1652286725.779173 +2022-05-11 12:32:05,790 controller.py: 33 () INFO Published Set Point: 1652286725.7891245 +2022-05-11 12:32:05,800 controller.py: 33 () INFO Published Set Point: 1652286725.799172 +2022-05-11 12:32:05,810 controller.py: 33 () INFO Published Set Point: 1652286725.8091662 +2022-05-11 12:32:05,820 controller.py: 33 () INFO Published Set Point: 1652286725.8191118 +2022-05-11 12:32:05,830 controller.py: 33 () INFO Published Set Point: 1652286725.8291585 +2022-05-11 12:32:05,840 controller.py: 33 () INFO Published Set Point: 1652286725.8391607 +2022-05-11 12:32:05,850 controller.py: 33 () INFO Published Set Point: 1652286725.8491654 +2022-05-11 12:32:05,860 controller.py: 33 () INFO Published Set Point: 1652286725.8591578 +2022-05-11 12:32:05,870 controller.py: 33 () INFO Published Set Point: 1652286725.8691695 +2022-05-11 12:32:05,880 controller.py: 33 () INFO Published Set Point: 1652286725.879165 +2022-05-11 12:32:05,890 controller.py: 33 () INFO Published Set Point: 1652286725.889165 +2022-05-11 12:32:05,900 controller.py: 33 () INFO Published Set Point: 1652286725.8991592 +2022-05-11 12:32:05,910 controller.py: 33 () INFO Published Set Point: 1652286725.909167 +2022-05-11 12:32:05,920 controller.py: 33 () INFO Published Set Point: 1652286725.9191718 +2022-05-11 12:32:05,930 controller.py: 33 () INFO Published Set Point: 1652286725.929167 +2022-05-11 12:32:05,940 controller.py: 33 () INFO Published Set Point: 1652286725.9391696 +2022-05-11 12:32:05,950 controller.py: 33 () INFO Published Set Point: 1652286725.9491663 +2022-05-11 12:32:05,960 controller.py: 33 () INFO Published Set Point: 1652286725.9591677 +2022-05-11 12:32:05,970 controller.py: 33 () INFO Published Set Point: 1652286725.969168 +2022-05-11 12:32:05,980 controller.py: 33 () INFO Published Set Point: 1652286725.9791632 +2022-05-11 12:32:05,990 controller.py: 33 () INFO Published Set Point: 1652286725.9891768 +2022-05-11 12:32:06,000 controller.py: 33 () INFO Published Set Point: 1652286725.9991658 +2022-05-11 12:32:06,010 controller.py: 33 () INFO Published Set Point: 1652286726.0091677 +2022-05-11 12:32:06,020 controller.py: 33 () INFO Published Set Point: 1652286726.0191658 +2022-05-11 12:32:06,030 controller.py: 33 () INFO Published Set Point: 1652286726.0291648 +2022-05-11 12:32:06,040 controller.py: 33 () INFO Published Set Point: 1652286726.039107 +2022-05-11 12:32:06,050 controller.py: 33 () INFO Published Set Point: 1652286726.0491621 +2022-05-11 12:32:06,060 controller.py: 33 () INFO Published Set Point: 1652286726.0591016 +2022-05-11 12:32:06,070 controller.py: 33 () INFO Published Set Point: 1652286726.0691655 +2022-05-11 12:32:06,080 controller.py: 33 () INFO Published Set Point: 1652286726.0791602 +2022-05-11 12:32:06,090 controller.py: 33 () INFO Published Set Point: 1652286726.0891376 +2022-05-11 12:32:06,100 controller.py: 33 () INFO Published Set Point: 1652286726.0991244 +2022-05-11 12:32:06,110 controller.py: 33 () INFO Published Set Point: 1652286726.1091218 +2022-05-11 12:32:06,120 controller.py: 33 () INFO Published Set Point: 1652286726.1191244 +2022-05-11 12:32:06,130 controller.py: 33 () INFO Published Set Point: 1652286726.129123 +2022-05-11 12:32:06,140 controller.py: 33 () INFO Published Set Point: 1652286726.139123 +2022-05-11 12:32:06,150 controller.py: 33 () INFO Published Set Point: 1652286726.1491237 +2022-05-11 12:32:06,160 controller.py: 33 () INFO Published Set Point: 1652286726.1591222 +2022-05-11 12:32:06,170 controller.py: 33 () INFO Published Set Point: 1652286726.169124 +2022-05-11 12:32:06,180 controller.py: 33 () INFO Published Set Point: 1652286726.1791253 +2022-05-11 12:32:06,190 controller.py: 33 () INFO Published Set Point: 1652286726.1891704 +2022-05-11 12:32:06,200 controller.py: 33 () INFO Published Set Point: 1652286726.1991565 +2022-05-11 12:32:06,210 controller.py: 33 () INFO Published Set Point: 1652286726.2091713 +2022-05-11 12:32:06,220 controller.py: 33 () INFO Published Set Point: 1652286726.2191558 +2022-05-11 12:32:06,230 controller.py: 33 () INFO Published Set Point: 1652286726.229163 +2022-05-11 12:32:06,240 controller.py: 33 () INFO Published Set Point: 1652286726.2391567 +2022-05-11 12:32:06,250 controller.py: 33 () INFO Published Set Point: 1652286726.2491622 +2022-05-11 12:32:06,260 controller.py: 33 () INFO Published Set Point: 1652286726.2591567 +2022-05-11 12:32:06,270 controller.py: 33 () INFO Published Set Point: 1652286726.2691636 +2022-05-11 12:32:06,280 controller.py: 33 () INFO Published Set Point: 1652286726.279162 +2022-05-11 12:32:06,290 controller.py: 33 () INFO Published Set Point: 1652286726.2891626 +2022-05-11 12:32:06,300 controller.py: 33 () INFO Published Set Point: 1652286726.2991562 +2022-05-11 12:32:06,310 controller.py: 33 () INFO Published Set Point: 1652286726.3091674 +2022-05-11 12:32:06,320 controller.py: 33 () INFO Published Set Point: 1652286726.3191633 +2022-05-11 12:32:06,330 controller.py: 33 () INFO Published Set Point: 1652286726.3291605 +2022-05-11 12:32:06,340 controller.py: 33 () INFO Published Set Point: 1652286726.3391635 +2022-05-11 12:32:06,350 controller.py: 33 () INFO Published Set Point: 1652286726.3491619 +2022-05-11 12:32:06,360 controller.py: 33 () INFO Published Set Point: 1652286726.3591566 +2022-05-11 12:32:06,370 controller.py: 33 () INFO Published Set Point: 1652286726.3691635 +2022-05-11 12:32:06,380 controller.py: 33 () INFO Published Set Point: 1652286726.3791275 +2022-05-11 12:32:06,390 controller.py: 33 () INFO Published Set Point: 1652286726.389169 +2022-05-11 12:32:06,400 controller.py: 33 () INFO Published Set Point: 1652286726.3991275 +2022-05-11 12:32:06,410 controller.py: 33 () INFO Published Set Point: 1652286726.4091723 +2022-05-11 12:32:06,420 controller.py: 33 () INFO Published Set Point: 1652286726.4191148 +2022-05-11 12:32:06,430 controller.py: 33 () INFO Published Set Point: 1652286726.4291704 +2022-05-11 12:32:06,440 controller.py: 33 () INFO Published Set Point: 1652286726.439171 +2022-05-11 12:32:06,450 controller.py: 33 () INFO Published Set Point: 1652286726.4491699 +2022-05-11 12:32:06,460 controller.py: 33 () INFO Published Set Point: 1652286726.4591594 +2022-05-11 12:32:06,470 controller.py: 33 () INFO Published Set Point: 1652286726.4691672 +2022-05-11 12:32:06,480 controller.py: 33 () INFO Published Set Point: 1652286726.479173 +2022-05-11 12:32:06,490 controller.py: 33 () INFO Published Set Point: 1652286726.48917 +2022-05-11 12:32:06,500 controller.py: 33 () INFO Published Set Point: 1652286726.4991717 +2022-05-11 12:32:06,510 controller.py: 33 () INFO Published Set Point: 1652286726.5091674 +2022-05-11 12:32:06,520 controller.py: 33 () INFO Published Set Point: 1652286726.5191693 +2022-05-11 12:32:06,530 controller.py: 33 () INFO Published Set Point: 1652286726.5291684 +2022-05-11 12:32:06,540 controller.py: 33 () INFO Published Set Point: 1652286726.5391693 +2022-05-11 12:32:06,550 controller.py: 33 () INFO Published Set Point: 1652286726.5491664 +2022-05-11 12:32:06,560 controller.py: 33 () INFO Published Set Point: 1652286726.559168 +2022-05-11 12:32:06,570 controller.py: 33 () INFO Published Set Point: 1652286726.569168 +2022-05-11 12:32:06,580 controller.py: 33 () INFO Published Set Point: 1652286726.5791752 +2022-05-11 12:32:06,590 controller.py: 33 () INFO Published Set Point: 1652286726.5891693 +2022-05-11 12:32:06,600 controller.py: 33 () INFO Published Set Point: 1652286726.5991657 +2022-05-11 12:32:06,610 controller.py: 33 () INFO Published Set Point: 1652286726.6091673 +2022-05-11 12:32:06,620 controller.py: 33 () INFO Published Set Point: 1652286726.6191723 +2022-05-11 12:32:06,630 controller.py: 33 () INFO Published Set Point: 1652286726.6291707 +2022-05-11 12:32:06,640 controller.py: 33 () INFO Published Set Point: 1652286726.6391704 +2022-05-11 12:32:06,650 controller.py: 33 () INFO Published Set Point: 1652286726.6491735 +2022-05-11 12:32:06,660 controller.py: 33 () INFO Published Set Point: 1652286726.6591678 +2022-05-11 12:32:06,670 controller.py: 33 () INFO Published Set Point: 1652286726.6691701 +2022-05-11 12:32:06,680 controller.py: 33 () INFO Published Set Point: 1652286726.6791704 +2022-05-11 12:32:06,690 controller.py: 33 () INFO Published Set Point: 1652286726.6891673 +2022-05-11 12:32:06,700 controller.py: 33 () INFO Published Set Point: 1652286726.699171 +2022-05-11 12:32:06,710 controller.py: 33 () INFO Published Set Point: 1652286726.709168 +2022-05-11 12:32:06,720 controller.py: 33 () INFO Published Set Point: 1652286726.7191224 +2022-05-11 12:32:06,730 controller.py: 33 () INFO Published Set Point: 1652286726.7291706 +2022-05-11 12:32:06,740 controller.py: 33 () INFO Published Set Point: 1652286726.739174 +2022-05-11 12:32:06,750 controller.py: 33 () INFO Published Set Point: 1652286726.7491667 +2022-05-11 12:32:06,760 controller.py: 33 () INFO Published Set Point: 1652286726.7591689 +2022-05-11 12:32:06,770 controller.py: 33 () INFO Published Set Point: 1652286726.7691705 +2022-05-11 12:32:06,780 controller.py: 33 () INFO Published Set Point: 1652286726.7791681 +2022-05-11 12:32:06,790 controller.py: 33 () INFO Published Set Point: 1652286726.7891698 +2022-05-11 12:32:06,800 controller.py: 33 () INFO Published Set Point: 1652286726.7991686 +2022-05-11 12:32:06,810 controller.py: 33 () INFO Published Set Point: 1652286726.8091671 +2022-05-11 12:32:06,820 controller.py: 33 () INFO Published Set Point: 1652286726.8191717 +2022-05-11 12:32:06,830 controller.py: 33 () INFO Published Set Point: 1652286726.8291645 +2022-05-11 12:32:06,840 controller.py: 33 () INFO Published Set Point: 1652286726.8391788 +2022-05-11 12:32:06,850 controller.py: 33 () INFO Published Set Point: 1652286726.8491664 +2022-05-11 12:32:06,860 controller.py: 33 () INFO Published Set Point: 1652286726.8591764 +2022-05-11 12:32:06,870 controller.py: 33 () INFO Published Set Point: 1652286726.8691685 +2022-05-11 12:32:06,880 controller.py: 33 () INFO Published Set Point: 1652286726.879172 +2022-05-11 12:32:06,890 controller.py: 33 () INFO Published Set Point: 1652286726.8891683 +2022-05-11 12:32:06,900 controller.py: 33 () INFO Published Set Point: 1652286726.8991692 +2022-05-11 12:32:06,910 controller.py: 33 () INFO Published Set Point: 1652286726.9091656 +2022-05-11 12:32:06,920 controller.py: 33 () INFO Published Set Point: 1652286726.9191678 +2022-05-11 12:32:06,930 controller.py: 33 () INFO Published Set Point: 1652286726.9291658 +2022-05-11 12:32:06,940 controller.py: 33 () INFO Published Set Point: 1652286726.939172 +2022-05-11 12:32:06,950 controller.py: 33 () INFO Published Set Point: 1652286726.9491699 +2022-05-11 12:32:06,960 controller.py: 33 () INFO Published Set Point: 1652286726.9591215 +2022-05-11 12:32:06,970 controller.py: 33 () INFO Published Set Point: 1652286726.969116 +2022-05-11 12:32:06,980 controller.py: 33 () INFO Published Set Point: 1652286726.9791906 +2022-05-11 12:32:06,990 controller.py: 33 () INFO Published Set Point: 1652286726.989174 +2022-05-11 12:32:07,000 controller.py: 33 () INFO Published Set Point: 1652286726.9991634 +2022-05-11 12:32:07,010 controller.py: 33 () INFO Published Set Point: 1652286727.0092008 +2022-05-11 12:32:07,020 controller.py: 33 () INFO Published Set Point: 1652286727.0191631 +2022-05-11 12:32:07,030 controller.py: 33 () INFO Published Set Point: 1652286727.029167 +2022-05-11 12:32:07,040 controller.py: 33 () INFO Published Set Point: 1652286727.039171 +2022-05-11 12:32:07,050 controller.py: 33 () INFO Published Set Point: 1652286727.0491695 +2022-05-11 12:32:07,060 controller.py: 33 () INFO Published Set Point: 1652286727.059169 +2022-05-11 12:32:07,070 controller.py: 33 () INFO Published Set Point: 1652286727.0691652 +2022-05-11 12:32:07,080 controller.py: 33 () INFO Published Set Point: 1652286727.0791698 +2022-05-11 12:32:07,090 controller.py: 33 () INFO Published Set Point: 1652286727.0891693 +2022-05-11 12:32:07,100 controller.py: 33 () INFO Published Set Point: 1652286727.099168 +2022-05-11 12:32:07,110 controller.py: 33 () INFO Published Set Point: 1652286727.109164 +2022-05-11 12:32:07,120 controller.py: 33 () INFO Published Set Point: 1652286727.1191206 +2022-05-11 12:32:07,130 controller.py: 33 () INFO Published Set Point: 1652286727.1291687 +2022-05-11 12:32:07,140 controller.py: 33 () INFO Published Set Point: 1652286727.1391754 +2022-05-11 12:32:07,150 controller.py: 33 () INFO Published Set Point: 1652286727.1491678 +2022-05-11 12:32:07,160 controller.py: 33 () INFO Published Set Point: 1652286727.1591184 +2022-05-11 12:32:07,170 controller.py: 33 () INFO Published Set Point: 1652286727.1691673 +2022-05-11 12:32:07,180 controller.py: 33 () INFO Published Set Point: 1652286727.1791532 +2022-05-11 12:32:07,190 controller.py: 33 () INFO Published Set Point: 1652286727.1891673 +2022-05-11 12:32:07,200 controller.py: 33 () INFO Published Set Point: 1652286727.1991673 +2022-05-11 12:32:07,210 controller.py: 33 () INFO Published Set Point: 1652286727.2091703 +2022-05-11 12:32:07,220 controller.py: 33 () INFO Published Set Point: 1652286727.2191677 +2022-05-11 12:32:07,230 controller.py: 33 () INFO Published Set Point: 1652286727.2291691 +2022-05-11 12:32:07,240 controller.py: 33 () INFO Published Set Point: 1652286727.2391694 +2022-05-11 12:32:07,250 controller.py: 33 () INFO Published Set Point: 1652286727.249167 +2022-05-11 12:32:07,260 controller.py: 33 () INFO Published Set Point: 1652286727.259155 +2022-05-11 12:32:07,270 controller.py: 33 () INFO Published Set Point: 1652286727.2691686 +2022-05-11 12:32:07,280 controller.py: 33 () INFO Published Set Point: 1652286727.2791612 +2022-05-11 12:32:07,290 controller.py: 33 () INFO Published Set Point: 1652286727.2891798 +2022-05-11 12:32:07,300 controller.py: 33 () INFO Published Set Point: 1652286727.2991714 +2022-05-11 12:32:07,310 controller.py: 33 () INFO Published Set Point: 1652286727.3091536 +2022-05-11 12:32:07,320 controller.py: 33 () INFO Published Set Point: 1652286727.3191695 +2022-05-11 12:32:07,330 controller.py: 33 () INFO Published Set Point: 1652286727.329168 +2022-05-11 12:32:07,340 controller.py: 33 () INFO Published Set Point: 1652286727.339175 +2022-05-11 12:32:07,350 controller.py: 33 () INFO Published Set Point: 1652286727.3491695 +2022-05-11 12:32:07,360 controller.py: 33 () INFO Published Set Point: 1652286727.359167 +2022-05-11 12:32:07,370 controller.py: 33 () INFO Published Set Point: 1652286727.3691676 +2022-05-11 12:32:07,380 controller.py: 33 () INFO Published Set Point: 1652286727.3791723 +2022-05-11 12:32:07,390 controller.py: 33 () INFO Published Set Point: 1652286727.3891454 +2022-05-11 12:32:07,400 controller.py: 33 () INFO Published Set Point: 1652286727.3991673 +2022-05-11 12:32:07,410 controller.py: 33 () INFO Published Set Point: 1652286727.4091675 +2022-05-11 12:32:07,420 controller.py: 33 () INFO Published Set Point: 1652286727.4191778 +2022-05-11 12:32:07,430 controller.py: 33 () INFO Published Set Point: 1652286727.4291677 +2022-05-11 12:32:07,440 controller.py: 33 () INFO Published Set Point: 1652286727.439117 +2022-05-11 12:32:07,450 controller.py: 33 () INFO Published Set Point: 1652286727.449163 +2022-05-11 12:32:07,460 controller.py: 33 () INFO Published Set Point: 1652286727.4591684 +2022-05-11 12:32:07,470 controller.py: 33 () INFO Published Set Point: 1652286727.4691672 +2022-05-11 12:32:07,480 controller.py: 33 () INFO Published Set Point: 1652286727.47916 +2022-05-11 12:32:07,490 controller.py: 33 () INFO Published Set Point: 1652286727.489118 +2022-05-11 12:32:07,500 controller.py: 33 () INFO Published Set Point: 1652286727.4991684 +2022-05-11 12:32:07,510 controller.py: 33 () INFO Published Set Point: 1652286727.5091677 +2022-05-11 12:32:07,520 controller.py: 33 () INFO Published Set Point: 1652286727.519173 +2022-05-11 12:32:07,530 controller.py: 33 () INFO Published Set Point: 1652286727.5291672 +2022-05-11 12:32:07,540 controller.py: 33 () INFO Published Set Point: 1652286727.5391204 +2022-05-11 12:32:07,550 controller.py: 33 () INFO Published Set Point: 1652286727.549171 +2022-05-11 12:32:07,560 controller.py: 33 () INFO Published Set Point: 1652286727.559163 +2022-05-11 12:32:07,570 controller.py: 33 () INFO Published Set Point: 1652286727.5691693 +2022-05-11 12:32:07,580 controller.py: 33 () INFO Published Set Point: 1652286727.5791702 +2022-05-11 12:32:07,590 controller.py: 33 () INFO Published Set Point: 1652286727.5891373 +2022-05-11 12:32:07,600 controller.py: 33 () INFO Published Set Point: 1652286727.5991704 +2022-05-11 12:32:07,610 controller.py: 33 () INFO Published Set Point: 1652286727.6091678 +2022-05-11 12:32:07,620 controller.py: 33 () INFO Published Set Point: 1652286727.619167 +2022-05-11 12:32:07,630 controller.py: 33 () INFO Published Set Point: 1652286727.629154 +2022-05-11 12:32:07,640 controller.py: 33 () INFO Published Set Point: 1652286727.6391377 +2022-05-11 12:32:07,650 controller.py: 33 () INFO Published Set Point: 1652286727.6491077 +2022-05-11 12:32:07,660 controller.py: 33 () INFO Published Set Point: 1652286727.659111 +2022-05-11 12:32:07,670 controller.py: 33 () INFO Published Set Point: 1652286727.6691115 +2022-05-11 12:32:07,680 controller.py: 33 () INFO Published Set Point: 1652286727.6791642 +2022-05-11 12:32:07,690 controller.py: 33 () INFO Published Set Point: 1652286727.6891625 +2022-05-11 12:32:07,700 controller.py: 33 () INFO Published Set Point: 1652286727.6991558 +2022-05-11 12:32:07,710 controller.py: 33 () INFO Published Set Point: 1652286727.7090914 +2022-05-11 12:32:07,720 controller.py: 33 () INFO Published Set Point: 1652286727.7191617 +2022-05-11 12:32:07,730 controller.py: 33 () INFO Published Set Point: 1652286727.7291703 +2022-05-11 12:32:07,740 controller.py: 33 () INFO Published Set Point: 1652286727.7391684 +2022-05-11 12:32:07,750 controller.py: 33 () INFO Published Set Point: 1652286727.7491143 +2022-05-11 12:32:07,760 controller.py: 33 () INFO Published Set Point: 1652286727.7591753 +2022-05-11 12:32:07,770 controller.py: 33 () INFO Published Set Point: 1652286727.769174 +2022-05-11 12:32:07,780 controller.py: 33 () INFO Published Set Point: 1652286727.7791572 +2022-05-11 12:32:07,790 controller.py: 33 () INFO Published Set Point: 1652286727.7891643 +2022-05-11 12:32:07,800 controller.py: 33 () INFO Published Set Point: 1652286727.799167 +2022-05-11 12:32:07,810 controller.py: 33 () INFO Published Set Point: 1652286727.8091497 +2022-05-11 12:32:07,820 controller.py: 33 () INFO Published Set Point: 1652286727.8191772 +2022-05-11 12:32:07,830 controller.py: 33 () INFO Published Set Point: 1652286727.8291569 +2022-05-11 12:32:07,840 controller.py: 33 () INFO Published Set Point: 1652286727.8391666 +2022-05-11 12:32:07,850 controller.py: 33 () INFO Published Set Point: 1652286727.8491619 +2022-05-11 12:32:07,860 controller.py: 33 () INFO Published Set Point: 1652286727.859174 +2022-05-11 12:32:07,870 controller.py: 33 () INFO Published Set Point: 1652286727.8691695 +2022-05-11 12:32:07,880 controller.py: 33 () INFO Published Set Point: 1652286727.8791654 +2022-05-11 12:32:07,890 controller.py: 33 () INFO Published Set Point: 1652286727.8891711 +2022-05-11 12:32:07,900 controller.py: 33 () INFO Published Set Point: 1652286727.8991694 +2022-05-11 12:32:07,910 controller.py: 33 () INFO Published Set Point: 1652286727.9091208 +2022-05-11 12:32:07,920 controller.py: 33 () INFO Published Set Point: 1652286727.9191701 +2022-05-11 12:32:07,930 controller.py: 33 () INFO Published Set Point: 1652286727.9291656 +2022-05-11 12:32:07,940 controller.py: 33 () INFO Published Set Point: 1652286727.9391696 +2022-05-11 12:32:07,950 controller.py: 33 () INFO Published Set Point: 1652286727.949166 +2022-05-11 12:32:07,960 controller.py: 33 () INFO Published Set Point: 1652286727.9591668 +2022-05-11 12:32:07,970 controller.py: 33 () INFO Published Set Point: 1652286727.9691691 +2022-05-11 12:32:07,980 controller.py: 33 () INFO Published Set Point: 1652286727.979128 +2022-05-11 12:32:07,990 controller.py: 33 () INFO Published Set Point: 1652286727.9891684 +2022-05-11 12:32:08,000 controller.py: 33 () INFO Published Set Point: 1652286727.999169 +2022-05-11 12:32:08,010 controller.py: 33 () INFO Published Set Point: 1652286728.0091307 +2022-05-11 12:32:08,020 controller.py: 33 () INFO Published Set Point: 1652286728.019169 +2022-05-11 12:32:08,030 controller.py: 33 () INFO Published Set Point: 1652286728.0291703 +2022-05-11 12:32:08,040 controller.py: 33 () INFO Published Set Point: 1652286728.03917 +2022-05-11 12:32:08,050 controller.py: 33 () INFO Published Set Point: 1652286728.0491662 +2022-05-11 12:32:08,060 controller.py: 33 () INFO Published Set Point: 1652286728.0591693 +2022-05-11 12:32:08,070 controller.py: 33 () INFO Published Set Point: 1652286728.069167 +2022-05-11 12:32:08,080 controller.py: 33 () INFO Published Set Point: 1652286728.079172 +2022-05-11 12:32:08,090 controller.py: 33 () INFO Published Set Point: 1652286728.0891666 +2022-05-11 12:32:08,100 controller.py: 33 () INFO Published Set Point: 1652286728.0991125 +2022-05-11 12:32:08,110 controller.py: 33 () INFO Published Set Point: 1652286728.1091695 +2022-05-11 12:32:08,120 controller.py: 33 () INFO Published Set Point: 1652286728.1191692 +2022-05-11 12:32:08,130 controller.py: 33 () INFO Published Set Point: 1652286728.1291656 +2022-05-11 12:32:08,140 controller.py: 33 () INFO Published Set Point: 1652286728.139168 +2022-05-11 12:32:08,150 controller.py: 33 () INFO Published Set Point: 1652286728.1491613 +2022-05-11 12:32:08,160 controller.py: 33 () INFO Published Set Point: 1652286728.1591687 +2022-05-11 12:32:08,170 controller.py: 33 () INFO Published Set Point: 1652286728.1691585 +2022-05-11 12:32:08,180 controller.py: 33 () INFO Published Set Point: 1652286728.1791203 +2022-05-11 12:32:08,190 controller.py: 33 () INFO Published Set Point: 1652286728.189175 +2022-05-11 12:32:08,199 controller.py: 33 () INFO Published Set Point: 1652286728.199118 +2022-05-11 12:32:08,210 controller.py: 33 () INFO Published Set Point: 1652286728.209168 +2022-05-11 12:32:08,220 controller.py: 33 () INFO Published Set Point: 1652286728.2191656 +2022-05-11 12:32:08,230 controller.py: 33 () INFO Published Set Point: 1652286728.2291727 +2022-05-11 12:32:08,240 controller.py: 33 () INFO Published Set Point: 1652286728.239171 +2022-05-11 12:32:08,250 controller.py: 33 () INFO Published Set Point: 1652286728.2491715 +2022-05-11 12:32:08,260 controller.py: 33 () INFO Published Set Point: 1652286728.259155 +2022-05-11 12:32:08,270 controller.py: 33 () INFO Published Set Point: 1652286728.2691693 +2022-05-11 12:32:08,280 controller.py: 33 () INFO Published Set Point: 1652286728.2791724 +2022-05-11 12:32:08,290 controller.py: 33 () INFO Published Set Point: 1652286728.2891674 +2022-05-11 12:32:08,300 controller.py: 33 () INFO Published Set Point: 1652286728.2991667 +2022-05-11 12:32:08,310 controller.py: 33 () INFO Published Set Point: 1652286728.309169 +2022-05-11 12:32:08,320 controller.py: 33 () INFO Published Set Point: 1652286728.319172 +2022-05-11 12:32:08,330 controller.py: 33 () INFO Published Set Point: 1652286728.3291728 +2022-05-11 12:32:08,340 controller.py: 33 () INFO Published Set Point: 1652286728.3391206 +2022-05-11 12:32:08,350 controller.py: 33 () INFO Published Set Point: 1652286728.349137 +2022-05-11 12:32:08,360 controller.py: 33 () INFO Published Set Point: 1652286728.3591666 +2022-05-11 12:32:08,370 controller.py: 33 () INFO Published Set Point: 1652286728.3691661 +2022-05-11 12:32:08,380 controller.py: 33 () INFO Published Set Point: 1652286728.3791697 +2022-05-11 12:32:08,390 controller.py: 33 () INFO Published Set Point: 1652286728.3891692 +2022-05-11 12:32:08,400 controller.py: 33 () INFO Published Set Point: 1652286728.3991683 +2022-05-11 12:32:08,410 controller.py: 33 () INFO Published Set Point: 1652286728.4091673 +2022-05-11 12:32:08,420 controller.py: 33 () INFO Published Set Point: 1652286728.4191694 +2022-05-11 12:32:08,430 controller.py: 33 () INFO Published Set Point: 1652286728.4291656 +2022-05-11 12:32:08,440 controller.py: 33 () INFO Published Set Point: 1652286728.4391835 +2022-05-11 12:32:08,450 controller.py: 33 () INFO Published Set Point: 1652286728.4491172 +2022-05-11 12:32:08,460 controller.py: 33 () INFO Published Set Point: 1652286728.4591658 +2022-05-11 12:32:08,470 controller.py: 33 () INFO Published Set Point: 1652286728.4691756 +2022-05-11 12:32:08,480 controller.py: 33 () INFO Published Set Point: 1652286728.4791837 +2022-05-11 12:32:08,490 controller.py: 33 () INFO Published Set Point: 1652286728.4891167 +2022-05-11 12:32:08,500 controller.py: 33 () INFO Published Set Point: 1652286728.4991677 +2022-05-11 12:32:08,510 controller.py: 33 () INFO Published Set Point: 1652286728.5091655 +2022-05-11 12:32:08,520 controller.py: 33 () INFO Published Set Point: 1652286728.5191808 +2022-05-11 12:32:08,530 controller.py: 33 () INFO Published Set Point: 1652286728.529137 +2022-05-11 12:32:08,540 controller.py: 33 () INFO Published Set Point: 1652286728.539167 +2022-05-11 12:32:08,550 controller.py: 33 () INFO Published Set Point: 1652286728.5491648 +2022-05-11 12:32:08,560 controller.py: 33 () INFO Published Set Point: 1652286728.5591674 +2022-05-11 12:32:08,570 controller.py: 33 () INFO Published Set Point: 1652286728.569163 +2022-05-11 12:32:08,580 controller.py: 33 () INFO Published Set Point: 1652286728.579167 +2022-05-11 12:32:08,590 controller.py: 33 () INFO Published Set Point: 1652286728.58917 +2022-05-11 12:32:08,600 controller.py: 33 () INFO Published Set Point: 1652286728.5991678 +2022-05-11 12:32:08,610 controller.py: 33 () INFO Published Set Point: 1652286728.6091666 +2022-05-11 12:32:08,620 controller.py: 33 () INFO Published Set Point: 1652286728.619173 +2022-05-11 12:32:08,630 controller.py: 33 () INFO Published Set Point: 1652286728.6291654 +2022-05-11 12:32:08,640 controller.py: 33 () INFO Published Set Point: 1652286728.6391683 +2022-05-11 12:32:08,650 controller.py: 33 () INFO Published Set Point: 1652286728.649166 +2022-05-11 12:32:08,660 controller.py: 33 () INFO Published Set Point: 1652286728.6591678 +2022-05-11 12:32:08,670 controller.py: 33 () INFO Published Set Point: 1652286728.6691709 +2022-05-11 12:32:08,680 controller.py: 33 () INFO Published Set Point: 1652286728.6791594 +2022-05-11 12:32:08,690 controller.py: 33 () INFO Published Set Point: 1652286728.6891634 +2022-05-11 12:32:08,700 controller.py: 33 () INFO Published Set Point: 1652286728.6991668 +2022-05-11 12:32:08,710 controller.py: 33 () INFO Published Set Point: 1652286728.7091208 +2022-05-11 12:32:08,720 controller.py: 33 () INFO Published Set Point: 1652286728.7191617 +2022-05-11 12:32:08,730 controller.py: 33 () INFO Published Set Point: 1652286728.7291658 +2022-05-11 12:32:08,740 controller.py: 33 () INFO Published Set Point: 1652286728.7391698 +2022-05-11 12:32:08,750 controller.py: 33 () INFO Published Set Point: 1652286728.7491667 +2022-05-11 12:32:08,760 controller.py: 33 () INFO Published Set Point: 1652286728.7591724 +2022-05-11 12:32:08,770 controller.py: 33 () INFO Published Set Point: 1652286728.7691176 +2022-05-11 12:32:08,780 controller.py: 33 () INFO Published Set Point: 1652286728.7791681 +2022-05-11 12:32:08,790 controller.py: 33 () INFO Published Set Point: 1652286728.789117 +2022-05-11 12:32:08,804 controller.py: 33 () INFO Published Set Point: 1652286728.800247 +2022-05-11 12:32:08,810 controller.py: 33 () INFO Published Set Point: 1652286728.8091397 +2022-05-11 12:32:08,820 controller.py: 33 () INFO Published Set Point: 1652286728.8191874 +2022-05-11 12:32:08,830 controller.py: 33 () INFO Published Set Point: 1652286728.8291261 +2022-05-11 12:32:08,840 controller.py: 33 () INFO Published Set Point: 1652286728.83912 +2022-05-11 12:32:08,850 controller.py: 33 () INFO Published Set Point: 1652286728.849168 +2022-05-11 12:32:08,860 controller.py: 33 () INFO Published Set Point: 1652286728.8591697 +2022-05-11 12:32:08,870 controller.py: 33 () INFO Published Set Point: 1652286728.8691607 +2022-05-11 12:32:08,880 controller.py: 33 () INFO Published Set Point: 1652286728.8791134 +2022-05-11 12:32:08,899 controller.py: 33 () INFO Published Set Point: 1652286728.8950698 +2022-05-11 12:32:08,901 controller.py: 33 () INFO Published Set Point: 1652286728.8999949 +2022-05-11 12:32:08,921 controller.py: 33 () INFO Published Set Point: 1652286728.9200835 +2022-05-11 12:32:08,931 controller.py: 33 () INFO Published Set Point: 1652286728.9300876 +2022-05-11 12:32:08,945 controller.py: 33 () INFO Published Set Point: 1652286728.9406843 +2022-05-11 12:32:08,952 controller.py: 33 () INFO Published Set Point: 1652286728.950081 +2022-05-11 12:32:08,962 controller.py: 33 () INFO Published Set Point: 1652286728.9600835 +2022-05-11 12:32:08,972 controller.py: 33 () INFO Published Set Point: 1652286728.9700787 +2022-05-11 12:32:08,982 controller.py: 33 () INFO Published Set Point: 1652286728.9800947 +2022-05-11 12:32:08,991 controller.py: 33 () INFO Published Set Point: 1652286728.9900792 +2022-05-11 12:32:09,001 controller.py: 33 () INFO Published Set Point: 1652286729.0001135 +2022-05-11 12:32:09,011 controller.py: 33 () INFO Published Set Point: 1652286729.0101244 +2022-05-11 12:32:09,021 controller.py: 33 () INFO Published Set Point: 1652286729.0201263 +2022-05-11 12:32:09,031 controller.py: 33 () INFO Published Set Point: 1652286729.0300782 +2022-05-11 12:32:09,041 controller.py: 33 () INFO Published Set Point: 1652286729.0401149 +2022-05-11 12:32:09,051 controller.py: 33 () INFO Published Set Point: 1652286729.0501227 +2022-05-11 12:32:09,061 controller.py: 33 () INFO Published Set Point: 1652286729.0601144 +2022-05-11 12:32:09,071 controller.py: 33 () INFO Published Set Point: 1652286729.070136 +2022-05-11 12:32:09,081 controller.py: 33 () INFO Published Set Point: 1652286729.0801392 +2022-05-11 12:32:09,091 controller.py: 33 () INFO Published Set Point: 1652286729.0901158 +2022-05-11 12:32:09,101 controller.py: 33 () INFO Published Set Point: 1652286729.1000733 +2022-05-11 12:32:09,111 controller.py: 33 () INFO Published Set Point: 1652286729.1100714 +2022-05-11 12:32:09,121 controller.py: 33 () INFO Published Set Point: 1652286729.1200728 +2022-05-11 12:32:09,131 controller.py: 33 () INFO Published Set Point: 1652286729.130115 +2022-05-11 12:32:09,141 controller.py: 33 () INFO Published Set Point: 1652286729.1401186 +2022-05-11 12:32:09,151 controller.py: 33 () INFO Published Set Point: 1652286729.150084 +2022-05-11 12:32:09,161 controller.py: 33 () INFO Published Set Point: 1652286729.1601148 +2022-05-11 12:32:09,171 controller.py: 33 () INFO Published Set Point: 1652286729.1701167 +2022-05-11 12:32:09,181 controller.py: 33 () INFO Published Set Point: 1652286729.1801226 +2022-05-11 12:32:09,191 controller.py: 33 () INFO Published Set Point: 1652286729.190091 +2022-05-11 12:32:09,201 controller.py: 33 () INFO Published Set Point: 1652286729.200074 +2022-05-11 12:32:09,211 controller.py: 33 () INFO Published Set Point: 1652286729.210115 +2022-05-11 12:32:09,221 controller.py: 33 () INFO Published Set Point: 1652286729.2201211 +2022-05-11 12:32:09,231 controller.py: 33 () INFO Published Set Point: 1652286729.230116 +2022-05-11 12:32:09,241 controller.py: 33 () INFO Published Set Point: 1652286729.240117 +2022-05-11 12:32:09,251 controller.py: 33 () INFO Published Set Point: 1652286729.250089 +2022-05-11 12:32:09,261 controller.py: 33 () INFO Published Set Point: 1652286729.2601242 +2022-05-11 12:32:09,271 controller.py: 33 () INFO Published Set Point: 1652286729.270091 +2022-05-11 12:32:09,281 controller.py: 33 () INFO Published Set Point: 1652286729.2800732 +2022-05-11 12:32:09,291 controller.py: 33 () INFO Published Set Point: 1652286729.2900856 +2022-05-11 12:32:09,301 controller.py: 33 () INFO Published Set Point: 1652286729.3000848 +2022-05-11 12:32:09,311 controller.py: 33 () INFO Published Set Point: 1652286729.31012 +2022-05-11 12:32:09,321 controller.py: 33 () INFO Published Set Point: 1652286729.320128 +2022-05-11 12:32:09,331 controller.py: 33 () INFO Published Set Point: 1652286729.3300745 +2022-05-11 12:32:09,341 controller.py: 33 () INFO Published Set Point: 1652286729.3401022 +2022-05-11 12:32:09,351 controller.py: 33 () INFO Published Set Point: 1652286729.3501353 +2022-05-11 12:32:09,361 controller.py: 33 () INFO Published Set Point: 1652286729.3601182 +2022-05-11 12:32:09,371 controller.py: 33 () INFO Published Set Point: 1652286729.370097 +2022-05-11 12:32:09,381 controller.py: 33 () INFO Published Set Point: 1652286729.380088 +2022-05-11 12:32:09,392 controller.py: 33 () INFO Published Set Point: 1652286729.3900728 +2022-05-11 12:32:09,401 controller.py: 33 () INFO Published Set Point: 1652286729.4001126 +2022-05-11 12:32:09,411 controller.py: 33 () INFO Published Set Point: 1652286729.4100933 +2022-05-11 12:32:09,421 controller.py: 33 () INFO Published Set Point: 1652286729.4201274 +2022-05-11 12:32:09,431 controller.py: 33 () INFO Published Set Point: 1652286729.4301121 +2022-05-11 12:32:09,441 controller.py: 33 () INFO Published Set Point: 1652286729.440076 +2022-05-11 12:32:09,451 controller.py: 33 () INFO Published Set Point: 1652286729.4501104 +2022-05-11 12:32:09,461 controller.py: 33 () INFO Published Set Point: 1652286729.4600835 +2022-05-11 12:32:09,471 controller.py: 33 () INFO Published Set Point: 1652286729.4700723 +2022-05-11 12:32:09,481 controller.py: 33 () INFO Published Set Point: 1652286729.4800713 +2022-05-11 12:32:09,491 controller.py: 33 () INFO Published Set Point: 1652286729.4900837 +2022-05-11 12:32:09,501 controller.py: 33 () INFO Published Set Point: 1652286729.5001185 +2022-05-11 12:32:09,511 controller.py: 33 () INFO Published Set Point: 1652286729.510121 +2022-05-11 12:32:09,521 controller.py: 33 () INFO Published Set Point: 1652286729.520083 +2022-05-11 12:32:09,531 controller.py: 33 () INFO Published Set Point: 1652286729.530083 +2022-05-11 12:32:09,541 controller.py: 33 () INFO Published Set Point: 1652286729.540086 +2022-05-11 12:32:09,551 controller.py: 33 () INFO Published Set Point: 1652286729.550074 +2022-05-11 12:32:09,561 controller.py: 33 () INFO Published Set Point: 1652286729.5601304 +2022-05-11 12:32:09,571 controller.py: 33 () INFO Published Set Point: 1652286729.5701208 +2022-05-11 12:32:09,580 controller.py: 33 () INFO Published Set Point: 1652286729.5801208 +2022-05-11 12:32:09,590 controller.py: 33 () INFO Published Set Point: 1652286729.5901182 +2022-05-11 12:32:09,600 controller.py: 33 () INFO Published Set Point: 1652286729.60012 +2022-05-11 12:32:09,610 controller.py: 33 () INFO Published Set Point: 1652286729.6100743 +2022-05-11 12:32:09,620 controller.py: 33 () INFO Published Set Point: 1652286729.6201308 +2022-05-11 12:32:09,630 controller.py: 33 () INFO Published Set Point: 1652286729.6301193 +2022-05-11 12:32:09,640 controller.py: 33 () INFO Published Set Point: 1652286729.640121 +2022-05-11 12:32:09,650 controller.py: 33 () INFO Published Set Point: 1652286729.650111 +2022-05-11 12:32:09,660 controller.py: 33 () INFO Published Set Point: 1652286729.6601207 +2022-05-11 12:32:09,670 controller.py: 33 () INFO Published Set Point: 1652286729.6701233 +2022-05-11 12:32:09,680 controller.py: 33 () INFO Published Set Point: 1652286729.6801143 +2022-05-11 12:32:09,690 controller.py: 33 () INFO Published Set Point: 1652286729.690119 +2022-05-11 12:32:09,700 controller.py: 33 () INFO Published Set Point: 1652286729.700115 +2022-05-11 12:32:09,711 controller.py: 33 () INFO Published Set Point: 1652286729.7101169 +2022-05-11 12:32:09,721 controller.py: 33 () INFO Published Set Point: 1652286729.7200801 +2022-05-11 12:32:09,731 controller.py: 33 () INFO Published Set Point: 1652286729.7301302 +2022-05-11 12:32:09,741 controller.py: 33 () INFO Published Set Point: 1652286729.740123 +2022-05-11 12:32:09,751 controller.py: 33 () INFO Published Set Point: 1652286729.7501278 +2022-05-11 12:32:09,761 controller.py: 33 () INFO Published Set Point: 1652286729.7600992 +2022-05-11 12:32:09,771 controller.py: 33 () INFO Published Set Point: 1652286729.770117 +2022-05-11 12:32:09,781 controller.py: 33 () INFO Published Set Point: 1652286729.78014 +2022-05-11 12:32:09,791 controller.py: 33 () INFO Published Set Point: 1652286729.7901213 +2022-05-11 12:32:09,801 controller.py: 33 () INFO Published Set Point: 1652286729.800075 +2022-05-11 12:32:09,811 controller.py: 33 () INFO Published Set Point: 1652286729.8101182 +2022-05-11 12:32:09,821 controller.py: 33 () INFO Published Set Point: 1652286729.8201194 +2022-05-11 12:32:09,831 controller.py: 33 () INFO Published Set Point: 1652286729.8301024 +2022-05-11 12:32:09,841 controller.py: 33 () INFO Published Set Point: 1652286729.8401272 +2022-05-11 12:32:09,851 controller.py: 33 () INFO Published Set Point: 1652286729.8501282 +2022-05-11 12:32:09,861 controller.py: 33 () INFO Published Set Point: 1652286729.8601232 +2022-05-11 12:32:09,871 controller.py: 33 () INFO Published Set Point: 1652286729.870068 +2022-05-11 12:32:09,881 controller.py: 33 () INFO Published Set Point: 1652286729.880119 +2022-05-11 12:32:09,891 controller.py: 33 () INFO Published Set Point: 1652286729.8901165 +2022-05-11 12:32:09,901 controller.py: 33 () INFO Published Set Point: 1652286729.9001184 +2022-05-11 12:32:09,911 controller.py: 33 () INFO Published Set Point: 1652286729.9101188 +2022-05-11 12:32:09,921 controller.py: 33 () INFO Published Set Point: 1652286729.9200869 +2022-05-11 12:32:09,931 controller.py: 33 () INFO Published Set Point: 1652286729.9301174 +2022-05-11 12:32:09,941 controller.py: 33 () INFO Published Set Point: 1652286729.9401183 +2022-05-11 12:32:09,951 controller.py: 33 () INFO Published Set Point: 1652286729.9501207 +2022-05-11 12:32:09,961 controller.py: 33 () INFO Published Set Point: 1652286729.9601183 +2022-05-11 12:32:09,971 controller.py: 33 () INFO Published Set Point: 1652286729.9700875 +2022-05-11 12:32:09,981 controller.py: 33 () INFO Published Set Point: 1652286729.980126 +2022-05-11 12:32:09,991 controller.py: 33 () INFO Published Set Point: 1652286729.9901183 +2022-05-11 12:32:10,001 controller.py: 33 () INFO Published Set Point: 1652286730.0001202 +2022-05-11 12:32:10,011 controller.py: 33 () INFO Published Set Point: 1652286730.0101144 +2022-05-11 12:32:10,021 controller.py: 33 () INFO Published Set Point: 1652286730.0201676 +2022-05-11 12:32:10,031 controller.py: 33 () INFO Published Set Point: 1652286730.0301204 +2022-05-11 12:32:10,041 controller.py: 33 () INFO Published Set Point: 1652286730.0401254 +2022-05-11 12:32:10,051 controller.py: 33 () INFO Published Set Point: 1652286730.05019 +2022-05-11 12:32:10,061 controller.py: 33 () INFO Published Set Point: 1652286730.0600948 +2022-05-11 12:32:10,071 controller.py: 33 () INFO Published Set Point: 1652286730.0701194 +2022-05-11 12:32:10,081 controller.py: 33 () INFO Published Set Point: 1652286730.0801208 +2022-05-11 12:32:10,091 controller.py: 33 () INFO Published Set Point: 1652286730.0900733 +2022-05-11 12:32:10,101 controller.py: 33 () INFO Published Set Point: 1652286730.1001198 +2022-05-11 12:32:10,111 controller.py: 33 () INFO Published Set Point: 1652286730.110126 +2022-05-11 12:32:10,121 controller.py: 33 () INFO Published Set Point: 1652286730.1200721 +2022-05-11 12:32:10,130 controller.py: 33 () INFO Published Set Point: 1652286730.1301098 +2022-05-11 12:32:10,140 controller.py: 33 () INFO Published Set Point: 1652286730.140105 +2022-05-11 12:32:10,150 controller.py: 33 () INFO Published Set Point: 1652286730.1501126 +2022-05-11 12:32:10,160 controller.py: 33 () INFO Published Set Point: 1652286730.1601129 +2022-05-11 12:32:10,170 controller.py: 33 () INFO Published Set Point: 1652286730.1701186 +2022-05-11 12:32:10,180 controller.py: 33 () INFO Published Set Point: 1652286730.1801174 +2022-05-11 12:32:10,190 controller.py: 33 () INFO Published Set Point: 1652286730.1901152 +2022-05-11 12:32:10,200 controller.py: 33 () INFO Published Set Point: 1652286730.200119 +2022-05-11 12:32:10,210 controller.py: 33 () INFO Published Set Point: 1652286730.2101176 +2022-05-11 12:32:10,221 controller.py: 33 () INFO Published Set Point: 1652286730.2201247 +2022-05-11 12:32:10,231 controller.py: 33 () INFO Published Set Point: 1652286730.2300997 +2022-05-11 12:32:10,241 controller.py: 33 () INFO Published Set Point: 1652286730.2401266 +2022-05-11 12:32:10,251 controller.py: 33 () INFO Published Set Point: 1652286730.2501197 +2022-05-11 12:32:10,261 controller.py: 33 () INFO Published Set Point: 1652286730.2601235 +2022-05-11 12:32:10,270 controller.py: 33 () INFO Published Set Point: 1652286730.270122 +2022-05-11 12:32:10,280 controller.py: 33 () INFO Published Set Point: 1652286730.2801206 +2022-05-11 12:32:10,290 controller.py: 33 () INFO Published Set Point: 1652286730.2901213 +2022-05-11 12:32:10,300 controller.py: 33 () INFO Published Set Point: 1652286730.3001194 +2022-05-11 12:32:10,311 controller.py: 33 () INFO Published Set Point: 1652286730.3101192 +2022-05-11 12:32:10,321 controller.py: 33 () INFO Published Set Point: 1652286730.320118 +2022-05-11 12:32:10,331 controller.py: 33 () INFO Published Set Point: 1652286730.3301182 +2022-05-11 12:32:10,341 controller.py: 33 () INFO Published Set Point: 1652286730.3401222 +2022-05-11 12:32:10,351 controller.py: 33 () INFO Published Set Point: 1652286730.3501215 +2022-05-11 12:32:10,361 controller.py: 33 () INFO Published Set Point: 1652286730.3601215 +2022-05-11 12:32:10,371 controller.py: 33 () INFO Published Set Point: 1652286730.3700922 +2022-05-11 12:32:10,381 controller.py: 33 () INFO Published Set Point: 1652286730.3800843 +2022-05-11 12:32:10,391 controller.py: 33 () INFO Published Set Point: 1652286730.390079 +2022-05-11 12:32:10,401 controller.py: 33 () INFO Published Set Point: 1652286730.4000823 +2022-05-11 12:32:10,411 controller.py: 33 () INFO Published Set Point: 1652286730.410083 +2022-05-11 12:32:10,421 controller.py: 33 () INFO Published Set Point: 1652286730.4200826 +2022-05-11 12:32:10,431 controller.py: 33 () INFO Published Set Point: 1652286730.4300814 +2022-05-11 12:32:10,441 controller.py: 33 () INFO Published Set Point: 1652286730.4400828 +2022-05-11 12:32:10,451 controller.py: 33 () INFO Published Set Point: 1652286730.4500823 +2022-05-11 12:32:10,461 controller.py: 33 () INFO Published Set Point: 1652286730.460082 +2022-05-11 12:32:10,471 controller.py: 33 () INFO Published Set Point: 1652286730.470083 +2022-05-11 12:32:10,481 controller.py: 33 () INFO Published Set Point: 1652286730.4800828 +2022-05-11 12:32:10,491 controller.py: 33 () INFO Published Set Point: 1652286730.4900813 +2022-05-11 12:32:10,501 controller.py: 33 () INFO Published Set Point: 1652286730.5000894 +2022-05-11 12:32:10,511 controller.py: 33 () INFO Published Set Point: 1652286730.5100899 +2022-05-11 12:32:10,521 controller.py: 33 () INFO Published Set Point: 1652286730.5200918 +2022-05-11 12:32:10,531 controller.py: 33 () INFO Published Set Point: 1652286730.5300918 +2022-05-11 12:32:10,541 controller.py: 33 () INFO Published Set Point: 1652286730.5400927 +2022-05-11 12:32:10,551 controller.py: 33 () INFO Published Set Point: 1652286730.5500937 +2022-05-11 12:32:10,561 controller.py: 33 () INFO Published Set Point: 1652286730.5600877 +2022-05-11 12:32:10,571 controller.py: 33 () INFO Published Set Point: 1652286730.5701218 +2022-05-11 12:32:10,581 controller.py: 33 () INFO Published Set Point: 1652286730.5800753 +2022-05-11 12:32:10,591 controller.py: 33 () INFO Published Set Point: 1652286730.5900867 +2022-05-11 12:32:10,601 controller.py: 33 () INFO Published Set Point: 1652286730.6000822 +2022-05-11 12:32:10,611 controller.py: 33 () INFO Published Set Point: 1652286730.610082 +2022-05-11 12:32:10,621 controller.py: 33 () INFO Published Set Point: 1652286730.6201236 +2022-05-11 12:32:10,631 controller.py: 33 () INFO Published Set Point: 1652286730.6300757 +2022-05-11 12:32:10,641 controller.py: 33 () INFO Published Set Point: 1652286730.6400757 +2022-05-11 12:32:10,651 controller.py: 33 () INFO Published Set Point: 1652286730.6500742 +2022-05-11 12:32:10,661 controller.py: 33 () INFO Published Set Point: 1652286730.6601174 +2022-05-11 12:32:10,671 controller.py: 33 () INFO Published Set Point: 1652286730.6700885 +2022-05-11 12:32:10,681 controller.py: 33 () INFO Published Set Point: 1652286730.6800885 +2022-05-11 12:32:10,691 controller.py: 33 () INFO Published Set Point: 1652286730.6901119 +2022-05-11 12:32:10,701 controller.py: 33 () INFO Published Set Point: 1652286730.7001116 +2022-05-11 12:32:10,711 controller.py: 33 () INFO Published Set Point: 1652286730.7101183 +2022-05-11 12:32:10,721 controller.py: 33 () INFO Published Set Point: 1652286730.7200835 +2022-05-11 12:32:10,734 controller.py: 33 () INFO Published Set Point: 1652286730.7333298 +2022-05-11 12:32:10,741 controller.py: 33 () INFO Published Set Point: 1652286730.740083 +2022-05-11 12:32:10,751 controller.py: 33 () INFO Published Set Point: 1652286730.7500854 +2022-05-11 12:32:10,761 controller.py: 33 () INFO Published Set Point: 1652286730.7600904 +2022-05-11 12:32:10,771 controller.py: 33 () INFO Published Set Point: 1652286730.7700872 +2022-05-11 12:32:10,781 controller.py: 33 () INFO Published Set Point: 1652286730.780078 +2022-05-11 12:32:10,791 controller.py: 33 () INFO Published Set Point: 1652286730.7901258 +2022-05-11 12:32:10,801 controller.py: 33 () INFO Published Set Point: 1652286730.8001273 +2022-05-11 12:32:10,811 controller.py: 33 () INFO Published Set Point: 1652286730.8101223 +2022-05-11 12:32:10,821 controller.py: 33 () INFO Published Set Point: 1652286730.8200817 +2022-05-11 12:32:10,831 controller.py: 33 () INFO Published Set Point: 1652286730.8301218 +2022-05-11 12:32:10,841 controller.py: 33 () INFO Published Set Point: 1652286730.8400826 +2022-05-11 12:32:10,851 controller.py: 33 () INFO Published Set Point: 1652286730.8501194 +2022-05-11 12:32:10,861 controller.py: 33 () INFO Published Set Point: 1652286730.8601167 +2022-05-11 12:32:10,871 controller.py: 33 () INFO Published Set Point: 1652286730.8701155 +2022-05-11 12:32:10,881 controller.py: 33 () INFO Published Set Point: 1652286730.8801181 +2022-05-11 12:32:10,891 controller.py: 33 () INFO Published Set Point: 1652286730.8901186 +2022-05-11 12:32:10,901 controller.py: 33 () INFO Published Set Point: 1652286730.9001124 +2022-05-11 12:32:10,911 controller.py: 33 () INFO Published Set Point: 1652286730.910118 +2022-05-11 12:32:10,921 controller.py: 33 () INFO Published Set Point: 1652286730.9201121 +2022-05-11 12:32:10,930 controller.py: 33 () INFO Published Set Point: 1652286730.9301076 +2022-05-11 12:32:10,941 controller.py: 33 () INFO Published Set Point: 1652286730.9400783 +2022-05-11 12:32:10,950 controller.py: 33 () INFO Published Set Point: 1652286730.9501045 +2022-05-11 12:32:10,961 controller.py: 33 () INFO Published Set Point: 1652286730.960113 +2022-05-11 12:32:10,971 controller.py: 33 () INFO Published Set Point: 1652286730.9701133 +2022-05-11 12:32:10,981 controller.py: 33 () INFO Published Set Point: 1652286730.9801128 +2022-05-11 12:32:10,991 controller.py: 33 () INFO Published Set Point: 1652286730.990113 +2022-05-11 12:32:11,001 controller.py: 33 () INFO Published Set Point: 1652286731.0001235 +2022-05-11 12:32:11,011 controller.py: 33 () INFO Published Set Point: 1652286731.010119 +2022-05-11 12:32:11,021 controller.py: 33 () INFO Published Set Point: 1652286731.0201275 +2022-05-11 12:32:11,031 controller.py: 33 () INFO Published Set Point: 1652286731.0301132 +2022-05-11 12:32:11,041 controller.py: 33 () INFO Published Set Point: 1652286731.0400765 +2022-05-11 12:32:11,051 controller.py: 33 () INFO Published Set Point: 1652286731.050108 +2022-05-11 12:32:11,061 controller.py: 33 () INFO Published Set Point: 1652286731.060083 +2022-05-11 12:32:11,071 controller.py: 33 () INFO Published Set Point: 1652286731.0700748 +2022-05-11 12:32:11,081 controller.py: 33 () INFO Published Set Point: 1652286731.0800805 +2022-05-11 12:32:11,091 controller.py: 33 () INFO Published Set Point: 1652286731.0901139 +2022-05-11 12:32:11,101 controller.py: 33 () INFO Published Set Point: 1652286731.1000786 +2022-05-11 12:32:11,111 controller.py: 33 () INFO Published Set Point: 1652286731.1100864 +2022-05-11 12:32:11,121 controller.py: 33 () INFO Published Set Point: 1652286731.1201198 +2022-05-11 12:32:11,131 controller.py: 33 () INFO Published Set Point: 1652286731.1301122 +2022-05-11 12:32:11,141 controller.py: 33 () INFO Published Set Point: 1652286731.1400795 +2022-05-11 12:32:11,150 controller.py: 33 () INFO Published Set Point: 1652286731.1500735 +2022-05-11 12:32:11,161 controller.py: 33 () INFO Published Set Point: 1652286731.160121 +2022-05-11 12:32:11,170 controller.py: 33 () INFO Published Set Point: 1652286731.1701171 +2022-05-11 12:32:11,181 controller.py: 33 () INFO Published Set Point: 1652286731.1800797 +2022-05-11 12:32:11,191 controller.py: 33 () INFO Published Set Point: 1652286731.1901195 +2022-05-11 12:32:11,201 controller.py: 33 () INFO Published Set Point: 1652286731.2001054 +2022-05-11 12:32:11,211 controller.py: 33 () INFO Published Set Point: 1652286731.210116 +2022-05-11 12:32:11,221 controller.py: 33 () INFO Published Set Point: 1652286731.2200794 +2022-05-11 12:32:11,231 controller.py: 33 () INFO Published Set Point: 1652286731.2301242 +2022-05-11 12:32:11,241 controller.py: 33 () INFO Published Set Point: 1652286731.2400694 +2022-05-11 12:32:11,251 controller.py: 33 () INFO Published Set Point: 1652286731.2500782 +2022-05-11 12:32:11,261 controller.py: 33 () INFO Published Set Point: 1652286731.2601054 +2022-05-11 12:32:11,271 controller.py: 33 () INFO Published Set Point: 1652286731.2701178 +2022-05-11 12:32:11,281 controller.py: 33 () INFO Published Set Point: 1652286731.2801135 +2022-05-11 12:32:11,291 controller.py: 33 () INFO Published Set Point: 1652286731.2901194 +2022-05-11 12:32:11,301 controller.py: 33 () INFO Published Set Point: 1652286731.300115 +2022-05-11 12:32:11,311 controller.py: 33 () INFO Published Set Point: 1652286731.3101232 +2022-05-11 12:32:11,321 controller.py: 33 () INFO Published Set Point: 1652286731.3201065 +2022-05-11 12:32:11,331 controller.py: 33 () INFO Published Set Point: 1652286731.3301215 +2022-05-11 12:32:11,341 controller.py: 33 () INFO Published Set Point: 1652286731.3401184 +2022-05-11 12:32:11,351 controller.py: 33 () INFO Published Set Point: 1652286731.350125 +2022-05-11 12:32:11,361 controller.py: 33 () INFO Published Set Point: 1652286731.3601203 +2022-05-11 12:32:11,371 controller.py: 33 () INFO Published Set Point: 1652286731.3701148 +2022-05-11 12:32:11,381 controller.py: 33 () INFO Published Set Point: 1652286731.3800828 +2022-05-11 12:32:11,391 controller.py: 33 () INFO Published Set Point: 1652286731.3901143 +2022-05-11 12:32:11,401 controller.py: 33 () INFO Published Set Point: 1652286731.4001176 +2022-05-11 12:32:11,411 controller.py: 33 () INFO Published Set Point: 1652286731.4101143 +2022-05-11 12:32:11,421 controller.py: 33 () INFO Published Set Point: 1652286731.4201202 +2022-05-11 12:32:11,431 controller.py: 33 () INFO Published Set Point: 1652286731.4301252 +2022-05-11 12:32:11,441 controller.py: 33 () INFO Published Set Point: 1652286731.4401128 +2022-05-11 12:32:11,451 controller.py: 33 () INFO Published Set Point: 1652286731.45012 +2022-05-11 12:32:11,461 controller.py: 33 () INFO Published Set Point: 1652286731.4601114 +2022-05-11 12:32:11,471 controller.py: 33 () INFO Published Set Point: 1652286731.4701164 +2022-05-11 12:32:11,481 controller.py: 33 () INFO Published Set Point: 1652286731.480124 +2022-05-11 12:32:11,491 controller.py: 33 () INFO Published Set Point: 1652286731.4901164 +2022-05-11 12:32:11,501 controller.py: 33 () INFO Published Set Point: 1652286731.500118 +2022-05-11 12:32:11,511 controller.py: 33 () INFO Published Set Point: 1652286731.5101178 +2022-05-11 12:32:11,520 controller.py: 33 () INFO Published Set Point: 1652286731.5201163 +2022-05-11 12:32:11,531 controller.py: 33 () INFO Published Set Point: 1652286731.5301151 +2022-05-11 12:32:11,541 controller.py: 33 () INFO Published Set Point: 1652286731.5401156 +2022-05-11 12:32:11,551 controller.py: 33 () INFO Published Set Point: 1652286731.5501187 +2022-05-11 12:32:11,560 controller.py: 33 () INFO Published Set Point: 1652286731.5601156 +2022-05-11 12:32:11,571 controller.py: 33 () INFO Published Set Point: 1652286731.570117 +2022-05-11 12:32:11,581 controller.py: 33 () INFO Published Set Point: 1652286731.5801175 +2022-05-11 12:32:11,591 controller.py: 33 () INFO Published Set Point: 1652286731.5901172 +2022-05-11 12:32:11,600 controller.py: 33 () INFO Published Set Point: 1652286731.6000638 +2022-05-11 12:32:11,611 controller.py: 33 () INFO Published Set Point: 1652286731.6100748 +2022-05-11 12:32:11,621 controller.py: 33 () INFO Published Set Point: 1652286731.620068 +2022-05-11 12:32:11,631 controller.py: 33 () INFO Published Set Point: 1652286731.6300738 +2022-05-11 12:32:11,641 controller.py: 33 () INFO Published Set Point: 1652286731.640121 +2022-05-11 12:32:11,651 controller.py: 33 () INFO Published Set Point: 1652286731.6501176 +2022-05-11 12:32:11,661 controller.py: 33 () INFO Published Set Point: 1652286731.660116 +2022-05-11 12:32:11,671 controller.py: 33 () INFO Published Set Point: 1652286731.6701171 +2022-05-11 12:32:11,681 controller.py: 33 () INFO Published Set Point: 1652286731.6801107 +2022-05-11 12:32:11,691 controller.py: 33 () INFO Published Set Point: 1652286731.6901157 +2022-05-11 12:32:11,701 controller.py: 33 () INFO Published Set Point: 1652286731.7001152 +2022-05-11 12:32:11,711 controller.py: 33 () INFO Published Set Point: 1652286731.7101161 +2022-05-11 12:32:11,720 controller.py: 33 () INFO Published Set Point: 1652286731.7201161 +2022-05-11 12:32:11,731 controller.py: 33 () INFO Published Set Point: 1652286731.7301152 +2022-05-11 12:32:11,741 controller.py: 33 () INFO Published Set Point: 1652286731.7401168 +2022-05-11 12:32:11,750 controller.py: 33 () INFO Published Set Point: 1652286731.7500594 +2022-05-11 12:32:11,761 controller.py: 33 () INFO Published Set Point: 1652286731.7601151 +2022-05-11 12:32:11,771 controller.py: 33 () INFO Published Set Point: 1652286731.7701159 +2022-05-11 12:32:11,781 controller.py: 33 () INFO Published Set Point: 1652286731.7801187 +2022-05-11 12:32:11,791 controller.py: 33 () INFO Published Set Point: 1652286731.7901223 +2022-05-11 12:32:11,801 controller.py: 33 () INFO Published Set Point: 1652286731.8001184 +2022-05-11 12:32:11,811 controller.py: 33 () INFO Published Set Point: 1652286731.8101182 +2022-05-11 12:32:11,821 controller.py: 33 () INFO Published Set Point: 1652286731.8201153 +2022-05-11 12:32:11,831 controller.py: 33 () INFO Published Set Point: 1652286731.8301182 +2022-05-11 12:32:11,841 controller.py: 33 () INFO Published Set Point: 1652286731.8401208 +2022-05-11 12:32:11,851 controller.py: 33 () INFO Published Set Point: 1652286731.8501184 +2022-05-11 12:32:11,861 controller.py: 33 () INFO Published Set Point: 1652286731.8601174 +2022-05-11 12:32:11,871 controller.py: 33 () INFO Published Set Point: 1652286731.8701212 +2022-05-11 12:32:11,881 controller.py: 33 () INFO Published Set Point: 1652286731.8801186 +2022-05-11 12:32:11,891 controller.py: 33 () INFO Published Set Point: 1652286731.8901157 +2022-05-11 12:32:11,901 controller.py: 33 () INFO Published Set Point: 1652286731.9001176 +2022-05-11 12:32:11,911 controller.py: 33 () INFO Published Set Point: 1652286731.9101186 +2022-05-11 12:32:11,921 controller.py: 33 () INFO Published Set Point: 1652286731.9201183 +2022-05-11 12:32:11,931 controller.py: 33 () INFO Published Set Point: 1652286731.9301176 +2022-05-11 12:32:11,941 controller.py: 33 () INFO Published Set Point: 1652286731.9401157 +2022-05-11 12:32:11,951 controller.py: 33 () INFO Published Set Point: 1652286731.9501255 +2022-05-11 12:32:11,961 controller.py: 33 () INFO Published Set Point: 1652286731.9601216 +2022-05-11 12:32:11,971 controller.py: 33 () INFO Published Set Point: 1652286731.9701188 +2022-05-11 12:32:11,981 controller.py: 33 () INFO Published Set Point: 1652286731.9801197 +2022-05-11 12:32:11,991 controller.py: 33 () INFO Published Set Point: 1652286731.9901223 +2022-05-11 12:32:12,001 controller.py: 33 () INFO Published Set Point: 1652286732.0001194 +2022-05-11 12:32:12,011 controller.py: 33 () INFO Published Set Point: 1652286732.0101213 +2022-05-11 12:32:12,021 controller.py: 33 () INFO Published Set Point: 1652286732.020105 +2022-05-11 12:32:12,031 controller.py: 33 () INFO Published Set Point: 1652286732.0301192 +2022-05-11 12:32:12,041 controller.py: 33 () INFO Published Set Point: 1652286732.0401106 +2022-05-11 12:32:12,051 controller.py: 33 () INFO Published Set Point: 1652286732.050118 +2022-05-11 12:32:12,061 controller.py: 33 () INFO Published Set Point: 1652286732.0601163 +2022-05-11 12:32:12,071 controller.py: 33 () INFO Published Set Point: 1652286732.0701187 +2022-05-11 12:32:12,081 controller.py: 33 () INFO Published Set Point: 1652286732.080118 +2022-05-11 12:32:12,091 controller.py: 33 () INFO Published Set Point: 1652286732.090105 +2022-05-11 12:32:12,101 controller.py: 33 () INFO Published Set Point: 1652286732.1001182 +2022-05-11 12:32:12,111 controller.py: 33 () INFO Published Set Point: 1652286732.1101155 +2022-05-11 12:32:12,121 controller.py: 33 () INFO Published Set Point: 1652286732.120118 +2022-05-11 12:32:12,131 controller.py: 33 () INFO Published Set Point: 1652286732.1301217 +2022-05-11 12:32:12,141 controller.py: 33 () INFO Published Set Point: 1652286732.1401181 +2022-05-11 12:32:12,151 controller.py: 33 () INFO Published Set Point: 1652286732.150117 +2022-05-11 12:32:12,161 controller.py: 33 () INFO Published Set Point: 1652286732.1601253 +2022-05-11 12:32:12,171 controller.py: 33 () INFO Published Set Point: 1652286732.1700811 +2022-05-11 12:32:12,181 controller.py: 33 () INFO Published Set Point: 1652286732.1800852 +2022-05-11 12:32:12,191 controller.py: 33 () INFO Published Set Point: 1652286732.1900878 +2022-05-11 12:32:12,201 controller.py: 33 () INFO Published Set Point: 1652286732.2001243 +2022-05-11 12:32:12,211 controller.py: 33 () INFO Published Set Point: 1652286732.2101147 +2022-05-11 12:32:12,220 controller.py: 33 () INFO Published Set Point: 1652286732.2201185 +2022-05-11 12:32:12,231 controller.py: 33 () INFO Published Set Point: 1652286732.2301202 +2022-05-11 12:32:12,241 controller.py: 33 () INFO Published Set Point: 1652286732.2401097 +2022-05-11 12:32:12,251 controller.py: 33 () INFO Published Set Point: 1652286732.2501204 +2022-05-11 12:32:12,260 controller.py: 33 () INFO Published Set Point: 1652286732.260074 +2022-05-11 12:32:12,271 controller.py: 33 () INFO Published Set Point: 1652286732.270117 +2022-05-11 12:32:12,281 controller.py: 33 () INFO Published Set Point: 1652286732.2801166 +2022-05-11 12:32:12,291 controller.py: 33 () INFO Published Set Point: 1652286732.2901134 +2022-05-11 12:32:12,301 controller.py: 33 () INFO Published Set Point: 1652286732.3001158 +2022-05-11 12:32:12,311 controller.py: 33 () INFO Published Set Point: 1652286732.310118 +2022-05-11 12:32:12,320 controller.py: 33 () INFO Published Set Point: 1652286732.3200674 +2022-05-11 12:32:12,330 controller.py: 33 () INFO Published Set Point: 1652286732.330072 +2022-05-11 12:32:12,341 controller.py: 33 () INFO Published Set Point: 1652286732.3401062 +2022-05-11 12:32:12,351 controller.py: 33 () INFO Published Set Point: 1652286732.3501055 +2022-05-11 12:32:12,361 controller.py: 33 () INFO Published Set Point: 1652286732.360107 +2022-05-11 12:32:12,371 controller.py: 33 () INFO Published Set Point: 1652286732.3701286 +2022-05-11 12:32:12,381 controller.py: 33 () INFO Published Set Point: 1652286732.3801231 +2022-05-11 12:32:12,390 controller.py: 33 () INFO Published Set Point: 1652286732.3901155 +2022-05-11 12:32:12,400 controller.py: 33 () INFO Published Set Point: 1652286732.4001234 +2022-05-11 12:32:12,411 controller.py: 33 () INFO Published Set Point: 1652286732.4101183 +2022-05-11 12:32:12,420 controller.py: 33 () INFO Published Set Point: 1652286732.4201171 +2022-05-11 12:32:12,431 controller.py: 33 () INFO Published Set Point: 1652286732.4301205 +2022-05-11 12:32:12,441 controller.py: 33 () INFO Published Set Point: 1652286732.440118 +2022-05-11 12:32:12,451 controller.py: 33 () INFO Published Set Point: 1652286732.4501138 +2022-05-11 12:32:12,460 controller.py: 33 () INFO Published Set Point: 1652286732.460113 +2022-05-11 12:32:12,471 controller.py: 33 () INFO Published Set Point: 1652286732.4701073 +2022-05-11 12:32:12,481 controller.py: 33 () INFO Published Set Point: 1652286732.480118 +2022-05-11 12:32:12,491 controller.py: 33 () INFO Published Set Point: 1652286732.4901216 +2022-05-11 12:32:12,500 controller.py: 33 () INFO Published Set Point: 1652286732.5001123 +2022-05-11 12:32:12,511 controller.py: 33 () INFO Published Set Point: 1652286732.5101159 +2022-05-11 12:32:12,521 controller.py: 33 () INFO Published Set Point: 1652286732.5201097 +2022-05-11 12:32:12,531 controller.py: 33 () INFO Published Set Point: 1652286732.5301154 +2022-05-11 12:32:12,541 controller.py: 33 () INFO Published Set Point: 1652286732.5401185 +2022-05-11 12:32:12,551 controller.py: 33 () INFO Published Set Point: 1652286732.5501232 +2022-05-11 12:32:12,561 controller.py: 33 () INFO Published Set Point: 1652286732.5601182 +2022-05-11 12:32:12,571 controller.py: 33 () INFO Published Set Point: 1652286732.5701182 +2022-05-11 12:32:12,581 controller.py: 33 () INFO Published Set Point: 1652286732.5801156 +2022-05-11 12:32:12,591 controller.py: 33 () INFO Published Set Point: 1652286732.590118 +2022-05-11 12:32:12,601 controller.py: 33 () INFO Published Set Point: 1652286732.6001184 +2022-05-11 12:32:12,611 controller.py: 33 () INFO Published Set Point: 1652286732.6101174 +2022-05-11 12:32:12,621 controller.py: 33 () INFO Published Set Point: 1652286732.620116 +2022-05-11 12:32:12,631 controller.py: 33 () INFO Published Set Point: 1652286732.6301153 +2022-05-11 12:32:12,641 controller.py: 33 () INFO Published Set Point: 1652286732.6401157 +2022-05-11 12:32:12,651 controller.py: 33 () INFO Published Set Point: 1652286732.650116 +2022-05-11 12:32:12,660 controller.py: 33 () INFO Published Set Point: 1652286732.660118 +2022-05-11 12:32:12,671 controller.py: 33 () INFO Published Set Point: 1652286732.6701124 +2022-05-11 12:32:12,681 controller.py: 33 () INFO Published Set Point: 1652286732.680118 +2022-05-11 12:32:12,691 controller.py: 33 () INFO Published Set Point: 1652286732.6901183 +2022-05-11 12:32:12,700 controller.py: 33 () INFO Published Set Point: 1652286732.7001162 +2022-05-11 12:32:12,711 controller.py: 33 () INFO Published Set Point: 1652286732.7101152 +2022-05-11 12:32:12,721 controller.py: 33 () INFO Published Set Point: 1652286732.720116 +2022-05-11 12:32:12,731 controller.py: 33 () INFO Published Set Point: 1652286732.7301168 +2022-05-11 12:32:12,740 controller.py: 33 () INFO Published Set Point: 1652286732.740121 +2022-05-11 12:32:12,751 controller.py: 33 () INFO Published Set Point: 1652286732.750116 +2022-05-11 12:32:12,761 controller.py: 33 () INFO Published Set Point: 1652286732.7601175 +2022-05-11 12:32:12,771 controller.py: 33 () INFO Published Set Point: 1652286732.7701225 +2022-05-11 12:32:12,781 controller.py: 33 () INFO Published Set Point: 1652286732.7801163 +2022-05-11 12:32:12,791 controller.py: 33 () INFO Published Set Point: 1652286732.7901156 +2022-05-11 12:32:12,801 controller.py: 33 () INFO Published Set Point: 1652286732.8001163 +2022-05-11 12:32:12,811 controller.py: 33 () INFO Published Set Point: 1652286732.810117 +2022-05-11 12:32:12,821 controller.py: 33 () INFO Published Set Point: 1652286732.8201177 +2022-05-11 12:32:12,831 controller.py: 33 () INFO Published Set Point: 1652286732.830116 +2022-05-11 12:32:12,840 controller.py: 33 () INFO Published Set Point: 1652286732.8401148 +2022-05-11 12:32:12,851 controller.py: 33 () INFO Published Set Point: 1652286732.8501153 +2022-05-11 12:32:12,860 controller.py: 33 () INFO Published Set Point: 1652286732.8601205 +2022-05-11 12:32:12,871 controller.py: 33 () INFO Published Set Point: 1652286732.8701143 +2022-05-11 12:32:12,881 controller.py: 33 () INFO Published Set Point: 1652286732.8801181 +2022-05-11 12:32:12,891 controller.py: 33 () INFO Published Set Point: 1652286732.890116 +2022-05-11 12:32:12,900 controller.py: 33 () INFO Published Set Point: 1652286732.9001107 +2022-05-11 12:32:12,911 controller.py: 33 () INFO Published Set Point: 1652286732.9101176 +2022-05-11 12:32:12,921 controller.py: 33 () INFO Published Set Point: 1652286732.9201162 +2022-05-11 12:32:12,931 controller.py: 33 () INFO Published Set Point: 1652286732.9301155 +2022-05-11 12:32:12,941 controller.py: 33 () INFO Published Set Point: 1652286732.9401107 +2022-05-11 12:32:12,951 controller.py: 33 () INFO Published Set Point: 1652286732.9501083 +2022-05-11 12:32:12,960 controller.py: 33 () INFO Published Set Point: 1652286732.9601133 +2022-05-11 12:32:12,971 controller.py: 33 () INFO Published Set Point: 1652286732.9700778 +2022-05-11 12:32:12,981 controller.py: 33 () INFO Published Set Point: 1652286732.9800813 +2022-05-11 12:32:12,991 controller.py: 33 () INFO Published Set Point: 1652286732.990092 +2022-05-11 12:32:13,001 controller.py: 33 () INFO Published Set Point: 1652286733.0001135 +2022-05-11 12:32:13,011 controller.py: 33 () INFO Published Set Point: 1652286733.0101132 +2022-05-11 12:32:13,021 controller.py: 33 () INFO Published Set Point: 1652286733.0201201 +2022-05-11 12:32:13,031 controller.py: 33 () INFO Published Set Point: 1652286733.0301113 +2022-05-11 12:32:13,040 controller.py: 33 () INFO Published Set Point: 1652286733.0400665 +2022-05-11 12:32:13,051 controller.py: 33 () INFO Published Set Point: 1652286733.0501044 +2022-05-11 12:32:13,061 controller.py: 33 () INFO Published Set Point: 1652286733.0601034 +2022-05-11 12:32:13,071 controller.py: 33 () INFO Published Set Point: 1652286733.0701153 +2022-05-11 12:32:13,081 controller.py: 33 () INFO Published Set Point: 1652286733.0801194 +2022-05-11 12:32:13,091 controller.py: 33 () INFO Published Set Point: 1652286733.0901208 +2022-05-11 12:32:13,100 controller.py: 33 () INFO Published Set Point: 1652286733.1001167 +2022-05-11 12:32:13,111 controller.py: 33 () INFO Published Set Point: 1652286733.1101208 +2022-05-11 12:32:13,120 controller.py: 33 () INFO Published Set Point: 1652286733.120104 +2022-05-11 12:32:13,131 controller.py: 33 () INFO Published Set Point: 1652286733.1301174 +2022-05-11 12:32:13,140 controller.py: 33 () INFO Published Set Point: 1652286733.1401193 +2022-05-11 12:32:13,151 controller.py: 33 () INFO Published Set Point: 1652286733.1501162 +2022-05-11 12:32:13,161 controller.py: 33 () INFO Published Set Point: 1652286733.1601171 +2022-05-11 12:32:13,171 controller.py: 33 () INFO Published Set Point: 1652286733.170118 +2022-05-11 12:32:13,180 controller.py: 33 () INFO Published Set Point: 1652286733.1801248 +2022-05-11 12:32:13,191 controller.py: 33 () INFO Published Set Point: 1652286733.190117 +2022-05-11 12:32:13,201 controller.py: 33 () INFO Published Set Point: 1652286733.200119 +2022-05-11 12:32:13,211 controller.py: 33 () INFO Published Set Point: 1652286733.21012 +2022-05-11 12:32:13,220 controller.py: 33 () INFO Published Set Point: 1652286733.2201164 +2022-05-11 12:32:13,231 controller.py: 33 () INFO Published Set Point: 1652286733.230123 +2022-05-11 12:32:13,241 controller.py: 33 () INFO Published Set Point: 1652286733.2401202 +2022-05-11 12:32:13,251 controller.py: 33 () INFO Published Set Point: 1652286733.2501187 +2022-05-11 12:32:13,261 controller.py: 33 () INFO Published Set Point: 1652286733.26012 +2022-05-11 12:32:13,271 controller.py: 33 () INFO Published Set Point: 1652286733.2701178 +2022-05-11 12:32:13,281 controller.py: 33 () INFO Published Set Point: 1652286733.280121 +2022-05-11 12:32:13,291 controller.py: 33 () INFO Published Set Point: 1652286733.2901182 +2022-05-11 12:32:13,300 controller.py: 33 () INFO Published Set Point: 1652286733.3001132 +2022-05-11 12:32:13,311 controller.py: 33 () INFO Published Set Point: 1652286733.3101192 +2022-05-11 12:32:13,321 controller.py: 33 () INFO Published Set Point: 1652286733.3201256 +2022-05-11 12:32:13,331 controller.py: 33 () INFO Published Set Point: 1652286733.330118 +2022-05-11 12:32:13,341 controller.py: 33 () INFO Published Set Point: 1652286733.34012 +2022-05-11 12:32:13,351 controller.py: 33 () INFO Published Set Point: 1652286733.3501139 +2022-05-11 12:32:13,361 controller.py: 33 () INFO Published Set Point: 1652286733.3601184 +2022-05-11 12:32:13,371 controller.py: 33 () INFO Published Set Point: 1652286733.370125 +2022-05-11 12:32:13,381 controller.py: 33 () INFO Published Set Point: 1652286733.3801172 +2022-05-11 12:32:13,391 controller.py: 33 () INFO Published Set Point: 1652286733.3901196 +2022-05-11 12:32:13,401 controller.py: 33 () INFO Published Set Point: 1652286733.4001212 +2022-05-11 12:32:13,410 controller.py: 33 () INFO Published Set Point: 1652286733.4101036 +2022-05-11 12:32:13,420 controller.py: 33 () INFO Published Set Point: 1652286733.4200664 +2022-05-11 12:32:13,431 controller.py: 33 () INFO Published Set Point: 1652286733.4301078 +2022-05-11 12:32:13,441 controller.py: 33 () INFO Published Set Point: 1652286733.4401205 +2022-05-11 12:32:13,451 controller.py: 33 () INFO Published Set Point: 1652286733.4501188 +2022-05-11 12:32:13,460 controller.py: 33 () INFO Published Set Point: 1652286733.460119 +2022-05-11 12:32:13,471 controller.py: 33 () INFO Published Set Point: 1652286733.4701133 +2022-05-11 12:32:13,481 controller.py: 33 () INFO Published Set Point: 1652286733.4801195 +2022-05-11 12:32:13,491 controller.py: 33 () INFO Published Set Point: 1652286733.4901156 +2022-05-11 12:32:13,500 controller.py: 33 () INFO Published Set Point: 1652286733.500117 +2022-05-11 12:32:13,511 controller.py: 33 () INFO Published Set Point: 1652286733.5101178 +2022-05-11 12:32:13,520 controller.py: 33 () INFO Published Set Point: 1652286733.520099 +2022-05-11 12:32:13,531 controller.py: 33 () INFO Published Set Point: 1652286733.530118 +2022-05-11 12:32:13,540 controller.py: 33 () INFO Published Set Point: 1652286733.5401192 +2022-05-11 12:32:13,551 controller.py: 33 () INFO Published Set Point: 1652286733.550117 +2022-05-11 12:32:13,560 controller.py: 33 () INFO Published Set Point: 1652286733.5601184 +2022-05-11 12:32:13,571 controller.py: 33 () INFO Published Set Point: 1652286733.570116 +2022-05-11 12:32:13,580 controller.py: 33 () INFO Published Set Point: 1652286733.580115 +2022-05-11 12:32:13,591 controller.py: 33 () INFO Published Set Point: 1652286733.590118 +2022-05-11 12:32:13,600 controller.py: 33 () INFO Published Set Point: 1652286733.6001155 +2022-05-11 12:32:13,611 controller.py: 33 () INFO Published Set Point: 1652286733.6101158 +2022-05-11 12:32:13,621 controller.py: 33 () INFO Published Set Point: 1652286733.6201208 +2022-05-11 12:32:13,631 controller.py: 33 () INFO Published Set Point: 1652286733.6301165 +2022-05-11 12:32:13,641 controller.py: 33 () INFO Published Set Point: 1652286733.6401284 +2022-05-11 12:32:13,651 controller.py: 33 () INFO Published Set Point: 1652286733.6501164 +2022-05-11 12:32:13,661 controller.py: 33 () INFO Published Set Point: 1652286733.660118 +2022-05-11 12:32:13,671 controller.py: 33 () INFO Published Set Point: 1652286733.6701164 +2022-05-11 12:32:13,681 controller.py: 33 () INFO Published Set Point: 1652286733.680117 +2022-05-11 12:32:13,691 controller.py: 33 () INFO Published Set Point: 1652286733.6901138 +2022-05-11 12:32:13,701 controller.py: 33 () INFO Published Set Point: 1652286733.7001173 +2022-05-11 12:32:13,711 controller.py: 33 () INFO Published Set Point: 1652286733.71012 +2022-05-11 12:32:13,721 controller.py: 33 () INFO Published Set Point: 1652286733.7201126 +2022-05-11 12:32:13,731 controller.py: 33 () INFO Published Set Point: 1652286733.7301054 +2022-05-11 12:32:13,741 controller.py: 33 () INFO Published Set Point: 1652286733.740107 +2022-05-11 12:32:13,751 controller.py: 33 () INFO Published Set Point: 1652286733.7501044 +2022-05-11 12:32:13,761 controller.py: 33 () INFO Published Set Point: 1652286733.7601218 +2022-05-11 12:32:13,771 controller.py: 33 () INFO Published Set Point: 1652286733.770083 +2022-05-11 12:32:13,781 controller.py: 33 () INFO Published Set Point: 1652286733.78008 +2022-05-11 12:32:13,791 controller.py: 33 () INFO Published Set Point: 1652286733.7900956 +2022-05-11 12:32:13,801 controller.py: 33 () INFO Published Set Point: 1652286733.800117 +2022-05-11 12:32:13,811 controller.py: 33 () INFO Published Set Point: 1652286733.8101094 +2022-05-11 12:32:13,821 controller.py: 33 () INFO Published Set Point: 1652286733.8201165 +2022-05-11 12:32:13,831 controller.py: 33 () INFO Published Set Point: 1652286733.8301163 +2022-05-11 12:32:13,840 controller.py: 33 () INFO Published Set Point: 1652286733.8401163 +2022-05-11 12:32:13,851 controller.py: 33 () INFO Published Set Point: 1652286733.8501127 +2022-05-11 12:32:13,861 controller.py: 33 () INFO Published Set Point: 1652286733.860114 +2022-05-11 12:32:13,871 controller.py: 33 () INFO Published Set Point: 1652286733.870115 +2022-05-11 12:32:13,880 controller.py: 33 () INFO Published Set Point: 1652286733.8801184 +2022-05-11 12:32:13,891 controller.py: 33 () INFO Published Set Point: 1652286733.890117 +2022-05-11 12:32:13,900 controller.py: 33 () INFO Published Set Point: 1652286733.900114 +2022-05-11 12:32:13,911 controller.py: 33 () INFO Published Set Point: 1652286733.9101136 +2022-05-11 12:32:13,921 controller.py: 33 () INFO Published Set Point: 1652286733.9201167 +2022-05-11 12:32:13,931 controller.py: 33 () INFO Published Set Point: 1652286733.930117 +2022-05-11 12:32:13,940 controller.py: 33 () INFO Published Set Point: 1652286733.9401171 +2022-05-11 12:32:13,950 controller.py: 33 () INFO Published Set Point: 1652286733.9501143 +2022-05-11 12:32:13,961 controller.py: 33 () INFO Published Set Point: 1652286733.9601111 +2022-05-11 12:32:13,971 controller.py: 33 () INFO Published Set Point: 1652286733.9701152 +2022-05-11 12:32:13,981 controller.py: 33 () INFO Published Set Point: 1652286733.9801168 +2022-05-11 12:32:13,991 controller.py: 33 () INFO Published Set Point: 1652286733.9901166 +2022-05-11 12:32:14,000 controller.py: 33 () INFO Published Set Point: 1652286734.0001152 +2022-05-11 12:32:14,011 controller.py: 33 () INFO Published Set Point: 1652286734.010116 +2022-05-11 12:32:14,021 controller.py: 33 () INFO Published Set Point: 1652286734.0201192 +2022-05-11 12:32:14,031 controller.py: 33 () INFO Published Set Point: 1652286734.0301144 +2022-05-11 12:32:14,040 controller.py: 33 () INFO Published Set Point: 1652286734.0401168 +2022-05-11 12:32:14,051 controller.py: 33 () INFO Published Set Point: 1652286734.050113 +2022-05-11 12:32:14,060 controller.py: 33 () INFO Published Set Point: 1652286734.060119 +2022-05-11 12:32:14,071 controller.py: 33 () INFO Published Set Point: 1652286734.0701132 +2022-05-11 12:32:14,081 controller.py: 33 () INFO Published Set Point: 1652286734.0801132 +2022-05-11 12:32:14,091 controller.py: 33 () INFO Published Set Point: 1652286734.090114 +2022-05-11 12:32:14,101 controller.py: 33 () INFO Published Set Point: 1652286734.1001155 +2022-05-11 12:32:14,111 controller.py: 33 () INFO Published Set Point: 1652286734.1101148 +2022-05-11 12:32:14,120 controller.py: 33 () INFO Published Set Point: 1652286734.1201138 +2022-05-11 12:32:14,131 controller.py: 33 () INFO Published Set Point: 1652286734.1301208 +2022-05-11 12:32:14,141 controller.py: 33 () INFO Published Set Point: 1652286734.1401205 +2022-05-11 12:32:14,151 controller.py: 33 () INFO Published Set Point: 1652286734.1501162 +2022-05-11 12:32:14,161 controller.py: 33 () INFO Published Set Point: 1652286734.1601164 +2022-05-11 12:32:14,171 controller.py: 33 () INFO Published Set Point: 1652286734.1701136 +2022-05-11 12:32:14,181 controller.py: 33 () INFO Published Set Point: 1652286734.1801167 +2022-05-11 12:32:14,191 controller.py: 33 () INFO Published Set Point: 1652286734.190114 +2022-05-11 12:32:14,200 controller.py: 33 () INFO Published Set Point: 1652286734.2001133 +2022-05-11 12:32:14,211 controller.py: 33 () INFO Published Set Point: 1652286734.2101142 +2022-05-11 12:32:14,221 controller.py: 33 () INFO Published Set Point: 1652286734.2201157 +2022-05-11 12:32:14,231 controller.py: 33 () INFO Published Set Point: 1652286734.2301137 +2022-05-11 12:32:14,240 controller.py: 33 () INFO Published Set Point: 1652286734.2401152 +2022-05-11 12:32:14,251 controller.py: 33 () INFO Published Set Point: 1652286734.250111 +2022-05-11 12:32:14,261 controller.py: 33 () INFO Published Set Point: 1652286734.2601159 +2022-05-11 12:32:14,271 controller.py: 33 () INFO Published Set Point: 1652286734.270119 +2022-05-11 12:32:14,280 controller.py: 33 () INFO Published Set Point: 1652286734.280114 +2022-05-11 12:32:14,291 controller.py: 33 () INFO Published Set Point: 1652286734.2901134 +2022-05-11 12:32:14,300 controller.py: 33 () INFO Published Set Point: 1652286734.300121 +2022-05-11 12:32:14,310 controller.py: 33 () INFO Published Set Point: 1652286734.3101132 +2022-05-11 12:32:14,321 controller.py: 33 () INFO Published Set Point: 1652286734.3201187 +2022-05-11 12:32:14,331 controller.py: 33 () INFO Published Set Point: 1652286734.330113 +2022-05-11 12:32:14,341 controller.py: 33 () INFO Published Set Point: 1652286734.3401082 +2022-05-11 12:32:14,351 controller.py: 33 () INFO Published Set Point: 1652286734.3501163 +2022-05-11 12:32:14,360 controller.py: 33 () INFO Published Set Point: 1652286734.3601136 +2022-05-11 12:32:14,371 controller.py: 33 () INFO Published Set Point: 1652286734.3701117 +2022-05-11 12:32:14,381 controller.py: 33 () INFO Published Set Point: 1652286734.380114 +2022-05-11 12:32:14,390 controller.py: 33 () INFO Published Set Point: 1652286734.390073 +2022-05-11 12:32:14,400 controller.py: 33 () INFO Published Set Point: 1652286734.400063 +2022-05-11 12:32:14,410 controller.py: 33 () INFO Published Set Point: 1652286734.4100628 +2022-05-11 12:32:14,421 controller.py: 33 () INFO Published Set Point: 1652286734.4200718 +2022-05-11 12:32:14,431 controller.py: 33 () INFO Published Set Point: 1652286734.4300694 +2022-05-11 12:32:14,441 controller.py: 33 () INFO Published Set Point: 1652286734.4401178 +2022-05-11 12:32:14,451 controller.py: 33 () INFO Published Set Point: 1652286734.4501169 +2022-05-11 12:32:14,461 controller.py: 33 () INFO Published Set Point: 1652286734.4601173 +2022-05-11 12:32:14,471 controller.py: 33 () INFO Published Set Point: 1652286734.4701202 +2022-05-11 12:32:14,481 controller.py: 33 () INFO Published Set Point: 1652286734.4801102 +2022-05-11 12:32:14,491 controller.py: 33 () INFO Published Set Point: 1652286734.4901094 +2022-05-11 12:32:14,501 controller.py: 33 () INFO Published Set Point: 1652286734.5001178 +2022-05-11 12:32:14,511 controller.py: 33 () INFO Published Set Point: 1652286734.5101166 +2022-05-11 12:32:14,521 controller.py: 33 () INFO Published Set Point: 1652286734.5201187 +2022-05-11 12:32:14,531 controller.py: 33 () INFO Published Set Point: 1652286734.5301135 +2022-05-11 12:32:14,540 controller.py: 33 () INFO Published Set Point: 1652286734.5401175 +2022-05-11 12:32:14,551 controller.py: 33 () INFO Published Set Point: 1652286734.5501132 +2022-05-11 12:32:14,561 controller.py: 33 () INFO Published Set Point: 1652286734.5601156 +2022-05-11 12:32:14,571 controller.py: 33 () INFO Published Set Point: 1652286734.5700753 +2022-05-11 12:32:14,581 controller.py: 33 () INFO Published Set Point: 1652286734.5800781 +2022-05-11 12:32:14,591 controller.py: 33 () INFO Published Set Point: 1652286734.5900838 +2022-05-11 12:32:14,601 controller.py: 33 () INFO Published Set Point: 1652286734.6001155 +2022-05-11 12:32:14,611 controller.py: 33 () INFO Published Set Point: 1652286734.6101186 +2022-05-11 12:32:14,621 controller.py: 33 () INFO Published Set Point: 1652286734.6201165 diff --git a/examples/ImageProcessing/actuator.py b/examples/ImageProcessing/actuator.py index c9886cd..8291c2b 100644 --- a/examples/ImageProcessing/actuator.py +++ b/examples/ImageProcessing/actuator.py @@ -1,5 +1,4 @@ -from reem.datatypes import PublishSpace, CallbackSubscriber -from reem.connection import RedisInterface +from reem import PublishSpace, CallbackSubscriber import time import logging @@ -17,8 +16,7 @@ # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -pspace = PublishSpace(interface=interface) +pspace = PublishSpace("localhost") def callback(data, updated_path): @@ -27,7 +25,7 @@ def callback(data, updated_path): subscriber = CallbackSubscriber( channel="processed_info", - interface=interface, + interface="localhost", callback_function=callback, kwargs={} ) diff --git a/examples/ImageProcessing/camera.py b/examples/ImageProcessing/camera.py index dbeab17..ee169c6 100644 --- a/examples/ImageProcessing/camera.py +++ b/examples/ImageProcessing/camera.py @@ -1,5 +1,4 @@ -from reem.datatypes import PublishSpace -from reem.connection import RedisInterface +from reem import PublishSpace import numpy as np import time import logging @@ -19,8 +18,7 @@ # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -pspace = PublishSpace(interface=interface) +pspace = PublishSpace("localhost") image_count = 0 while time.time() < start_time + TIME_TO_RUN: diff --git a/examples/ImageProcessing/processor.py b/examples/ImageProcessing/processor.py index 9b235af..49261f3 100644 --- a/examples/ImageProcessing/processor.py +++ b/examples/ImageProcessing/processor.py @@ -1,5 +1,4 @@ -from reem.datatypes import PublishSpace, CallbackSubscriber -from reem.connection import RedisInterface +from reem import PublishSpace, CallbackSubscriber import numpy as np import time import logging @@ -18,8 +17,7 @@ # --------------------------- Main ----------------------------------- -interface = RedisInterface(host="localhost") -pspace = PublishSpace(interface=interface) +pspace = PublishSpace("localhost") def callback(data, updated_path): @@ -33,7 +31,7 @@ def callback(data, updated_path): subscriber = CallbackSubscriber( channel="raw_image", - interface=interface, + interface="localhost", callback_function=callback, kwargs={} ) diff --git a/examples/demonstrations/callback_subscriber.py b/examples/demonstrations/callback_subscriber.py index 7796659..ccb4721 100644 --- a/examples/demonstrations/callback_subscriber.py +++ b/examples/demonstrations/callback_subscriber.py @@ -1,16 +1,16 @@ -from reem.datatypes import PublishSpace, CallbackSubscriber -from reem.connection import RedisInterface +from reem import PublishSpace, CallbackSubscriber import time - -interface = RedisInterface(host="localhost") -interface.initialize() +import os # Initialize a publisher -publisher = PublishSpace(interface) +publisher = PublishSpace("localhost") +t0 = None # Callback Function def callback(data, updated_path, foo): + global t0 + print("Received message from publisher, delay",time.time()-t0) print("Foo = {}".format(foo)) print("Updated Path = {}".format(updated_path)) print("Data = {}".format(data)) @@ -18,11 +18,19 @@ def callback(data, updated_path, foo): # # Initialize a callback subscriber subscriber = CallbackSubscriber(channel="callback_channel", - interface=interface, + interface="localhost", callback_function=callback, kwargs={"foo": 5}) subscriber.listen() +t0 = time.time() publisher["callback_channel"] = {"number": 5, "string": "REEM"} -publisher["callback_channel"]["number"] = 6 -time.sleep(.01) +#windows is sometimes ungodly slow at setting up an initial connection... if you have problems uncomment the following line +if os.name == 'nt': + time.sleep(2.0) +print("Should print several messages below...") +for i in range(6,20): + publisher["callback_channel"]["number"] = i + time.sleep(0.1) +print("Done.") + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d32e802 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,32 @@ +[build-system] +requires = ["setuptools >= 42.0","wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = 'reem' +version = '0.1.3' +description='Redis Extendable Efficient Middleware' +authors = [ + {name='Trishul Nagenalli'}, + {name='Kris Hauser', email='hauser.kris@gmail.com' } +] +readme = 'README.md' +license = {file='LICENSE.txt'} +dependencies=[ + 'redis>=4.0.0', + 'six', + 'numpy', +] + +classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Programming Language :: Python', + 'License :: OSI Approved :: Apache Software License', + 'Topic :: Communications', +] + +[project.urls] +Homepage = "https://example.com" +Documentation = "https://reem.readthedocs.io" +Repository = "https://www.github.com/krishauser/reem" diff --git a/reem/__init__.py b/reem/__init__.py index e69de29..d9efa01 100644 --- a/reem/__init__.py +++ b/reem/__init__.py @@ -0,0 +1,4 @@ +__version__ = '0.1.3' +__all__ = ['RedisInterface','KeyValueStore','TolerantKeyValueStore','PublishSpace','CallbackSubscriber','SilentSubscriber'] +from .connection import RedisInterface,KeyValueStore,PublishSpace,SilentSubscriber,CallbackSubscriber +from .convenience import TolerantKeyValueStore \ No newline at end of file diff --git a/reem/accessors.py b/reem/accessors.py new file mode 100644 index 0000000..97b0484 --- /dev/null +++ b/reem/accessors.py @@ -0,0 +1,302 @@ +from __future__ import print_function + +from threading import Thread, Lock +import redis +import rejson +from .utilities import * +from typing import Any,Union + +_ROOT_VALUE_READ_NAME = "{}ROOT{}".format(ROOT_VALUE_SEQUENCE, ROOT_VALUE_SEQUENCE) +_TYPEMAP = { + 'object':dict, + 'array':list, + 'integer':int, + 'number':float, + 'boolean':bool +} + +class MetadataListener: + def __init__(self, client): + self.client = client + self.pubsub = self.client.pubsub() + #import time + #t0 = time.time() + self.pubsub.psubscribe(['__keyspace@0__:*']) + #print("Time to psubscribe on metadata",time.time()-t0) + self.listeners = {} + + def add_listener(self, key_name, reader): + listen_name = "__keyspace@0__:{}".format(key_name) + self.listeners.setdefault(listen_name,[]).append(reader) + + def flush(self): + while True: + item = self.pubsub.get_message() + if item is None: + break + channel = item['channel'].decode("utf_8") + try: + for listener in self.listeners[channel]: + listener.pull_metadata = True + except KeyError: + pass + + +class KeyAccessor: + """Main class for accessing sub-keys of a KeyValueStore.""" + def __init__(self, parent, writer, reader, initial_path=[]): + self.parent = parent + self.writer = writer + self.reader = reader + self.path = initial_path + self.path_str = None #caches path string + + def __str__(self) -> str: + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + return "reem.KeyAccessor({} {})".format(self.writer.top_key_name,self.path_str) + + def __getitem__(self, key : str) -> 'KeyAccessor': + assert check_valid_key_name_ext(key),"{} is not a valid key under path {}".format(key,key_sequence_to_path(self.path) if self.path_str is None else self.path_str) + return self.__class__(self,self.writer,self.reader,self.path+[key]) + + def get(self, key : str, default_value : Any = None) -> Any: + """Similar to dict's get() method, returns a default value if the key doesn't exist. + + Essentially equivalent to + ``` + try: + value = self[key].read() + except: + value = default_value + ``` + """ + try: + return self[key].read() + except redis.exceptions.ResponseError: + return default_value + + def __setitem__(self, key : str, value : Any) -> None: + if isinstance(value,KeyAccessor): + #sometimes this happens on += / *= on subkeys + if value.parent is self: + return + else: + raise ValueError("Cannot set a KeyAccessor to another KeyAccessor... {}[{}] = {}".format(self.path,key,value.path)) + assert check_valid_key_name_ext(key),"{} is not a valid key under path {}".format(key,key_sequence_to_path(self.path) if self.path_str is None else self.path_str) + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + if self.path_str.endswith('.'): #root + if isinstance(key,int): + path = '[%d]'%(key) + else: + path = self.path_str + key + else: + if isinstance(key,int): + path = self.path_str + '[%d]'%(key,) + else: + path = self.path_str + '.' + key + self.writer.send_to_redis(path, value) + + def __delitem__(self, key : str) -> None: + assert check_valid_key_name_ext(key),"{} is not a valid key under path {}".format(key,key_sequence_to_path(self.path) if self.path_str is None else self.path_str) + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + if self.path_str.endswith('.'): #root + if isinstance(key,int): + path = '[%d]'%(key) + else: + path = self.path_str + key + else: + if isinstance(key,int): + path = self.path_str + '[%d]'%(key,) + else: + path = self.path_str + '.' + key + self.writer.delete_from_redis(path) + + def read(self) -> Any: + """Actually read the value referred to by this accessor.""" + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + server_value = self.reader.read_from_redis(self.path_str) + #if it's special, then its value is under _ROOT_VALUE_READ_NAME + try: + return server_value[_ROOT_VALUE_READ_NAME] + except Exception: + return server_value + + def write(self, value : Any) -> None: + """Writes value to the path referred to by this accessor.""" + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + self.writer.send_to_redis(self.path_str, value) + + def _do_rejson_call(self,fn,*args): + assert isinstance(fn,str) + if self.path_str is None: + self.path_str = key_sequence_to_path_ext(self.path) + with self.writer.interface.INTERFACE_LOCK: + return getattr(self.writer.interface.client,fn)(self.writer.top_key_name,self.path_str,*args) + + def type(self) -> str: + """Returns the type of the object""" + t = self._do_rejson_call('jsontype') + return _TYPEMAP[t] + + def __len__(self) -> str: + """Returns the length of an array / number of keys in dict""" + try: + return self._do_rejson_call('jsonobjlen') + except: + return self._do_rejson_call('jsonarrlen') + + def __iadd__(self, rhs : Union[int,float,list]) -> 'KeyAccessor': + """Adds a value to an integer / float value, or concatenates a list + to an array. + + Type checking is not performed, so the user should know what they're doing. + """ + if not hasattr(rhs,'__iter__'): + #treat as value + if not isinstance(rhs,(int,float)): + raise ValueError("+= can only accept int or float arguments") + self._do_rejson_call('jsonnumincrby',rhs) + else: + self._do_rejson_call('jsonarrappend',*rhs) + return self + + def __isub__(self, rhs : Union[int,float]) -> 'KeyAccessor': + """Subtracts a value from an integer / float value + + Type checking is not performed, so the user should know what they're doing. + """ + self += -rhs + return self + + def __imul__(self, rhs : Union[int,float]) -> 'KeyAccessor': + """Multiplies a value by an integer / float value. + + Type checking is not performed, so the user should know what they're doing. + """ + #treat as value + if not isinstance(rhs,(int,float)): + raise ValueError("*= can only accept int or float arguments") + self._do_rejson_call('jsonnummultby',rhs) + return self + + def __idiv__(self, rhs : Union[int,float]) -> 'KeyAccessor': + """Divides a value by an integer / float value + + Type checking is not performed, so the user should know what they're doing. + """ + self *= 1.0/rhs + return self + + def append(self, rhs : Any) -> None: + """Appends a value to an array + + Type checking is not performed, so the user should know what they're doing. + """ + self._do_rejson_call('jsonarrappend',rhs) + + def __enter__(self): + """Reads the value, returns the json struct which can then be manipulated, + and writes back on __exit__. This is useful when you want to make many + small reads/writes which would otherwise bog down Redis. + + Usage:: + kvs = KeyValueStore() + with kvs['foo']['bar'] as val: + #all this stuff is done client side with no communication + for i in range(len(val['baz'])): + val['baz'][i] += 1 + #now val will be written back to the KeyValueStore + + """ + self._value = self.read() + return self._value + + def __exit__(self,exc_type,exc_val,traceback): + if exc_type is not None: + self.write(self._value) + delattr(self,'_value') + + + +class WriteOnlyKeyAccessor(KeyAccessor): + def __init__(self,*args,**kwargs): + KeyAccessor.__init__(self,*args,**kwargs) + def read(self): + raise NotImplementedError() + def __delitem__(self,key): + raise NotImplementedError() + def __iadd__(self,rhs): + raise NotImplementedError() + def __isub__(self,rhs): + raise NotImplementedError() + def __imul__(self,rhs): + raise NotImplementedError() + def __idiv__(self,rhs): + raise NotImplementedError() + def append(self,rhs): + raise NotImplementedError() + + +class ActiveSubscriberKeyAccessor(KeyAccessor): + def __init__(self,*args,**kwargs): + KeyAccessor.__init__(self,*args,**kwargs) + def write(self): + raise NotImplementedError() + def __setitem__(self,key,value): + raise NotImplementedError() + def __delitem__(self,key): + raise NotImplementedError() + def __iadd__(self,rhs): + raise NotImplementedError() + def __isub__(self,rhs): + raise NotImplementedError() + def __imul__(self,rhs): + raise NotImplementedError() + def __idiv__(self,rhs): + raise NotImplementedError() + def append(self,rhs): + raise NotImplementedError() + + def read(self) -> Any: + return_val = self.parent.local_copy + if len(self.path) == 0: + pass + else: + for key in self.path: + return_val = return_val[key] + if type(return_val) == dict: + return copy_dictionary_without_paths(return_val, []) + return return_val + + +class ChannelListener(Thread): + def __init__(self, client, channel_name, callback_function, kwargs): + Thread.__init__(self) + self.client = client + self.channel_name = channel_name + self.callback_function = callback_function + self.kwargs = kwargs + self.first_item_seen = False + + def run(self): + #import time + #t0 = time.time() + self.pubsub = self.client.pubsub() + self.pubsub.psubscribe([self.channel_name]) + #print("Time to establish psubscribe",time.time()-t0) + for item in self.pubsub.listen(): + # First Item is a generic message that we need to get rid of + if not self.first_item_seen: + self.first_item_seen = True + continue + item = json_recode_str(item) + channel = item['channel'] + message = item['data'] + + self.callback_function(channel=channel, message=message, **self.kwargs) + \ No newline at end of file diff --git a/reem/compat.py b/reem/compat.py new file mode 100644 index 0000000..cd6e1d2 --- /dev/null +++ b/reem/compat.py @@ -0,0 +1,43 @@ +import redis + +if redis.__version__ >= '4.0.0': + from redis.commands.json.path import Path + + ROOT_PATH = Path.root_path() + + class RejsonCompat: + """Patches a 4.x+ Redis instance to act like an old rejson.Client + with jsonX methods. + """ + def __init__(self,r): + self._r = r + def __getattr__(self,attr): + if attr == "jsondel": + return self._r.delete + elif attr.startswith('json'): + return getattr(self._r.json(),attr[4:]) + return getattr(self._r,attr) + def __enter__(self): + return self._r.__enter__() + def __exit__(self, *args, **kwargs): + return self._r.__exit__(*args, **kwargs) + def pipeline(self): + return RejsonCompat(self._r.pipeline()) + + def make_redis_client(host='localhost',port=6379,db=0,*args,**kwargs): + """Return plain redis client + rejson client""" + r = redis.Redis(host,port=port,db=db,*args,**kwargs) + j = RejsonCompat(redis.Redis(host,port=port,db=db,*args,**kwargs)) + return r,j +else: + #versions < 4.0.0 don't have rejson built in + import rejson + from rejson import Path + + ROOT_PATH = Path.rootPath() + + def make_redis_client(host='localhost',port=6379,db=0,*args,**kwargs): + """Return plain redis client + rejson client""" + r = rejson.Client(host=host, port=port, db=db, decode_responses=False, *args, **kwargs) + j = rejson.Client(host=host, port=port, db=db, decode_responses=True, *args, **kwargs) + return r,j diff --git a/reem/connection.py b/reem/connection.py index 41e18b0..c261953 100644 --- a/reem/connection.py +++ b/reem/connection.py @@ -1,30 +1,785 @@ -import rejson -from .supports import MetadataListener -from .ships import * +from __future__ import print_function,annotations +from six import iterkeys from threading import Lock +import logging +import redis +from .compat import ROOT_PATH, make_redis_client +from .accessors import KeyAccessor,WriteOnlyKeyAccessor,ActiveSubscriberKeyAccessor,ChannelListener,MetadataListener +from .marshalling import * +from .utilities import * +from typing import Union,Any,Optional,Callable class RedisInterface: - """ + """Low level class for interfacing with Redis. Notably, stores the set + of marshallers used for accessing Numpy and other user data. + + Variable args and keyword arguments are passed to a ``redis.Redis()`` + constructor. + Attributes: + hostname (str): the hostname of the Redis server (default localhost) + marshallers (List[Marshaller]): the list of marshallers used for + decoding Python objects like Numpy arrays. + client (redis.Redis): the ReJSON client + client_no_decode (redis.Redis): the ReJSON client used for communicating + with Redis without decoding JSON results. """ - def __init__(self, host='localhost', ships=[NumpyShip()]): + def __init__(self, host : str = 'localhost', marshallers = [NumpyMarshaller()], *args, **kwargs): self.hostname = host - self.ships = ships - self.client = rejson.Client(host=host, decode_responses=True) - self.client_no_decode = rejson.Client(host=host) - self.metadata_listener = MetadataListener(self) + self.marshallers = marshallers + self.client_no_decode,self.client = make_redis_client(host, *args, **kwargs) + metadata_client = redis.Redis(host) + self.metadata_listener = MetadataListener(metadata_client) self.INTERFACE_LOCK = Lock() - self.label_to_shipper = {} - for sh in self.ships: - self.label_to_shipper[sh.get_label()] = sh + self.label_to_marshaller = {} + for sh in self.marshallers: + self.label_to_marshaller[sh.get_label()] = sh + + self.marshaller_labels = [sh.get_label() for sh in marshallers] + + def client_copy(self): + return redis.Redis(self.hostname) + + def __getstate__(self): + return {'host':self.hostname, 'marshallers':[m.__class__.__name__ for m in self.marshallers]} + + def __setstate__(self,state): + self.hostname = state['host'] + self.marshallers = [] + for m in state['marshallers']: + try: + self.marshallers.append(globals()[m]()) + except Exception: + raise RuntimeError("Cannot find marshaller "+m) + self.client_no_decode,self.client = make_redis_client(self.hostname) + + self.label_to_marshaller = {} + for sh in self.marshallers: + self.label_to_marshaller[sh.get_label()] = sh + + self.marshaller_labels = [sh.get_label() for sh in self.marshallers] + + +logger = logging.getLogger("reem") + +_ROOT_VALUE_READ_NAME = "{}ROOT{}".format(ROOT_VALUE_SEQUENCE, ROOT_VALUE_SEQUENCE) + + +class KeyValueStore(object): + """Dictionary Like object used for get/set paradigm + + The ``KeyValueStore`` object is one that users will frequently use. It + keeps ``Reader`` and ``Writer`` objects for each key that the user has read + or written to. It does not actually handle the getting and setting of data + but produces ``KeyAccessor`` objects that assist with path + construction and call the reader and writer's write and read methods. + + When constructing this class, users can pass through ``*args`` and + ``**kwargs`` that will be forwarded to the ``RedisInterface`` and + eventually to the ``Redis`` client. This allows users to set things like + socket timeouts. See https://redis.readthedocs.io/en/latest/connections.html + for a full list of options. + + Attributes: + interface (str, RedisInterface, or KeyValueStore): Defines the + connection to Redis this reader will use. If a str, then a + RedisInterface will be created and connected to automatically. + """ + def __init__(self, interface : Union[str,RedisInterface,KeyValueStore]='localhost', *args, **kwargs): + if isinstance(interface,str): + host = interface + self.interface = RedisInterface(host, *args, **kwargs) + elif isinstance(interface,KeyValueStore): + self.interface = interface.interface + assert isinstance(self.interface,RedisInterface) + else: + assert isinstance(interface,RedisInterface) + self.interface = interface + self.entries = {} + self.track_schema = True + + def get(self, path : str) -> Any: + """Reads a path in the form 'key.element1.element2' from the redis + server. If the path doesn't exist, an error is raised. + + Marginally faster than nested accessors. + """ + dotpos = path.find('.') + if dotpos < 0: + key = path + subkey = '.' #includes dot + else: + key = path[:dotpos] + subkey = path[dotpos:] #includes dot + if key not in self.entries: + pulled = self.interface.client.jsonget(key, ".") + if pulled is None: + raise ValueError("Invalid top-level key %s"%key) + else: + self._ensure_key_existence(key) + writer,reader = self.entries[key] + return reader.read_from_redis(subkey) + + def set(self, path : str, value : Any) -> None: + """Sets a value in a path in the form 'key.element1.element2' from the + redis server. If any elements along the path, except for the last key, + do not exist, an error is raised. + + ``value`` must be a JSON-serializable object. + + Marginally faster than nested accessors. + """ + dotpos = path.find('.') + if dotpos < 0: + key = path + subkey = '.' #includes dot + else: + key = path[:dotpos] + subkey = path[dotpos:] #includes dot + if key not in self.entries: + self._ensure_key_existence(key) + writer,reader = self.entries[key] + return writer.send_to_redis(subkey,value) + + def __setitem__(self, key: str, value : Any) -> None: + """ Only used for setting key on first level of KVS. i.e. KVS["top_key"] = value. Otherwise see __getitem__ + + Args: + key (str): "dictionary" key. It becomes a top-level Redis key + value: value to store + + Returns: None + + """ + + assert check_valid_key_name(key), "Invalid Key: {}".format(key) + if not isinstance(value,(list,tuple,dict)): + value = {_ROOT_VALUE_READ_NAME: value} + with self.interface.INTERFACE_LOCK: + self._ensure_key_existence(key) + writer, reader = self.entries[key] + writer.send_to_redis(ROOT_PATH, value) + + def __getitem__(self, item : str) -> KeyAccessor: + """Used to retrieve KeyAccessor object for handling path construction when setting/getting Redis + + Args: + item (str): "dictionary" key. It must be a top-level Redis key + + Returns: KeyAccessor + + """ + + assert check_valid_key_name(item), "Invalid Key: {}".format(item) + #logger.debug("KVS GET {}".format(item)) + with self.interface.INTERFACE_LOCK: + self._ensure_key_existence(item) + writer, reader = self.entries[item] + return KeyAccessor(self, writer=writer, reader=reader) + + def __delitem__(self, item : str) -> None: + """ Only used for deleting key on first level of KVS. + + Args: + key (str): "dictionary" key. It must be a top-level Redis key + + Returns: None + + """ + with self.interface.INTERFACE_LOCK: + if item not in self.entries: + raise KeyError(item) + writer, reader = self.entries[item] + writer.delete_from_redis(ROOT_PATH) + + def _ensure_key_existence(self, key) -> None: + """ Ensure that the requested key has a reader and writer associated with it. + + Returns: None + + """ + + assert check_valid_key_name(key), "Invalid Key: {}".format(key) + if key not in self.entries: + self.entries[key] = (Writer(key, self.interface), Reader(key, self.interface)) + self.entries[key][0].do_metadata_update = self.track_schema + + def track_schema_changes(self, track : bool, keys=None) -> None: + """ Performance optimization for skipping schema update checks + + Stop checking for schema updates when setting data. Use ONLY if + your data's schema is static and you are really trying to eke out + every bit of optimization. + + Args: + track (bool): True/False indicating if the keys' schema should be tracked + keys (List[str]): List of keys to track. If None, all present and future + keys are tracked according to ``track`` + + Returns: None + + """ + with self.interface.INTERFACE_LOCK: + if keys is None: + keys = iterkeys(self.entries) + self.track_schema = track + for k in keys: + self.entries[k][0].do_metadata_update = track + + def __getstate__(self): + return {'interface':self.interface.__getstate__(),'track_schema':self.track_schema} + + def __setstate__(self,state): + self.interface.__setstate__(state['interface']) + self.entries = {} + self.track_schema = state['track_schema'] + + +class PublishSpace(KeyValueStore): + """ Convenience class for publishing + + This class keeps track of ``PublishWriter`` objects for each key the user has published on. + + """ + def __getitem__(self, item : str) -> WriteOnlyKeyAccessor: + """ Same function as ``KeyValueStore`` method, but returns a non-readable ``WriteOnlyKeyAccessor`` object + + """ + assert isinstance(item,str) + with self.interface.INTERFACE_LOCK: + self._ensure_key_existence(item) + publisher, _ = self.entries[item] + return WriteOnlyKeyAccessor(self, writer=publisher, reader=_) + + def __setitem__(self, key : str, value : Any) -> None: + """ Only used for setting key on first level of KVS. i.e. KVS["top_key"] = value. Otherwise see __getitem__ + + Args: + key (str): "dictionary" key. It becomes a top-level Redis key + value: value to store + + Returns: None + + """ + assert check_valid_key_name(key), "Invalid Key: {}".format(key) + if not isinstance(value,(list,tuple,dict)): + value = {_ROOT_VALUE_READ_NAME: value} + with self.interface.INTERFACE_LOCK: + self._ensure_key_existence(key) + writer, reader = self.entries[key] + writer.send_to_redis(ROOT_PATH, value) + + def _ensure_key_existence(self, key): + """ Identical to ``KeyValueStore`` method of same name but does not instantiate a ``Reader`` object + """ + assert check_valid_key_name(key), "Invalid Key: {}".format(key) + if key not in self.entries: + self.entries[key] = (PublishWriter(key, self.interface), None) + self.entries[key][0].do_metadata_update = self.track_schema + + +class RawSubscriber: + """A Subscriber that calls a callback function of the + form `f(channel,message,**kwargs)` every time it receives a message + published on `channel_name*`. + """ + + def __init__(self, channel_name, interface, callback_function, kwargs): + self.listening_channel = '__pubspace@0__:{}'.format(channel_name) + self.listener = ChannelListener(interface.client_copy(), self.listening_channel, callback_function, kwargs) + self.listener.setDaemon(True) + + def listen(self): + self.listener.start() + + +class SilentSubscriber: + """A Subscriber that reads updates into a local dict, and users access + the most up-to-date values using value() or [key]. + """ + + def __init__(self, channel : str, interface : Union[str,RedisInterface]): + if isinstance(interface,str): + host = interface + interface = RedisInterface(host) + self.passive_subscriber = RawSubscriber(channel + "*", interface, self.update_local_copy, {}) + self.reader = Reader(channel, interface) + self.local_copy = {} + self.prefix = "__pubspace@0__:" + self.reader.top_key_name + + def update_local_copy(self, channel, message): + """ Update the local copy of the data stored under this channel name in redis. - self.shipper_labels = [sh.get_label() for sh in ships] + Args: + channel: the name of the channel that was published. + message: message published on that channel + + Returns: None + + """ + #logger.info("SILENT_SUBSCRIBER @{} : channel={} message={}".format(self.prefix, channel, message)) + if message != b"Publish": + logger.debug("SILENT_SUBSCRIBER @{} : Incorrect message type? {}".format(self.prefix,message)) + return + + channel = channel.decode('utf-8') + if channel == self.prefix: + #import time + #t0 = time.time() + self.local_copy = self.reader.read_from_redis(ROOT_PATH) + #print("Time to read from redis",time.time()-t0) + return + + path = channel[len(self.prefix):] + redis_value = self.reader.read_from_redis(path) + #logger.debug("SILENT_SUBSCRIBER @{} : Read from Redis: {}".format(self.prefix, redis_value)) + insert_into_dictionary(self.local_copy, path_to_key_sequence(path), redis_value) + #logger.debug("SILENT_SUBSCRIBER @{} : Local Copy: {}".format(self.prefix, self.local_copy)) + + def listen(self) -> None: + """ Makes this subscriber start listening + + Returns: None + + """ + self.passive_subscriber.listen() + + def value(self): + """ Get data stored at root + + Where as the reader can do ``server["foo"].read()`` with if server is a ``KeyValueStore``, + accessing the root value of a subscriber is not as easy. This method retrieves all data stored underneath + a top level key. + + Returns: all data stored underneath a top level Redis key. - def initialize(self): """ - Call before doing anything with this connection - :return: + if _ROOT_VALUE_READ_NAME in self.local_copy: + return self.local_copy[_ROOT_VALUE_READ_NAME] + # Copy dictionary - paths to omit is blank, so we copy everything + return copy_dictionary_without_paths(self.local_copy, []) + + def __getitem__(self, item : str) -> ActiveSubscriberKeyAccessor: + """ Implement dictionary API for local copy + + We do not give the user direct access to the dictionary representing the lcoal + Args: + item (str): + + Returns: ActiveSubscriberKeyAccessor + + """ + assert isinstance(item,str), "Key name must be string" + return ActiveSubscriberKeyAccessor(self, None, self.reader, [item]) + + +class CallbackSubscriber(SilentSubscriber): + """A Subscriber that calls a user-defined callback every time a + publisher sends a message. You can also access the most up-to-date + value using value() or [key]. + + The callback function is of the form `f(channel,message,**kwargs)` + and is called every time it receives a message published on + `channel_name*` + """ + + def __init__(self, channel : str, interface : Union[str,RedisInterface], callback_function : Callable, kwargs): + if isinstance(interface,str): + host = interface + interface = RedisInterface(host) + super(CallbackSubscriber,self).__init__(channel, interface) + #self.passive_subscriber = RawSubscriber(channel + "*", interface, self.call_user_function, {}) + if not callable(callback_function): + raise ValueError("Need to provide a callback function") + self.passive_subscriber.listener.callback_function = self.call_user_function + self.callback_function = callback_function + self.kwargs = kwargs + + def call_user_function(self, channel, message): + """ + Wrapper callback function (wrapping user function) for this class to work with a RawSubscriber object + Fits required interface for a ChannelSubscriber callback function + :param channel: channel published to + :param message: message that was published + :return: None + :rtype: None """ - pass \ No newline at end of file + self.update_local_copy(channel, message) + channel_name = channel.split(b"__pubspace@0__:")[1] + self.callback_function(data=self.value(), updated_path=channel_name, **self.kwargs) + + + + + + +class Writer(object): + """Responsible for setting data inside Redis + + The Writer class is an internal class that is used for all data sent to Redis (not including pub/sub messages). + Each key that will have nested data below requires a new instantiation of Writer + + Attributes: + top_key_name (str): The name of the Redis key under which JSON data will be stored. To Redis, + this will become a ReJSON key name. It is also used to generate the Redis key name that marshallers use to + store non JSON data. + interface (RedisInterface): Defines the connection to Redis this writer will use + """ + def __init__(self, top_key_name : str, interface : RedisInterface): + self.interface = interface + self.top_key_name = top_key_name + self.metadata_key_name = self.top_key_name + SEPARATOR_CHARACTER + "metadata" + self.metadata = None + self.__initialize_metadata() + self.sp_to_label = self.metadata["special_paths"] + self.pipeline = self.interface.client.pipeline() + self.pipeline_no_decode = self.interface.client_no_decode.pipeline() + self.do_metadata_update = True + + def __initialize_metadata(self): + """ Pull metadata for this key from Redis or set a default + + Returns: + None + """ + try: + pulled = self.interface.client.jsonget(self.metadata_key_name, ".") + if pulled is not None: + self.metadata = pulled + return + except TypeError: + pass + self.metadata = {"special_paths": {}, "required_labels": self.interface.marshaller_labels} + + def send_to_redis(self, set_path, set_value): + """ Execute equivalent of ``JSON.SET self.top_key_name `` + + From the user's perspective, it executes ``JSON.SET self.top_key_name `` + except that ``set_value`` can be json-incompatible. In such a case, it determines what + non-serializable types are inside set_value, stores the serializable data as a JSON, and + stores the non-serializable data using ``self.interface``'s marshallers. + + Args: + set_path (str): path underneath JSON key to set + set_value: value to set + + Returns: + None + + """ + with self.interface.INTERFACE_LOCK: + #logger.info("SET {} {} = {}".format(self.top_key_name, set_path, type(set_value))) + self._process_metadata(set_path, set_value) + #logger.debug("SET {} {} Metadata: {}".format(self.top_key_name, set_path, self.metadata)) + self._publish_non_serializables(set_path, set_value) + #logger.debug("SET {} {} Non-Serializables Pipelined".format(self.top_key_name, set_path)) + self._publish_serializables(set_path, set_value) + #logger.debug("SET {} {} Serializables Pipelined".format(self.top_key_name, set_path)) + self.pipeline.execute() + #logger.debug("SET {} {} Pipeline Executed".format(self.top_key_name, set_path)) + + def delete_from_redis(self, del_path : str): + """Execute equivalent of ``JSON.DEL self.top_key_name `` + + + Args: + del_path (str): path underneath JSON key to delete + + Returns: + None + """ + with self.interface.INTERFACE_LOCK: + dels = 0 + if del_path in self.sp_to_label: + marshaller = self.interface.label_to_marshaller[self.sp_to_label[del_path]] + special_name = str(self.top_key_name) + str(del_path) + marshaller.delete(special_name, self.pipeline_no_decode) + self.pipeline_no_decode.execute() + del self.sp_to_label[del_path] + dels += 1 + else: + self.pipeline.jsondel(self.top_key_name, del_path) + + #maybe some of the sub-keys of del_path could be special + special_paths, suffixes = filter_paths_by_prefix(iterkeys(self.sp_to_label), del_path) + for p in special_paths: + special_path_redis_key_name = self.top_key_name + p + ship = self.interface.label_to_marshaller[self.sp_to_label[p]] + ship.delete(special_path_redis_key_name, self.pipeline_no_decode) + del self.sp_to_label[p] + dels += 1 + self.pipeline_no_decode.execute() + + if dels > 0: + #must broadcast metadata change + self.pipeline.jsonset(self.metadata_key_name, ".", self.metadata) + channel, message = "__keyspace@0__:"+ self.metadata_key_name, "set" + self.pipeline.publish(channel, message) # Homemade key-space notification for metadata updates + + self.pipeline.execute() + + + def _process_metadata(self, set_path : str, set_value): + """ Handle metadata updates + + Given the path and value the user would like to set, check if there are non-serializable data types and update + metadata locally and in Redis. Happens without pipeline + + Args: + set_path (str): path underneath JSON key to set + set_value: value to set + + Returns: + None + + """ + if not self.do_metadata_update: + return + + overridden_paths = set() + for existing_path in iterkeys(self.sp_to_label): + if existing_path.startswith(set_path): + overridden_paths.add(existing_path) + [self.sp_to_label.pop(op) for op in overridden_paths] + + special_paths = get_special_paths(set_path, set_value, self.sp_to_label, self.interface.label_to_marshaller) + dels, adds = overridden_paths - special_paths, special_paths - overridden_paths + for set_path, label in special_paths: + self.sp_to_label[set_path] = label + + if len(adds) > 0 or len(dels) > 0: + self.pipeline.jsonset(self.metadata_key_name, ".", self.metadata) + channel, message = "__keyspace@0__:"+ self.metadata_key_name, "set" + self.pipeline.publish(channel, message) # Homemade key-space notification for metadata updates + + def _publish_non_serializables(self, set_path, set_value): + """Publish JSON incompatible data to Redis + + Given a set, publish the non-serializable components to redis, given that metadata has been updated already + + Args: + set_path (str): path underneath JSON key to set + set_value: value to set + + Returns: + None + """ + + overridden_paths, suffixes = filter_paths_by_prefix(iterkeys(self.sp_to_label), set_path) + for full_path, suffix in zip(overridden_paths, suffixes): + #logger.debug("Suffix = {}".format(suffix)) + update_value = extract_object(set_value, path_to_key_sequence(suffix)) + special_path_redis_key_name = self.top_key_name+full_path + #logger.debug("SET {} {} Non-serializable update {} = {}".format( + # self.top_key_name, set_path, special_path_redis_key_name, type(update_value)) + #) + self.interface.label_to_marshaller[self.sp_to_label[full_path]].write( + key=special_path_redis_key_name, + value=update_value, + client=self.pipeline + ) + + def _publish_serializables(self, set_path, set_value): + """ Publish the serializable portion of ``set_value`` + + Take out the non-serializable part of set_value and publish it at set_path + + Args: + set_path (str): path underneath JSON key to set + set_value: value to set + + Returns: None + + """ + if type(set_value) is dict: + intrusive_paths, suffixes = filter_paths_by_prefix(iterkeys(self.sp_to_label), set_path) + excised_copy = copy_dictionary_without_paths(set_value, [path_to_key_sequence(s) for s in suffixes]) + self.pipeline.jsonset(self.top_key_name, set_path, excised_copy) + #logger.debug("SET {} {} Serializable update {} = {}".format(self.top_key_name, set_path, set_path, excised_copy)) + elif set_path not in self.sp_to_label: + self.pipeline.jsonset(self.top_key_name, set_path, set_value) + #logger.debug("SET {} {} Serializable update {} = {}".format(self.top_key_name, set_path, set_path, set_value)) + + +class Reader(object): + """Responsible for getting data from Redis + + The Reader class is an internal class that is used for all read from Redis (not including pub/sub messages). + Each key that will have nested data below requires a new instantiation of Reader + + Attributes: + top_key_name (str): The name of the Redis key under which JSON data is stored + interface (RedisInterface): Defines the connection to Redis this reader will use + """ + def __init__(self, top_key_name, interface): + self.interface = interface + self.top_key_name = top_key_name + self.metadata = {"special_paths": {}, "required_labels": self.interface.marshaller_labels} + self.sp_to_label = self.metadata["special_paths"] + self.pipeline = self.interface.client.pipeline() + self.pipeline_no_decode = self.interface.client_no_decode.pipeline() + self.metadata_key_name = "{}{}metadata".format(self.top_key_name, SEPARATOR_CHARACTER) + self.interface.metadata_listener.add_listener(self.metadata_key_name, self) + self.pull_metadata = True + # Will need to update metadata on first read regardless so the simple initialization we have here is sufficient + + def read_from_redis(self, read_path): + """ Read specified path from Redis + + This is the only public method of the Reader class. It will retrieve the data stored at a specified path + from Redis. At a high level, it reads data stored with ReJSON and inserts non-JSON compatible data + at appropriate paths using the metadata associated with this key. + + Args: + read_path (str): path the user wants to read + + Returns: data stored at value in Redis + + """ + + with self.interface.INTERFACE_LOCK: + #logger.info("GET {} {} pull_metadata = {}".format(self.top_key_name, read_path, self.pull_metadata)) + self.update_metadata() + #logger.debug("GET {} {} Using Metadata: {}".format(self.top_key_name, read_path, self.metadata)) + if read_path in self.sp_to_label: + ret_val = self.pull_special_path(read_path) + else: + self.queue_reads(read_path) + #logger.debug("GET {} {} Reads Queued".format(self.top_key_name, read_path)) + ret_val = item = json_recode_str(self.build_dictionary(read_path)) + #logger.debug("GET {} {} Dictionary Built".format(self.top_key_name, read_path)) + return ret_val + + def update_metadata(self): + """ Update the local copy of metadata if a relevant path has been updated. + + The metadata listener is a redis client subscribed to key-space notifications. If a relevant path is updated, + this Reader's ``pull_metadata`` flag will be turned on. If ``pull_metadata`` is ``True``, then the reader + will fetch metadata from the Redis server. + + Returns: None + + """ + self.interface.metadata_listener.flush() + if self.pull_metadata: + try: + pulled = self.interface.client.jsonget(self.metadata_key_name, ".") + if pulled is not None: + self.metadata = pulled + except TypeError: # No Metadata online + return + self.sp_to_label = self.metadata["special_paths"] + self.pull_metadata = False + + def queue_reads(self, read_path): + """ Queue reads in a pipeline + + Queue all redis queries necessary to read data at path into the appropriate redis pipeline. + First, queue decoded pipeline with the ReJSON query + Next, queue all the special path reads with the non-decoded pipeline and marshallers + + Args: + read_path: path user wants to read + + Returns: None + """ + self.pipeline.jsonget(self.top_key_name, read_path) + special_paths, suffixes = filter_paths_by_prefix(iterkeys(self.sp_to_label), read_path) + for p in special_paths: + special_path_redis_key_name = self.top_key_name + p + #logger.debug("type(sp to label) = {}, type(p) = {}".format(type(self.sp_to_label), type(p))) + ship = self.interface.label_to_marshaller[self.sp_to_label[p]] + ship.read(special_path_redis_key_name, self.pipeline_no_decode) + + def build_dictionary(self, read_path): + """ Execute pipelines and consolidate data into a dictionary + + Args: + read_path: path user wants to read + + Returns: The data stored at ``read_path`` in Redis + """ + + try: + return_val = self.pipeline.execute()[0] + except TypeError as e: + raise KeyError("Invalid read from path "+self.top_key_name+read_path) + #logger.debug("GET {} {} Serializable Pipeline Executed".format(self.top_key_name, read_path)) + responses = self.pipeline_no_decode.execute() + special_paths, suffixes = filter_paths_by_prefix(iterkeys(self.sp_to_label), read_path) + assert len(special_paths) == len(suffixes) + #logger.debug("special_path = {}, suffixes = {}".format(special_paths, suffixes)) + for i, (sp, suffix) in enumerate(zip(special_paths, suffixes)): + value = self.interface.label_to_marshaller[self.sp_to_label[sp]].interpret_read(responses[i: i + 1]) + insert_into_dictionary(return_val, path_to_key_sequence(suffix), value) + #logger.debug("GET {} {} Nonserializable Pipeline Inserted {} = {}" + # .format(self.top_key_name, read_path, sp, type(value)) + # ) + #logger.debug("GET {} {} Dictionary Built".format(self.top_key_name, read_path)) + return return_val + + def pull_special_path(self, read_path): + """ Directly pull a non-JSON path + + If the user specified path is not in JSON, this will retrieve the data directly without going through ReJSON. + + Args: + read_path: path user wants to read + + Returns: + + """ + + marshaller = self.interface.label_to_marshaller[self.sp_to_label[read_path]] + special_name = str(self.top_key_name) + str(read_path) + marshaller.read(special_name, self.pipeline_no_decode) + responses = self.pipeline_no_decode.execute() + return marshaller.interpret_read(responses) + + +class PublishWriter(Writer): + """ Identical to Writer, but publishes a message when it writes a value. + + """ + + def __init__(self, top_key_name, interface): + super(PublishWriter,self).__init__(top_key_name, interface) + self.message = "Publish" + + def send_to_redis(self, set_path, set_value): + """ PublishWriter equivalent of Writer ``send_to_redis`` + + This is an equivalent function to ``Writer``'s ``send_to_redis`` method but also publishes a message + indicating what channel has been updated. + + Args: + set_path (str): path underneath JSON key to set + set_value: value to set + + Returns: None + + """ + #logger.info("PUBLISH {} {} = {}".format(self.top_key_name, set_path, type(set_value))) + #logger.debug("PUBLISH {} {} Metadata Update?: {}".format(self.top_key_name, set_path, self.do_metadata_update)) + with self.interface.INTERFACE_LOCK: + self._process_metadata(set_path, set_value) + #logger.debug("PUBLISH {} {} Metadata: {}".format(self.top_key_name, set_path, self.metadata)) + self._publish_non_serializables(set_path, set_value) + self._publish_serializables(set_path, set_value) + + # Addition to Writer class + if set_path == ROOT_PATH: + set_path = "" + channel_name = "__pubspace@0__:" + self.top_key_name + set_path + self.pipeline.publish(channel_name, self.message) + + # Resume Writer Class + self.pipeline.execute() + #logger.debug("PUBLISH {} {} pipeline executed, published {} to {}".format( + # self.top_key_name, set_path, self.message, channel_name) + #) + + def delete_from_redis(self,del_path): + raise RuntimeError("Cannot delete published values") \ No newline at end of file diff --git a/reem/convenience.py b/reem/convenience.py new file mode 100644 index 0000000..71f2981 --- /dev/null +++ b/reem/convenience.py @@ -0,0 +1,366 @@ +from __future__ import annotations +from .connection import RedisInterface,KeyValueStore +import weakref +import redis +import time +from typing import Union,Optional,Any + +class TolerantKeyValueStore(KeyValueStore): + """TolerantKeyValueStore acts almost like a normal KeyValueStore, except + for the following advantages when using the :func:`var`, :func:`set`, + and :func:`get` methods: + + - More tolerant of uninitialized keys and will fill in empty + dicts as needed. + - Can accept paths in the form of string paths ``['key1','key2']`` or + period- separated keys ``'key1.key2'`` + + .. note:: + + Does not accept path strings that include integer array indices, yet. + To access arrays, you will need to pass in arrays, e.g. + ``['key1','key2',3]`` + + There are also some performance enhancements when using :func:`var`: + + - If you are accessing a sub-key many times in success to obtain its + sub-objects, storing a :func:`var` once and accessing its sub-keys is + much faster because it will cache the object and avoid making many + calls to the server. + - If you are accessing a sub-key of a large object, use + ``var(path_to_item)`` rather than ``var(key1)[key2][...]``. The latter + will retrieve the whole object referenced by key1. + - You may play around with the cache refresh time with the second + argument to :func:`var` or with the attribute ``defaultVarRefreshRate``. + If you have a slow item that only updates + occasionally, e.g., by user input, set a larger refresh, e.g. + ``var(path,2)`` will make at most one query to the server per 2 seconds. + + """ + def __init__(self, + interface: Union[str,RedisInterface,KeyValueStore]='localhost', + refreshRate : float=0, + *args, + **kwargs): + KeyValueStore.__init__(self,interface,*args,**kwargs) + self.defaultVarRefreshRate = refreshRate + + def var(self, + path : Union[str,list], + refreshRate : Optional[float]=None) -> TolerantKVSVar: + """Given a path (period-separated str or list of str), returns a + :class:`TolerantKVSVar` object that accesses the key using get()/set(). + + All parent keys in path will be created as empty dictionaries + if they don't exist. + + If refreshRate!=0, values will be cached, only refreshing after + refreshRate seconds elapse. This minimizes server traffic. + """ + return TolerantKVSVar(self,path,(refreshRate if refreshRate is not None else self.defaultVarRefreshRate)) + + def get(self, + path : Union[str,list]) -> Any: + """Given a path (period-separated str or list of str), returns a JSON + object or numpy array at path by recursively descending into self. + """ + return TolerantKVSVar(self,path).get() + + def set(self, + path : Union[str,list], value : Any): + """Given a path (period-separated str or list of str), sets a value in + the state server. The item must be json-encodable or a numpy array. + + If you are accessing a path with multiple subkeys that don't + exist, the subkeys will be added. + """ + return TolerantKVSVar(self,path).set(value) + + +class TolerantKVSVar: + """An accessor for a TolerantKeyValueStore. Can be more convenient than accessing + the server via ``server[key].read() / write()`` because it will create + parent keys from a period-separated path, and can be more efficient on + reads due to caching and pre-creation of path strings. + + Supports operators [], del [], type(), len(), +=, -=, *=, /=, and append(). + """ + def __init__(self, server : TolerantKeyValueStore, path : Union[str,list], refreshRate : float=0): + self.server = weakref.proxy(server) + if isinstance(path,str): + path = path.split('.') + else: + assert isinstance(path,(list,tuple)) + assert len(path) > 0 + self.path = path + res = server + for p in path: + res = res[p] + self.node = res + self.refreshRate = refreshRate + self.cachedTime = 0 + self.cachedValue = None + self.cacheWrites = 0 + self.cacheHits = 0 + self.cacheMisses = 0 + + def _ensureKeys(self): + res = KeyValueStore.__getitem__(self.server,self.path[0]) + try: + res.type() + except Exception: + if isinstance(self.path[0],int): + raise KeyError("Invalid Redis index into array {}".format(self.path)) + self.server.set(self.path[0],{}) + + for p in self.path[1:-1]: + prev = res + res = res[p] + try: + res.type() + except Exception: + if isinstance(p,int): + raise KeyError("Invalid Redis index into array {}".format(self.path)) + #key doesn't exist + try: + prev.write({p:dict()}) + except ValueError: + print("Uh... didn't successfully write keys in",self.path,"up to",p) + raise + except redis.exceptions.ResponseError: + print("Uh... didn't successfully write keys in",self.path,"up to",p) + raise + res = prev[p] + + def _rawRead(self): + try: + return self.node.read() + except ValueError: + pass + except redis.exceptions.ResponseError: + pass + raise KeyError("Redis path %s does not exist"%('.'.join(str(v) for v in self.path))) + + def _rawWrite(self,value): + try: + return self.node.write(value) + except ValueError: + pass + except redis.exceptions.ResponseError: + pass + self._ensureKeys() + return self.node.write(value) + + def _cachedRead(self,func): + t = time.time() + if self.cachedValue is not None and t < self.cachedTime + self.refreshRate: + self.cacheHits += 1 + return func(self.cachedValue) + self.cachedValue = self._rawRead() + self.cachedTime = t + self.cacheMisses += 1 + return func(self.cachedValue) + + def get(self): + """Reads the value at the given key from the state server""" + if self.refreshRate: + return self._cachedRead(lambda x:x) + else: + return self._rawRead() + + def set(self,value): + """Sets the value at the given key into the state server. + """ + if self.refreshRate: + self.cachedValue = value + self.cachedTime = time.time() + self.cacheWrites += 1 + self._rawWrite(value) + + def __getitem__(self,key): + return TolerantKVSVarSubkey(self,self,key) + + def __setitem__(self,key,value): + return TolerantKVSVarSubkey(self,self,key).set(value) + + def __delitem__(self,key): + del self.node[key] + if self.cachedValue is not None: + try: + del self.cachedValue[key] + except KeyError: + pass + + def __str__(self): + return '.'.join(str(v) for v in self.path)+'='+str(self.get()) + + def type(self): + if self.refreshRate: + return self._cachedRead(lambda x:x.__class__) + else: + return self.node.type() + + def __len__(self): + if self.refreshRate: + return self._cachedRead(lambda x:len(x)) + else: + return len(self.node) + + def __iadd__(self,rhs): + if self.refreshRate: + self.cachedValue += rhs + self.cachedTime = time.time() + self.cacheWrites += 1 + self.node += rhs + return self + + def __isub__(self,rhs): + if self.refreshRate: + self.cachedValue -= rhs + self.cachedTime = time.time() + self.cacheWrites += 1 + self.node -= rhs + return self + + def __imul__(self,rhs): + if self.refreshRate: + self.cachedValue *= rhs + self.cachedTime = time.time() + self.cacheWrites += 1 + self.node *= rhs + return self + + def __idiv__(self,rhs): + if self.refreshRate: + self.cachedValue /= rhs + self.cachedTime = time.time() + self.cacheWrites += 1 + self.node /= rhs + return self + + def append(self,rhs): + if self.refreshRate: + self.cachedValue.append(rhs) + self.cachedTime = time.time() + self.cacheWrites += 1 + self.node.append(rhs) + + +class TolerantKVSVarSubkey: + """Accessor for sub-keys of TolerantKVSVar's. Respects cache, and + refreshes the cache of the original object referenced by var(). + + Performs copy-on-write semantics. + + Supports operators [], del [], type(), len(), +=, -=, *=, /=, and append(). + """ + def __init__(self,root : TolerantKVSVar, parentnode, key : str): + self.root = root + self.parent = parentnode + self.key = key + if isinstance(self.parent,TolerantKVSVar): + self.path = [key] + self.node = self.parent.node[key] + else: + self.path = self.parent.path + [key] + self.node = self.parent.node[key] + + def get(self): + val = self.root.get() + for k in self.path: + val = val[k] + return val + + def _setCachedValue(self,value): + if self.root.cachedValue is None: return None + t = time.time() + if t >= self.root.cachedTime + self.root.refreshRate: return None + cachedParent = None + cachedValue = self.root.cachedValue + for k in self.path: + cachedParent = cachedValue + if k not in cachedValue: + cachedValue[k] = {} + cachedValue = cachedValue[k] + assert cachedParent is not None + cachedParent[self.key] = value + + def _getCachedValue(self): + if self.root.cachedValue is None: return None + t = time.time() + if t >= self.root.cachedTime + self.root.refreshRate: return None + cachedValue = self.root.cachedValue + for k in self.path: + cachedValue = cachedValue[k] + self.root.cacheWrites += 1 + self.root.cachedTime = t + return cachedValue + + def set(self,value): + if isinstance(value,(TolerantKVSVar,TolerantKVSVarSubkey)): + if value is self: #this happens with incremental add/sub/mul/div operators + return + value = value.get() + try: + self.node.write(value) + except ValueError: + #create nodes up to this one + self.parent.set({}) + self.node.write(value) + except redis.exceptions.ResponseError: + #create nodes up to this one + self.parent.set({}) + self.node.write(value) + if self._setCachedValue(value) is None: + self.root.cacheWrites += 1 + + def __getitem__(self,key) -> 'TolerantKVSVarSubkey': + return TolerantKVSVarSubkey(self.root,self,key) + def __setitem__(self,key,value): + TolerantKVSVarSubkey(self.root,self,key).set(value) + def __delitem__(self,key): + del self.node[key] + cv = self._getCachedValue() + if cv is not None: + del cv[key] + + def __str__(self): + return '.'.join(str(v) for v in self.path)+'='+str(self.get()) + def type(self): + return self.get().__class__ + def __len__(self): + return len(self.get()) + + def __iadd__(self,rhs): + self.node += rhs + cv = self._getCachedValue() + if cv is not None: + cv += rhs + return self + + def __isub__(self,rhs): + self.node -= rhs + cv = self._getCachedValue() + if cv is not None: + cv -= rhs + return self + + def __imul__(self,rhs): + self.node *= rhs + cv = self._getCachedValue() + if cv is not None: + cv *= rhs + return self + + def __idiv__(self,rhs): + self.node /= rhs + cv = self._getCachedValue() + if cv is not None: + cv /= rhs + return self + + def append(self,rhs): + self.node.append(rhs) + cv = self._getCachedValue() + if cv is not None: + cv.append(rhs) diff --git a/reem/datatypes.py b/reem/datatypes.py deleted file mode 100644 index 87aee73..0000000 --- a/reem/datatypes.py +++ /dev/null @@ -1,548 +0,0 @@ -from .utilities import * -from .supports import ReadablePathHandler, PathHandler, ChannelListener, ActiveSubscriberPathHandler -from rejson import Path -import logging -import queue - -logger = logging.getLogger("reem") - - -class Writer: - """Responsible for setting data inside Redis - - The Writer class is an internal class that is used for all data sent to Redis (not including pub/sub messages). - Each key that will have nested data below requires a new instantiation of Writer - - Attributes: - top_key_name (str): The name of the Redis key under which JSON data will be stored. To Redis, - this will become a ReJSON key name. It is also used to generate the Redis key name that ``ship``'s use to - store non JSON data. - interface (RedisInterface): Defines the connection to Redis this writer will use - """ - def __init__(self, top_key_name, interface): - self.interface = interface - self.top_key_name = top_key_name - self.metadata_key_name = "{}{}metadata".format(self.top_key_name, SEPARATOR_CHARACTER) - self.metadata = None - self.__initialize_metadata() - self.sp_to_label = self.metadata["special_paths"] - self.pipeline = self.interface.client.pipeline() - self.do_metadata_update = True - - def __initialize_metadata(self): - """ Pull metadata for this key from Redis or set a default - - Returns: - None - """ - try: - pulled = self.interface.client.jsonget(self.metadata_key_name, ".") - if pulled is not None: - self.metadata = pulled - return - except TypeError: - pass - self.metadata = {"special_paths": {}, "required_labels": self.interface.shipper_labels} - - def send_to_redis(self, set_path, set_value): - """ Execute equivalent of ``JSON.SET self.top_key_name `` - - From the user's perspective, it executes ``JSON.SET self.top_key_name `` - except that ``set_value`` can be json-incompatible. This is the only public - method of this class. It determines what non-serializable types are inside set_value, stores the - serializable data as a JSON, and stores the non-serializable data using ``self.interface``'s ships - - Args: - set_path (str): path underneath JSON key to set - set_value: value to set - - Returns: - None - - """ - logger.info("SET {} {} = {}".format(self.top_key_name, set_path, type(set_value))) - self.__process_metadata(set_path, set_value) - logger.debug("SET {} {} Metadata: {}".format(self.top_key_name, set_path, self.metadata)) - self.__publish_non_serializables(set_path, set_value) - logger.debug("SET {} {} Non-Serializables Pipelined".format(self.top_key_name, set_path)) - self.__publish_serializables(set_path, set_value) - logger.debug("SET {} {} Serializables Pipelined".format(self.top_key_name, set_path)) - self.pipeline.execute() - logger.debug("SET {} {} Pipeline Executed".format(self.top_key_name, set_path)) - - def __process_metadata(self, set_path, set_value): - """ Handle metadata updates - - Given the path and value the user would like to set, check if there are non-serializable data types and update - metadata locally and in Redis. Happens without pipeline - - Args: - set_path (str): path underneath JSON key to set - set_value: value to set - - Returns: - None - - """ - if not self.do_metadata_update: - return - - overridden_paths = set() - for existing_path in self.sp_to_label.keys(): - if existing_path.startswith(set_path): - overridden_paths.add(existing_path) - [self.sp_to_label.pop(op) for op in overridden_paths] - - special_paths = get_special_paths(set_path, set_value, self.sp_to_label, self.interface.label_to_shipper) - dels, adds = overridden_paths - special_paths, special_paths - overridden_paths - for set_path, label in special_paths: - self.sp_to_label[set_path] = label - - if len(adds) > 0 or len(dels) > 0: - self.pipeline.jsonset(self.metadata_key_name, ".", self.metadata) - channel, message = "__keyspace@0__:{}".format(self.metadata_key_name), "set" - self.pipeline.publish(channel, message) # Homemade key-space notification for metadata updates - - def __publish_non_serializables(self, set_path, set_value): - """Publish JSON incompatible data to Redis - - Given a set, publish the non-serializable components to redis, given that metadata has been updated already - - Args: - set_path (str): path underneath JSON key to set - set_value: value to set - - Returns: - None - """ - - overridden_paths, suffixes = filter_paths_by_prefix(self.sp_to_label.keys(), set_path) - for full_path, suffix in zip(overridden_paths, suffixes): - logger.debug("Suffix = {}".format(suffix)) - update_value = extract_object(set_value, path_to_key_sequence(suffix)) - special_path_redis_key_name = "{}{}".format(self.top_key_name, full_path) - logger.debug("SET {} {} Non-serializable update {} = {}".format( - self.top_key_name, set_path, special_path_redis_key_name, type(update_value)) - ) - self.interface.label_to_shipper[self.sp_to_label[full_path]].write( - key=special_path_redis_key_name, - value=update_value, - client=self.pipeline - ) - - def __publish_serializables(self, set_path, set_value): - """ Publish the serializable portion of ``set_value - - Take out the non-serializable part of set_value and publish it at set_path - - Args: - set_path (str): path underneath JSON key to set - set_value: value to set - - Returns: None - - """ - if type(set_value) is dict: - intrusive_paths, suffixes = filter_paths_by_prefix(self.sp_to_label.keys(), set_path) - excised_copy = copy_dictionary_without_paths(set_value, [path_to_key_sequence(s) for s in suffixes]) - self.pipeline.jsonset(self.top_key_name, set_path, excised_copy) - logger.debug("SET {} {} Serializable update {} = {}".format(self.top_key_name, set_path, set_path, excised_copy)) - elif set_path not in self.sp_to_label: - self.pipeline.jsonset(self.top_key_name, set_path, set_value) - logger.debug("SET {} {} Serializable update {} = {}".format(self.top_key_name, set_path, set_path, set_value)) - - -class Reader: - """Responsible for getting data from Redis - - The Reader class is an internal class that is used for all read from Redis (not including pub/sub messages). - Each key that will have nested data below requires a new instantiation of Reader - - Attributes: - top_key_name (str): The name of the Redis key under which JSON data is stored - interface (RedisInterface): Defines the connection to Redis this reader will use - """ - def __init__(self, top_key_name, interface): - self.interface = interface - self.top_key_name = top_key_name - self.metadata = {"special_paths": {}, "required_labels": self.interface.shipper_labels} - self.sp_to_label = self.metadata["special_paths"] - self.pipeline = self.interface.client.pipeline() - self.pipeline_no_decode = self.interface.client_no_decode.pipeline() - self.metadata_key_name = "{}{}metadata".format(self.top_key_name, SEPARATOR_CHARACTER) - self.interface.metadata_listener.add_listener(self.metadata_key_name, self) - self.pull_metadata = True - # Will need to update metadata on first read regardless so the simple initialization we have here is sufficient - - def read_from_redis(self, read_path): - """ Read specified path from Redis - - This is the only public method of the Reader class. It will retrieve the data stored at a specified path - from Redis. At a high level, it reads data stored with ReJSON and inserts non-JSON compatible data - at appropriate paths using the metadata associated with this key. - - Args: - read_path (str): path the user wants to read - - Returns: data stored at value in Redis - - """ - - self.interface.INTERFACE_LOCK.acquire(timeout=1) - logger.info("GET {} {} pull_metadata = {}".format(self.top_key_name, read_path, self.pull_metadata)) - self.update_metadata() - logger.debug("GET {} {} Using Metadata: {}".format(self.top_key_name, read_path, self.metadata)) - if read_path in self.sp_to_label: - ret_val = self.pull_special_path(read_path) - else: - self.queue_reads(read_path) - logger.debug("GET {} {} Reads Queued".format(self.top_key_name, read_path)) - ret_val = self.build_dictionary(read_path) - logger.debug("GET {} {} Dictionary Built".format(self.top_key_name, read_path)) - self.interface.INTERFACE_LOCK.release() - return ret_val - - def update_metadata(self): - """ Update the local copy of metadata if a relevant path has been updated. - - The metadata listener is a redis client subscribed to key-space notifications. If a relevant path is updated, - this Reader's ``pull_metadata`` flag will be turned on. If ``pull_metadata`` is ``True``, then the reader - will fetch metadata from the Redis server. - - Returns: None - - """ - self.interface.metadata_listener.flush() - if self.pull_metadata: - try: - pulled = self.interface.client.jsonget(self.metadata_key_name, ".") - if pulled is not None: - self.metadata = pulled - except TypeError: # No Metadata online - return - self.sp_to_label = self.metadata["special_paths"] - self.pull_metadata = False - - def queue_reads(self, read_path): - """ Queue reads in a pipeline - - Queue all redis queries necessary to read data at path into the appropriate redis pipeline. - First, queue decoded pipeline with the ReJSON query - Next, queue all the special path reads with the non-decoded pipeline and ships - - Args: - read_path: path user wants to read - - Returns: None - """ - self.pipeline.jsonget(self.top_key_name, read_path) - special_paths, suffixes = filter_paths_by_prefix(self.sp_to_label.keys(), read_path) - for p in special_paths: - special_path_redis_key_name = "{}{}".format(self.top_key_name, p) - logger.debug("type(sp to label) = {}, type(p) = {}".format(type(self.sp_to_label), type(p))) - ship = self.interface.label_to_shipper[self.sp_to_label[p]] - ship.read(special_path_redis_key_name, self.pipeline_no_decode) - - def build_dictionary(self, read_path): - """ Execute pipelines and consolidate data into a dictionary - - Args: - read_path: path user wants to read - - Returns: The data stored at ``read_path`` in Redis - """ - - return_val = self.pipeline.execute()[0] - logger.debug("GET {} {} Serializable Pipeline Executed".format(self.top_key_name, read_path)) - responses = self.pipeline_no_decode.execute() - special_paths, suffixes = filter_paths_by_prefix(self.sp_to_label.keys(), read_path) - logger.debug("special_path = {}, suffixes = {}".format(special_paths, suffixes)) - for i, (sp, suffix) in enumerate(zip(special_paths, suffixes)): - value = self.interface.label_to_shipper[self.sp_to_label[sp]].interpret_read(responses[i: i + 1]) - insert_into_dictionary(return_val, path_to_key_sequence(suffix), value) - logger.debug("GET {} {} Nonserializable Pipeline Inserted {} = {}" - .format(self.top_key_name, read_path, sp, type(value)) - ) - logger.debug("GET {} {} Dictionary Built".format(self.top_key_name, read_path)) - return return_val - - def pull_special_path(self, read_path): - """ Directly pull a non-JSON path - - If the user specified path is not in JSON, this will retrieve the data directly without going through ReJSON. - - Args: - read_path: path user wants to read - - Returns: - - """ - shipper = self.interface.label_to_shipper[self.sp_to_label[read_path]] - special_name = "{}{}".format(self.top_key_name, read_path) - shipper.read(special_name, self.pipeline_no_decode) - responses = self.pipeline_no_decode.execute() - return shipper.interpret_read(responses) - - -class KeyValueStore: - """Dictionary Like object used for get/set paradigm - - The ``KeyValueStore`` object is one that users will frequently use. It keeps ``Reader`` and ``Writer`` objects - for each key that the user read or written to. It does not actually handle the getting and setting of data - but produces ``ReadablePathHandler`` objects that assist with path construction and call the reader and - writer's write and read methods. - - Attributes: - interface (RedisInterface): Defines the connection to Redis this reader will use - """ - def __init__(self, interface): - self.interface = interface - self.entries = {} - self.track_schema = True - - def __setitem__(self, key, value): - """ Only used for setting key on first level of KVS. i.e. KVS["top_key"] = value. Otherwise see __getitem__ - - Args: - key (str): "dictionary" key. It becomes a top-level Redis key - value: value to store - - Returns: None - - """ - - assert check_valid_key_name(key), "Invalid Key: {}".format(key) - if type(value) != dict: - value = {"{}ROOT{}".format(ROOT_VALUE_SEQUENCE, ROOT_VALUE_SEQUENCE): value} - self.__ensure_key_existence(key) - writer, reader = self.entries[key] - writer.send_to_redis(Path.rootPath(), value) - - def __getitem__(self, item): - """Used to retrieve ReadablePathHandler object for handling path construction when setting/getting Redis - - Args: - item (str): "dictionary" key. It must be a top-level Redis key - - Returns: - - """ - - assert check_valid_key_name(item), "Invalid Key: {}".format(item) - logger.debug("KVS GET {}".format(item)) - self.__ensure_key_existence(item) - writer, reader = self.entries[item] - return ReadablePathHandler(writer=writer, reader=reader, initial_path=Path.rootPath()) - - def __ensure_key_existence(self, key): - """ Ensure that the requested key has a reader and writer associated with it. - - Returns: None - - """ - - assert check_valid_key_name(key), "Invalid Key: {}".format(key) - if key not in self.entries: - self.entries[key] = (Writer(key, self.interface), Reader(key, self.interface)) - self.entries[key][0].do_metadata_update = self.track_schema - - def track_schema_changes(self, set_value, keys=None): - """ Performance optimization for skipping schema update checks - - Stop checking for schema updates when setting data. Use ONLY if your data's schema is static - and you are really trying to eek out every bit of optimization. - - Args: - set_value (bool): True/False indicating if the keys' schema should be tracked - keys (List[str]): List of keys to track. If None, all present and future keys are tracked - according to ``set_value`` - - Returns: None - - """ - - if keys is None: - keys = self.entries.keys() - self.track_schema = set_value - for k in keys: - self.entries[k][0].do_metadata_update = set_value - - -class Publisher(Writer): - """ Defines Publisher behavior - - The Publisher is identical to the writer but publishes a message when it writes a value. - - """ - - def __init__(self, top_key_name, interface): - super().__init__(top_key_name, interface) - self.message = "Publish" - - def send_to_redis(self, set_path, set_value): - """ Publisher equivalent of Writer ``send_to_redis`` - - This is an equivalent function to ``Writer``'s ``send_to_redis`` method but also publishes a message - indicating what channel has been updated. - - Args: - set_path (str): path underneath JSON key to set - set_value: value to set - - Returns: None - - """ - - logger.info("PUBLISH {} {} = {}".format(self.top_key_name, set_path, type(set_value))) - logger.debug("PUBLISH {} {} Metadata Update?: {}".format(self.top_key_name, set_path, self.do_metadata_update)) - self.__process_metadata(set_path, set_value) - logger.debug("PUBLISH {} {} Metadata: {}".format(self.top_key_name, set_path, self.metadata)) - self.__publish_non_serializables(set_path, set_value) - self.__publish_serializables(set_path, set_value) - - # Addition to Writer class - if set_path == Path.rootPath(): - set_path = "" - channel_name = "__pubspace@0__:{}{}".format(self.top_key_name, set_path) - self.pipeline.publish(channel_name, self.message) - - # Resume Writer Class - self.pipeline.execute() - logger.debug("PUBLISH {} {} pipeline executed, published {} to {}".format( - self.top_key_name, set_path, self.message, channel_name) - ) - - -class PublishSpace(KeyValueStore): - """ Convenience class for publishing - - This class keeps track of ``Publisher`` objects for each key the user has published on. - - """ - def __getitem__(self, item): - """ Identical to ``KeyValueStore`` method of same name but provides non-readable ``PathHandler`` objects - - """ - assert type(item) == str - self.__ensure_key_existence(item) - publisher, _ = self.entries[item] - return PathHandler(writer=publisher, reader=_, initial_path=Path.rootPath()) - - def __ensure_key_existence(self, key): - """ Identical to ``KeyValueStore`` method of same name but does not instantiate a ``Reader`` object - """ - - assert check_valid_key_name(key), "Invalid Key: {}".format(key) - if key not in self.entries: - self.entries[key] = (Publisher(key, self.interface), None) - self.entries[key][0].do_metadata_update = self.track_schema - - -class RawSubscriber: - def __init__(self, channel_name, interface, callback_function, kwargs): - self.listening_channel = '__pubspace@0__:{}'.format(channel_name) - self.listener = ChannelListener(interface, self.listening_channel, callback_function, kwargs) - self.listener.setDaemon(True) - - def listen(self): - self.listener.start() - - -class SilentSubscriber(Reader): - """ Silent Subscriber Implementation""" - - def __init__(self, channel, interface): - super().__init__(channel, interface) - self.local_copy = {} - self.passive_subscriber = RawSubscriber(channel + "*", interface, self.update_local_copy, {}) - self.prefix = "__pubspace@0__:{}".format(self.top_key_name) - - def update_local_copy(self, channel, message): - """ Update the local copy of the data stored under this channel name in redis. - - Args: - channel: the name of the channel that was published. - message: message published on that channel - - Returns: None - - """ - - logger.info("SILENT_SUBSCRIBER @{} : channel={} message={}".format(self.prefix, channel, message)) - try: - message = message.decode("utf-8") - except Exception as e: - return - if message != "Publish": - return - - if channel == self.prefix: - self.local_copy = self.read_from_redis(Path.rootPath()) - return - - path = channel[len(self.prefix):] - redis_value = self.read_from_redis(path) - logger.debug("SILENT_SUBSCRIBER @{} : Read from Redis: {}".format(self.prefix, redis_value)) - insert_into_dictionary(self.local_copy, path_to_key_sequence(path), redis_value) - logger.debug("SILENT_SUBSCRIBER @{} : Local Copy: {}".format(self.prefix, self.local_copy)) - - def listen(self): - """ Makes this subscriber start listening - - Returns: None - - """ - self.passive_subscriber.listen() - - def value(self): - """ Get data stored at root - - Where as the reader can do ``server["foo"].read()`` with if server is a ``KeyValueStore``, - accessing the root value of a subscriber is not as easy. This method retrieves all data stored underneath - a top level key. - - Returns: all data stored underneath a top level Redis key. - - """ - root_name = "{0}ROOT{0}".format(ROOT_VALUE_SEQUENCE) - if root_name in self.local_copy: - return self.local_copy[root_name] - # Copy dictionary - paths to omit is blank, so we copy everything - return copy_dictionary_without_paths(self.local_copy, []) - - def __getitem__(self, item): - """ Implement dictionary API for local copy - - We do not give the user direct access to the dictionary representing the lcoal - Args: - item: - - Returns: - - """ - assert type(item) == str, "Key name must be string" - return ActiveSubscriberPathHandler(None, self, "{}{}".format(Path.rootPath(), item)) - - -class CallbackSubscriber(SilentSubscriber): - """ Callback Subscriber Implementation""" - - def __init__(self, channel, interface, callback_function, kwargs): - super().__init__(channel, interface) - self.queue = queue.Queue() - self.passive_subscriber = RawSubscriber(channel + "*", interface, self.call_user_function, {}) - self.callback_function = callback_function - self.kwargs = kwargs - - def call_user_function(self, channel, message): - """ - Wrapper callback function (wrapping user function) for this class to work with a RawSubscriber object - Fits required interface for a ChannelSubscriber callback function - :param channel: channel published to - :param message: message that was published - :return: None - :rtype: None - """ - self.update_local_copy(channel, message) - channel_name = channel.split("__pubspace@0__:")[1] - self.callback_function(data=self.value(), updated_path=channel_name, **self.kwargs) \ No newline at end of file diff --git a/reem/ships.py b/reem/marshalling.py similarity index 53% rename from reem/ships.py rename to reem/marshalling.py index f1f7461..b7d48c7 100644 --- a/reem/ships.py +++ b/reem/marshalling.py @@ -1,39 +1,48 @@ -from abc import ABC, abstractmethod +from __future__ import print_function,unicode_literals + +from abc import ABCMeta, abstractmethod import numpy as np import io -class SpecialDatatypeShip(ABC): +class SpecialDatatypeMarshaller(object): + """Abstract base class for marshallers that convert Python objects to/from + ReJSON commands.""" + __metaclass__ = ABCMeta + def __init__(self): - super().__init__() + super(SpecialDatatypeMarshaller, self).__init__() @abstractmethod def check_fit(self, value): - """ Determine if this ship will handle ``value`` + """ Determine if this marshaller will handle ``value`` - This method returns true if ``value`` is data that this ship is supposed to handle. If this ship handled all - numpy arrays, it would check if ``value``'s type is a numpy array. + This method returns true if ``value`` is data that this marshaller is + supposed to handle. If this marshaller handled all numpy arrays, it + would check if ``value``'s type is a numpy array. Args: value: object to check - Returns: True if ship will handle ``value`` + Returns: True if marshaller will handle ``value`` """ pass @abstractmethod - def write(self, key, value, client): + def write(self, key, value, client) -> None: """ Write ``value`` to Redis at the specified ``key`` using ``client`` - Given a Redis client, execute any number of needed commands to store the ``value`` in Redis. You - are required to use the key given for REEM to find it. If you must store multiple pieces of information, - use a `Redis Hash `_ which acts like a one level dictionary. + Given a Redis client, execute any number of needed commands to store + the ``value`` in Redis. You are required to use the key given for REEM + to find it. If you must store multiple pieces of information, use a + `Redis Hash `_ which acts like a + one level dictionary. Args: - key (str): The Redis key name this ship must store data under + key (str): The Redis key name this marshaller must store data under value: The value to write into Redis - client: A `ReJSON Redis Client `_ pipeline + client: A `Redis Client `_ Returns: None @@ -44,13 +53,30 @@ def write(self, key, value, client): def read(self, key, client): """ Retrieve necessary information from Redis - Given a Redis client, execute ONE command to retrieve all the information you need to rebuild the data - that was stored in ``write`` from Redis. This method should execute the command that allows you to retrieve - all data stored under key + Given a Redis client, execute ONE command to retrieve all the + information you need to rebuild the data that was stored in ``write`` + from Redis. This method should execute the command that allows you to + retrieve all data stored under key. Args: key (str): a keyname that contains data stored by ``write`` - client: A `ReJSON Redis Client `_ pipeline + client: A `Redis Client `_ + + Returns: None + + """ + pass + + @abstractmethod + def delete(self, key, client): + """Delete information from redis at the specified ``key`` using ``client``. + + Given a Redis client, execute any number of commands to retrieve all the information you need to + delete all of the data stored under ``key`` + + Args: + key (str): a keyname that contains data stored by ``write`` + client: A `Redis Client `_ Returns: None @@ -77,7 +103,7 @@ def interpret_read(self, responses): def get_label(self): """ Return a unique string identifier - This method should return a string that uniquely identifies this ship. REEM will use it to determine what ship + This method should return a string that uniquely identifies this marshaller. REEM will use it to determine what marshaller to use to decode data that is already stored in Redis. Returns: @@ -87,18 +113,22 @@ def get_label(self): pass -class NumpyShip(SpecialDatatypeShip): +class NumpyMarshaller(SpecialDatatypeMarshaller): + """A marshaller for Numpy arrays.""" def check_fit(self, value): return type(value) in [np.array, np.ndarray] + def get_label(self): + return "default_numpy_handler" + def write(self, key, value, client): - client.hset(key, "arr", bytes(memoryview(value.data))) + client.hset(key, "arr", memoryview(value.data).tobytes()) client.hset(key, "dtype", str(value.dtype)) client.hset(key, "shape", str(value.shape)) client.hset(key, "strides", str(value.strides)) - def get_label(self): - return "default_numpy_handler" + def delete(self, key, client): + client.delete(key) def read(self, key, client): client.hgetall(key) diff --git a/reem/supports.py b/reem/supports.py deleted file mode 100644 index 450c7f5..0000000 --- a/reem/supports.py +++ /dev/null @@ -1,108 +0,0 @@ -from threading import Thread, Lock -import rejson -from .utilities import * - - -class MetadataListener: - def __init__(self, interface): - self.client = rejson.Client(host=interface.hostname) - self.pubsub = self.client.pubsub() - self.pubsub.psubscribe(['__keyspace@0__:*']) - self.listeners = {} - - super().__init__() - - def add_listener(self, key_name, reader): - listen_name = "__keyspace@0__:{}".format(key_name) - if listen_name not in self.listeners: - self.listeners[listen_name] = [] - self.listeners[listen_name].append(reader) - - def flush(self): - while True: - item = self.pubsub.get_message() - if item is None: - break - channel = item['channel'].decode("utf_8") - if channel in self.listeners: - for listener in self.listeners[channel]: - listener.pull_metadata = True - - -class PathHandler: - def __init__(self, writer, reader, initial_path): - self.writer = writer - self.reader = reader - self.path = initial_path - - def __getitem__(self, item): - assert check_valid_key_name(item) - self.path = append_to_path(self.path, item) - return self - - def __setitem__(self, instance, value): - assert check_valid_key_name(instance) - self.path = append_to_path(self.path, instance) - self.writer.send_to_redis(self.path, value) - - -class ReadablePathHandler(PathHandler): - def read(self): - server_value = self.reader.read_from_redis(self.path) - root_value_read_name = "{}ROOT{}".format(ROOT_VALUE_SEQUENCE, ROOT_VALUE_SEQUENCE) - if type(server_value)==dict and root_value_read_name in server_value: - return server_value[root_value_read_name] - return server_value - - -class ActiveSubscriberPathHandler(PathHandler): - def read(self): - return_val = self.reader.local_copy - dissect_path = self.path[1:] - if len(dissect_path) == 0: - pass - elif "." in dissect_path: - for key in dissect_path.split("."): - return_val = return_val[key] - else: - return_val = return_val[dissect_path] - if type(return_val) == dict: - return copy_dictionary_without_paths(return_val, []) - return return_val - - def __setitem__(self, instance, value): - raise Exception("Cannot set value for a subscriber") - - -class ChannelListener(Thread): - def __init__(self, interface, channel_name, callback_function, kwargs): - self.client = rejson.Client(host=interface.hostname) - self.pubsub = self.client.pubsub() - self.pubsub.psubscribe([channel_name]) - self.callback_function = callback_function - self.kwargs = kwargs - self.first_item_seen = False - super().__init__() - - def run(self): - for item in self.pubsub.listen(): - # First Item is a generic message that we need to get rid of - if not self.first_item_seen: - self.first_item_seen = True - continue - channel = item['channel'].decode("utf_8") - message = item['data'] - self.callback_function(channel=channel, message=message, **self.kwargs) - -""" -Naming: -Rapid Extendable Middleware -Redis Medium Extendable Middleware -Redis Robotic Communication - -Redis Extendable Middleware - -Extendable Efficient Redis Middleware -Redis Extendable Efficient Middleware -reem -""" \ No newline at end of file diff --git a/reem/utilities.py b/reem/utilities.py index 1d39735..05ff73e 100644 --- a/reem/utilities.py +++ b/reem/utilities.py @@ -1,8 +1,11 @@ -from rejson import Path +from __future__ import print_function + from functools import reduce -from typing import List, Dict, Iterable import json import logging +from six import itervalues,iteritems +import sys +from .compat import ROOT_PATH logger = logging.getLogger("reem") @@ -10,52 +13,57 @@ ROOT_VALUE_SEQUENCE = "%%%%" -def append_to_path(existing, addition): - """ - Append an key to an existing subpath - :param existing: a subpath string - :param addition: a new key in the subpath - :return: a path string - :rtype: str - """ - if existing == Path.rootPath(): - return Path.rootPath() + addition - return "{}.{}".format(existing, addition) - - -def path_to_key_sequence(path: str): +def path_to_key_sequence(path): """ Turn a ReJSON subpath string into a sequence of key accesses - :param path: a path string of form: ".", ".subkey1.subkey2" + :param path (str): a path string of form: ".", ".subkey1.subkey2" :return: list of key accesses below a top level key in redis :rtype: List[str] """ - if path == Path.rootPath(): + if path == ROOT_PATH: return [] return path.split(".")[1:] - -def key_sequence_to_path(sequence: List[str]): +def key_sequence_to_path(sequence): """ Convert a sequence of key accesses into a path string representing a path below the top level key in redis - :param sequence: list of strings representing key accesses + :param sequence (List[str]): list of strings representing key accesses :return: a subpath string """ - return Path.rootPath() + ".".join(sequence) + return ROOT_PATH + ".".join(sequence) + +def key_sequence_to_path_ext(sequence): + """ + Convert a sequence of key accesses or array accesses into a path string representing a path below the top level key in redis + :param sequence (List[str or int]): list of strings representing key accesses or indices representing array accesses + :return: a subpath string + """ + if len(sequence) == 0: + return ROOT_PATH + #if isinstance(sequence[0],int): + # raise ValueError("Top-level key cannot be an integer") + seps_keys = [] + for k in sequence: + if isinstance(k,int): + seps_keys.append('[%d]'%(k,)) + else: + seps_keys.append('.') + seps_keys.append(k) + return ''.join(seps_keys) -def copy_dictionary_without_paths(dictionary: Dict, key_sequence: List[List[str]]): +def copy_dictionary_without_paths(dictionary, key_sequence): """ Return a copy of dictionary with the paths formed by key_sequences removed - :param key_sequence: 2D List of Strings where each internal list is a sequence of key accesses from dictionary root - :param dictionary: The dictionary to copy + :param dictionary (Dict): The dictionary to copy + :param key_sequence (List[List[str]]): 2D List of Strings where each internal list is a sequence of key accesses from dictionary root :return: dictionary with paths represented by lists inside key_sequences removed :rtype: dict """ ret = {} possibles = [ks for ks in key_sequence if len(ks) == 1] possibles = set(reduce(lambda x, y: x + y, possibles, [])) - for k, v in dictionary.items(): + for k, v in iteritems(dictionary): if k in possibles: continue if type(v) == dict: @@ -65,11 +73,11 @@ def copy_dictionary_without_paths(dictionary: Dict, key_sequence: List[List[str] return ret -def extract_object(dictionary: Dict, key_sequence: List[str]): +def extract_object(dictionary, key_sequence): """ Extract the object inside the dictionary at a specific path - :param dictionary: dictionary to extract from - :param key_sequence: list of strings represetning key accesses + :param dictionary (Dict): dictionary to extract from + :param key_sequence (List[str]): list of strings represetning key accesses :return: the value inside dictionary specified by key_sequence """ ret = dictionary @@ -78,15 +86,16 @@ def extract_object(dictionary: Dict, key_sequence: List[str]): return ret -def filter_paths_by_prefix(paths: Iterable[str], prefix: str): +def filter_paths_by_prefix(paths, prefix): """ - Given a list of paths and a prefix, return the paths that - :param paths: list of paths - :param prefix: prefix to filter on + Given a list of paths and a prefix, return the paths that start with prefix. + :param paths (Iterable[str]): list of paths + :param prefix (str): prefix to filter on :return: list of paths that begin with the specified prefix and the subsequent paths after the prefix :rtype: List[str], List[str] """ - if prefix == Path.rootPath(): + if prefix == ROOT_PATH: + paths = list(paths) return paths, paths full_paths, suffixes = [], [] for p in paths: @@ -96,30 +105,28 @@ def filter_paths_by_prefix(paths: Iterable[str], prefix: str): return full_paths, suffixes -def insert_into_dictionary(dictionary: Dict, key_sequence: List[str], value): +def insert_into_dictionary(dictionary, key_sequence, value): """ Insert value into dictionary at path specified by key_sequence. If the sequence of keys does not exist, it will be made - :param dictionary: dictionary to insert into - :param key_sequence: specify the path inside the dictionary + :param dictionary (Dict): dictionary to insert into + :param key_sequence (List[str]): specify the path inside the dictionary :param value: value to insert :return: None - the method will modify dictionary :rtype: None """ parent = dictionary for key in key_sequence[:-1]: - if key not in parent.keys(): - parent[key] = {} - parent = parent[key] + parent = parent.setdefault(key,{}) parent[key_sequence[-1]] = value -def get_special_paths(set_path: str, set_value, sp_to_label: Dict, label_to_ship: Dict): +def get_special_paths(set_path, set_value, sp_to_label, label_to_ship): """ Get info on how to update sp_to_label according to the user uploading `set_value` in location `set_path` - :param set_path: ".key0.key1" subpath + :param set_path (str): ".key0.key1" subpath :param set_value: anything to be inserted into data. Needs to uploadable to redis - :param sp_to_label: dictionary mapping current special paths to their ships - :param label_to_ship: dictionary mapping ship labels to ship objects + :param sp_to_label (Dict): dictionary mapping current special paths to their ships + :param label_to_ship (Dict): dictionary mapping ship labels to ship objects :return: A set of tuples: (path, corresponding ship's label) :rtype: set """ @@ -131,15 +138,15 @@ def get_special_paths(set_path: str, set_value, sp_to_label: Dict, label_to_ship return additions # If this is something a ship covers, add it as a special path - for ship in label_to_ship.values(): + for ship in itervalues(label_to_ship): if ship.check_fit(set_value): additions.add( (set_path, ship.get_label()) ) # If this is a dict, recursively build the set of additional paths else: - for k, v in set_value.items(): + for k, v in iteritems(set_value): assert check_valid_key_name(k), "Invalid Key: {}".format(k) - if set_path != Path.rootPath(): + if set_path != ROOT_PATH: child_path = "{}.{}".format(set_path, k) else: child_path = ".{}".format(k) @@ -149,17 +156,47 @@ def get_special_paths(set_path: str, set_value, sp_to_label: Dict, label_to_ship return additions -def check_valid_key_name(name): +def check_valid_key_name(name : str): """ Ensure the key name provided is legal :param name: a potential key name :return: boolean indicating legality of name :rtype: bool """ - if type(name) not in [str]: + if not isinstance(name,str): return False bad_chars = ["*", ".", "&&&&"] - for k in bad_chars: - if k in name: - return False - return True \ No newline at end of file + if any(k in name for k in bad_chars): + return False + return True + +def check_valid_key_name_ext(name : str): + """ + Ensure the key / index name provided is legal + :param name: a potential key name or index + :return: boolean indicating legality of name + :rtype: bool + """ + if isinstance(name,int): + return True + if not isinstance(name,str): + return False + bad_chars = ["*", ".", "&&&&"] + if any(k in name for k in bad_chars): + return False + return True + +if sys.version_info[0] < 3: + def json_recode_str(input): + if isinstance(input, dict): + return {json_recode_str(key): json_recode_str(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [json_recode_str(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input +else: + def json_recode_str(input): + return input \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2c584e4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +redis>=3.0.1,<4.0.0 +rejson>=0.3.0 +setuptools +six +numpy \ No newline at end of file diff --git a/run_some_tests.py b/run_some_tests.py new file mode 100644 index 0000000..f7d228c --- /dev/null +++ b/run_some_tests.py @@ -0,0 +1,7 @@ +from tests import reem_testing_kvs + +reem_testing_kvs.test_store_under_non_existant_top_key() +reem_testing_kvs.test_store_under_non_existant_sub_key() +reem_testing_kvs.test_kvs_upload_all() +reem_testing_kvs.test_store_non_dict() +reem_testing_kvs.test_new_key_read() \ No newline at end of file diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index bc17ace..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -# Inside of setup.cfg -[metadata] \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index 324c9f1..0000000 --- a/setup.py +++ /dev/null @@ -1,26 +0,0 @@ -from setuptools import setup - -# read the contents of your README file -from os import path -this_directory = path.abspath(path.dirname(__file__)) -with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -setup( - name='reem', - version='v0.0.11', - packages=['reem'], - url='https://www.github.com/tn74/reem', - license='Apache 2.0', - author='Trishul Nagenalli', - author_email='trishul.nagenalli@duke.edu', - description='Redis Extendable Efficient Middleware', - install_requires=[ - 'rejson', - 'redis', - 'six', - 'numpy', - ], - long_description=long_description, - long_description_content_type='text/markdown' -) diff --git a/tests/SubscriberOverhead.py b/tests/SubscriberOverhead.py index cc76fd4..2add275 100644 --- a/tests/SubscriberOverhead.py +++ b/tests/SubscriberOverhead.py @@ -1,7 +1,6 @@ from multiprocessing import Process, Manager import time -from reem.connection import RedisInterface -from reem.datatypes import CallbackSubscriber, PublishSpace +from reem import RedisInterface, CallbackSubscriber, PublishSpace from tests.testing import plot_performance interface = RedisInterface() diff --git a/tests/reem_performance_measurement.py b/tests/reem_performance_measurement.py index f44f3e6..a164a6d 100644 --- a/tests/reem_performance_measurement.py +++ b/tests/reem_performance_measurement.py @@ -1,6 +1,5 @@ from tests.testing import * -from reem.datatypes import * -from reem.connection import RedisInterface +from reem import RedisInterface,KeyValueStore,PublishSpace,CallbackSubscriber import numpy as np import logging import time @@ -13,7 +12,7 @@ log_file_name = os.path.join(base, "logs/reem_testing_kvs_timed.log") FORMAT = "%(asctime)20s %(filename)30s:%(lineno)3s %(funcName)20s() %(levelname)10s %(message)s" logging.basicConfig(format=FORMAT, filename=log_file_name, filemode='w') -logger = logging.getLogger("reem.datatypes") +logger = logging.getLogger("reem") logger.setLevel(logging.DEBUG) diff --git a/tests/reem_testing.py b/tests/reem_testing.py index 3f7982c..2b1e089 100644 --- a/tests/reem_testing.py +++ b/tests/reem_testing.py @@ -1,20 +1,19 @@ -from reem import datatypes, connection +from reem import RedisInterface,connection import numpy as np import time import logging import datetime -from . import testing +from tests import testing # Logging Configuration FORMAT = "%(filename)s:%(lineno)s %(funcName)20s() %(levelname)10s %(message)s" logging.basicConfig(format=FORMAT) -logger = logging.getLogger("reem.datatypes") +logger = logging.getLogger("reem") logger.setLevel(logging.DEBUG) # Testing Help -intf = connection.RedisInterface(host='localhost') -intf.initialize() +intf = RedisInterface(host='localhost') flat_data = testing.get_flat_data() @@ -36,39 +35,39 @@ def compare_equality(d1, d2): def test_flat_root_set(): path = "." - writer = datatypes.Writer("test_set", intf) + writer = connection.Writer("test_set", intf) writer.send_to_redis(path, flat_data) def test_nested_root_set(): path = "." - writer = datatypes.Writer("nested_set", intf) + writer = connection.Writer("nested_set", intf) writer.send_to_redis(path, nested_data) def test_deeper_set(): - writer = datatypes.Writer("nested_set", intf) + writer = connection.Writer("nested_set", intf) nested_data["stats"]["points"] = nested_data["stats"]["points"] + 5 writer.send_to_redis(".stats", nested_data["stats"]) def test_flat_root_read(): test_flat_root_set() - reader = datatypes.Reader("test_set", intf) + reader = connection.Reader("test_set", intf) ret = reader.read_from_redis(".") assert compare_equality(ret, flat_data) def test_nested_root_read(): test_nested_root_set() - reader = datatypes.Reader("nested_set", intf) + reader = connection.Reader("nested_set", intf) ret = reader.read_from_redis(".") assert compare_equality(ret, nested_data) def test_deeper_read(): test_deeper_set() - reader = datatypes.Reader("nested_set", intf) + reader = connection.Reader("nested_set", intf) ret = reader.read_from_redis(".stats") assert compare_equality(ret, nested_data["stats"]) # Pairs with test_deeper_set in which nested_data was set under this key @@ -81,20 +80,20 @@ def test_deeper_read(): def test_nested_np(): - writer = datatypes.Writer("np_set", intf) + writer = connection.Writer("np_set", intf) nested_data['nparr'] = nparr writer.send_to_redis(".", nested_data) def test_nested_np_read(): - reader = datatypes.Reader("np_set", intf) + reader = connection.Reader("np_set", intf) print("Read in: {}".format(reader.read_from_redis("."))) # Write and Read Sequences def test_sequence_1(): - writer = datatypes.Writer("Sequence1", intf) - reader = datatypes.Reader("Sequence1", intf) + writer = connection.Writer("Sequence1", intf) + reader = connection.Reader("Sequence1", intf) writer.send_to_redis(".", flat_data) print("1. Full Data: {}".format(reader.read_from_redis("."))) @@ -112,7 +111,7 @@ def test_sequence_1(): # ------------------------ Key Value Store Testing ------------------------- -server = datatypes.KeyValueStore(intf) +server = connection.KeyValueStore(intf) def test_kvs_flat(): @@ -193,15 +192,15 @@ def test_skip_metadata(): def test_publish(): - p = datatypes.Publisher("test_publish", intf) + p = connection.Publisher("test_publish", intf) p.send_to_redis(".", flat_data) p.do_metadata_update = True p.send_to_redis(".subkey", nparr) def test_pubsub(): - p = datatypes.Publisher("test_pubsub", intf) - active = datatypes.SilentSubscriber("test_pubsub", intf) + p = connection.Publisher("test_pubsub", intf) + active = connection.SilentSubscriber("test_pubsub", intf) active.listen() p.send_to_redis(".", flat_data) time.sleep(1) diff --git a/tests/reem_testing_kvs.py b/tests/reem_testing_kvs.py index 094a948..8346195 100644 --- a/tests/reem_testing_kvs.py +++ b/tests/reem_testing_kvs.py @@ -1,6 +1,5 @@ from tests.testing import * -from reem.datatypes import KeyValueStore -from reem.connection import RedisInterface +from reem import KeyValueStore import logging import numpy as np import redis @@ -21,10 +20,7 @@ hundred_key_dict = single_level_dictionary() layered_dictionary = nested_level_dictionary(levels=3) -interface = RedisInterface(host="localhost") -interface.initialize() - -server = KeyValueStore(interface) +server = KeyValueStore("localhost") # Can't-Do Behavior Defining Tests @@ -37,6 +33,7 @@ def test_store_under_non_existant_top_key(): except redis.exceptions.ResponseError as e: # Redis spits error: new objects must be created at the root return + print("Strange... no error in server[%s][%s]",random_key_name,"item") assert False @@ -48,6 +45,7 @@ def test_store_under_non_existant_sub_key(): except redis.exceptions.ResponseError as e: # Redis spits error: missing key at non-terminal path level return + print("Strange... no error in server[flat_data][not_real_key][not_real_key]") assert False @@ -182,7 +180,7 @@ def test_store_non_dict(): def test_new_key_read(): server["image_dict"] = image_dict - kvs_new = KeyValueStore(interface) + kvs_new = KeyValueStore('localhost') logger.debug("Set KVS Gets Metadata: {}".format(server.interface.client.jsonget(server.entries["image_dict"][1].metadata_key_name))) logger.debug("Get KVS Gets Metadata: {}".format(kvs_new.interface.client.jsonget(server.entries["image_dict"][1].metadata_key_name))) assert np.array_equal(kvs_new["image_dict"]["image"].read(), image_array) diff --git a/tests/reem_testing_kvs_timed.py b/tests/reem_testing_kvs_timed.py index 9e390eb..af583dc 100644 --- a/tests/reem_testing_kvs_timed.py +++ b/tests/reem_testing_kvs_timed.py @@ -1,7 +1,6 @@ from tests.testing import * -from reem.datatypes import KeyValueStore -from reem.connection import RedisInterface -from reem import ships +from reem import KeyValueStore,RedisInterface +from reem import marshalling import logging import numpy as np @@ -21,7 +20,7 @@ hundred_key_dict = single_level_dictionary() layered_dictionary = nested_level_dictionary(levels=20) -interface = RedisInterface(host="localhost", ships=[ships.NumpyShip()]) +interface = RedisInterface(host="localhost",marshallers=[marshalling.NumpyMarshaller()]) interface.initialize() server = KeyValueStore(interface) diff --git a/tests/reem_testing_pubsub.py b/tests/reem_testing_pubsub.py index 950a3d4..e76840e 100644 --- a/tests/reem_testing_pubsub.py +++ b/tests/reem_testing_pubsub.py @@ -1,6 +1,5 @@ from tests.testing import * -from reem.datatypes import PublishSpace, SilentSubscriber, CallbackSubscriber -from reem.connection import RedisInterface +from reem import RedisInterface, PublishSpace, SilentSubscriber, CallbackSubscriber import logging import numpy as np import time diff --git a/tests/testing.py b/tests/testing.py index 67438ac..fd7054b 100644 --- a/tests/testing.py +++ b/tests/testing.py @@ -1,13 +1,10 @@ import datetime -import rejson import numpy as np import random import string from matplotlib import pyplot as plt import multiprocessing -rejson_client = rejson.Client(host='localhost', port=6379, decode_responses=True) - def generate_data(format='string', strlen=100, b=0, kb=0, mb=0): date_string = str(datetime.datetime.now()) + " " @@ -79,7 +76,7 @@ def make_complex_dictionary(data=sample_data()): :return: dict """ test = {} - test["hundred_key"] = single_level_dictionary(keys=50, data=data) + test["hundred_key"] = single_level_dictionary(copies=100, data=data) test["ten_level_dictionary"] = nested_level_dictionary(levels=10, data=data) return test