From 0cb32d22ca39a4ae2e6eefed86962259277e5fe9 Mon Sep 17 00:00:00 2001 From: dhoomakethu Date: Sat, 20 May 2017 12:04:09 +0530 Subject: [PATCH] Add CI support (#168) * Refactored and simplified calculation of RTU frames, added missing unit tests * - fixing a few small issues - bringing a few areas of coverage back up * adding installer test script * enabling the checksum tests in check frame, fixing tests * * Updating documentation * Adding code to handle messages that do not respond * Fixes issue 41 * cleaning up the build tools a bit * Adding more commands to the setup.py - pep8, lint, 2to3 Fixed a few pep8/lint bugs to test * moving files around * pep8 and cleanup * more cleanup * Fixes issue 47 * adding another quick example * cutting 200 pep8 errors * working on py3 merge * updating to python3 * reverting back changes, remember Switch flag next time * adding some magic methods, just cause * adding documentation pdf * Fixes issue 49 * Adds True and False constants for older python versions. Update issue 50 * adding tests for a few fixes * Fixes issue 51 * fixing tests broken by interface change * Updates issue 52 * Fixes issue 53 * Fix to add Python < 2.5 compatibility This fix simply removes all the ternaries that were added in Python 2.5. Fixes issue 50 * adding a mostly complete diagnostic register implementation * Adding more documentation and helpful factory methods. The documentation added was to address some questions with the synchronous and asynchrounous server implementations as well as the functionality of the data contexts. The factory methods were added by request to simplify the creation of a fully populated DataBlock address space. * adding modbus plus registers * adding endian ability to payload builder * Finishing the remaining modbus protocol * Adding the remaining portions of the protocol (request/response) * Tieing these into the factory decoder * Adding tests to cover the new code (need more) * Fixing a few bugs found along the way * finished file read/write record requests * documentation, more tests, fixing extra commands * adding more tests * Fixing the client/server async/sync implementations - asynchronous client/server for tcp working and tested - synchronous client/server for tcp/udp working and tested - adding tests to exercise the synchronous client/server - more documentation * adding test stubs to get full coverage count * working on jamod, need to set up more complete project * adding GetDeviceInformationRequest * adding read device information to decoder factory * fixing some example errors * working on the serial implementations * fixing the synchronous server implementation * updating functional tests and documentation for sync-serial * updating tac files * Updating the documentation for the serial client/servers * adding readme to root * Fixes issue 56 * Fixes issue 1 * adding a requirements file for virtualenv folk * adding more cohesive code to the payload utilities * forgot to add the new example to the doc index * Fixing the rtu size calculation isse #55 on google code * using the endian flag in register factory * fixing bad documentation * fixing issue 58 on google code * Fix binary framer and add start and end tokens Fixes a TypeError occuring while escaping token bytes in the message and adds the start and end tokens to the packet. * Adding checking in the client for an unconnected socket. * Fixing issue 60 on google code (including ez_setup) * fixing github issue #7 * adding tests and two utilities * adding message parser utility * Fixing extended message decoding * Now correctly decoding sub function messages (diagnostic) * Message parser now finished and documented * Fixed broken logger unit test * ModbusSparseDataBlock handled dictionaries incorrectly (they have an __iter__ attribute). Changed 'if' to 'elif' * Updating the Readme.rst to explain how to install in zero dependency mode. * Fixing issue #10 * updating the client documentation * updating the server context documentation * fixes #9 on github * fixing the factory decoding and adding examples * pushing to version 1.0 * Fixing a bug in the asynchronous client that slipped through. * complete tests for the sync client * cleaning up some pep8 errors * finished unit tests for async client * adding another test to the test-install script * finished covering sync client * updating documentation * adding another example, adding debug checks * Fixing the serial implementation of everything * updating lots of reference documentation * fixing the fifo semantics of serial clients * using transaction manager in async clients * fixing references * fixing incorrect rtu lenght calculation * Add optional server_address to Sync and Async TCP/UDP Server API * Improve erver_address defaults to passing None * adding a few messages * Adding a message encoding generator for testing. - fixed messages not passing **kwargs to base - fixed binary framer off by 1 - fixed mei_message rtu size tests - added a message generator to use with message parser - fixed message parser with ascii - tested message parser with all formats (added to messages) * adding documentation for message formats * updating documentation and being pedantic * Allowing overloading of message encoding * allow codes like payload builder to encode * added IPayloadBuilder interface (future) * renamed builder methods to reflect vision * added error code decoding to name * fixed affected tests * Cleaning up the build tools - moving custom datastores to examples - bumping required versions - making the debug server console optional - updating documentation * adding support for pydev * fixing broken nosetest (/dev/pts) and pydev issues * adding bcd payload builder * reworking contrib packages * adding bcd payload contrib * moving complex examples to contrib * syncing version on pypi * adding server rest api * moving web -> bottle * fixing documentation * adding gui base * adding initial manager page * adding data view * fixing error in example * adding the ability to override sync client framer * updating the performance test * fixing documentation * fixing memory leak in sync client * adding modicon encoder/decoder * Fix bogus calculation in ModbusSocketFramer.checkFrame (one of the tests also seemed wrong, I had to fix it) * Adding sunspec client example * Changing @staticmethod to @classmethod to fix inheritance * adding method to retrieve all the device blocks * adding the initial mapper interface * adding ideas in progress * adding a modbus datastore saver * making lrc/crc read stdin * adding the callback server example * adding a periodic updating example * fixing documentation * adding fix for stuck RTU streams * fixing documentation error * Adding an example for changing framers - new example changing-framers.py - added documentation link * Reworking the transaction managers to be explicit - Serial framers use the FIFO manager (results in order) - Socket framers use the Dict manager (tid -> result) - Fixed tests and removed bad global managers - Managers no longer use global state (now instance) * Bumping the version and adding a changelog * Fixing a logic error in client code - Now correctly choosing transaction manager * Fixing 2to3 common warnings * Fixed example typo in readme * Adding slave context delete ability - Fixes #20 * Fixing google code issue 69 - custom-message example had bugs - http://code.google.com/p/pymodbus/issues/detail?id=69 * Fixed docstring in synchronous serial client connect() method I think there was a copy/paste error in the docstring. It said tcp but I think it is supposed to be serial. * Fix for issue #21 * Allowing options to be passed through - This fixes issue #21 - Options now go to the transaction manager * Adding source_address to TCP client inputs * Typo * Typo * Typo * Typo * Adding some new examples * modbus scraper (and documentation) * thread safe datastore (and documentation) * Adding a concurrent client example * Allow specification of client connection handler in Modbus...Server o ModbusTcpServer and ModbusUdpServer allows handler class other than default Modbus{Connected,Disconnected}RequestHandler o Add debug logging on request failure, to help diagnose root causes * Fixes #46 * Fixes #48 * Adds the option to drop into zero mode for slaves * Fixes #42 * Bumping the version to 1.3.0 * add missing self operator The parameter values of the constructor within class WriteMultipleRegistersRequest can specified as single value or list of values. But if a single value is given the missing self operator on line 137 leads to crash in line 138 with error: TypeError("object of type 'int' has no len()",) * typo: fix spelling of Parameter Signed-off-by: Karl Palsson * async: missing slaves: add missing imports 1e0bcde13153469365dd1debf6456e4b0e048566 is missing imports into the async server, the import was only added to the sync server. Further fix for #42 Signed-off-by: Karl Palsson * Fix zero_mode argument for ModbusSlaveContext Using "-" in the argument name causes SyntaxError 'non-keyword arg after keyword arg' * Fix typo in constants * Adding an example and adding tcp timeout * fixes #70 * Endianness now used in packing bytes * Adding a libmodbus wrapper * adding new contrib example of libmodbus client * updating example documentation so users can find it * closes #73 * Execute methods of Requests accept context There were errors whenever a request that got handles in other_message.py got it's execute method called, as it was being called with a context parameter. The functions now accept this parameter, although they don't do anything with it. The tests have also been updated. * Add Modbus RTU syncronous server example * Signal handlers to stop in shutdown(). * WriteMultipleRegistersRequest: Handle values=None case Currently, if None is passed in explicitly, or if values is not given, the 'values' object is correctly identified as *not* having an __iter__ attribute, but is incorrectly identified as being a valid register value. This breaks testInvalidWriteMultipleRegistersRequest. Solution: if we see None, replace this with [] and skip the check for __iter__. * Fix payload tests. Looking at the "encoded" string, it looks identical to that of the big endian encoding string, and my understanding is that the data shown in "encoded" *IS* big-endian, not little-endian. I have no idea how this passed before, but it passes now. * sync.ModbusUdpClient: Correct reference to settimeout. I could not find a 'settimeout' (case-insensitive) anywhere in the codebase other than on this line, but I *did* see it was a method of socket.socket. So I'll assume that this was *supposed* to be calling socket.socket.settimeout. * test-client-sync: Fix UDP connection test. Rather than passing in a vanilla object, we should pass in something that implements the settimeout method. * Lazily initialize InstallManagementConsole Simply importing the management console takes ~0.3 sec on an 1GHz Atom. Since it is (I suspect) often not used, lazily importing it should help startup for many programs. * Fixes the UDP client socket timeout bug fixes #51 * Implement mask_write_register method in client mixin * Workaround for bug 101 https://github.com/bashwork/pymodbus/issues/101 * Workaround for bug 101 https://github.com/bashwork/pymodbus/issues/101 * Riptide 1.3.0 pymodbus internal pre-release (riptide1) with dhoomakethu's fix for bashwork#101. * Riptide 1.3.0 pymodbus internal pre-release (riptide1) with dhoomakethu's fix for bashwork#101. * Use a PEP 404 compliant version. Start at rc93101 to usurp any other real release candidates. * Use a PEP 404 compliant version. Start at rc93101 to usurp any other real release candidates. * Document Riptide specific instructions. * Include Workaround for bug 101 bashwork#101 * Include Workaround for bug 101 bashwork#101 * Better tag names. * pymodbus fix for modes RTU error cases. * version bumped to c93103 * version bumped to c93103 * fixed issue with pymodbus timing over serial * fixed issue with pymodbus timing over serial * Add RIPTIDE.md to .gitignore * bump version to rc93105 * fix merge conflicts * fix version file * fix unit test failures * cleanup * #121 changelog updated * Misc update Add __maintainer__ field in setup.py * 1. #162, creating universal distribution for py2 and py3 2. Merge PR #152 , create compatible versions * fix test failures * fix ReadDeviceInformationRequest encoding problem * #166 fix failing tests on python 3.5 * mis - Updated documentation * #167 updated documentation for CI * #167 disable pep8/flake checks for the time being * #167, fix install dependencies osx, remove pypy from supported python versions * #167, fix install dependencies osx, remove pypy from supported python versions * #167 , fix minior error in travis.yml * Bump version to 1.3.0rc2, update README --- .gitignore | 5 + .travis.yml | 32 + CHANGELOG.rst | 5 + Makefile | 64 + README.rst | 25 +- doc/sphinx/conf.py | 208 +- doc/sphinx/doctrees/environment.pickle | Bin 0 -> 1724102 bytes .../examples/asynchronous-client.doctree | Bin 0 -> 15603 bytes .../examples/asynchronous-processor.doctree | Bin 0 -> 18069 bytes .../examples/asynchronous-server.doctree | Bin 0 -> 12967 bytes .../doctrees/examples/bcd-payload.doctree | Bin 0 -> 16238 bytes .../doctrees/examples/bottle-frontend.doctree | Bin 0 -> 3955 bytes .../doctrees/examples/callback-server.doctree | Bin 0 -> 12719 bytes .../examples/changing-framers.doctree | Bin 0 -> 7861 bytes .../examples/concurrent-client.doctree | Bin 0 -> 22382 bytes .../examples/custom-datablock.doctree | Bin 0 -> 8763 bytes .../doctrees/examples/custom-message.doctree | Bin 0 -> 9525 bytes .../examples/database-datastore.doctree | Bin 0 -> 15916 bytes .../doctrees/examples/gtk-frontend.doctree | Bin 0 -> 47228 bytes doc/sphinx/doctrees/examples/index.doctree | Bin 0 -> 5190 bytes .../examples/libmodbus-client.doctree | Bin 0 -> 37552 bytes .../examples/message-generator.doctree | Bin 0 -> 44301 bytes .../doctrees/examples/message-parser.doctree | Bin 0 -> 18891 bytes .../doctrees/examples/modbus-logging.doctree | Bin 0 -> 6223 bytes .../examples/modbus-payload-server.doctree | Bin 0 -> 8899 bytes .../doctrees/examples/modbus-payload.doctree | Bin 0 -> 8627 bytes .../doctrees/examples/modbus-scraper.doctree | Bin 0 -> 23370 bytes .../examples/modbus-simulator.doctree | Bin 0 -> 11210 bytes .../doctrees/examples/modicon-payload.doctree | Bin 0 -> 20990 bytes .../doctrees/examples/performance.doctree | Bin 0 -> 10613 bytes .../doctrees/examples/redis-datastore.doctree | Bin 0 -> 21030 bytes .../examples/remote-server-context.doctree | Bin 0 -> 17518 bytes .../examples/serial-forwarder.doctree | Bin 0 -> 5894 bytes .../examples/synchronous-client-ext.doctree | Bin 0 -> 18229 bytes .../examples/synchronous-client.doctree | Bin 0 -> 15969 bytes .../examples/synchronous-server.doctree | Bin 0 -> 13165 bytes .../examples/thread-safe-datastore.doctree | Bin 0 -> 19126 bytes .../doctrees/examples/tk-frontend.doctree | Bin 0 -> 29046 bytes .../doctrees/examples/updating-server.doctree | Bin 0 -> 9631 bytes .../doctrees/examples/wx-frontend.doctree | Bin 0 -> 26776 bytes doc/sphinx/doctrees/index.doctree | Bin 0 -> 5002 bytes .../doctrees/library/async-client.doctree | Bin 0 -> 28361 bytes .../doctrees/library/async-server.doctree | Bin 0 -> 57169 bytes .../doctrees/library/bit-read-message.doctree | Bin 0 -> 69284 bytes .../library/bit-write-message.doctree | Bin 0 -> 64878 bytes .../doctrees/library/client-common.doctree | Bin 0 -> 46059 bytes doc/sphinx/doctrees/library/constants.doctree | Bin 0 -> 46064 bytes .../library/datastore/context.doctree | Bin 0 -> 44330 bytes .../doctrees/library/datastore/index.doctree | Bin 0 -> 3067 bytes .../doctrees/library/datastore/remote.doctree | Bin 0 -> 27337 bytes .../doctrees/library/datastore/store.doctree | Bin 0 -> 67432 bytes doc/sphinx/doctrees/library/device.doctree | Bin 0 -> 91411 bytes .../doctrees/library/diag-message.doctree | Bin 0 -> 175206 bytes doc/sphinx/doctrees/library/events.doctree | Bin 0 -> 44309 bytes .../doctrees/library/exceptions.doctree | Bin 0 -> 20191 bytes doc/sphinx/doctrees/library/factory.doctree | Bin 0 -> 30467 bytes .../doctrees/library/file-message.doctree | Bin 0 -> 87800 bytes doc/sphinx/doctrees/library/index.doctree | Bin 0 -> 3651 bytes .../doctrees/library/interfaces.doctree | Bin 0 -> 63093 bytes .../doctrees/library/mei-message.doctree | Bin 0 -> 35577 bytes .../doctrees/library/other-message.doctree | Bin 0 -> 79788 bytes doc/sphinx/doctrees/library/payload.doctree | Bin 0 -> 87845 bytes doc/sphinx/doctrees/library/pdu.doctree | Bin 0 -> 58850 bytes doc/sphinx/doctrees/library/pymodbus.doctree | Bin 0 -> 4622 bytes .../library/register-read-message.doctree | Bin 0 -> 93314 bytes .../library/register-write-message.doctree | Bin 0 -> 65231 bytes .../doctrees/library/sync-client.doctree | Bin 0 -> 89157 bytes .../doctrees/library/sync-server.doctree | Bin 0 -> 102442 bytes .../doctrees/library/transaction.doctree | Bin 0 -> 159065 bytes doc/sphinx/doctrees/library/utilities.doctree | Bin 0 -> 37326 bytes doc/sphinx/html/.buildinfo | 4 + doc/sphinx/html/_modules/index.html | 114 + .../_modules/pymodbus/bit_read_message.html | 331 + .../_modules/pymodbus/bit_write_message.html | 353 + .../html/_modules/pymodbus/client/async.html | 305 + .../html/_modules/pymodbus/client/common.html | 240 + .../html/_modules/pymodbus/client/sync.html | 503 + .../html/_modules/pymodbus/constants.html | 331 + .../_modules/pymodbus/datastore/context.html | 246 + .../_modules/pymodbus/datastore/remote.html | 190 + .../_modules/pymodbus/datastore/store.html | 343 + doc/sphinx/html/_modules/pymodbus/device.html | 712 ++ .../html/_modules/pymodbus/diag_message.html | 845 ++ doc/sphinx/html/_modules/pymodbus/events.html | 287 + .../html/_modules/pymodbus/exceptions.html | 177 + .../html/_modules/pymodbus/factory.html | 347 + .../html/_modules/pymodbus/file_message.html | 576 + .../html/_modules/pymodbus/interfaces.html | 327 + .../html/_modules/pymodbus/mei_message.html | 256 + .../html/_modules/pymodbus/other_message.html | 533 + .../html/_modules/pymodbus/payload.html | 432 + doc/sphinx/html/_modules/pymodbus/pdu.html | 330 + .../pymodbus/register_read_message.html | 442 + .../pymodbus/register_write_message.html | 337 + .../html/_modules/pymodbus/server/async.html | 370 + .../html/_modules/pymodbus/server/sync.html | 597 + .../html/_modules/pymodbus/transaction.html | 1064 ++ .../html/_modules/pymodbus/utilities.html | 290 + .../examples/asynchronous-client.rst.txt | 16 + .../examples/asynchronous-processor.rst.txt | 15 + .../examples/asynchronous-server.rst.txt | 6 + .../_sources/examples/bcd-payload.rst.txt | 6 + .../_sources/examples/bottle-frontend.rst.txt | 22 + .../_sources/examples/callback-server.rst.txt | 6 + .../examples/changing-framers.rst.txt | 6 + .../examples/concurrent-client.rst.txt | 6 + .../examples/custom-datablock.rst.txt | 6 + .../_sources/examples/custom-message.rst.txt | 6 + .../examples/database-datastore.rst.txt | 6 + .../_sources/examples/gtk-frontend.rst.txt | 26 + .../html/_sources/examples/index.rst.txt | 59 + .../examples/libmodbus-client.rst.txt | 6 + .../examples/message-generator.rst.txt | 26 + .../_sources/examples/message-parser.rst.txt | 55 + .../_sources/examples/modbus-logging.rst.txt | 6 + .../examples/modbus-payload-server.rst.txt | 6 + .../_sources/examples/modbus-payload.rst.txt | 6 + .../_sources/examples/modbus-scraper.rst.txt | 6 + .../examples/modbus-simulator.rst.txt | 5 + .../_sources/examples/modicon-payload.rst.txt | 6 + .../_sources/examples/performance.rst.txt | 11 + .../_sources/examples/redis-datastore.rst.txt | 6 + .../examples/remote-server-context.rst.txt | 6 + .../examples/serial-forwarder.rst.txt | 6 + .../examples/synchronous-client-ext.rst.txt | 6 + .../examples/synchronous-client.rst.txt | 19 + .../examples/synchronous-server.rst.txt | 6 + .../examples/thread-safe-datastore.rst.txt | 6 + .../_sources/examples/tk-frontend.rst.txt | 17 + .../_sources/examples/updating-server.rst.txt | 6 + .../_sources/examples/wx-frontend.rst.txt | 17 + doc/sphinx/html/_sources/index.rst.txt | 23 + .../_sources/library/async-client.rst.txt | 19 + .../_sources/library/async-server.rst.txt | 29 + .../_sources/library/bit-read-message.rst.txt | 32 + .../library/bit-write-message.rst.txt | 26 + .../_sources/library/client-common.rst.txt | 16 + .../html/_sources/library/constants.rst.txt | 31 + .../library/datastore/context.rst.txt | 20 + .../_sources/library/datastore/index.rst.txt | 13 + .../_sources/library/datastore/remote.rst.txt | 16 + .../_sources/library/datastore/store.rst.txt | 23 + .../html/_sources/library/device.rst.txt | 28 + .../_sources/library/diag-message.rst.txt | 128 + .../html/_sources/library/events.rst.txt | 28 + .../html/_sources/library/exceptions.rst.txt | 26 + .../html/_sources/library/factory.rst.txt | 19 + .../_sources/library/file-message.rst.txt | 34 + .../html/_sources/library/index.rst.txt | 35 + .../html/_sources/library/interfaces.rst.txt | 28 + .../html/_sources/library/mei-message.rst.txt | 19 + .../_sources/library/other-message.rst.txt | 31 + .../html/_sources/library/payload.rst.txt | 19 + doc/sphinx/html/_sources/library/pdu.rst.txt | 32 + .../html/_sources/library/pymodbus.rst.txt | 7 + .../library/register-read-message.rst.txt | 38 + .../library/register-write-message.rst.txt | 26 + .../html/_sources/library/sync-client.rst.txt | 29 + .../html/_sources/library/sync-server.rst.txt | 40 + .../html/_sources/library/transaction.rst.txt | 31 + .../html/_sources/library/utilities.rst.txt | 33 + doc/sphinx/html/_static/README | 1 + doc/sphinx/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes doc/sphinx/html/_static/basic.css | 632 + doc/sphinx/html/_static/classic.css | 261 + doc/sphinx/html/_static/comment-bright.png | Bin 0 -> 756 bytes doc/sphinx/html/_static/comment-close.png | Bin 0 -> 829 bytes doc/sphinx/html/_static/comment.png | Bin 0 -> 641 bytes doc/sphinx/html/_static/default.css | 1 + doc/sphinx/html/_static/doctools.js | 287 + doc/sphinx/html/_static/down-pressed.png | Bin 0 -> 222 bytes doc/sphinx/html/_static/down.png | Bin 0 -> 202 bytes doc/sphinx/html/_static/file.png | Bin 0 -> 286 bytes doc/sphinx/html/_static/jquery-3.1.0.js | 10074 ++++++++++++++++ doc/sphinx/html/_static/jquery.js | 4 + doc/sphinx/html/_static/minus.png | Bin 0 -> 90 bytes doc/sphinx/html/_static/plus.png | Bin 0 -> 90 bytes doc/sphinx/html/_static/pygments.css | 69 + doc/sphinx/html/_static/searchtools.js | 758 ++ doc/sphinx/html/_static/sidebar.js | 159 + doc/sphinx/html/_static/underscore-1.3.1.js | 999 ++ doc/sphinx/html/_static/underscore.js | 31 + doc/sphinx/html/_static/up-pressed.png | Bin 0 -> 214 bytes doc/sphinx/html/_static/up.png | Bin 0 -> 203 bytes doc/sphinx/html/_static/websupport.js | 808 ++ .../html/examples/asynchronous-client.html | 255 + .../html/examples/asynchronous-processor.html | 312 + .../html/examples/asynchronous-server.html | 230 + doc/sphinx/html/examples/bcd-payload.html | 344 + doc/sphinx/html/examples/bottle-frontend.html | 140 + doc/sphinx/html/examples/callback-server.html | 253 + .../html/examples/changing-framers.html | 177 + .../html/examples/concurrent-client.html | 355 + .../html/examples/custom-datablock.html | 176 + doc/sphinx/html/examples/custom-message.html | 208 + .../html/examples/database-datastore.html | 294 + doc/sphinx/html/examples/gtk-frontend.html | 637 + doc/sphinx/html/examples/index.html | 204 + .../html/examples/libmodbus-client.html | 548 + .../html/examples/message-generator.html | 808 ++ doc/sphinx/html/examples/message-parser.html | 361 + doc/sphinx/html/examples/modbus-logging.html | 162 + .../html/examples/modbus-payload-server.html | 191 + doc/sphinx/html/examples/modbus-payload.html | 203 + doc/sphinx/html/examples/modbus-scraper.html | 400 + .../html/examples/modbus-simulator.html | 249 + doc/sphinx/html/examples/modicon-payload.html | 407 + doc/sphinx/html/examples/performance.html | 208 + doc/sphinx/html/examples/redis-datastore.html | 364 + .../html/examples/remote-server-context.html | 317 + .../html/examples/serial-forwarder.html | 158 + .../html/examples/synchronous-client-ext.html | 298 + .../html/examples/synchronous-client.html | 262 + .../html/examples/synchronous-server.html | 238 + .../html/examples/thread-safe-datastore.html | 330 + doc/sphinx/html/examples/tk-frontend.html | 480 + doc/sphinx/html/examples/updating-server.html | 205 + doc/sphinx/html/examples/wx-frontend.html | 452 + doc/sphinx/html/genindex.html | 1828 +++ doc/sphinx/html/index.html | 160 + doc/sphinx/html/library/async-client.html | 271 + doc/sphinx/html/library/async-server.html | 383 + doc/sphinx/html/library/bit-read-message.html | 469 + .../html/library/bit-write-message.html | 459 + doc/sphinx/html/library/client-common.html | 370 + doc/sphinx/html/library/constants.html | 400 + .../html/library/datastore/context.html | 349 + doc/sphinx/html/library/datastore/index.html | 137 + doc/sphinx/html/library/datastore/remote.html | 251 + doc/sphinx/html/library/datastore/store.html | 502 + doc/sphinx/html/library/device.html | 632 + doc/sphinx/html/library/diag-message.html | 876 ++ doc/sphinx/html/library/events.html | 366 + doc/sphinx/html/library/exceptions.html | 196 + doc/sphinx/html/library/factory.html | 268 + doc/sphinx/html/library/file-message.html | 578 + doc/sphinx/html/library/index.html | 225 + doc/sphinx/html/library/interfaces.html | 453 + doc/sphinx/html/library/mei-message.html | 304 + doc/sphinx/html/library/other-message.html | 527 + doc/sphinx/html/library/payload.html | 574 + doc/sphinx/html/library/pdu.html | 425 + doc/sphinx/html/library/pymodbus.html | 136 + .../html/library/register-read-message.html | 579 + .../html/library/register-write-message.html | 448 + doc/sphinx/html/library/sync-client.html | 579 + doc/sphinx/html/library/sync-server.html | 564 + doc/sphinx/html/library/transaction.html | 1010 ++ doc/sphinx/html/library/utilities.html | 330 + doc/sphinx/html/objects.inv | Bin 0 -> 5971 bytes doc/sphinx/html/py-modindex.html | 428 + doc/sphinx/html/search.html | 107 + doc/sphinx/html/searchindex.js | 1 + examples/contrib/message-generator.py | 11 +- pymodbus/version.py | 2 +- requirements-checks.txt | 4 + requirements-tests.txt | 12 + requirements.txt | 1 + scripts/travis.sh | 11 + test/test_mei_messages.py | 6 +- tox.ini | 16 + 261 files changed, 51903 insertions(+), 169 deletions(-) create mode 100644 .travis.yml create mode 100644 Makefile create mode 100644 doc/sphinx/doctrees/environment.pickle create mode 100644 doc/sphinx/doctrees/examples/asynchronous-client.doctree create mode 100644 doc/sphinx/doctrees/examples/asynchronous-processor.doctree create mode 100644 doc/sphinx/doctrees/examples/asynchronous-server.doctree create mode 100644 doc/sphinx/doctrees/examples/bcd-payload.doctree create mode 100644 doc/sphinx/doctrees/examples/bottle-frontend.doctree create mode 100644 doc/sphinx/doctrees/examples/callback-server.doctree create mode 100644 doc/sphinx/doctrees/examples/changing-framers.doctree create mode 100644 doc/sphinx/doctrees/examples/concurrent-client.doctree create mode 100644 doc/sphinx/doctrees/examples/custom-datablock.doctree create mode 100644 doc/sphinx/doctrees/examples/custom-message.doctree create mode 100644 doc/sphinx/doctrees/examples/database-datastore.doctree create mode 100644 doc/sphinx/doctrees/examples/gtk-frontend.doctree create mode 100644 doc/sphinx/doctrees/examples/index.doctree create mode 100644 doc/sphinx/doctrees/examples/libmodbus-client.doctree create mode 100644 doc/sphinx/doctrees/examples/message-generator.doctree create mode 100644 doc/sphinx/doctrees/examples/message-parser.doctree create mode 100644 doc/sphinx/doctrees/examples/modbus-logging.doctree create mode 100644 doc/sphinx/doctrees/examples/modbus-payload-server.doctree create mode 100644 doc/sphinx/doctrees/examples/modbus-payload.doctree create mode 100644 doc/sphinx/doctrees/examples/modbus-scraper.doctree create mode 100644 doc/sphinx/doctrees/examples/modbus-simulator.doctree create mode 100644 doc/sphinx/doctrees/examples/modicon-payload.doctree create mode 100644 doc/sphinx/doctrees/examples/performance.doctree create mode 100644 doc/sphinx/doctrees/examples/redis-datastore.doctree create mode 100644 doc/sphinx/doctrees/examples/remote-server-context.doctree create mode 100644 doc/sphinx/doctrees/examples/serial-forwarder.doctree create mode 100644 doc/sphinx/doctrees/examples/synchronous-client-ext.doctree create mode 100644 doc/sphinx/doctrees/examples/synchronous-client.doctree create mode 100644 doc/sphinx/doctrees/examples/synchronous-server.doctree create mode 100644 doc/sphinx/doctrees/examples/thread-safe-datastore.doctree create mode 100644 doc/sphinx/doctrees/examples/tk-frontend.doctree create mode 100644 doc/sphinx/doctrees/examples/updating-server.doctree create mode 100644 doc/sphinx/doctrees/examples/wx-frontend.doctree create mode 100644 doc/sphinx/doctrees/index.doctree create mode 100644 doc/sphinx/doctrees/library/async-client.doctree create mode 100644 doc/sphinx/doctrees/library/async-server.doctree create mode 100644 doc/sphinx/doctrees/library/bit-read-message.doctree create mode 100644 doc/sphinx/doctrees/library/bit-write-message.doctree create mode 100644 doc/sphinx/doctrees/library/client-common.doctree create mode 100644 doc/sphinx/doctrees/library/constants.doctree create mode 100644 doc/sphinx/doctrees/library/datastore/context.doctree create mode 100644 doc/sphinx/doctrees/library/datastore/index.doctree create mode 100644 doc/sphinx/doctrees/library/datastore/remote.doctree create mode 100644 doc/sphinx/doctrees/library/datastore/store.doctree create mode 100644 doc/sphinx/doctrees/library/device.doctree create mode 100644 doc/sphinx/doctrees/library/diag-message.doctree create mode 100644 doc/sphinx/doctrees/library/events.doctree create mode 100644 doc/sphinx/doctrees/library/exceptions.doctree create mode 100644 doc/sphinx/doctrees/library/factory.doctree create mode 100644 doc/sphinx/doctrees/library/file-message.doctree create mode 100644 doc/sphinx/doctrees/library/index.doctree create mode 100644 doc/sphinx/doctrees/library/interfaces.doctree create mode 100644 doc/sphinx/doctrees/library/mei-message.doctree create mode 100644 doc/sphinx/doctrees/library/other-message.doctree create mode 100644 doc/sphinx/doctrees/library/payload.doctree create mode 100644 doc/sphinx/doctrees/library/pdu.doctree create mode 100644 doc/sphinx/doctrees/library/pymodbus.doctree create mode 100644 doc/sphinx/doctrees/library/register-read-message.doctree create mode 100644 doc/sphinx/doctrees/library/register-write-message.doctree create mode 100644 doc/sphinx/doctrees/library/sync-client.doctree create mode 100644 doc/sphinx/doctrees/library/sync-server.doctree create mode 100644 doc/sphinx/doctrees/library/transaction.doctree create mode 100644 doc/sphinx/doctrees/library/utilities.doctree create mode 100644 doc/sphinx/html/.buildinfo create mode 100644 doc/sphinx/html/_modules/index.html create mode 100644 doc/sphinx/html/_modules/pymodbus/bit_read_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/bit_write_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/client/async.html create mode 100644 doc/sphinx/html/_modules/pymodbus/client/common.html create mode 100644 doc/sphinx/html/_modules/pymodbus/client/sync.html create mode 100644 doc/sphinx/html/_modules/pymodbus/constants.html create mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/context.html create mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/remote.html create mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/store.html create mode 100644 doc/sphinx/html/_modules/pymodbus/device.html create mode 100644 doc/sphinx/html/_modules/pymodbus/diag_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/events.html create mode 100644 doc/sphinx/html/_modules/pymodbus/exceptions.html create mode 100644 doc/sphinx/html/_modules/pymodbus/factory.html create mode 100644 doc/sphinx/html/_modules/pymodbus/file_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/interfaces.html create mode 100644 doc/sphinx/html/_modules/pymodbus/mei_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/other_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/payload.html create mode 100644 doc/sphinx/html/_modules/pymodbus/pdu.html create mode 100644 doc/sphinx/html/_modules/pymodbus/register_read_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/register_write_message.html create mode 100644 doc/sphinx/html/_modules/pymodbus/server/async.html create mode 100644 doc/sphinx/html/_modules/pymodbus/server/sync.html create mode 100644 doc/sphinx/html/_modules/pymodbus/transaction.html create mode 100644 doc/sphinx/html/_modules/pymodbus/utilities.html create mode 100644 doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/bcd-payload.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/callback-server.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/changing-framers.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/concurrent-client.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/custom-datablock.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/custom-message.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/database-datastore.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/index.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/message-generator.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/message-parser.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modbus-logging.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modbus-payload.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/modicon-payload.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/performance.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/redis-datastore.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/remote-server-context.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/synchronous-client.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/synchronous-server.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/tk-frontend.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/updating-server.rst.txt create mode 100644 doc/sphinx/html/_sources/examples/wx-frontend.rst.txt create mode 100644 doc/sphinx/html/_sources/index.rst.txt create mode 100644 doc/sphinx/html/_sources/library/async-client.rst.txt create mode 100644 doc/sphinx/html/_sources/library/async-server.rst.txt create mode 100644 doc/sphinx/html/_sources/library/bit-read-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/bit-write-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/client-common.rst.txt create mode 100644 doc/sphinx/html/_sources/library/constants.rst.txt create mode 100644 doc/sphinx/html/_sources/library/datastore/context.rst.txt create mode 100644 doc/sphinx/html/_sources/library/datastore/index.rst.txt create mode 100644 doc/sphinx/html/_sources/library/datastore/remote.rst.txt create mode 100644 doc/sphinx/html/_sources/library/datastore/store.rst.txt create mode 100644 doc/sphinx/html/_sources/library/device.rst.txt create mode 100644 doc/sphinx/html/_sources/library/diag-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/events.rst.txt create mode 100644 doc/sphinx/html/_sources/library/exceptions.rst.txt create mode 100644 doc/sphinx/html/_sources/library/factory.rst.txt create mode 100644 doc/sphinx/html/_sources/library/file-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/index.rst.txt create mode 100644 doc/sphinx/html/_sources/library/interfaces.rst.txt create mode 100644 doc/sphinx/html/_sources/library/mei-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/other-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/payload.rst.txt create mode 100644 doc/sphinx/html/_sources/library/pdu.rst.txt create mode 100644 doc/sphinx/html/_sources/library/pymodbus.rst.txt create mode 100644 doc/sphinx/html/_sources/library/register-read-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/register-write-message.rst.txt create mode 100644 doc/sphinx/html/_sources/library/sync-client.rst.txt create mode 100644 doc/sphinx/html/_sources/library/sync-server.rst.txt create mode 100644 doc/sphinx/html/_sources/library/transaction.rst.txt create mode 100644 doc/sphinx/html/_sources/library/utilities.rst.txt create mode 100644 doc/sphinx/html/_static/README create mode 100644 doc/sphinx/html/_static/ajax-loader.gif create mode 100644 doc/sphinx/html/_static/basic.css create mode 100644 doc/sphinx/html/_static/classic.css create mode 100644 doc/sphinx/html/_static/comment-bright.png create mode 100644 doc/sphinx/html/_static/comment-close.png create mode 100644 doc/sphinx/html/_static/comment.png create mode 100644 doc/sphinx/html/_static/default.css create mode 100644 doc/sphinx/html/_static/doctools.js create mode 100644 doc/sphinx/html/_static/down-pressed.png create mode 100644 doc/sphinx/html/_static/down.png create mode 100644 doc/sphinx/html/_static/file.png create mode 100644 doc/sphinx/html/_static/jquery-3.1.0.js create mode 100644 doc/sphinx/html/_static/jquery.js create mode 100644 doc/sphinx/html/_static/minus.png create mode 100644 doc/sphinx/html/_static/plus.png create mode 100644 doc/sphinx/html/_static/pygments.css create mode 100644 doc/sphinx/html/_static/searchtools.js create mode 100644 doc/sphinx/html/_static/sidebar.js create mode 100644 doc/sphinx/html/_static/underscore-1.3.1.js create mode 100644 doc/sphinx/html/_static/underscore.js create mode 100644 doc/sphinx/html/_static/up-pressed.png create mode 100644 doc/sphinx/html/_static/up.png create mode 100644 doc/sphinx/html/_static/websupport.js create mode 100644 doc/sphinx/html/examples/asynchronous-client.html create mode 100644 doc/sphinx/html/examples/asynchronous-processor.html create mode 100644 doc/sphinx/html/examples/asynchronous-server.html create mode 100644 doc/sphinx/html/examples/bcd-payload.html create mode 100644 doc/sphinx/html/examples/bottle-frontend.html create mode 100644 doc/sphinx/html/examples/callback-server.html create mode 100644 doc/sphinx/html/examples/changing-framers.html create mode 100644 doc/sphinx/html/examples/concurrent-client.html create mode 100644 doc/sphinx/html/examples/custom-datablock.html create mode 100644 doc/sphinx/html/examples/custom-message.html create mode 100644 doc/sphinx/html/examples/database-datastore.html create mode 100644 doc/sphinx/html/examples/gtk-frontend.html create mode 100644 doc/sphinx/html/examples/index.html create mode 100644 doc/sphinx/html/examples/libmodbus-client.html create mode 100644 doc/sphinx/html/examples/message-generator.html create mode 100644 doc/sphinx/html/examples/message-parser.html create mode 100644 doc/sphinx/html/examples/modbus-logging.html create mode 100644 doc/sphinx/html/examples/modbus-payload-server.html create mode 100644 doc/sphinx/html/examples/modbus-payload.html create mode 100644 doc/sphinx/html/examples/modbus-scraper.html create mode 100644 doc/sphinx/html/examples/modbus-simulator.html create mode 100644 doc/sphinx/html/examples/modicon-payload.html create mode 100644 doc/sphinx/html/examples/performance.html create mode 100644 doc/sphinx/html/examples/redis-datastore.html create mode 100644 doc/sphinx/html/examples/remote-server-context.html create mode 100644 doc/sphinx/html/examples/serial-forwarder.html create mode 100644 doc/sphinx/html/examples/synchronous-client-ext.html create mode 100644 doc/sphinx/html/examples/synchronous-client.html create mode 100644 doc/sphinx/html/examples/synchronous-server.html create mode 100644 doc/sphinx/html/examples/thread-safe-datastore.html create mode 100644 doc/sphinx/html/examples/tk-frontend.html create mode 100644 doc/sphinx/html/examples/updating-server.html create mode 100644 doc/sphinx/html/examples/wx-frontend.html create mode 100644 doc/sphinx/html/genindex.html create mode 100644 doc/sphinx/html/index.html create mode 100644 doc/sphinx/html/library/async-client.html create mode 100644 doc/sphinx/html/library/async-server.html create mode 100644 doc/sphinx/html/library/bit-read-message.html create mode 100644 doc/sphinx/html/library/bit-write-message.html create mode 100644 doc/sphinx/html/library/client-common.html create mode 100644 doc/sphinx/html/library/constants.html create mode 100644 doc/sphinx/html/library/datastore/context.html create mode 100644 doc/sphinx/html/library/datastore/index.html create mode 100644 doc/sphinx/html/library/datastore/remote.html create mode 100644 doc/sphinx/html/library/datastore/store.html create mode 100644 doc/sphinx/html/library/device.html create mode 100644 doc/sphinx/html/library/diag-message.html create mode 100644 doc/sphinx/html/library/events.html create mode 100644 doc/sphinx/html/library/exceptions.html create mode 100644 doc/sphinx/html/library/factory.html create mode 100644 doc/sphinx/html/library/file-message.html create mode 100644 doc/sphinx/html/library/index.html create mode 100644 doc/sphinx/html/library/interfaces.html create mode 100644 doc/sphinx/html/library/mei-message.html create mode 100644 doc/sphinx/html/library/other-message.html create mode 100644 doc/sphinx/html/library/payload.html create mode 100644 doc/sphinx/html/library/pdu.html create mode 100644 doc/sphinx/html/library/pymodbus.html create mode 100644 doc/sphinx/html/library/register-read-message.html create mode 100644 doc/sphinx/html/library/register-write-message.html create mode 100644 doc/sphinx/html/library/sync-client.html create mode 100644 doc/sphinx/html/library/sync-server.html create mode 100644 doc/sphinx/html/library/transaction.html create mode 100644 doc/sphinx/html/library/utilities.html create mode 100644 doc/sphinx/html/objects.inv create mode 100644 doc/sphinx/html/py-modindex.html create mode 100644 doc/sphinx/html/search.html create mode 100644 doc/sphinx/html/searchindex.js create mode 100644 requirements-checks.txt create mode 100644 requirements-tests.txt create mode 100755 scripts/travis.sh create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 58a3b232c..f94731eed 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,8 @@ pymodbus.egg-info/ .noseids .idea/ +.tox/ +doc/api/epydoc/html/ +.vscode/ + + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..6817288a6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,32 @@ +sudo: false +language: python +matrix: + include: + - os: linux + python: "2.7" + - os: linux + python: "3.4" + - os: linux + python: "3.5" + - os: linux + python: "3.6" + - os: osx + language: generic +before_install: + - if [ $TRAVIS_OS_NAME = osx ]; then brew update; fi + - if [ $TRAVIS_OS_NAME = osx ]; then brew install openssl; fi + +install: +# - scripts/travis.sh pip install pip-accel + - scripts/travis.sh pip install coveralls + - scripts/travis.sh pip install --requirement=requirements-checks.txt + - scripts/travis.sh pip install --requirement=requirements-tests.txt + - scripts/travis.sh LC_ALL=C pip install . +script: +# - scripts/travis.sh make check + - scripts/travis.sh make test +after_success: + - scripts/travis.sh coveralls +branches: + except: + - /^[0-9]/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 51336648c..12ee8e7c4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,8 @@ + +Version 1.3.0.rc2 +------------------------------------------------------------ +* fix encoding problem for ReadDeviceInformationRequest method on python3 + Version 1.3.0.rc1 ------------------------------------------------------------ * Timing improvements over MODBUS Serial interface diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..e9f7d9ef5 --- /dev/null +++ b/Makefile @@ -0,0 +1,64 @@ +# Makefile for the `pymodbus' package. + +WORKON_HOME ?= $(HOME)/.virtualenvs +VIRTUAL_ENV ?= $(WORKON_HOME)/pymodbus +PATH := $(VIRTUAL_ENV)/bin:$(PATH) +MAKE := $(MAKE) --no-print-directory +SHELL = bash + +default: + @echo 'Makefile for pymodbus' + @echo + @echo 'Usage:' + @echo + @echo ' make install install the package in a virtual environment' + @echo ' make reset recreate the virtual environment' + @echo ' make check check coding style (PEP-8, PEP-257)' + @echo ' make test run the test suite, report coverage' + @echo ' make tox run the tests on all Python versions' + @echo ' make clean cleanup all temporary files' + @echo + +install: + @test -d "$(VIRTUAL_ENV)" || mkdir -p "$(VIRTUAL_ENV)" + @test -x "$(VIRTUAL_ENV)/bin/python" || virtualenv --quiet "$(VIRTUAL_ENV)" + @test -x "$(VIRTUAL_ENV)/bin/pip" || easy_install pip + @pip install --quiet --requirement=requirements.txt + @pip uninstall --yes pymodbus &>/dev/null || true + @pip install --quiet --no-deps --ignore-installed . + +reset: + $(MAKE) clean + rm -Rf "$(VIRTUAL_ENV)" + $(MAKE) install + +check: install + @pip install --upgrade --quiet --requirement=requirements-checks.txt + @flake8 + +test: install + @pip install --quiet --requirement=requirements-tests.txt + @nosetests --with-coverage --cover-html + @coverage report --fail-under=90 + +tox: install + @pip install --quiet tox && tox + +docs: install + @pip install --quiet sphinx + @cd doc/sphinx && sphinx-build -nb html -d doctrees . html + +publish: install + git push origin && git push --tags origin + $(MAKE) clean + pip install --quiet twine wheel + python setup.py sdist bdist_wheel + twine upload dist/* + $(MAKE) clean + +clean: + @rm -Rf *.egg .cache .coverage .tox build dist docs/build htmlcov + @find -depth -type d -name __pycache__ -exec rm -Rf {} \; + @find -type f -name '*.pyc' -delete + +.PHONY: default install reset check test tox docs publish clean diff --git a/README.rst b/README.rst index c9b6f77e0..f7088713c 100644 --- a/README.rst +++ b/README.rst @@ -115,11 +115,34 @@ like your device tested, I accept devices via mail or by IP address. That said, the current work mainly involves polishing the library as I get time doing such tasks as: + * Add CI support + * Make PEP-8 compatible and flake8 ready * Fixing bugs/feature requests * Architecture documentation * Functional testing against any reference I can find * The remaining edges of the protocol (that I think no one uses) - + +------------------------------------------------------------ +Development Instructions +------------------------------------------------------------ +The current code base is compatible with both py2 and py3. +Use make to perform a range of activities + +``` +$ make +Makefile for pymodbus + +Usage: + + make install install the package in a virtual environment + make reset recreate the virtual environment + make check check coding style (PEP-8, PEP-257) + make test run the test suite, report coverage + make tox run the tests on all Python versions + make clean cleanup all temporary files + +``` + ------------------------------------------------------------ License Information ------------------------------------------------------------ diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py index e223ad565..9bea8e318 100644 --- a/doc/sphinx/conf.py +++ b/doc/sphinx/conf.py @@ -1,198 +1,88 @@ -# -*- coding: utf-8 -*- +# Pymodbus # -# PyModbus documentation build configuration file, created by -# sphinx-quickstart on Tue Apr 14 19:11:16 2009. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. +# Author: dhoomakethu +# Last Change: May 20, 2017 +# URL: https://pymodbus.readthedocs.io + +"""Sphinx documentation configuration for the `pymodbus` package.""" + +import os +import sys + +sys.path.insert(0, os.path.abspath(os.pardir)) -import sys, os -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.append(os.path.abspath('.')) +# -- General configuration ---------------------------------------------------- -# -- General configuration ----------------------------------------------------- +# Sphinx extension module names. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.viewcode', + 'humanfriendly.sphinx', +] -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage'] +# Sort members by the source order instead of alphabetically. +autodoc_member_order = 'bysource' -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +# Paths that contain templates, relative to this directory. +templates_path = ['templates'] # The suffix of source filenames. source_suffix = '.rst' -# The encoding of source files. -#source_encoding = 'utf-8' - # The master toctree document. master_doc = 'index' # General information about the project. -project = u'Pymodbus' -copyright = u'2009, Galen Collins' +project = u'pymodbus' +copyright = u'2017, riptideio/bashworks' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -# + +# Find the package version and make it the release. +from pymodbus import __version__ as pymodbus_version # noqa + # The short X.Y version. -version = '1.0' +version = '.'.join(pymodbus_version.split('.')[:2]) + # The full version, including alpha/beta/rc tags. -release = '1.0' +release = pymodbus_version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +language = 'en' -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of documents that shouldn't be included in the build. -#unused_docs = [] - -# List of directories, relative to source directory, that shouldn't be searched -# for source files. -exclude_trees = ['build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['build'] # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -show_authors = True +add_function_parentheses = True # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - +# Refer to the Python standard library. +# From: http://twistedmatrix.com/trac/ticket/4582. +intersphinx_mapping = dict( + python=('https://docs.python.org/2', None), + capturer=('https://capturer.readthedocs.io/en/latest', None), + humanfriendly=('https://humanfriendly.readthedocs.io/en/latest', None), +) -# -- Options for extensions --------------------------------------------------- -autodoc_default_flags = ['members', 'inherited-members', 'show-inheritance'] -autoclass_content = 'both' +# -- Options for HTML output -------------------------------------------------- -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. Major themes that come with -# Sphinx are currently 'default' and 'sphinxdoc'. +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. html_theme = 'default' -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None +# Output file base name for HTML help builder. +htmlhelp_basename = 'pymodbusdoc' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_use_modindex = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = '' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'Pymodbus' - - -# -- Options for LaTeX output -------------------------------------------------- - -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' - -# The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'Pymodbus.tex', ur'Pymodbus Documentation', - ur'Galen Collins', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_use_modindex = True diff --git a/doc/sphinx/doctrees/environment.pickle b/doc/sphinx/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..59b1234b6a8933ecddf31e046494b49276e21489 GIT binary patch literal 1724102 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�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Ÿ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%0D#PQJWe=QI?ERk@%C^i$X zi%{b=$cfkvwPVO#{=Bi(w>jCI;*r$>o`-mpiIN&W&Ie1sxf9o`k#gkMVF-UeQVlY! zqK{?Shwqg?!V+eS0MLc$xe8lwWachEZ{Tq_k17Q>7^POfLlaBA71^fL>|2QKF!|U_ zCe9I;)cNh+5CmfG*g4!V1tivU$5Cz&gcTvct%T4;thUH9Ym~Yo+9(9SuQxY}Q!H`k z_D_(6tIpk+@XSzvI$~!NBpDuhmU7XcLNt{i9-DxKD&L9uMc$~9$m4xfilJfOfD?wN zs4l{Xd`7<`55A3-70)){14B-m|&+)M@qQp7b zAq`Y8gufpiKX`uQDeFxek;FOa6gn)?YQd4&hb~@?mk|E(oyQ}{PUCs0SeuXs9fPyr zjSfJa7*Q%{;+XnGO{~O1NJgbuovpXsi1*JIqs3)ir#A6|b6UcCqXJ_8<%xCv;$(c{ zXJKNkSKHD^bttUz!}1JOFNdM$z2Yn?ev!0?NK+@djYRxkE-y;Lv&5Cv(jF@{k=_^U zR%Omed~?GdR?HZG)%J6Mhw)UkAH6Ro<5GU)Pp?<1x1l(1?LV&L^NaR+Ek_mCuREI)Y(KC4w0SELqm zN0c@QIkx{;BkRz)A@bOMv6Cq=bWTY|-Ut|?ciOpz|HF7Bo&lXAOu9?$)+1XmD|VmZU_9kEzM|HT53~p7N?J2p$;zR(xwJ zFfw|;gMvkaF6QC_-xp(9IcgGDMnT|Lm1YZ&{6wZ&BHOA<7u(5HN=cyGNc{t~kO(U) zoC}pNdSbqvmL2v+1w;-9@e;?eg0Z=D;Vr=+NXa2u0iv)&5Ci+#U<2ul12m zSg1Qsa2!W97&+~TMjHR34@F?)>Ph&yHWb-~UNKDuY~+4UJk>fx$2#Bhe~Z^K)+8N3 zP!It66VwaC4j5eG6X0$Z~gm!v6wJ;V$YYT))>AFo=nB=*v$;WUSsn5w@=o{rt{$V$O#* zY9#Wwg-w5gSNC*S-aZKlusSLVH32`2sh3~+Ue#WNaNE-fcbvdzE~a%vvaAj3lU3Yg ziOGzMkbI)m?-PdLBF3K#&x#Q;A=1{Pqojm#J^ke{Lcp%4rzZd*tLhdA57OcmCgP*M zwU79>n?>aEP{3Z0BE1}m_$xePJ5b5`FD)7ZV&L#>00Y5ED;7eH`UyAgj-KP>6gB12P%l{5ylks&zTB3_zvRRZ|o25Vl45TlX}3q+S<>n~?2{nAlxF z%Az>pAH!(*>Z}~D8ADkF1?U$ zDfvy_2pFQv)s204id4Q)o;R^_tIMfS6L9AUvFHf(!4U)*-};&mIE{>5Z9*ult>cDM zc>=a$D;R_hE?n(!Mj(YM&C?MZn=p}7PI^rQ0w2OIg-0KsT{WK{>G!y#GLMhp>OUrNwf7kC3u+=SAWoAo!hLiInywSuWpFN}?oB!CG zE+MZ^;KyaFCgG{2gv4)S5cvQ*#v;$LP9^`gVJAk&Nr~=_)zEQ>|G>lPnH_O4`tbtY z?_Vs&#wMdb?~2Y}gCn}##s5| zFpOV`hknqLMYNh|WF>+%{#+t_w-c<5lu)-UBQ5NXu~ietKt~>1MIh*%FJ_b3;(J8# zAcNl@Mk_Y+YlGGrDFY8`jzuRNIo0o%(T{KC{X!Um-<`o~dT~64F!_=~^ZEFvn9#(1 zSCjKQ>OY7xtm5gAm3IT4IMBsmdflb!iZdsuHY9PVu*hcLjM3#)uTPD{4(Kpr7Zif; zFuM}Owt1B}DDzB{ELt3(CV+uzc8KA40sX%%qQn*0;iF{`IuIsjsn^C};-~KwW9_0- zgOc5D{6(Fa&y ztV9G>Vrj4C?KJ>m9*P-gIryo=u#`|zIWhb0jWt8k0a8UvJ~L!mvfpef6Kl{($-x^1 zhu`o}y+K5cfg`IYMTP8lpc%_fmrqR?DTZB_yS1{UDQly zr=6b6ywL(9CySqgqQkx?@l05YpAu@Kc|z$bJ9uIdZAeh1kh|Ej7|89bCL0|`poPJ{ z-Z>thoCxxhXZ^3AeEYcnKmYjcKiME8T!@{T_}*whk;|cH$VQf){$PR3RFMreaf)?} z43qmh5Lw)=Qz5Iq!agH$*wf>DLuPiv(wRL$Lj6f^jF1dhg(PekO2i?m>4|tlml4!Y zo;fNZ`mQZKlIuu|)&P1&ByKvI&ET;k!FTECp+d~wmS(}yUPCmMv|~_y8hAqER=um8 zmS8)_7w0Hp(u_|_ypNnr*IomIxW5XqNh<$NdRiyD54W5_BrUok&2&(25V|@r$@X3l zD%;UdBY32^OmoExA?U7R=xF+d@qECc=8qAvREhS|CgzGS^piPIIFixo!X(>$93&x; z{23YZj8)>Y2}-hx7JeZP;df2YYMR0m3&Q9K-NMj*+j|CS@m762WCqsngjn415-KPJ z-_cN&XP3+0k4C=b5^t=vU>8RqYN(8%VSpjd51mAhF?(W_SBcvjjza8G_}uLhZi^DF zqm50%IuQ$|xqLc7$@pQ>`Jgn9$ziN1Z%h*gumVA@rP)R#M_*Duj_VwK*IQDKLEt;` zmKm?0%Vw>tzBK(vOh|V|%}?k=B9puJ%2^;OkElueaMX@B!E5_x-LBP_YgQwm|`qia5;jFeD&#e^}uEN|k(8CwY1^U_otqThso zfG}ZbkmF`b2r^1U)S6xq?ZiDQr(Z(o?KrXt;GG=4K#W!8?vj8Ml@f@omj!^3@10I& zM@aEx2TkIeTh0egPqaIla=VB1jc71KD?)Bc=ADEryB@J4-)Y!9ZABy$WgWI6wZH06 zOLl}x=aFz2sHAxkvUd+c77*c4a$ObFck*NbzfUn9u zW`^1*b*S4gMBgjElp>1ynUOew3nAf4Q*nsy2^b*OMakWSxY%)*D*{397FYi9@&xH{ zS271S_*XnV{3TGxwc`LO5}{3wLSEkJge2FSriW#2D1A65E*&Exj~alGB3R9<-L;)yrIZBv z&@>^k8BF=n*B~=roQVzAp-t(+Bf~rP?!kX>1`GYsWhEXa=DFk5)I=haLlXj+ExC_E zix7isEhUsg9TG$XNM}G|D4;L!cUj^hX+&L+lt?>>wwhinj+WpX_fq1TtAeyDazbi7 zq)G#naEV;^UOLl*{FY_im=EBSVxyQiRyy)_C<1%9XSod}`yHNjewrsdw>lCe1_+^l z)i5%{_Z?XQxxp(#b7GS_3OArPsG(^?>MWMrB*=AQ!<4v1JBCUBq=PT+_45l<)HcM# zMz2B^m6H7vn~x}Ev0LDu^V4|b`#W*78L1zwEf~Vz!E;%#DY`Jr3o`FppA#H}T2Hzz z7;?B>9^~MonRfIrO}tkNt#fI4o9JloTHUmZDL=*fpLo=F)LU~5c3vdz)p?abGI3l~ z;*gON%BpkE&q^(r#G7MHzpL~_lxS9PsQkdTQ@uJZ!S0y3S1%FN??f8ZE$;CSV{sFS zOd?SZrU_XBj*wv8<|=W#yJrnof;TE4+cAZCyfX~#sknIx0&!A_h#9g?3xG+;3{#ddi;Sc4!eH5wwjd}?!+`0#2k zPQ|z$pLftlt*_8WQn?G%f_NEzA_)UfP;y1(8{ovHQ4KH)w(9trDM=iz4Jsj*tQ|EZXUFzq7{)k% zaVr~Y;sF$t&Ea$$!poDh3WVM6$yvf+8>6#aU#SpCgIu(5X3=-e^FPi#qG$1@)6lxd|h7OO8}(!rhZo3nu}xY^!P;FR?+4 zM&jgd9Df}^53?M`q$2Ub6!Q1aWnCF}LTRShu&IU8N@6U#shdNXSbhWuHuNvyJ+& zkUo0!=_h?igBLEtKF@k~P}=6;B(T|u%0OG9Xi(J)2Y5v0Tw%U^oxQXJlWgz58Vz1Z zBo7v){W{#P(xLo2;2MEzEfluvUg{aGcUlLbr z0@vI%U8%^d`6uzNQcQAuP##%WxO|}XMY-cF6Orcyf$U1N1xS9L>V*$2hPvdZr$fb4 z!4Uqg--{v`;A@62kO;}YB_aPgIlsgkO)T<}A|CiWEb6!l6WSUO5x6EM+@7uIBXk&P zDg1y)EUAvI5Fms;tWV*KX>I9C+^dCHdtTbh@IfORmMo zR*&7p@#B;}lHPRHD9#gB(8)TT&?^;E9do?>8kMGW z8$DS5h;%HYPm!U{oO=exgE{_NW0bK?8v@yEgyZ+z$CSV=48{=i1p7y1Y?^GtEC9$Y zS}iy-YdpD_;WQF|yy=t6(a0z2$npgO|F5&zynl2lKWq@MI4)d%a+?7^%Nrel-^Mm?K#|KX z)^F6rjp_v%smAE|1uYOA`6V`s#2?7d;(eTXQ3)Y&+YkgkEZk76`uGTr2c8%xvDclr z)$f8t9uHi9Jzh#Vn6(6fiM{R!WaN!CIC8srd<3h*S?$)5cw!k5@oNAbeY>CJjzv9U zzkV_ktKnTbKKgrr5c-zXdUL7J_ESQA*{Bc~a=RIakN4Iw@*mu*3O;-HuiZ zj?C`(b}LB^AA1Gf#P#XaWaNzo6uA_QY`;I9l|(Mr*T^~!;YAZ&ixt~xqAOwIriM8n z+gW7SN?5(t!X%WQT@z*T@x|OF=k1imBqWSG-5}3p=p7Q)@eZ*}5eWJ)Rt93DU_%=$ z5Y$;Ghe}*O0nuD)Yk*{UFkHT5_ytaHlnoT^@jMkeqBl<;S?S) zWEQPv(4B#jac#gcJHcBq;1n#f+5cG#;$r1P73k&c=+Ac6B!-TZ{G2rmLgOhc=2JW* zkoMJJ6N}5J2;4v*=(`ZHhG#AfCQd{@1nqHRbd+*OQ-esPp{YZ ziVKy3AWyOQV-b+uFaK&CUq?U0b@=GuLiQ+w>mOi_LwGS(E+rh*m6h8WD~*&;H_f$o z^iw2DOx&JE#KEWm2zlG|SUe#Rt%Kls8}-EJcj&-s95T35t0JaNrA9)C*`(A6BpqX# zjE1AJk8wi()v_{?Sivx1;-)+C{j%MJ87ZL-y-LaPcy%^fJVMEC&nA=jb|>b{d80-m zkB2r3aIFfn80XOs;Dk`oF_9f`WOq>F?>tIbeP|LNR7m+rrRhlIa7T^@BtBquLh)cf zoh{t@miU&Mnr!Mn1ROabvH1-CO!$Yb`NXmz32_TC!S)adf`l;8MCvaFnUF(`kf3c4 zLW_deE@PMf6FmhHA!}m7y#teh^)8`NYMtFeOO%py{^-%*trVSe9Kt`Wr|oErXO*Ur z4x3NH{!l}#Erli~c^<%Qg=-kbK5>qyJbDusv5=C-ItHwhLvmVi+w|d2;5wPE zjs^yC56@tvrR*?39o6G8EDT#1nMh3NE*LVnZ)QIz1d6*YBByKxCG_?kcEdF=8-Me8 z$G={}13k2qiMz^-|U`Ua(kY;`5(1z!H=BjlNQq2IQSqyy*W3q{eW zRnLt@!Zz)+96WDSK;#f*${#}!_)l+Krrc3d6Z-J$Q zXAkjOc22yox}NWpz6rYb=lSTA$td+rXw#igDUy&2wGBbw9X}_}2S3eSz)f63PDW&J zC`MxxR^wHi+SeNeMIh*hwS`x+2)a9v4M;)=C>VM`ls3ftsR){ZNv1a>m;z?KMYwz= zgrqu>!e|Nhal2jx((R6Z9`!9TyM4tUH}3&A1+;NE5A8p;z}bUCSIApjot~h76~`scjk#X4&_u(zQ)(E! zLXuEhZU4M^wFSh66L%9ZJ8&2xOTQmSWIDbgh`H3FRY8#nwJDcKIN&$nc8_yNK0->U zyA_jh+dVrW)&_aI#}ybE?V77KZf@~vv}s5jx*aasj-kN*^q^jtj&;I8++VG#Hr zz74=jL_hi3NeD|p+8mYuB7=IZs2_J+%?ZoI1{Qtjuf!!BP-JrF6;3QTQ6Bfc(IRwJ z5|o7dRZ#OoqE%y&4gCj1S+TsFdYz#y{Re`YfK}BlbzxdF$|aQdeps{f-WV^}0LhWA zCYnFjR_AsHIJOmr{zQj;NAA=iOd})aLe~=@A-NbCJKTg|A9rwJ{P5(fXV1U;{`<#Y zS~nBtaCOgAT=laksLM_)H z!qWxrGNJ%<`6sc98nxZ803_FYx$!C6fYYh5_k$!Yi>#1| zsp)uj7zAPWuv_Swh?AmnKTkN3I3Xw98;+t~9-fZXuG9Z<>9=4)=n*nK6dLrz{H!ek zL&b)o*XB&#{+HhjrtrXZsq)2UIcO`XJH=8*_xDf^BHK{Ue%c|H7~LZyjroDbdJL1dOd7+-8e15 z_G>L~l?otn4Azt!+4>KJ(xHV_c6PBCvatH%Ldw}%w-Ya@pe2K7K^!t9vbf{1-!Rs{ zLOx2^>LW5E!K5n$yn&?OVObVL!!4?~VrWh*k&X-vH4YgZ*y(Zvx4~(DKAZUTCe&0N z2U7*3gEU9ZsiOr=A(|b(sG$>sWYnC8P9!q9IhbBb-bYzuHp>Ycs}T{q2GD++xUC7F z$IHP4q0@$)5DXgB= zlb!G|?XZ=sqmh}VKW^05R#y$we?>E(j(bvNA-RobvK*@9$ zHOJEZaPV9?T*8vi9{yvAVaQ=P2#?3 z$@)S|6mdwKED;lGP}@1ADJ6l*BfH-p!zvXo;OjrK1BeVhuq_szCy5u1k#M34IpOwN z*N1(7#_)7j;xOAFgx=AGi*c>oloG4T$k^K^gbskMizsK17=VtY1aiXN_82Uji_QA- zi5YWR_SG8|5IO8Z0Y~NMWN{W5L}Ls#d+}*-|h%eN&;1OwiEb1U-rRhHedDXhIRZ6 z>})k!6Plf{R8c=h@u`HGz2$th6k;8B3{AwwiDBKkpO7G(l9THVxDh~z01VL&PNv{I zJnJC?`E)rcI+KI|?4-IM)^Lcw3-=vMGApj#`MwuA!j~pth`ob!E{7NVkFB>76n zTtY_BCOt8!_hYGy>ltq7ocPj?N0)xE1}!~xWsKNvWPAP{^sGTd9wZ$V;JbHDhfm{@3fT zgfrQ=x6jIm!Jc!D-xH>CR7V#W zf_tJHBwBK@Ao0fR=r;j$NGzAP9_D&JS)UU_(vb+f0Ynxbu7#0fL&CaO{Dd+Fy({C= z3m`cbXI>~)rX_b@Lc)o0Z_k3_D7=f8lkq95LD+z04m+)6LGU#coe*psYJ&Z#Q{Mdv zg_;wSfj4R-@?h+iB*UJ=2+f~TitQOA&g@&BzJ4Ei`fCRv&-NdACmS+(XiI8Zv+g{_ZWC7&Mw=!>b7DxD+mHVj5A~@WsVWr{$x6wT)-K~`ky%N0)ih9tu;V0 zJan}r>_$j8P;2-TM}`yYGI()Hm2Zti9uI2wTW)IjK8^aTpY59xRh9~Z3R0ylsv{gg zj!1^L{q&j~i-(&WiN-2%FF7s0$r}|AITRuOjg{A^jUZvV&5o~`@vhtP3Wyv&3Ly(# zG?1T0xa8&+t2#xxFOHo=b19+L_XFBRV@GGJf zKxFWt%YBmOsE{yNs;jNv#K{*39OP)V@yPCuqyllnoTn5qR*6S&BcsR~ z3_09|`jok3B`EFd+38bAaFOgXp)z%HevCJoSmbltR};PyR({0QZ?WZ_wy`WLARQ}n z=f!0O^Iy{$I3c)oI0HA4$VA+)kzWSAhj*b*dcvL#GVgpvt|Nozw#X!6r;vY#-EA|R z82*Zu_*L7nwBK<~N^pzeC!~!aBYLz5qP=g%MOU7OnTr`oh)}bf*c~`zaJRSn3rubtr@sfuOsTofgPEgCb}#@(JUX(doF0JYO($;LEs3 zr0|mx3zX0@ZXA?=(#|)%$MOeHp=19`Q=HILn)r>mz+6n@VDd;-EmUIMzJ2|L+2NGA z8I>RQ*X=vDac$SR{r=_k?AuuU z$!n7I{=JUd-(ERqPY18+b@8wN9_u1_@Z%4yT$IRha;`o?+rB*UelTJVbQcg=L@H-- z$4 z@px2H7bNa6CnW=K6ddA9n!HM*x?P$)5)x)7?%?TGYJ(tSAEQMO0^ci#G)yPw7qHM( z6`>PuWrdzBO0xk+URDofcKV4wCAZfJL)HW};r?SIDJ&#^#0|*V0!hkqLAeejp@?@d zeuX!v#@m3bpM>ef61wjGn%dDeKYcBGPCi)}oW@B&^{OKazAj8@#Mm zdcxx3i<{`)a1>(SfsasxiOlgCOT2zOn=| zXbA>k4^=5<=3@$mj-KdtOSRTSA^sh@xWEku$yHc!UTk)@9uk_ELe2h{W(7t*J7xgH zk|_%=q4MZ(Q8Ng_np4pq-l9{{I+lLGU?jyckU33$*a#&)z{of}O$fq1DDMQEU$4aP zQ*@SLjZ2tMHog{GfaLe%&W@vbTpksnz6)c zt7$o)^&bpOM->YnZ|#%usTx}(<{pi{J3u5xwIGmFY4YV)0LkwoKWiUP2Pj+cbaW!I z$he@3oRY8^IS3hgqYF_-vc$`K6i8m?a$2(T21-?5OxbNcd)~$S;UcmsB-AKQZilat zv$wx)*j&U6IT^tx0s_EfeC{V&A{Z!O*z;&%snbKX0ZPWA5)%L9M&78zw}6Z+n&gCh zV29F|lZhM_6Xdb~j!9B%{1a-Aj$>^d&8FFe1d%f+Y<#xGG#jl>^EwbY)G0<(@r#nOg@Vqg}>U!yy9c#Agf7jgoNcX$Dsp0HWS98_#rBqWltip-#(? zAQ1Hb8oS3?LU3sYN zfA;+I=YM==&OWKD)qM*|t|gck9&T;Ee_px%{`b90m!+ z;&2i0J3;WwqK~3>lgX$UGKR08vo$k1r5dW@+j>?hH*K9!X1WPQ)b_8k@ zMp>+RfJvy8eMUlmSIG5CO4}UD2uD^o(48NTM=wi8w8W~dKEY`T_K~Q*JGLdkvn z94!c1i_5R@C+mH}|0+PZ!lKmyNv7R~g-?y&+cGRzb@iKb1Ro;ae}wI591>E45b1WQ zsM-0V3Br^Z;Po{@fAoiA%Ja)*vR_zIx5{WGj!45u0E=O$et(sZ+^V z>I#M6$P|N`QGk}8t(u~VElX;`cj71ue;~8i&l6-4DsSz?HSN^o;*ACrx%@)(PTZr(mZ;3fnV{ecLmZSwIOE&JJlqYU)% zXWODL<IApNHtfDidH%1(Zi`@zLr66PXqeTz`-$iNXDV_$1nT3lY zMh3B9aULgBQ$bD!(Q1H^k$51Uzks>b24*`CM5QFqZ~Vz88cFva?4vU3Y_X~NuuV-( z(u14uPo8rwarinJKgb)3p)Vp?_+CYcZh?f{?>0i@ewY~tz1SgDDxzIdW8AU0YF(W#?I zML{9B_;o|-g@y7WGzN*cM5Qq()CAmnH99(4%wCCqAr)ZhOa>L9t(+zh;UAg=D1zAW zU~$}U3zUh6X@@}B0jFQ%^{p{LNC4sQ$HdS(p)I466Im^eLhPOM<;&q>CBy$JvWzEW zN+Tn16GFS}@pO`~AEhMntHlY4>nXsLjitrLE&c+YKCmi>CM9tRb>!D>0FlK39Ii%sB4N6vkw5YZDLCe~re z_OC+~+1sRaH2zmOqXov6>dfXlY&C;KdhE)agecJQ4s#5Co0XzbmB1n@$4rY*{{8F4 zPE{-h2FJAZH~p6=qzqx7jBl6l0C7{@F0XS(Hc@Pxz##+iCp#IQVW-&SBox}!t!ku% zdbnl|nO{JeeGwY4#2B?9I7sb34g;5b_pP1^M8J{g4Se1cM@p-rNKj57z#i({-+LD@(oKl4qTaeo8^RL zfLUI*lsgKscN#^94LPBrXhpt9=sZDhng_=aInVQu9c~{4AfzXY_!%!am*EqOLuG(? zpyRdNQv`y_#(4p}xkoK+w{eV=P+=5YOdh$@yM21%V()Nx$DaxiS=lJWAJ!F-O7 zsZxX`EM!5?RTr%$8d=?xyZ7a&mZ}qL!ib1o1Ly$R`HY)ga?T(GElebd0qQv18$e|7 zKx#dF|M(kLiV)rGmye(FcbkZWg0@jDq7#ao)Rp3NfLfG>op{K!E_c z52w_G`vAJ8B?8Xl%u6ims`{3Z66zO~-6tW>v=o;lCeE&{aQvuVYKdFDduI@X!2cPZ zjd)MOXf`{(fE^BRe{t&&Jr8wx5GCo+ZPWB`ufO73fLzV3zini~F6~+P8%x_iiW4xQ z@-srRY=aQ`UTxSk+jcROCX@k%UeCnRh6q8GQn8epSRtwieOM=!QB$lCQuh1iYW89@ z?LB$+_`9zREFo5|#Wxft1jD{nvfM4lh!2idF|CnKJ78WIUQ6xDLMT{d!sw#)U@I_Zkd2{H7UtC!q@c`Q@iC zP<2Dq;kLjMg(Zok>kB%UUW5mBV3PHo#5%uP4Ce4cs;t6^?+QZW)`TJWKJ;-k?DQpl z69RzjI}&Odp(OAc1d%^9$x0s8c=(Am3LB<=Stm}84(Y55j|_J$AYFdIq18SlaoTqT zvO9(Xo1Xni+X_|o6?lcqA%_~J%Y%wcou6# zHw3&Q6R(X`Le&xS8<|C`0Y*mepqz=pCLTYnD_m%avIo@-Q_x#w2}4YXg_X{y0YKPW zHsz;-izrK!kn1}ZiXss7b}OM*DU*|UGqqkeC8w95=up7Sc0R^cw;CQV2C-2S*iOhP z^M<1k`<|a-b{$*OMmr(o2R(U2OD}gv(@`2eV*-}U?#W0NqB=)-C}({rZ-i7YgC zNs%D7vm6f3LV(z_%xqFa%T}FC6 z8~?DN)?w_zBAenX50mk9<~L$OaM-X442Ix$*9^H;wvNP!QONlfrKx8IL^!-*TA$JH z&lV8|bN$aS7=nLfJ5}czF?W(26tWQNCHSqFF#2?C_fA0lo)FVa+!8 zj8EVqe}<>d8}&Fq*yH!k1`2|i5AHuaC9RQBy_BarO>Hk4H%+}r~HMA zEH(lOL9BX8J1xON8w?&*xNt)H*wj;^*f4l#4$>u8J3Mg}ZdeMALwNHG3oTb-6k19% z(U4V8xJ2>;+JX{V{b={}{PafkN=ZlMCoBNB*XR(jjskCteh5#FDpt z?T-b)&4rbBeNS9@FDBTKR&gQN-RgxaFi-)!aXR?eXH4OFoAT7j1T3FlbD8rKn|tZ z0@SgJce(rmFHV$b8jgJvBxLrWC$nfZ(a7qirh(`kU!1%6mC)H35z%V^LcR}2^0_3s z&M*JU1zjl#bk`i3+()Y650yC1JN%(qP-Jtzgw~IyFULq~+uyPTbVrPR6N!B8nY60~ zsqj=r{&f_*vQbK0_YHcEed8|$k?i)d#YL~&o7gYLC~?F&C3$!wV2JL|mnvL5A!DyU zUr4XRv-YxtD`aGgNjOs$diJ|C?V+l0j=$Q_$-PY5sZF8Es}~GS>=;Om04Z0c!@Fjh_#F zQzsVG%7{1}H3Bi;fj!Q~KJgmjqLI{gxl=rf5$j+USB(o4 zb8e_$5`)P8%iSs@P^-S<_ zGZ=!qgVkjAD)eoM)!iX1D}wb{OEgYr!y`zhehgnvV-+Ae0Uc&wmxF8qGFOV&eK{ys z!I5EIN=lT)t|ogE-H754{+`&^a2hi(6ICMM`YeGy_9+P_wVAC0N58?`EG4WGwz!FF z)Dsika2eJ*ao@G<4@ynAJ1+X+DL#~piIr+Dp$2hkT@IGf zrvXJShvmV%I)YVqT3ikj_fsJzo6;;;`Yk5MoWf1+Y&=}nZf1#FswKrVQOIBqdETZM zi=*Z8VsV0S==_vc3E~<6guRJt;fH6>zx)2#lRp?_;tf^ZB|%KMI5p;F_g(YUAcBHo zbTF?NQq-WyFT83@3pD{B(61JLnt>7oPV2o5AqAXDIQF zHSRX?#8zbaFcrQU0K|;k_g}(NwW>0LCyowJZNsj6qu>yK->y519E-fU(lfD^J1)wC zqMi3tDyV{TzPvaJXYoYmos^yTM!_NeZO^FA{HS#{_JqR9Y01DF6%aXm6dpGeMx;77 z{7X@b5QQIXgB4NN@XS7GlQJN7p(>u85RF9I0pHnGVwwVYaJOxiy#Evhm-95Qe0)_3`TH-%|`-T zDG9s=qMe@4CDUwAe;9B^3{Wy1lLiD~A2LU}Rvd)db_u&VVh^F>ajj57r&1uur8H3r zt$}ERq)v2dR4r9Z6WhDPgRY5;i3VoJACXNcHWmml+;rs?f4kdLKa%M?*7SdiBi-eF9$+E~JS``$T z+~BhV^}|ASl90?uL)?m*aQDMaQA-B>(2OxiSn3>r@ZPWjM1e+LyG4h6^5d}!mI<$e z?igWW5ct*-?=#roQ8+mgODALzqhiM!2n3Bf9AD1{$0fU5V&C{hOJHv}3bF5$Toe7- z^5hIYuW@=Mc20NJiVBHLZpM)r#qbgbSP-%I(E4};z+20jFi~xFodsN z?P~2n0^NOzbnMMj2qUC0M86Ly3h!Wv0n{=k{n^C|C6Vo*Nf`1g0P?BYtZ3qZWVdFo zlUvbvC4}dOb&lK`f5DYOJhIxsxy|?qhKw1Hg!fQ&+*jm;yoqBHwtyat7h?lVh~q}Y z?$!W=6pw#N?CYw5#C=q~p_Gz9hyJRC_pxWavOXq`04HWAy-_2P2mBAt=h&%>-b*C% zz>SBlPh91mknw_Cr>+xB2O9nlybe(=(>@~cxU8Hef>`0q{YaD&2A8rGAqu z^z`>NFtXak9Sm8Gb|U;V4jEBQ>G%;X33Q=;WKgb$F@;^lump~=gUoPY&Ybz;nTDSDi zN=>9)UjtY}$Qo&oiNo6I+G|HZh`eV;i*p1uZkMdI!`cxbgnmzQ=|D|my-kP(jVwGu zNt|DGXInxd9;{3QfBO3QYoTyNT7R=VPKHe8ky-ka-|D|LhKWZ{SEN9o5WFo)){Yo& zLzJxCG9=rQ_!<-=zJ?7ZwpQf^&_v)j96m-AcNAxvD|M!lILAbWsVFFSRIRtIjlG( zbUd*=jGVl>p~&Wjoy5lxWSVg4>^QxJo`4Trfq_bK$J0UY`RtF=u~;^25)vw~+77Z2 zjm&P_Ed2bHe!R4dIWK(z6C-Q1{Q3?YGGKB%$;UJ5 z)xl>~*uf94KYm1pQjBES8R5y_>kbxy-ZttM>-4JUfurfiwvR;F^P=1h*U5i={l~U3 zIK1sYR>0&eNtuRci&<>%?UFJXDWN|00@0fB9hH3+Fx?@w&H1d4^l~Mr z22gUop{{?!Sy+J+daN~fL6Q@12ctBbGrci>SjQ7v+Q``NCWH=9S&sFRUd{Ao~Lwg0R1UsN#oKM$siv z3B|3Q#KfV0AIfK+E_^vAj=)N>0}++91lu{eveD%j~ zzj*#H-#@n1kpS;VSx`_2{;N+23P+n>)SZiBtv zx(g8fBDec|iE8E>iUKEOFh}7I_C_ZpxjwM{P+}1fBfS`h)R&NDI(F1L8ky}L{rm`r zspyCy$hu&e(60*}Kd1#j)SK3U54wxANztlpT~S^GUe z2>naQWMN&qhSG!7L^^P*GW^ya4UXqSkC07>FHXuq^+v%VzT|J^Cm>P7{GLi?MtO|BEs${?Ybgyi52M zCFu{2E9cpSHh;r|!Cu|@*Ft$>lQ}8J#Tx~O z`1|u0r+j9}orcNx9Ke}@F-pR(!4Unnc&Bj__s<|{Zl{cDc(%1bh;CuM__9y_yA63l zL9ix!D?JfIb0!lB$@tADQa}iOi!Re%O-*%_iQbZmBix`Tb{85O_EFuRqeB z-jKwl4gb)D*xN{UYQ*g1L1_BCO1yP6;ffWc9DryA5E)eIHxL6@^r#8^5^g{SrD;Gq zad?*>wTfCN2HB~I?2Ymo*fB+t);!72U9Ep=La?)cttUE_Lhu1t_Ks%9$de2Ic*(@U z$WG&xP@uN4_$lo_b}(R1T)3+O|E?$85rB~Q!j!t0AZM+7e*f%8&zzbNc!Qo_60Ig0 zS-q=a_%>FF7kx`tW#q&XbG|r(7}$2^d=e7oKeb0*G(5;m3?Cs>18Yz3zrFq?-^S~l z-VIFHqXWOa21}%bonX1yCnhcrCzT{n{(FHTJkKF<+=|!jw&#!$6YaLW8%iXf_cn2p zcDy-i95UFk&wvT}P1O$uLD+|05lb#;_=3WZn0H}3^b%s9L+DvF)}mVLcsfoY$KpSD zOA>KGB8z<+DG1829l%Is%O)Y}`BJHtO+nHA7td2k|Nb^A)C3M0?08;?^D43_aUpaB z#V!KJuIf@@ zR~3%wl5s4d5GoMskF_QwS?)=~^a&i8n-LNTJ9s1IdW}HbI-n2Uxu~6f5ob?Aov_JK zqd@8455_0MI+i_g){}&zUx*2IH$qfk$%KPfe=r#jeETFElY*S!(Q1H^(Y}A(c)6{2 zu~U+THv)#}Zb3wh@9b?@5NjMV*een*TqQ$ip12STq4poAxYl1*9HP5;fC~jtbk#Y3 zJ@KG|A^ZcJi|6n`ppQBt{8tyy@@(D%ReDwNjvJI+B;R2;MEPz0K2(RMA zzTLtJCyG#dOxg-eynTd<3>)M`yk~zp9-R!(8_rq@AW1B{Hg+3`T*QzJXYXQ0NT^sV z%bJlAD#Yz4&-!2dYl}NOL!!C3YA|h*yXSR$o6=S;jZIeuzW#du;_Yob_=D z*)%3x0owHZg!Uf|lpJq|q+pwF=G+p-grFsxXcZ)~*u}DCDq_)4O+CCLaSb^g(Y;|H zL^kvE=rrnCC&b@s6XDn(Ey3XHjFcwN`cIyH`Q)jMctY7pD)z8JPe=*IIUge-k-;Ur zZmZrYrS%Ou>8GE6`(=N0>ORbgP0`Rs2RRXoQ{-xayJ!5;x|mqV@e0v-@r>n;qa7Zf zpGu$!gV+o@@!oVQB6~wLBKq2S2vI~dXrl8s)9ws$L%4>F#T7<)zo%;mvZ?9Is7ib34lN8=^L0{B=iXHf4=MklU7Oe`y-C3Xi68Ql2u5+a8< zo%zcsVbmrKVJm9FMJOcA&2WOTAx;SUejE|k8v#S~4@(e-B}g6pG#t&V<(ha<7YuSL z%{55!{6MlPh|b*A6^W;GOATBQh*+K8Rpi+9Pj7+{*;BN@RVnsSqPrb>O+_H6q>+L9 z01o!4A8Co}zB+Y-m~bBm6lt_u-Ae=&PbRm-Gebr(y5%+l7 zUy13rKYZkwyfY!RjJY8IS#AO(yPYMR;;?C7@D-9jtBp(GZA?Yqxrl1-x^e{euQROdG%)USxkZXD|=aZm;oM<-f>L0EIZl=4b8 z;ECIO%?M2LRyU#2$=?&vv1T^~gRlrE!Ho#VbI73jc+DS>MoQ#$7=u@b-&eXm`-m}8 z8*}3P?Qq(wUp0lwCoG~yq(_6s|4AVT9f497l_vM7x=`INiF;9mLNO8R zqc2(=kTy)qCB1A~*+&z~;8{hf`=t5<#?U{j^N{`Ilm76NM>cYa_ge*0jb7_2Fi>5d zaJv$jwFGr1)_Uct<+KEQ0L?`em!rQ*$xQozD^6DzuM2|qe-j}29eT_r!@Jdk(O4y3 zpH56h-l&mufDkcN(@jHW#_a6dx$h#@Ju}FJ%|7DqbCwdgv2h}`Lj6$yX}p2 zJo39~wnHS)@Rvqn`*j!`383RapPbtNC~=;(JbEhcqj)uc^WB&3bA7E>GwIpGJD%(8 zc)U6rEtoaUw@_lgI<=4Q>1c*}!8H`Qd|-0q#4nx1Iou(7f?Q_`A|y61bGh0Q-cIfe zV#4jZOWV(wobo_d67zmL+ZmV4(Dh$fpTGSW&3bOYAfIhV2xpMygO;?*jz57MfOi|t4ps#oO5P*>W z=7V8uX&~rOjFG(dh?#zET_^Tq>w!=~5K|Nn zSksFUYGUP2jY{zl#DptyeZM~)oxYWzb;Tk4hiaNc`Z0K_QI#rwiM8L_6&g*y0U8*b z$HrgG-@{PJc5i+OuRBVsaIp^Ked55X2+65x6NvD;FpR4EQJtJ1A&yiA)ta8540=Z# zyG?3Bhu;W#7fRwBO1&4#xP84P;Q?uw87DFj^TWGPh`(=#B)uB(g!kJZ0p4-E78HWZ zkF|ay3#y-KMpliGZa1hNu8+7!tx=q2*wdWL`Dtaaj5!DPqk z7eW?mNMx{~)aSE{Ba2kEPx`ml%TZegr&dh#V@u?YW;!#Qp%!ztOaMF(wv! z^8gdAXmX%T#8hrz+Z`xMNuYg1cgh0@KepXkM#<@3Lm~KY8s(_qY%2E56TCUj znx3i&gENtIWg#O|Z+S5nuwEA?S??~V$7jb#g?WY)?#C|kCX5b7M^-Hi0>jk<))N^r zS?}LV!{#7yEe0*&qg9Z|;$HCqxm=y0&gT(K(L+x}pKuHedSf$KiJh~DI=2-XS?ycG zB8bh6R7Z)EwIkJ0K_U1pEK**C%i>y+SoPJ>SEzODAq+z?#qtqQt4fY88~cRp>$Dsb zZ-9XVk;5G@r{r*3Bo>hqlZiKK zB=WfNv#inKV)*G64^`3-x1!cAx80w94p-QO>9$Qw7VSR@B6-Q-24z~rO>K9$DJ6k+ z%PsVENu{2!ixoQdv@{7r?2luU*|x$_q~+=dm2X1g{TDc76|HVmor_naqoc*_6;j>M zZyrxuH_;_r+$&;otlDy45sYl!k*ael5GIuUt%rT7SZ8iDe}=os078-ru89+-!vUwD zu#5YyuK8*L(XD8G5>xDy90P9z4AI|1sU5MT+aM&u_o~`FBqYp^7j#4{;KF^Z5=!VG z(`mAt{R%?ho6EDw=qD*e6I&%AODPdCYkD0|7qox-nd%+v(-V``C1?i0Q&_Lp^f`h?8VI{lQINF@rs-yi>k zkTZ{4ONcBR-fRIx1|OVCDBAKe{O%GKGm`Mz3o*fJuPGR5&28%FQ=80$HeGE>onBK7 zK(gD@|GKw)HJDdPUJ^^w2z~zK-5DT+7U6R>#CcGq-AYU(sEFC1Cg8p5%ZfwU?`&ie z7Ltm->UPU3;dd$m-8h}hj(TJHr!h$MoisYDg_?c8F&;uw%*5#im$=bEL$HdLUZIDsH5{8ccZPBfPI%zDbB6osPf=1XLKEI7k#Pr-Lf}ZDQgoDa2_Bwg>al@a*^qk7E9`F-TnQ zPRMEVhNCF<@<)j{`_w~?^4LyDY;WLECZSO}a}Vuio)4y@3G!O3V2MX*HZ+V&!X>By zK~{~wG(h=5w-NepF-b@O zH8uIve+W2ox)sHhW>FO}VgCy%=r`kcK_KY+XHa-miHs8~lN9W0&=Tr^slcS-qW@yU zkhmnB!t{<_y3zlveHF_K&Yt4VoKQwrSAmhTuODf=uUa&EPe*vM4M*QY_!vZvxbI#s z^E5y>B8|VaU~LlBKX`;JhQ9JMlc-eWVcy1yKv2)f0H+H0UaUezoj4S10}hBDs}oArhVKczo74$^g$f`t-3BD*ur`a-CLZd>x1! zZrK(>kVhm)P8?Sqr-~vFG-8bq4hVfx?1_Z5h2xx>U7bN|1PswX;J!S;No-@0cuKXl zGKsCLF2?rz^}8=Ifw8`ttIcr;@BV*7B!7+A)`U3Q@o+K-!fLX*1uS_8Nw-l*D3w~H z;PkD5!1?o5ww>b;{@B^i8;(Mp`Ke zBynIrJoyUMxsf#W@t64lu7r`Ao}ez>O;@uszv2=*EhM@k-6;Y=@4HU)3l+tmBE}bM z$D_X!RwxJH$aw5jq)NZ|5F>29B<*x zh}>f;AKHf`=F zl8!wEa)skT5ARpEMsI&Zl9*t3;+}&>b1|Ba2CLAHCcIyRnqMES8jEZWzLM&6Kg<>{ zdfy;O_V*EplaOv%*zT2(lF2%fj!L)_+Tu$*g@uHeg;oc}wL%bt5H7f45Ar+5sR`|k z1{As6w3lG@luS6ybOfssfROL{YgEY{Wv}myQIxt;j@zFQmf|J`(NxBmCyRL{7>cwk+xm#okZo z(mNCFtmBd2j{nC~`Nbw9aZ5WHr`sEfLEKxhbNfH~shv1o*Ehb96Y-aDL5ue0#=DMO8_Mnao>F@LPhg*v(D*tI);tN?7}^Fg~f+`&7|#L;Q8yTBO{ZTLoPpY z0~k5|jmUH2tK6(qb+VY9>l3f?OdD+eT-O*CG^h(v?j5Q?AhQ?cU)46=79;lQjuaIW z4G*xgxp<=iMJ|?J9(P;F z3W+!HnzyFX6VdMkrueVYUR>`^C@2IMQzzCN{3@^OXIH2d@O-eqLu^8U)J8XPcsLbD z*Bg>|LQl5?b)!OnCzR!V$qZ@GiKStrL|%tsr{BdW97hV2M1tAsNiB2)`K6YsSFfkU zVbnT-m6}M0At1=@hLU9EeoH)nf|y?%tqO`vibk{FNA{_>K@);NV756Z4&iG79ZN)X zH^Cwyj%{R7u*l{%W`e3YxHluMCnDwj&`6knoK`<$9f%wr#HkMZB<>?<>rp5UIjC&~ zULkP=@dU7t=_718to|KHAqLMy*k_ zp#z9q4lKTvQ9%;O;nR}XupObX6%66`hR5(v#iMW3$XSqhhk%gN-3B1+9mzG=$Iyr= z8do8_gCfv0v1o%@Idox>&0RG>se2Pcw5}4J?ZbP zPWPL5#s{rU>KYPR+%Go^PHQ;Tvb1z~tR|$l?rW+Ero&@u_{AHSgjWQDc6%uO!|TsD z7Xr0YoxWSeDZ@et7b2t5{&>jMJ1wIve_Xjl-`|V@#FeXM0ssN$`W!1BcdS z@9|WAITq2;h9%QmrM0!QhQr>zPsLctb&z-$wQMFrOQ;gxHT6y=gs%;kEg%S5=W?e? zsVa|m2lTyBUSTvw3|Z=&Zd8LEOHrl&xw^A%>4_b{0vb0#~ijxm<; zkf0w*Qct~n`j%K20dI9gNn*D*5`%64BR8+A%xnuQH=!g>*$!F2F$laPU653R{o!Kb zw{zmD(&%}i*YRfBEzGUF-fR{Vkga50PEW{^{mcFC5?4VBP@3j)_rQG35p=d3oQ(QM z;b*RLd%`wl2wWW-(b)IDY(DrUGZGZ|qrUv3vNeAH`X_b)BHPjw6~#I(xmT(7zR<>?0CZy(R!THUCsF z$+7afDfM4Y5#xgkzb_tw#T)Pqylyr_vl9;%C&S-8LJ?U60QJ#99AHa$Z;pK>Cw8kL z@Pjv^k=gs$RY*c zQaB_eol1GJbYjBoxmrsiW{W3FLeb=e?65Z+h1efH9xN}v#9MQAy6kl zL8OLAc;b$LA@5beAge1t$#uux8khwb;qwPd#}maM2>S~;!3`}j;4LYI#Kd_}+wkRg z2}FT!mG?C9=Ir(dXkh6`RA+0XDM-jd-A5}Bh}wuyK}MfghbQ=Er z_}CnVzb`IqZ|*eQf+gdd^VKDTMDf!WdqVaSBJRzaTIUikb2wQ*fh!^9zQz;sVU--H zrYC5*cGU~OI(q$U*I=~A&|@Ph^Ww5$XiD_BGBnln1l_mSFAkJGvK3A}w_swibmZJE zCmFBIX$BN|+_aNJ^tQG(5~rRM=|a}ChX}-c59f(Eyc=F(J+y8BrzhHO(=#N$ zfcb#l>&qVjLsJ4@l5^85Te|5}Bm=|A*#F``-yV(RF=sqTu zftyqN#k!f8MyDjSHv)#}x5Na}L%@vuG~~poN-DxO=oRvO`ErOXKghcr>2DIpo>39B zfk4o|?Dl6s%@uWgu&)2>>lHc$DCsj%c(5mXn0(qj2S<3r#o3U!z%@ zB(zUV^@bg5Fa(#{ZqRI;j8A2W_C05bja260_2OFK#W*XV0j1 zGKPsn_W?qF(dvLCQ?I{??nn|61grUZnlKl1q%Em&bb5-YQ)e1Tpcg`ZN@-R(2P9mf zE@zv#7(wBSNh#UQ+5x~S8pPqBc-L-NO7LRP)dVcEIjGY^E+?ar+vO7?WaZ;&15$EU zDim4Vf;kUk0$;4z(VuPIB;JccMc4*85#_W$ImRctK(^g!Z={5BE39fPe5obu105<3 z#~`pfu4`09@wiDGF&)qar3@)-L2&3E`hmagkOnys?}_i2Rg;~aAC0F>rR3w0I9Cci zC#^JL04{Lk^{dvQqq))Gr?V`D&=T6Lf}<_);gJ4MM|jMY=IE^ zz)$P(F}&Iqt59qwR*{p6%eVhtV6^Az*CI)Fo>qzU64FW`Wamp$afrUpXFi{2YMiuz zNgN44^go3S- zz?_y~JGi*ckme2l$8Xl-#F^$~GOzx-LJ;;Nk7)QukHTQlpSpa>6-o;C7;+E}i#NIu z$@5O6w3Gbs*03*1h?7B0Zqcf-$mT=Dr$fX)>eZ!%9>Lo)wnbvX9fQ2Q(E&(~DA_sH zR1p_4SCjFH>lYHH>7XU6XcZ)~a2e4!&k=_HYVF0mQG8sJ!6GvWbx4PJ|^zi zjy?tmq47v{V+E>~KricOabk-XQqEy%IubcVHq$RAv*qZ`vzZ2r_TRn`{ug)%!ZW~^ z;PqsL3Wo5vE3d%8;#5@MHl2xk+-W&F-oV5<5IKA-`Zn&Jg=}+Z%zEF;PFj3HCvxMK zc(ctfm73gM14_=jmg^eQ{7)zG#!8&MMn^_13>`Fkgz4SEf7)jxykZ)(WYPGGqLIyx zzx5=P&!;6JLO2AeA3joh2E^;54;hM9HpQMjTYl&k>e6ap_B1byrCGxEm=j6W%NsG z|HLcP2*OON*+~P3`0^&Br(F1|Z6{_pEy3!zJKUt96HoLtluJ4gZl&olB99#&)6}PoPhA{K$fK>(Jpc%LP)pdgsGg8xf|UJ^mj9yX{VkPYP{RcJ zEt}eezSgLS+(2Nj@7L1`*Uay+eBf5%t`S$9&;HQ5a%yWt@_P^4X<9n zVH&IP52MxRi_@1jByYMJ9gTeaj>Um9d*v(TdUvcrX!kurA29^u;TJTCTK5x++=)3X z-l&mcq$_pdb|Xzf!rX1t;t_+J+(_2h#M0hSfG2>+2)S<-v(@bAvI>kzd_;#G zqXk7a?-Y3>ado%6^@Nrvny>W?;Ug})CR97E3qz?1caN!Upc!BG#>dk^@A>TWXJ0&d zV*4tg)T|TcY``L;UqfTf1n#|ObLh%P$IsE8Ee4CrugX472*d%y35`}KC>b|QND{wc z-*}7OcOL8lLbT>NPjm6IISgx%XqnE{kmbkDwQgj&vVRy|R3SU-ffD(h< z;Zx-p1QuUR>JV-I5~|nA7gH$-)QGF6oKwAu6D|NHj$Xx$(w27%bQpvqt3A_iVC|gG zAZJ_G6UxF4#Ylh<`dv70kD}O5LgCOlu8drV7AsOr>HeNe3~jZBm6AXQu2~x|=~@~Z z%*3z#re6>EX=9m?Yn`ZZ!3Y8||1Q)AC~;CdovjBzX+wO~NOS3_f9N)SK@$c^3f4FE~W?Q|L!<6)j(k=YO0cEsGC* zLe>gm4pOu#C^GSs!e_`n?nacvUha_O6oH_3?ATOoHx7@_d%n$_(Cf@Xv)3KszB(W;6%1DbB*Dm-aT z0PjQX!232m4l58w)Ru&{J{mv-|6$!t3DOsCKkHq?5!++j3Yb)x`zix~)ZaZOo(^uk z6O%76(WV^@C4j+%0@XvwG9VvB3hch90!vX^5^Q;}UI`<{ob|>KeAXLdhaYd!wb&N4S_}-?UM}9c`%gROi}^IRhm*4 z@}O{dAR55jfQuqlZ#ZGD0-i_2>V=7NAWKqsz9JKQi`Ea2>S;D zUj;6ClyZ~;K`pN_(aZaW?u@LbMlk?0z&aK;JqiPbMscru#US_&W(EqZ5w{^vIGxYN zn|%-x!N1R(#kG3$WmCb;E2IGOrX|5nK_TEaaF zg+jpZHZq0(F%&5f#*T<01A@RlunJpgVM7l8Q|q_ZHzb==K$x1w%qkH;)P>on1(x>} zxig?ZomXm~7Plve`)q0xtlvfrDs_qrFx!-nwoeui6Wh9gExkFn0Ds$N1l&Fm5CVL! z2{VX2VDK&gIufg}KnOIP)(a~g9CXkg4LVB&3Xcu^0%9cs--kq<;CjJ$F`PzgK+m>b zq%8rv--uo=fUSYqCFPF=tP#_e2pxgL9Y8+VUd{L7F}$0vIHO2g>Ome5gaJf7+$lm# zPw*)a+>=HGS{@JrV=YB4Ed1b33yBgHm`2-{VB04Wc?5~Na7xc$ue+g10V`dsX96w{ ztpUOyxceYE%(qC@yWJk{4JuA=+mwLYCku!=(Bm`sBzOb9h!-IBVT`*x88A$E$BrKM zMsT>2*p&rhXii(|!Fd)~)X4)zrBa64KjF2Az=cy`Uw)B|uNWZe;%+>x2E}DH&lJW_k<6bzJe41&q1^ zF-d!8!1(14CpGC`V47`fnq>Rr!lG_qQ<%A7l?#2rhz(D7$T@7mHqOYeQKhd3k~)3V zSkK^@L&aLB+2}#t8t(nJ8P5WNzK8`LgGU|0jylJBFtb&_D9N-NSd3`gwq+v~MWmA~ z>R^cj48m5oOk;IW9T>5=bh5hKhiw5-2Xv(rObevo#MCBTRSRfq{XOj)4G@VljT(iA%3LOB1=ziUmiqS>f-)E0=DeQ{a zhMM?Ns;wCgfyZ5gn^&+vj8(&I^%dNb0PPu#s-D|gAkhR(XkN7`f!arRi_zhIaA$q1 z-;?}c0fFLQFy_G^*moPP!@9h<_;Zz&4}!oxZ0uPqzTc`hAt>1ZwYzR>ObbK=Bi3;m z8q)_9J=RL_KOoP7dx9z3g-2jn z7+ecXON5OG0HZ1OVsPy0EM}H8Gs~XKp&16jJz#_nWN2#x@IX4aAx9j+0>Sf$>dG852~ABmx~QrU@6*m zGy?m?PzdyWXi~!uof_^!)S~DDK8k0Idmsq1a}ioI*{YF827ay$Mdo-~(?nPRk7v_J(WwxRJmjS1RaR+OAMw`|}Q zPy!K2g6#>Uce>vNv_}ox0(0fWqX=C$M$}_JINH?#wR0LfV!YegiYiAX9P8 zFevH+FRY^zkZ_lm89;%`HD`{sH377zyMl3!H6R9N0R0d9g;GU?iy0A^gh za$YNk3+(-xw#65N$|rk$0!qCeparrD7n)S*YFj)xts&=06maOZIj=piW|9;%>S^yf zUS!t9G66%b0xA*O5L~A%Q-3h()<<;O!kR?m3m6^TiXeIb2%G9zi6}4&glQo+N8^Q2h8GGTEUk#h@<1R6>OR=&fI%xX!m4f&ae?fK+myh&UpNKC zd*LWjvPNx$vH;$}#xDm1;r(97i;HA_y1jK}z z0-bQ!FTOL(^%>ZY*f|G@E;BO)6tJ|W4&}iE#q)05{%ftKRh9(;ZjoRCLm;5`axE>D zDPSEtVwjKpfI1rjC+BS9k%Qc^AwvN%5JA)dL*T>o+v*KCtkS4*)6sU*ZyreM^ggjL zux7BKQN#j6l9n{H@?gOr^wD@X9F_Je6-j({GB>^t;&XT`MFq@6*zjRpfgHiH4u_!) zAZ23w6)3luH$dhs5E{t4TTSa?=A4ocfkzDq1{@O(g|y8I>@>8sRXLg?0*e96GXR1K zV!@m$P&1R5lNX3UVhDANy(SR)$8#V`(W0^%DOIw1pn*rHF=yHT{1e9&e zuD)76z%D#B~G| zwS33sA7@*W zu2$TGS?kv7$d*RVMtyBfSly3%MnDX0f`zf+g(qi|LRglTz&dYARA_2`cgWGI6&^9LQ9)P$325g2E ztkJBvl4Uk-6gcw;XWo%B<{pj8Ab|@t_0pJ}KwgB`0Y|utW8T6b-0y%B-yPjOo0ONf z1nJ$#REC_>ytJbrb4VG<8uy%Foo2yO9WX;CMrYX~C zwYesuZ#EiHLxOR~=E%KkV8$6UZ3)ud#9^(5$FVt)g9uL<2rjSgft$KJuw&20a%R)6 z)Rv|Ez5Qe@fly5YEw7Pvd1vE#3j^dG!l04wZuF9VL+!ZPc*8d4IXyP)y>L@}PYnsi z9u9x04LzHd(AEqMlZx&&9kW5x)&y;rmx7*+_f1oRvmf*zTqH67sZoyt1ys*u=r)^& z>;anRk|r~+R=C}aXJZ=^zIW15QXDljXwIf{-1Y=C{@?8)lsz`9vfSoOp0|4eN03JDWsP%DX8@X*vuwbqD5^y%|*46}V zACh$t35n#S8zXX1p?EQoyW!U1N^h;gX1*cjY!VhA%=gyj4Ftj&^6F6OAI4d7Lgo>K z2}BrW3C|Lojk4OBu)KZH(PM6B)dAR&pxoPp-EAPKA&yzO+DfESV>Uil81n>!An&#; zdNZ=ZHYQjsE5In%vx9CzR+#n#@wRHUYWM}>x5KT$tA`IGfzA1_)n0%7@Ug>@i8VK; zJOn?jf`ddthyeF1P9kfz7#G8ucVNvEEW&gbmzEf0XVVX+DUbNWAO5fba%h$jGoRdN z>oqE#zM3uiXo1YTn(F~PPo9{t6NcYsv+os75P`oJg2|xBZh({HdJnU4xrO0cWA~t! z*GaBd;FzdYD}QH`6$Zq-0YS612i&u|i|cH%LR%9w*e46Yk8^3`u zFE9x5J?1L$isy;WHhu$Q-t|cLs!TCVJENy;#TxPNX!NDY*e>*q5sYE2--5h;=LYNt zs6%2eq1E5&9ZtH3akDx2TI0LD7boBO^S}Jwk72S1g2k`$+~CuL-doibxWwi%oP-Cz z1ntMSy-+ryk!kbMf?`FCz^>T{2z~xhCQfwX*E{B{e;xXWUl=a z*KWC`{gd!#{H6#1zs>9@qg2qld0mMaj7gcydDUJ2YeJR!R{oV1hy*0 ze{psaFlg%ZfDbE1`SWEBS%725qwyZ#NF!2_CHMJ=G&(JB`Y+x*65Ppr8a@$VzyCe? z(U1ppru=frU7Idq*R@sQ}>~My=jTIi{H0~kBYlAIt)8OnBr}MIT&2$m#9aT7P9ooU(O&8Sr z{lPi|)$aAZQto6|(RN@x%8~{Tk!ns*(ga$^NTn)N3xNv65S2rb(zH&h7b41YK2exn zaMKi(S5+bE(jN}+24D}T`pr|SXm^C%leurBo$jIa@f|{oIwFLg^$`+V0%i^>pup6H zG&F@6o%ySkg;Z8&gxH*qn3={E3TK@@51St$bZqKN9NbpR!Y!viLNBnv0xsj5IJ~KR zt7OcCp-oqW)cc||lQ&xfI>Q!g8yt##a))6aArxPI)_x(w*F&l7 z)faS?GkNw+(5$dg*Tbsp)fe_fXvGz)eRYr|u%*bEy|NXn-xHyfFA$(Uvfgb%w91c1 z?UX=px+{QO9}2jKl!5Vxwo}MC-4Sy6-b);}o$_9^H$pALS{iidwjzhYO0y8eAmc6w zi8!;1?5FgAH*aM#yWbO`6v(Ot&xML9nbKrcysH?U{5R`xD>UxMaOSKuIz@XTl!8o% zo!lWF#^|83jW}tb>N(p3;V$TbP?%;vnLURNGG$9}%Rev$cu5MOmA~lWE?d5S)T7c) zEqd*ZPz#v5L9tyMNR)%r9Dx%c>5O2Qzp&o&8Z zwT%pEekX)T7;Q1d8r53FJ}56=74}ka!Xi1eot!Y!9U&L!Ky~dgJrs+Nm&W4pt_Z1o zL%81_;RXpuK$T|T1$vo#iqR=}u|W*(;Zz!(;$0C^`MNJ=p6`_IlfH7M&k9)7Mjolk zo<6^)A}B$o(J$ZFF_fq$LMd(-TijujQ5P=v_Lbg_SqQc_LM;#q0SER6a95JQ0C$Sn zO;?0eeohKX{L)GPoytks&T@E5jGTTd=U+B&`8^Rz8F`n8VNiPBWrjRMI-;>-e8gQ5 zZGyUkm_ZYNxk%lRs&GkDullBO%7Q@(u#+jLt)+!pIt zqB~_@NneCkX4Ws}lI}p(Pr50U*)5j9vIH>J8EWTve+b1I87aXYu-xUVA9ma>O;Y}%-&0w{eN4rzmL zrC#rBy?evpb1?zB;z4E(UnOPPEcsm$l5r|6hTdPt_Nk*rKLap zE(nPrc4*$f5F)HZzeuCB*kRZSA_BW?@W{YUeKqM&?fY)nqLB7g>`5^`hhcOhw#)4B z)(zYYNpNVB*JOOxSvr)yavC>&O<*6|Za6S2-O;zt$cX~P^m4leziR-se|S`?!{&Aq zb-__E2m|`g6#`hf0DBDq|Izpk5CC+_Jg)t?C*$nqukq6G@F^|sX&k3Wcf@QJf4sEc zqfu% zQl*(JnY|HeLH(3{`S`h&)3u9BD@&I=tV*k&iglDrD?(`L;_;QG+L_bmmOQM=r&ZV+ zp%z%?{ty;cPJ1|&W=o~JA!LFSh*=PD%SUh6gUvD?E~TYFQoY3JVqU`2na~jJu6wwY zMwfIqgiIipeCl0Vdh=3k<a{cQKZ%0#zH};|xx?NF zwIHZysB7#%Zw5;XDh7Q_pFWV2=P!b^Tzq?`&+U$o%M}1Cr~G*2uC7;Jj^ID=k>|kmC>G< zW^n%MtM()wq*uUYmf*e7aBJk}{z~JruoI$Ika4i@U{#mxt`blRxIsq;G_M1rUW?_VOakQ`Vi9xy1&m&j(4f)=39g%1c>ibVi5;R;K7{{-`oU4LtBTq%<2lyE{TISYLe93S7K} z7}cmPiXS-8Y8ZwEN?Tu3`Xn@i@St6iq-^n4ZI5`Rg$E=3#HKVNK^q%AIwjHx?UpvB z+1(Lx&-)@14xuty&P*iA%vcb=S(d=e?U7InLSdH7aQX=Z-2L!VY36^b7eXa2DCJZ^ zXZp$(lS`BmDkG_MCjArPdj9pEf-xTl51{mux| zNI!&5VED#3G36hWX830IMyLhG3v2bL;4IB}3Hl&3vY41PA772PqfG2{LrSJ7XCjmishRk(hH#y#JhdF*c{ed z;~=W{gp_Dc&fyB!b$fw{(ZFJJUgob0E zoTDSr=_}7;%I=TQ3(mTiP{tOVPgC!R8C+}BJDt^f!#{Owy)5N7ty4lYFfIFV9b2;& z2_TkcT6#SY3Q>D46*wu`Uemm4z)83;x1fx0D5-;ZYPB>@%IS}&6NGqK^!KhnZFjKk zp|lXM-vuENH&KZH(Dgd=D}l#4t`eg@+pxSgQ1 zBAmPq3BdvaAtE4mR3NzNmUy6rbT}v$iu=SBOWA>zj4oq5#}-Db+lH!#osZOe{SZ2V zsjf1YEaPUnFG}&wOvA-&=))X(HZDX?&K`AE6hRFuH8;f*dOAfijl07N*zf z&Q?dtmS)0C>y!`;q8=o705v@Cq#M>rlos_!^%CPVdWq_dz$We2*CExv;YT`3ykg3rNGfzN2%W3o>$4+Y+Y?ZQqjY$ zG}c*>dSU5>h!og)_N8up(=YWY&Cc_?AS42FYQZfhj-9PpnmHBiiBJlhbBpxg#^!3z zPt=#@oQItdB7t4!VY~`gcJ=)etxL1(Vjaae2KTo1tK?oKe$b*cj`6!7Bm(1--$*+3 zEi6gJ^qjYbN;57a{UAE9X%u(c!mW(3*LHk+di(1uH|<>m6oWou^XD;J8kN%K zFVYXqAKtimQ055kLl}yhQx<4|IYx&!Af`_h z?TU;w9BjLpkjd_ZusLR-rdLe0UvCXy&NfEFX75@T4nz9X2yYQ~NoBn$3uh+mig!xb zTK20(8eXfz?Lv?!s5LfPohDS?d5Buqv@}H1{RO-hA^qwNxQE%pYn!~5*$3hBh#jme ziL3P{+F;6J=e8$^Qn0D-7j55>xiV$&;B+>UwNc0Nn1`0lv|C8q<*m$a3FC)tKP<`J z`@57__L^n;_DooXpyNIFlV+nS0u|z|!3Km<$q4n( zvA&&cI}`2AFM|nOG>^0b!A)OQL9$s!MDS!Mym4 zh0~HYOSd^MSzQn&nQ}+i$<)K@>}+!-1zh5FLl~*;kw!eSh_-2aWcES0%r#iN^sD}R zc$Wp#=Rkbkc+sA!u(=xBdM5sz))ir<;VNUq8n50%WSeoS05bKf62(W;J-AhQrBu$< zE(jBiZ$xzlmVA=)=}}~x@r@}x5ndWq^8}Gxp{2yxW>hT#o%+`m9l_R$A=l;H=8Dei zhA_&qQDyB%R&}X1YS0hiqGP9Q$xo)AZldU^l&v-~| z)6UB5gK$yVBj>o$iI~p0d^#7~ls)kd2n&rlUO0a7(&^)8U@qt&T#pdjjQoY5sptE3 z{a#vJx_Gg6a?$JaRB`@u4grn;P4@-|43^)U0gAni#;If8)OIy7;9jR$gFEKEA#c-m z4ItCFAGZW)fI*Hio__E84O3+Ab^iMH=p6%37^rrm6QXg$Hbg7>a5N62zTjch@A?^u zZECliUU+Ws?0mn{={=T6#{7p0U7VNm&y2?(CyXAQhm_s+z_L*0{XNEH6rj&((hM#YZW-#z0w%5M&n&nZ@E4h-)(kw$n&lREW})&{Mh8+=je?2`!BJN54R2#sVN`z6rz| zz+mz8Fc{?4Myq>$0*A-j^v%8kjF$M?bA5}i>Kqy;RL z1Q#g4y?u2Ac})Pk4=K0-B@;C~SDI?@P~b5jqR*b*RhUG;bpRx9{~1(re0eb5ON576 zg}SHl9nEB|4iy;i30_5VPsX<$t-b)y{RDQv!5y^YJ@8yTQtda6PR4sTiBL5HZ)%su zxAOrj=f)2>lK_P|TX5ycI!<to&Hc=zfJCi-N2&k%MBbU>~SEGzA?Urp+x z)$yJh9({xzOwNsWx4J~v=Hy2v-iX~#CSMuvqU&{#Zgb;Dlk0T=p9~IT z$u2L2c_^C3>eTT)K#I|@)frT~JtXw_cD|U$GWuRCM_7QFyP9sT+>8SpJILBskwO?vz3?|~AX-8S9*)};Lue)H~2n4ioWby};;gF>VBGw>EK z`}TA25jo-@{0oS_pZ}TXe-86MN9mstVbgvQ9@;PA9~@@;W%{lC3j8yE=#2DKG2=N| zZ`7NKKb*|B+8;rH$Kel;;JtPP^}&s9W1|lT$Bzc{M#%O0lbssJ6UUwYDi>JB_WJSJ znf5Y|>Vh5B!**1wy&>G*HNOVq0@2#svEe*+f;y_ak*roun$F^5$$gUtQqzF|U-hAa z^)TMIL1jdT`^jbx4jC+eUgmfO-2vBrCa}ZaYAuibcA4(o#l!4MjCF%C=QSno&cy!& zrVC)0|F021X8lJh^YinSi!}bqN(T}>xVkB=;-WLod5`If;76+oEZ}`YUzBDLV+N_S z6NJ4E9U58SuH`-2t2+RPo?jzO>r7AQ_1Q`K!vHCZq)XS~x-^l1T#q>LJbl(NEUlI=-Yo zk2dxWj$y8y!5jw!18@iGP1!-_O^d@Q|D($&8BJ$rnxBg@&0}UAGJ#-0)|*27fNgT$ zWYS|7%s8q{8xWyh2h#+^HdqR92FXsb&ch3)r^+Imgdn@QM|VArvtQ#e{Bz4b&KQ{a zQEsn7iNlp090RleqVyDB01um0l75ZH@UQF`)Ff~;v@vVu(Yo5H*?4+IEf6toK;+;t zg3b7#3bo+z{fQl)&e0%&NI+*E>L$TXM)P{7M)tTnvK8vJa?AhJdP*rI3Bl?=h@!I$=a#mJ?0tS zc|K9@n>?5!b}(vkWAth;Zw=NR7O*0HXOE8#P z7t;4{Fy3q!rd!Rf>dyhdw0-ySlvG$^rowN>kZnh zTt3rh+E;hF{kkI9v8skHmAwYD6ZlG$zz2!Im+-b?CIQLNey`I3yQc!02}BT!c3A;oa8Eo zc6UIqXD-%Vrpt_V`U@_z$h)(%$v=p)$>YQ(OEl)nW!OH;n@HI(2_XPI;Gy^c$8%_FI!?wb7h6#^??(isAGVw7nZdCVB{q zaE8}ry%RSB9?yN1hw*>fVLWDs;krOOY*RlPI0UAw;XVcZAacymhlHu?r5efMW^Wn*5zs#v(7 zJ$Xk|EOtCi#XigUvJH8c*J5_r`8WVe+m9SKJPF9;E7zR&n6?Psm@js14zIio3~_0B z8bie1V5DEM4DpDlPINA=^&!IkPH@FO^e(9PX{_6eju?Zy-_f znPl3_OmyssIprZCy7fgN!w);LcR(Ly8ZNhUj~RAL*Cn%gb#~GwQPR$_b!)w2^d;D4 z$u$X!H)C>R=S*(v(4o%Uxin}dsqf^#Nfo>I%reKJ`yrR$UW3`m{`n}`-$!J>bPbaS z&5Eni4e>eR;vqOL+K5Sx9UBg}vJkX8R8q`$dg~ZC-vJIcxfU~sGu%(yK6x+6^qo+EMCqH~DCa>M~InH~L$MCau3~FDEwm{5a(qf0r#D^}Mj$|1} zZN$vCcmTg(2XLnd$*tyS2iPWawcdvPxny@%=|5xa*f60NXJ4KF3&2R*Bl}t3)Cb@f z5BsAA9%B=PvEr{V*$^nNyaPhE9#rh~-w9=YH}yPCk^g&_ltGi(iTZD%M17QqdL9WO z8YUh>$$OCrj2$q6?-v47dDR-6mGHI(9QHchW^n1f-;21K+`Rk#>~!4)pwi6xAklT@ z256Ga%4rB1^_dJVKI5#Hn4Soj>8UO)T0>Yo_clZt9>w51_BAcckoO{wjny+iuUSh4>( zW67qTeR=k^`V#;rtwA{@Y1|R1Rk&JQ{H8wVmG`>ZA3?d3p5-6Q@*?L^82{X_so)EA}wdiw`Bc+4Z<_I=V?Vw%vuqa09DQ?eYzs6(us2#)I zV#n>QS^ZSXtUi9>bY;;kfAnXhNCO^AV#lJp1jNvW-BsXN?||fFPJ6=4hM3J4pu5Zp z)oCyDXohw)Psq$j&Hg)=<9kq0D3<6O^BCCv&T2cm@cMoLn^qHCNpsQctdNu+J6eHh zlm9ByA3I^8l~GB{ftnp-DZf6}*uT+eeD0e(nE%W&le08fREY~!zEQzTW6mrMagd~X z`!H10KrKgB8F%q!Ji@n@Q`P2%X;v{Z0#<{|aNv3&U$L`)c^d04u#39%j>Y z>2weP2v$P&YfM%I&a1%s`4A=s#dc!{7(dg-zeD=v`||9h{GBK%xiY|< z!E^XxGS~tm9D>fszqo(MMQS|lWhN_j#AHpa$3X+`3)(?dCHd18?k8?GWWB`L|36G_ zFnl!bk9l#~-^hdChfnBztOQ1U&c@P>iG7s?TmNAN1;j_J0SPM#sC% zXrfFc9Be^&n(bi_XYHHH{C)gay-|B;b4sPDUaCSx+ zSkkDWvh4~?Pf38+k9--m6Ks-^Ge0{XsSQE>Mz0T1C3 zVkbre6IED%Te^Xtc#Mz6E$2!V8}4TbE%sHw?Tdboq(fq;yMEzM>)3L+fO zGZq!)7Y*N5LHdH>oWUor+O}Q=QuS0a#EGGaAVMU4;af%IUk8LemH`a8#v-%=qH_ex zQ|L-Sl&%lPVNBYlGZKWj*gjxiG%j_OcZC?o*SHI2^tBg`VY&1O3V}fMK(ycG^;ayU zR7o|j-4$?~JIO+?)e#z4-Z~YKV8O!jcuV)C$?)k0B3ytV$e0v0m_5EDmwC+*RgYSz zDGVoVM4|m#AWnfOx->XVBhsTY8eqpz$J%NPP$okCQLQ#<|GR(`2W&^4A=EyOqTKYM zEaMH4m(S_m)_K_L(jRrr^5Jn>deJI!M)rQ&q09cMwM>^^OxhvmE5oIw-0?x9)#4K% zs&wGk1vs@Tf$0xLold_KNg$1~NZGa1U5cEucnXH|3*ef$tn{)Sjz^mXIEbu26J1nB zrAMand#ks_3LzQb5ooEQJz>#_s!dj4GOsE|a(KtEjILLmK(7`0Rj~2(1fG_G*EEqJ zN%PyBMbKyi-tM>p$3(CWP+=2lfr@QvbG+51E|9%jJ=4N-q9*O%MDE^WPcK8Mp>*}- z9i$O^{UM!0bQ(0Y5!<4HLP4j(AJ-#p_mc<|@y&_WQ0x!nWLR&5AuYGFfhId)#}J(# z0`?jl@CouKG(J?lg?7z{(m=g!A}rIgjhfFRPwND~&w?{kw1mZrN%IUA#dkqbC1!4E zg0$W9ww=4OS+QMeY>8Hb)GZw36)x;=vyE*4v4JmsDutMWDA3yds<0_RyfIIT;qvW^+{x-gb*at()ZI}YP6Fo-~C zt7TWUtqYOHP($Y>wr)&a!k~Hq7D05~sHFARP1H`vQ0xnw0r5bK9jUc!5U*BWjZ==NWmD6 zHrmEGzHASp=t$r=#$+?5tv_f9T3}L)=AwO^)|yJ-_S`1Q#iJIKr?^59de#V^+UDO8PezA-o{6HPu`dNz|UBJO&28)4HMcXrz}k@zZMguMtdk^5~&W$K4&4jW>ytUG|)k0^s{)Ikl{7nEys%DOwGnU zuyV4v=b%LbWG9dbO0%j~5M0tjEKY-bj%ZSKc6HhD*$6P@c&Z_BjjTGW0yhIMT&+o0 zq@s`Mpm4U{h2TRU4GHJlv}9GC;~66teDfC!Ze*d*_EoWrZj|*`gkh~aO8&MpnU6&1 z$cBiao626LSz^m;s^@yc(|9;5o=23Zp9D)EZ_2@Se^+2-e!K0_r5USM*X%V1f1ZXl zzX>KpmI18bbS5c8ZdEPF4v5CpJGg+^q;sTbGjM@4d=Y|Ev)%%lw5hq0NLzb;bv%Y* zVkg>K#h9a7Pcvo2BZOOWuZ*@XG)D^#%Y*@Z#%!x$UI7w*iAGVX2He^{?i!Cc=erV0cW!z$`F?6Jv$hcd@3CZw1;I@8OV@!43Nt{8A@cYxH@8^* zR{6J@i9Q?+x>PSPusJY}xM)uz63aEq9Mpvz(ZeU|qb6id;?ArJ?o?RFck(cFB_1i7 zl9NG^G1y+>%qa5~;~nwoh-s8aD*uBuFwO2x+5c|oGg&->sdkZp zX*xVBVlCuw<%P7)ulQmk|g%yM}5uOpEbeH?FDUPme)^IT=yf`z$X?T~YhDVUf!G>M9Rd2*qeT zo}6MHCkEj9o+^aFwQ{l!jzJSTeU8TD<4~h%1>=C~T&b`~bJhyPKuw~JQf?RP*D|th zjt^`zf7bt~^@pR{8XjqEvIL~GeSPbmD({kx3yK z6>o(tXbDS)R&VY~3WGQz&5}7>ZJN!Ws(I25!_ib8%rp7K0ytdfFml zlnH4wid8G z+Z~+|((qwRlK?@EZU{%J{4orX>FB^6MORG8zu=kncr;Ryr<1L9D zWRgTYGx5xj(jmj3lW2%>TTD1rq+YgBmv7z}2USI#BCWQytn!p6?Vm4&#FS|b_J+AK zNTpqFOdD^GI{Gpa14LCiwyiOnX?#P$r54sfK~j?Iq(C->uCfZI4Em=HYMuFz`WGzk zOOO6u6}N&STv4DVV$~1f^3uT24ESdFxaw?cm_Veiv%<6EA&$HHSafDscWN-W zqSMGQDlsu3g4f`7Iyf>K!Vj1m4Z{v<&ZiZd>(ExO!X@hbEEDq^Z!~g7SzO z5EuvtxWq*N1GbfR%&=uCsHDzcidB@8>tM=4MO@Ol3Rfd?qQgHX+A4Mz{9Z!0tgS)&!0o3ZiTsNIw;+o@2iyP0IoK^s& z3Mh>TPDx7O3`bjObo?`qP#(#G*R-pZ{)H19vS^7JR4e-nKLyPTWm?}XOiQSh>bV(S z)Gg(#szH?&7aSMz#Cs?$6!8MmB5SEC=XgLeR(vY|rK`a6NkPM9r@>PTKJ-wPi2|U} z0F6v*;8&{A5di|V1vcNh)bIED`L(w?yRNvPYd{BBZ_uZ!-y$xVuB*UMcdCaMZH_Z1 zu@}oWpkR<`&9)!BX$@k@W+ntkD8^MAxKbe_RSxpogp|WDh!zl`W=$=y6I8s$sGx|L zv}tka0?mlEIi(`!dRR^eoA&aj(K}`jSCdE;^%b2oIonC6&s#<@d2vNd{R)r87HuYm zgMce7%(hQ2|Il$x_urA7)RqZT5Ng1Bh!t3ssX(W)zG|fOP(t=o1bhPk`Onf*LZo8O zWCY{(TPx7vLJpYA{OQq8SZXcbYS6}A11!Sioj8m0)O&Vzy?GVSvdFNsHGbpZXv}rD zKthe2aFM7k2r1?TE=AapjTGa==n@OF>_TxdAVY1YW{B~wxxmIST-?dlX>v3_t9Bvw zN9;^yD{se;BP{dnIE}ffUxCp;I(03nHQ)y3muq;39!M1oPy3-Itu&2@bxBfWR3oYK z4VGARPX`SpwYD4>u$(#b$$xRw%!H~PjL#4zTa<&NQ_s>>Nhz{EoN^7=yNd;so0ohP z_9IQ9?5B-$nb%Mu;9ad5R|$iv4eIA0J`s=5sZ@&0+@;oL0vEDJt#+MqN7B=VKqx}# zThWvf_1ezi?pXa?IuNPuvu7GExCQH2bZN^tjhz_vO-=7^LT$yXj!+2`rqpzja`3Q9 zJSH=Mey~vU631!%vDsJ`ovuxW`{#%WuLY%B44S88jzmOesw2#Qb(EGIa z5Mv>sNHRs$Wd~ldFdvX&0rmHN6he9t$MZ0J0=$0UfyM!BpR0w$U&6Blg zodB_D!1^X1B{k`e3vNo>JkeSW>qoJc!A;fa55MlkGT@7A3gYy*fl1h>(5}kgo!45s( zmWV)CM_nyaNV`FXB*{o{Y7E;$&&%7o<%lAQBZ(H}q%5WD?@SCMN{Wid(NPIjSOj^X zcyU1ZB~v41EE1K_X-(lpD9KFDaMRQ0Xg^x$+}+wTG&T z152{tHOU#LbS8t+45ozmLT0z*L!AhAXlB?)p~h4{2YsW{aIfony>oKZrTcD87$#L} zto46}%Uy2)vH{}Rrt;IOP$MLv{8fbgQj|yq4_KB{)WGg(33aJTo($6lqPuJD>|V^ry4xUbukuT3dw0truUSXk4fhDS8Z zZ(K5?b@LMa3dmh}JYQb)Yg*bz3-;6>H!7T~hKYO5udPL$ay6XOXs8#EAA!3AI;PWW zXp^NZay5-SqsGifs`|@pe+qqH^_*S&;_@j~$@{1>gAMXTam|v}r*e{}Vj73iT4N4r zMYrPlr*_X*=$QuROt}X#sHtcy7FWQq?P}{YDKs666q%;+qf{Us65FMnR}~D!VBB>T zQVfl&=`G$7eVxihgh%?M#6zgMbOnWsk9z>m!$E&^%nSre;6Mfpc=L%E(Pf})<~bs6 z)YWlgLJ6vFjE2!9P~Yr1k*zRRuSR32Fk_l4m7USWn`Sj9^-Mvktc@*GMRwq?8Y9YV zEe=Jtnu-OSdC?-_3R0A2vF?~(CT%k7lDOgS0ycD;E0F`LqnRd$n-UE_iWFY;-RY%xA`(ktf$$0YI1mDe!&T`rjqYkB;#30 zF#7(`@~ttEyuwnolA_vI_Kj?*9|s$qfXNl>&0^bs^c;z9k)oy zW6{DIPb^q}-71h7qQ^7l`*`Xp;U~f?RJSTMG++e$nsZDGaDbdg5T4SaQL8+uoZ2Oo zH)CETqPErV;ikK^kE&Kfbm0UBJRcTv(J~wq7`1 zE)`;jY^(iy`UN;vPh7(UHmoBkvj`Q721AN3{fvW0Ne+a;5LF4q;oB7&N*1M7L<>?3 zRHf=fPyXSakaMMH=hz#4U@ z7vHOn@<^fPl=um}QdL@qj)FQbs__WhPM9ean(8;O_c zQg>c)YE>7g<|8Y@qFTu(L^OhBv=R+pCA5l2$t1EC@+Z|)n>ZCR$`gLqs8y`#>T|5v znBfG(tP9zt1rZT2IZ#o9RTruE)yPdyS z&G=`r}cdP}ORY=AUmuJe|3Dp<1vq_y->k~LGqxmn-Z zBL651o$8W~5>AXrbg`IfQ$ji3csT&at_SRL;T7$AAlb`GRf^GM@q?5tqbtZJmiJjzH?P#z+#cfW|j+P*^Qg`5K8%uP#k1W*j!8L7j|I1vPAH z`G+-Z+p%V{hNgxR4#d6Q|3Y>sv)P_TAYUS3TkY=!v zSLmKL;=HJNz7?m8G=-mmKX zQwQ0Kxz8tsh4LV8)Tz~ZQR0On*D0^5NQKMtHjo*tfrRR6SfKfp>fl7M zZQ6;sgigKAUjYU&;zNX1$RMf?qF9AHO@)GllEzGw@4b{lG-aKce%F||2gG;2VBw_Q zw%f_<^bgC@Yh~TDBGoDKc*V8K{e(caIi4ph$i5fO6WCZc)mQz&G0C&1J(|6smkk2*k9u{o?ON; zs%)0Ul{%L~Z5^eRwG&U=7$yU{$}U2vC5xL?y%7&XTpwqdGtsPd5IPy^O-&K?Cb%~3 z5dE9RGq4XrJd1^)!cF$4h z)jnwF*R#@6RrJc`QLlc{oangL?`@L*Ytpu1vP$>7Ww?hJLJjUZ0OKp`fPW=`M@Cfj zSYgTw5UU_`WdtO=-;Up|4EB{|;i+s+GpbjSlxLHq)jUfDAzP-J&lq6#7NnGR&a~`t zXTC%x7dGG$SlH?lyCf|IQ3r!8W7A1OVzs713tv@uE)TK5H^HHJwV;w^%A^4AWK^2v z2_SD?3ko20OVd%?h+}94W0)&Ym#zqrK8R*VoJQ(@Io3D}D!Aq~hleo$bX$!;5go81f>Rczmf|=;P!qNYCBMt22y<^^{4OzWFUB)xDt$~G8v!5TZO0lWC&zBbp&;*Ft1gQmGk1$K16Zc|8Mg~xEJ3Fz8w3{AtF zc$RVvL_2Wfpte@uY;_=(Mh0A{+Ek^dDQ9c2@VX8xg3Qhp7IDC3cUHLi)Uz=|$_cZ9 zx-$`>vv5sbI?SfRT30f(aWk-?gK5m$(7{x~xWYPKu!U}$0TV_hR6tE1oEl!C!=0x& zJn5kzLPXRQ&tn`zU&Aa;>QpBQWp~7w=4FOflvSzX1BE#Rog{-w=9=JsL`m$&Bz4K7DpHqScwM^r?P;6vlwb1UA!737)g*Quazh7c}aosVdU<3t#Efpi6Ym#(F_ z&zc6tuwfTL>}+KrPhUhW-IN{nFxiHi>9oamP?S(Sm0u{Ou3|3!YekO(p=@Mt4D+C8}-&OE1q)G?l*@C zY?3teleJtc%6wsbjiFiFI*k0q)&!?qHC(d@Nu{ZG?5Pc!*7XbV()Cm(DGx@(VTd0_ zt@P1VJ|&6loJ$?1T-C`>i%d-)fGL#eRjJjNtq7tPsjQuBi`vsmepC}ZjH{7iYZYC7 zlrMhUv}*h?#HX?;k1hor#hYF#M(PQr!lj}C)m)jUqYMjo)p_wq4gBmBw#$~5&;n3V zSn-?S zs^(lhjgSp9t8oRJkP~%|JZv}&?3WUyg22yO1)L$^5lXyLK&`{581^b&Qd^=O8;Dhq zlQOq@$=Jyn+f@4}Z_Q=ga0d4l;x}laTFn zFN`Y?_$pJp7I`Df+A9)w3eS!R=o9LBl`s*(riH)+B_-K({Y=#wFqyD^Le;0j#t4gy z+CUM@VHQOVji`J)5&B4?!$SjA)n61&)Z9(UTeafSe!z-b9SgILA)s`KLd(js0GkvI=dcIA;~Cfq~ZW~Ix>Ol*Tq#-%h`D)b{h<6hh(kOTHk;%hO*~Q$26FD6=mvD58KDQjAlXy=Nl+aoJdDGeMQ)!)i5G>%8Ey1sE8DEgH60dG2jW4 zONTSoKn0rH4nu*aHnDHifB?fRBxx!t%uV{@v4W*!_B4cMjk>O=bK?hlIU$PBP2O)u znK`LCDQS<57X|!5A?nKEh_m%^%)F*vy4SqKqdkjr#4HeBDdb0uOc z6uL^3sJLOVMO;BygDk0~A!}D7UErH8CDuY(Jbe|Ca=9~gbkfdZcuJVC5wBL~aAjph zD|0eAU7Sx7vq_yzqh?J3e2g|Cmq9I8C(4lC3-Y?2T01q0rGO&*;#MmgK@QcO9Lo=P z>Z?ZZ%spJHVVc|wDaewmNOV<-iZc^iQfn$KaZ$zQ39~o)5bZx{YYQciCj1&oGeyH2 zN2F9OJ`5Ezx_VP=2F$lU>eS&d(?~gtE@77t9Gtekj3cQ+I_ONKRhJvw1|gi0w|2ZK zYe=TXU~pHSyvrq+Us;qlB$kXayR)A{=8zZkO`y7$^Usqu zCXz+R7aw#SZ;dec+7Df5n-}039${)5l?;`i8jn-0R}NNZY%`hyXVH}C@Z#d|3CQcT zF|2Sx8p6`p>#84{}Xj2Lk(0bXu`3Pcr$y+*HNGPM4E)4l?a zC_Qm}T_<(YCR_Arb4VUH3?X4okqlRu6RnVObp1gAcFL)SqPBm6`eS`*6rdSKv z*UT%qUHxb-_JV6cS{WOOba93h&yt3dHj!I-a2HQ7Z>$w5tuvX{mR^lkewaxMYjjxV zFt-yexN0+^=XIWhJJShmGG1hXfzbdlo1_nwh5-wNMt9^$sRCkAfJ&w?gsKw7V=OX_ zj2mWAvzjQ>o~qTdM;$uv8S+}?WXKZUA~ZIz7<}OxRL1hmM%1!+M#Af(WF$MTGF{+2 zRqxdK*ppvFlTD?gszWcu=7$5SxreoAR65Pkj{TQ9w@BmuMzlIHbY~E83r*)DD&IwC zVePJEp3{vz`NNs=w z?u|OIM$NFDV>W=Ywh`wy4E^cC%VSZ)=K>^jY}A8Q9s^mGQ)~q(*sO#6)NRb2Zes`L z?7>!bp!0zHL&YS?x{gZ4b~LQuWs4kJK06qiNfft&#RMe7@)ZqoyN2ThFF27ZhK)p8 za*QjxXf#4WdSA7h3RYhlo{9y_Skzk~9m>SrvN|U1XTC4y(c~@!8}|s7fMylE=8j>4 zw@NY_yZh}^)#17z3mJipcpg}1O@)Ms@LKmObt{?johzI&4%1P?FN_Rl_@qn<6)ZCA zqVVm6g<4f(hLW6P3t!}}ViIohQ`Kc07B+u_qC9OMCgrnLmxgW@ZM}=0h8xy}sP@TQ z&_=cfd)q3)u2rpSZnmJl8>9&AY($GPePw{I7h}sh>TV%kUsKI0L{=NZ6#x;>(b;Do zdX5@K&o+$m%|Vg;*>+o0Si8O#6+A>e_Kd}wQ)?|&TOb8gbrcf0$}yqTRnARMpcX?b z=Z3o=bVN~(u?xb?lbVN) zM3F37T9#-cKh27mP@Pen?6E$izfVl#vfk`N46r}693MMCJ;gSTtXuIer!c6d_gd%> zi|AZl3?j%PMOZ5CbFy*bvW2-g6}O(w0;%m(k%6eyD*)3;4b&t zfijtbj?)NE@=-H7QHBx)4riuj1%r!}Oo*{*H?rdJQY8~=Hbsnh2rOFDIdy7%%8Xb3 z^gyZkE6I%v{{BvD_KBb=9zbJ|js^%9vFbUGttf45$LJ#n&@yTdRA5CXP$UA&yBesl zNd1s{%4r+Z07&_m>aC>pQd-w%nz#2_LbJSOX)0?=2j@xS#n@#Cqb*SMkt%9MG%abo zm{0yrnq0y8x~9e1{Z-R2bfoE_26 zSUW1(qZ}zB1@kdEmmz3Ho#R47Ro`hj{xH!@Wy+OK`>Y^|p*%)bgHBKAvud{gFG+*Pg^CW#g*WM@NkS;P_x%0ub37u)5Uva}tY;Udbj9x`)ExT>7au!!BNEF%rY zfefu-9f~u}kgKV0dRMqR(lp$orbql*Q62b87|jxiqT0%nD4u->&VVWkQC(>>PX)_V zKIbT9e51R{ICnX-4dcYr@lbzz|56z9QIpr$AnAmxRA-q)tOobCW32|08!9^W$B|J| zX`&NhU8z-aVJuZ6+=k)Z@$u3&3Fp)`n0HwP1Kt3~--QY5LsC?osvY86(Yv!c_UC#+0hD~Oe7h|+q5CPK-UM>XqyM{Vc|A956- zUWO;b2psRGtvNdphDWo~>tM?nxjrKn0$6J*FN?6TW*50dzJw2#g z9>73b-O7a3a%GKW?bPre_7V;9<02d+KYjl30GnikpR2x5NkYkZ2Vx?y0z<})#{vI=-bY>RzyE+;mj3s@PD4WY3k8+`{g2c46spgYd*Lv@K^P(0KDeJGo*|RxK`|0RF4UWq^c1#;#8e*ks2LS& zzY6Oa_=m1rlA&F(@B4lJksX5n{r3}TDev|4qC|m6a71}j*X9?fAvr;hnCSdrF?cFQ zUpX9IC6bdR@u-@}*{u6D0*~+e_#UBgAin zVDclNW1qy;_Z|4>yYbK8L<*1sBOLw?euu_G`wFfSTB`pHzxzY{L)zny@zcAo**^S3 zomTMEVf;fnl2+b%e2+xThw+DB$3L_i=-=X}{}2D%g&omyApJvB|7ra0XYkMO;VVCn zpNPdtOruC|KZSpAwX{Etf4+i$Xi96A_ z;sVlF{{bIK@$5oc9>708i{BlGPhTD1TZ5Chw_1%WwbpvK*H3_;J$!iB>vaazRx(_x_WJ9GH-?*?!;|qnz!*^Q(n)I9 zL7Q&^3h#mI**0ryz22}3CCT6$ttEZ%k(1g0I!NG!`v-V0(P-6gb`Ko~1;cCf=y1^S zp3!h^{)6)aC7z>*mku8O_>uV+-}=PC$#Uh3lZ%tl>iDj$WXmB{MM!n++BFE% z4maQsEF=~9qR!Qshhe4m+V$TT)OBg7jGSLDOD0M*Bn>vfC*4GxnVXspV47Nsy3 z@t=V;AObWQzc>Cfuf>OE7`AwER?k}4pB<4H4^>y54>a;Px7!P1F ze!@cYf0-AA9_)VKj{$geOy-V zuR4U)Mswa0R`CSFw!mW6pB}Y%nyH&#Pr7(}yFb11Bb7kH#Ov^YdTv=t^+YH}{eOu;-l1~lsj z>=4(7S6~+K`)+eGR$^s*eeJsQw$gC5Hw5{lKP7Dx;<(%%2JHH9W%6NgMdxW|?Rt2` z{fVM(x>gRzZ#*Qx9M8L(j31Eik)JIs_RF`lr0v)H>L$-DoFvSg`RMPjnS%&Lm!5QhgompN47V{_Y8Z@ zUJb+{*dWc`VDc7B2~Oz%o?<=?5f(9V!s;{;$c~5V7Pv7l5z3x5Lyr(PP z)AyMtT%KQTf0y@L!+W~yJ$1aNRqyHZ=80i`kM~sf-u$BX+sJ#m>OI}?o;J-B)8*sd z(^t(CPVZOSpZ3~a^Paxnd-{_1)G|-pL)&}$Ve^Eh=2zQa@!Ac&ryua1K4zX6=9>5P zhWGR-uiclur|aI+ir4Ow-c#3m`b%EBzW4M)=7~r2z20x1Fi(v2XT9Hk#5^&ro8FtB z^WOZ7_cZXHHoSI;_w)tt&5Pb|WAnsVuY13}={~8Yd`01hlcq_SX{Iu`M zuaWfPrzcFa;`^pCdDdE?(6yuL;59Y07??k9hg zJXLPD@(+HW{89dG?cgEuvia$@&G(aN=BK^C{%7RZ^3&a||BW16diuugU;mHfqw;V4 z1Fw^N%THJSph{jkKmF*+pODwfPd_)=Am^B$Uisxs@{;-Kz~}BIcbT6a_}H(Jjm1yD zdB;3?%=~oE`JW-znV!CJ}0$LLcm)!RNVNquR8+Q8*F{gZwF1CK-+SOKa4SeFH2Ii4uI>wqf5*sNfrJZ~8rOGY0Jonsld%b8A3=%>? zlsD68*jW>R+B;wTzr6?=E^O@ehZS(jA=929>b=rGQ z`lCLmfTPy$_4n@G+vwB>1CBdOy#Vk3Gu_X5$Q*oiZw3CtvEaX#Hd>IBfJgzd0Awnf zNd>+bVRmKMtB{ddsaFO-L`V{uU9uIK08GHt2@G3x6_bYFYd|ML_zG;*sSLJ~Mr#e? z{S}DsRUiWnvEo6cw?>Z^{j%wr^(*ZQ_{RioL z`U8jNR3xiAH%K~bhopxOo$GazLlvk@A0_7V^Uq%aA9Q_SX2Hw^WLjVe);ny8@)j)IlAwkUlnYsny(Z4(}Bpz3j5afU?OLP%5P=xu=aG_-t2(Dd8 zh86QqpVzoUuzrH~N(^|++)LBEZ4q;a+*+&9Fa}pzTO5^3c(EWo@IMB~FYzGwd;NvP zLKQKZd+x)pz4qK8e%TPlJWprEX_BYoBK#_=w!HCcU4c$;PMp^A+YfTX2tMTLR{kYi6Qn1FjA`dgVh zQu%fu5iSSjcX&E-eGUF|MjkR#vu9=d9Lse%cp9G}cw^0D(QH5hxav>DF71z~|Y720!Rc~hA?B!_M{m@19-ew*&ku@D9Zlr4mAr?*N4Y1Y}@Vz(?&g*)LoKgA-K+`55Fd4zKk{ zr^9!k8wA^YFY>4(`O#DWyJ6IYUFSXIJM$X^51@FVyFT22?_R1@o<{8fn!Zjh73zKd zgxbG18p1tNuaD~8A^zYz9#e~Ex=%WIo1IeQ+T&_6&MaGE@03#t#TIp-}jf!cr3l*?@nw9np`( zCh!~Z1xqJ>No_`YOF0T&b=o}-R-zTa-!x7(t)wAh8u-d5;?6SBz&JBHQYArAr``1X z{>tie&sE#KRt81w1V9vt=LE%!GgUs12-MVYU@$aUj^|{w2RG4~`BqW)W+FaeDHLHo zo>C_;fRl>e_{U#;$?^OgasnfK{4J1nAW6Zaw6Kx-t>$&4J#2VePv%}aWE3>73E*w? zx8U1j!FqFGS3z$;8O5C8G(}60f*xMQUcjGv>!9xsnoZlr4mTdE(-pZ^f9_%zM{Vqa z$xN|}BOh3G297dK%v%g{%o4g_A*QRi@?Rd38tnt%;AhirOh{Qq#)N2=Si{R!861|dc>j&)*jC{Yz-ZAg9%T?q6v%;XEwy` z2dlOT;eX9ia4ZeH`Ys3OKZOPyoMVX=uo#j9F;|OQltE&Gh%_}RK?Hrr?LWeT%|Fi3 z_@s~o1%z?!)Jt#$<&Zy5<%AXpCD2OrudbVK8v99PZ(u#;7*F4Vp#_7hs=KS9*+)y71H)n1 zo}BTg4prj6GBKVyHXXcC{u$4hDTYdIK2r|#79 zS-|KB!H=_SGz%s(`5ntAq4}fP%@wsfsi*jqFlurrmYKt&%O3&Q&qQHcVwv-%O_Mj4 zKWUppR=4SfDhOl*e`Wb^LX%AHiemQlBY z4pB*227d)z@T&zR55Jfza`=_Pl7?TOLULJZ)A2Nf<`<_3l__2OvV>obbF6vO>pOFH zEw{4NECAPt4Sutbyx>=-35vX~g+W{-XBQ0IL!LyKj)MpSezTYaaNnJ_^!eQ>3>ZTq z6L2v;5DJ@BPH2p#7cs&XFug!ioI32E=sYWp#^SE&rMa)?sX0eVAK&wO%-&N zP2M^zlR(y{c%QL~KzbqD@jk>Z<)Ml#p3_h=MiWolDx_`J0CGMHwyygXPvkH#4!IsT z5`cz+9=43v^|pP^HW5-gDBIKxMuE9+!czXv;^)oiY;&ANa&~S&9r3h-2=GMZD*z#Yc1Mgh1Uwq-fpK30RMCW(FiR zonokCmFFvzqckBdI^Cu+*R9~&H&gh;#ZS*WIWCRQeDg*DBv$DPCnK9Gjz7<_@p$mo z)IYfpyu&xGd}HIo%$%&6SNOF@cEP(p|1;`mlDIRro1W0;TW)&4D?DLfJeVDgH;QNRYreb~5^uY1BO9 zQ8p{MLIVXgjIXw02}TgS7mcZ6C`j8~9jS{XJO%abPJIf5<)mYt1{|GH z9Mqioi#|H|= z00lSe%pZLzKQH!zN~b_68O>@^USuNOZ2BuG7*4H3(-p5pOIq_Suf=Uy=VaK+3=z4) zg_^~SHYROEjx{%k9*)LVG8Qj{Al_AuWGnYuYwt$1{^0{nM<^qujXET)GE4cxJ6x3@ zQk;z{(1NC_r3$L(qqxmvKwOc(jl?Y~5P*gr$aHDp$kNr+$wAuAv1Kz~4%nAL{DmyV zO_?fAviCghxGZH3npJ#S<1ez;gv~$K+-GAGy%ejH_~#-5PdO%(cnrgnbPh*`7fP0` z*(t7dl>9DR()^O6-DzxeDwrMhx1LH5@TW0}at5EZKHOt%q_kN2zDLTB1t-3n5y*5M}21bEwg?iYZvL zO93H0O?TAIp^KQGft=K8t4jxlqdN$jM?hnPSBLjV^0(+Y!`Gz#uHoKf=Qr}w2VmUb z$?NAAPh4K9I7hM3ITln0%B>Y9?nL5)AHft{<&!QX-BV=^X^d*ee!vY+MjuQuAdT}z zD2vrKh^cJAAG^h1f_2NO6{cJylq8$1I5et;t2rbB>7!AFc-Ii1hJ!$eu+Y!7q|?Fv zuyCuaLyB`@^U&$AH19#@FEc9-PSB>GbfV4uZ;4 zOt5+X7;hDq@R<|^%fTYYULdgX(E8CMnbwZYv#HL&IAJ<@D6?R)#taa3g$WlTQRQ4* zj#L;P!J!d#iSB5C$MT5OoQTDZbtaW@01!jes!+${p6lVo0d z4YpEQo+BQCKZLu>U5DK7XgG%|x?{_0#)L8p!ECT|XzG2V1XFrO(@g>ORY+miW^ivy z(g~Nlurz#NuO&4-H|O~s*adTeLM1!z z^-9KkL+T2C3R7T~vX)U5DUcA9fNMEsMnC=ik!tSJ-t#=Jk>Dlk z(abS7jA`M_Q_jk9-r}_qQt_#a;EWI%&s{V*4Xqpe`0;zphKu3v-mCqd)Xo9x4*tTQepIfcGs zS#dXj;;ZOZ5^a3f65)|fbx$S{L?D_*2! zgivTN7@2KYLM+QvF>K6E{gx2XW;&xn)6hJ(mg!r4$0#a`bm;(jc(~m&{xcIs_Ke~? zVWPqV5dN5Mo~3X+Fj+5IaAxc2dl4Z~eX@6z@_J@-klFM0`0`V*vy6u5yv@+OG@$Hw z`;O&P(BS2q-`owZWhAcmMrQ?du zE6Z(ovl>8GYyf!rgjDHBf7`cuLM*y!GsxNQK9+X~wEn96QTD2=8XE z7FINZ)YHqjfjXBHg|9rEp1GB0=265ckkLe?dwY2yXeJSzLF{Qx6}Uq^1p{3az}0$(j)TO)3=^|eagta2Fn+hKMozKGR|}a z?V!$94bRg`PS2!WDE^4Pw*1$iqflD#%SK$dT)f<*_5668F+(mMBXHV%TtvChjViNg z6>d^MJo1Z0CeCmmHz=Yt92~+`%}gY#fM3kf6AmOts#^Zl70)l`@~@q4o;_|+Ksb2A z&lZW^YXxwPnYQoIDF6LZkMRpQk>!BGQZ4{5p@NIWR{CZt`Jq_R5|&B0T+?d z{ANMX%r6&^$^2rzFs64#Q@4M^4)Ft9=HkFAU&mOb>-{EkZ+_;9TW-P4ny2wbRlF6? z7O2=u&=)!__`Y%(t4}JI;5Gv|>u35l@zmMGd-pE!y{(o0sQc=x997^D8N;l?POJn@ zQMdcH`w3jO+v^{yz*)Xm$IIL2!9_z846Y5hKntYM8GM-AF?#7G94D+RiGt| z*w8deBsX7iunG~)F5E(VY2m`$Q*iEby|d9948dW3>4@1w2;@xqc!!IFI$fg+xEzPQ z3wSBFxvO!O3BQSHK1rjxk)9i8R?KamKpP=j&HxXYxFS=}fS)^qPMdoJeHMk3W1Oa+OkCXgZ z{vqvW_#)|&k4`gKn_H^)*6;%f2lEZq8ez{MOoVTNlS@Y8Y1rmZas)~VncNi-%4HuF z$7gcHBpb+7Rv}gC+h5?s0jVSp6i?c_PdKl$3YGJ+|DD-N1#P8r9I6d5_zkBBcUle7 zq$JBa^&3ETxhjp;E8L5R#b))&Mr$3#B;7&}wP$z$abI^VTCF94EVB)duiY-5d_k#h z3>{QhA&a7IiFSyJAj9FX$v0_sh(8eMfZx+nCuMqRAa} zSG|`nUuM31`7-n6^Ai=E*fWm8hzlKCoa6Ml>`HqOy?Z3z8{Bga6#y*O+SHsX>fH7c`#D+B)4d+h677HGJHwXm*R3I)PlK{Qs zMZGvx{=~9ZKHbm>q?A1|nKO*L39Din?p~<(6J%KpeR&3A08?1SFcPeY3dA!ncT~C2 zhE<#PyDN3P%ecj~J=@6&NdC=9ph~ zt=H-G@AXjKT%H`{M-j4=yO&{m!yc7_3n)Hxr-!#TIA6&sagUlISxc)lsO4JVBjG9+ z`5WNb(@1K=Ko6drb)!dMp*lz$f;KI}apF@%;b$WB&3d?$E5e5^)&?FtnTtZHc& znTPSL?Av-IB`rvhRWgr0rEpxuxHmQ~!SLf~{Lvgl*W9QhPmUW++~~eX5IR<7HB1#u z0Bb=(Y1!0uo#N9I?AM?z6!C|0ABF{u?W=nwCb@}1Fm45bF? z!l44&V?nU66%Y2De!#EnWH9~AW3pqrkS=_Ug%_!d?{#4D$!P$hjfDq-!zK|20EPuf^Fo=zG)5$5gn?vI`NNLIX>)8_WF5zSW@5qFh zS1E5fh1HB|Ct$?2|4MHF%LDMHcSd5Gn0(*~MPrC(o1dYx3_3F~3@!pE=mpkcIAvTU z?0BsKefYfV*c82(TdIBh5LTKC`OxPTk&NvDfSDEH#=rC4VA5et; zsDMA3U48&YWh~r9BV(eU7CbtS^nne5g+W!@BCQ=Wj*>|Dk?-(O1g1FN%U;TkE3e$w z+6d$%5!Dsa;j>V-Ep&S@xB2@JB(vqAiz*L5NUnn%JD06JhLg`#$enG|5LvUsUUM#~ z17e!6;i%n7S9|(qcUK2GUI?i^(O{*a$@ zX#P>sO6*Q}tN1i^{!#1q#s0MOuOg&;r=L?X?7`8>QxaahhiT0X$IZ$s;&`jcZPae9 z$?<~+j&*&x)F$sih$1q>&McZIX73ZTSHuLS$rH0z+!#;H-iI=KACt9t@ZMoHoi)VL z?>&B>u#U7BOd@Ph=3g0Zs~KcX?1;qU(RKLJarM5V$U;d=Kr*|naVK#{i8}Y+oJ#^o z&e}S7=lXm7`idHusddRD+6u$d<*6J#}60o#J1 zTX*}jvpQV2pK1J6bURu)l4Jj9NT;Uj(QLed9-pe1SUz#?=Nf+#t-qt9wNK@0{26(# z}6OBD0GWtMu5A`!_SMR~ou6fb-6O)RUP2{qcB|kKxaz{Q+uU z;9{5|N;A5})D;x-9d55?dhI%VlEW>1Il#J|@>46D5j#H=q_0=(=QT)Npo#mCHdWT3)_szgxBo zskU}D?6J6%=0`+}RhNKbqKm+m3eJ<^hOLy%(parvN?Y$0**Q?_pXpu_@cP}>c=yo)c(o@ zYJx@8SjCLLN-f5H97!E4R5tI@tf&BES>8_2Hxky?Q8Py7%1NPs!-c*}0`bdCMC#mH zq~Rb&F23k4pHuguySP+c**6rZ>*HxA3LbxKQ#H6MxM*NK^UY*bZ6v?O186VbBbI7E zp zQB|=Jdtfn)_dLoWgnI+Vmof)c@zfF%;{tk!oENU+KQVut?ZAiQ(PrY=6!`LWv_Yxv zEZnu`#2{$VmLxA9xee_a_7d6`2mF6feCJvCHrJp20HH$Vv$WN^`L&Z%A;;DWPjKeS-wYGU1Xp z<>yx5x}eoektILm#3OyOio&1SPWvu$&6vDBMXiv^0g1z7*1EHr<^~UHw!*weq)O zBq%r$M}ed>vtmZm(f#&VHv?wLqe4#?b6|p|m=9QK98Gr&+1^-OR~qRIN0MA`-7xB8 zwl$$Q16D9QPHYiwI9tRLRSjWZYRQti@a`QB4}C^~FnkXP!Q%uf%2;?m2@|Fo;$H5i zcpLSe2TEn3%l$qs2;iKx3t=X9MdO3{84 zZzYyYji|=js%*{V_bCOJ>`#%gbqPu7P+~o~;_a*~xq$m#TV2dqCngXeteHo!zl1{0 z26Jm}HJfLD$xtN*n1J#|m|>JyV2*BZunM-7wwQpTpo{E|b>H^AZLVLnRaWgpvAyGA ztg=Og*Fb-;jj~iMy+PtE9Ha<4yCxhDpIB$(;S=kO%36OGvl8D^>&$5&RbO+>w2G!> zdryhImaZRf9^@@`In1V(n<{6RZlXeATbS9ku<7>QS9>8%HdEp6 zuid5yd#mRUtJzk)4So>Jwu8-?=S>G*k%D+n_I9>LgM-dKYqfBdlhpvSO<8pktFkkn zxISI|LHkUPaxQ6#>Lssvl3w{QeRoT&l1eM_aQUpIf3xwENRW{#H|4NGI?!)6{twqQ zXBOwm`Dw{Pftk$88|5z1=C4UHzE74ZQQZAd$F^(RYVmX8kd2EES|iW3O)tV`p+7_TsgtC4&9Z;RkW1KU9l7tApTI}%V;NMmhvd*%nCjJ zXIU^GE+JhY!na7Zx@SV0z_ZZkMd6m9m>*hZA6ouA50KjPA6epw{pH>8GBed+H+I`qCN=VzP%CHQ5&S5BOHMkVK@n zh$lzb!6g>%P5iH#W9Yt+f;yV6$A{!5oqpdX`E8wOx9;>Fz!iF8i@zMnW%c<80L~s- z*+;WEHeU59g?y!Hy5XvT^}7Cx94L6n;a?iUIpsiI>fLU`GdjsNlxkkcj}NJc8#?F} zUYW1XTXbNh{J_O)7g2~{v;+TA55MPz2+58~r!PdE@O!RPn&F7TT;sdFJ!A*j!Cl&>2-YEK0W}DCjFxBp z==|TE^k!X_GU)bP!83Y4G<=3^5*dM?boJE+{_0=3VtIjKx0YO4)&>a3p-{+950ME( zGvI&IG$y3-w7Vf?N!rR#&p+=6(h>sM*0|Tc>p#4I2bZq1nnm@pla}NnSp+*$9w@tm zasYf>!s{u_6esHT{q~*~Q;~_wN|xx5BU1<|$Y>=Ya=k(m`Qk$~5o$0=)&<2~I-B!* zs0t}^Jvbg+JXLP$s9)A@?My_2x*|)S8rA_0s_|ZHG;H;DcBiN_asAF{Hqhvk^_Lb1 zsAbZktUvOub;RH|XD6m(laze@(RYhu7!uReY7|bJ)}uLYgaExpKlK)pt1sw5%9rUp zaPmyw6^ti|3|v3lHBSH4;bl%f$drf3DHK8B(>x4(6uLujm3D#0lv07(!VwD3IL=xV zgsoi#J&~8>3$~2{y+>vH%+BK-QTC%)Kw??SNbb)v@+KiJPZOY!FB+vN)%C)yyZ?SY zs#h0{=h5Y^?a>7(UdWEJibn0k3NAC-zsL;Sp5BpFdt!CIFF}k1o;-j9YHL>`(r!cO$YGtVTES1$@XJ-)!IF|` zvNlfUAq8j*O*N_Z&% z!fv!u08woh_V-fcy#6f}GB@v5wHW#yUI0BUiy|~<91%X>RgC~+PN=d%T=|3DAeCT# zC>%2NiGu)((B-C?Zv`z6nwzp8{<_aqCy4stU zE?>C$a!$xxU)RwJ_;J2k;b|#bs=qbr4{Mt^<<*euQhR_Tbk<>dz^zYbcq^(y<{*}E z045vj3g#+JD2Q-1Co)5d>=Co_yOXKwQ8QCpif9aPV1&rViQ|LR!|QUp-SL44?6h{WoRpdz(j^g>QOF+GBMB{fq4~fBJw)NGsavfCURy?C?9I0Xpz|fvm|O9bTzJ5OCP*@k@K_oTrgc z2=csKHQVa(Ji>1zNy(wd{4V4wjZg-#n1X0iNHcLT2vMQgYfsIQ3}!R?x?TV{9*l7F z76x;ql#x$~{wSW~*&18D<2Eu7tK1H?rIgI5QRx|wm+lBAFx5!!0qQ>Lqt;4JyENnHm?usQ1>{hHy!S{nNoO9@ z1ZA&^LRm%=GXIfivhTDA*%RR*7@eXXPYTm@#sHaIbM>(E}vQ4TZJeJqfrjC8g@3KXpG;xP*lMy;D@m84tr916Y< z)y~FRM_L981Idr zJ=vmU4=ShZ0(+2C`UM_h^>0Qm^n6`xQBSrfQ`kH!KCZJSlo}1x_j7x4?@HTjBklT! ze1DR67?2Gik0FHpeeNcOyUVaMitC>aQL#J1?*9SYyUM0se4At<+c^sY9B|UXQ7a0U z;c2kU>N*|p5OIt@4$ak)B$DWSsM~R-Z8M1|$vwm|^Kiy04R$95PoUj#QA5taBJOnN zU?*%|IR6^L-|%IPahU9*DL#h_ORht<#bk9I#FbsovJG5sWNer1sKoFbN+0hNOnNNa zf!kcx9^hFDOIpV10h?|+)3IOCvE7HavQ1x!9XI~EJ$`VB<%@24`*~9|+pSGTA~XDB zp#}VgIAqi=%T8tVB$K;9nTy_J8&SPujKbYF?XugDd^njCMs9D<6wvk^XfSpz;(qD%ShDR5C<)nN=u=PsTNab60)?GOqV zCj6LC^C)C+pAN0?2$Y8u+tX;tRhck#1#8oBlFSJ9e}TuF!r)sL^#Sul1#Jqq@#&j> z%#xlIgkn!h1<&H?qEFxu7JrsS6S!({P9(A5W8_`gA?=bO|6npgLKOT9jB!x!LUl{D z>GN5Cdx#PXaQ`I3xji$?PB70tmz_u{!y#nocK04%8dH|0`spYcbEgg8GfGPgpzpB* zK#ABTYg0zdTr3F=N>)Y*w~i&;q60X4$%5iJoQwFHt#pHLbp;Xu$L?sjJXK74!_kbl z=n=s3>T<7#NXGqkL@I-%ueS*-%638u5+{}J?E2mQZqe5#67Aop@rX%$E7>q7rQMxQ z*W!te;1;&T13_-0ycIXba)P@MFGbOt%Yq;Hl;oE>1Wq<^eVJSJ1m_HF#n6u8Hs=!b zz?`2_SEH#w4bk~F@yY`uvB^==W4(vBc%JQ;1zK4_ojly=H(`tz{7A0 z>163m{`Ds!#k^;*SE8LV)k>;wCYt!>WY_5_#I5@skB;yV8{Z@zIMg0m#e*b~m=|vox?&0)J4Sdg{UMA;#GhG;rzR${_*$`7+G~4w zSq}MT(~kKDNGP-VbTAj1*Hol=%-8lge|w~*OfAu_3p&O+xm@1pk-D$}(Eu#;K-_g& z+FHzj$7J2jw(!U*j-NYQ&>D~1xGPVVQPJTN00Xh3@fo*Ngyaknt$c$cnh2%mn?`H@O;z4kPBCMcV z91O8#B0|R%q+iplJ}ee2VpTJIh#g8}41zL~8E?Sav|-|PQ8*3?!OuPhMOkrM226!( z?fYsii0f4|`^4QU6ZW=5n4Ai?gJ4H}JW9;#F;Y%8GzFopHO#!?L!Fu_rY^qd&RT8h zrsP#}&Dv?&^kx1<m2FV#GeCK4<)%>OSfJfMKptGn{I65@c9cr`B2jdE3 zIPoR;h+VV@ukl;4|Co6M_2dpaw|S=~Wb;*?m6%r{JfKYi9l3*xIk3Ua+|~^sfWff` zguNr>)JB<@)*v}lFg4?ZUZcHCZWqC)zBlY}YWN-sTMTb69qt^J4nw!5JDm+jI8Msb ztfCWShEk6TAUzmrK9|#>uL8gv+QY-6!|bgYY+I(<`C}`04bXBlz->P?h%}{+!2N0m z=K|ysQl7yZy#F{^33HDXsxaEQ7$BMRoL=t)UdGa&V`jWy)Mi#A(Qlz@^p>x%GUGLj z8mCBe)T-0PMMxgX*+B>?f;55mZRqZM?8E`<=Ty#??F(--!rO;sK~S}szQ`R_lrwKLn>(m zL#~%(Z@`n3AwF?li)=C!;SBR!=wg$1mH2&j8EaPhC2@+A_0up++jxADKT$v;`c=Nl zu3F^6LK>OxsS8O!qvRalafB#So3wYNZXz`h%}Q<=(7oB#h;Ej zYzx$fxIeSK4Sny`uUjm_BO3%L@9y?UF}k+k!-20)5VXeJ0Pr--ltvG>{q|4`Ns3zs z-w7z$379M^!7kFu-))WAy~XEtkBx@%%0X&kiAj$-^C&n}n{1gifte=Q+ zIC=Jz!p%wU%1WzJ+bjBU< z+W@QGyqUI-x)-{(P~Q&SYu+&eaGS?(tz@73Ty~bmT=K;lB8nW-{g`nl+Y_%*6MLMz z#~p$VP3?MHZDZK&J-Eyh{c6_e?a6P^5sy#};*&@kPqZ$hW=jECm#P#!322Xu7&jEUJ!L)vq(gq zcmcj*xVWFE7NfNB>N)bO2{kw zB39}b#pC})DC#dpZhCQ>?euUA>f*j;n`r^)WeZhz7VUT+rXRjS({Rp@!*n=@jeJKP z{)>`D0Jor4jo=dt@Sfqw;njr}T7?c7n@TYs9i45wLE0XuqsGO?`*6yRSO_DU!G#_k zKj1|+`1b4=C$o{bi~2)x91PnKPMLoE{6t|la9AXJWP=e-PMQf)ZWb7gbgG-nE|16W zoe2%Oz4}q~Z<{{KQ zGn`lBI%~=#s7Ae^hnb)TUs-RwxvU<2;D9cEE;%Ydx-^?fyP9btXuybB=PyxwISRKB zPKDdfk0r8d>cVAFY-x>ro@0e9Jnu$H74$fFndd_9MW+Xke(=wU*=3#%^F8XO8wppL z3-CS3DtOtP-qk4ux^>ciN^=Rs4pf^G%PR8Q#{Nh>+67ZVk`O(i{kbH^U6lYZ(zi6a z(1cQ&K{PTf$;&+>Ah?FB_JS9rKt+)Q%(~PRDc7$ZqVt` z8{-`yOAMI6kuD2g6V>2X(k}4cGa@W`2p&yQG*A?s(JtISMOlF%gGl8=Cm=k@3<%-7 zobg9~MbTpm`Dw`RNoK&4%z(L>0iwd9jfPr3Y;j+saec3BsNUVrQ9fgY0wdV^ynh?Y zMowj=9iVcdv2(k7dcJe8`R~HPezet%!3E!4R9rh%dqH!iI2!yhij2PC;V^muUGX`_vMLB zFv_3PBa0OeKAz!}@!-Vi6B^t0Onpuc5wO0O-+XiY=9|Oitah(8sH*lwYO{xI7I_w&16tM#Sv_ zU;(UvL5QAFcznA%z^#pp55*#ujl!hrsd&F*Y>(@1-2l#o^<_NDd>nV6WJ{NucJ#cg z^BLNAJZEj8$5-pZnbp4ZN8l~;P^H!xHZ6Yw-dcj34VTjI|1ief?B+|z8W!OV?uoFH zBX@+|EJ4IA1lbn5VWQm0`4#GTC)8?W@{IySr-LOAW7qmfOl?uhk*(9@ z-G+mRhkbF5>g_6;*!X}e(6gNYlHDV?PINcfl)euoNDZV z3PH!#qOCB(Chwd>b3ax|Gv}pbI&?Ch&9(KDxSY6lCX8Ovohy)+6^q@8COv%kw*-tC zMfT`IZe(Q}Zt<}*fkduS;$V7R0*mv(g)^Nu?1JWY8E@tV zSJ!dQE&Iglz9R&4rv|Dd{zTgx>@_8w=(&gVx+C8rBnD9f;>Yh0sd_K*yhm-5jfi^K zZv-X2cc+TAQ$cYu(Ce4y6ED1l_mm_Do>}$eexASF>qXXFLr?DK;R?_P;C`N%2hk2i zMH!Tidf}x_VhZF;URv*rD~ly~g_cb%*MhoJ<8Mxdx>&jXtClC6Ox8P~z@GfU7zP06 z?&AF_ZG=IjBKKnVtkgpvU9@sQWHLGBs)HBtG6GiC*&s~khA&>gVqSz_T5PJf2XmL{ z4%TJWe-(Me$Iub$E?nCAh;_?l_&csVzTy{KNzP zZ#jFGY2X-n#ouBI(wg?N$M)O|BL{xkPN5UBqtO1aWj(a$rwOB*p-f^;T+pD7!qq6^ z{1{8S>B~Itfwwn)0%#F;uOTL?4xz)Z%HL~ukS@bK4Q6G0-6*F+we)LXo(#8JQx4r)rw_duvHc~g_Dkf}pB!t29TslG_7xg;H8mDgz0!cmR4p!d5JjrU#n=ALA-WG?`J1h0< z0&3t-&AoQy}0s z+}(oX8yj|ea7=EfP4-auV8>|nnq7WmY*4Bl;T6KSaHXwVpNwYX4im?=d-Y+@o&@=z zdd-=VC+_j%EKA1}t^@L#zxm*Wt!4U9-xhvwpA1@=f9buJ7rN4@;G7@#a0zdUMw?q$ z+enbao1)8a^OswIskfX@LcTlUIYt5h#QBaRf#|Y@o$qpYeb(V4Mp&I6a0k2>Myg`( zNKxA=2_Pi41ML3CTc^2GT* z|M>lZO?m(7obS2a#bUtF!9nkqxZYLkdoAlutxr7e^zDV~CK9TC;&BhPFrVbTKdFc( zb)8^7!pu`oF>AGWRT4Wm#YB7Jai`rIeuOCRiN_tzm14=WfXI8|f%kIp)p*qH#YX3) zR?n@697|ksyx2u0p+SH9&eVISoqIi;6BHKDXnL-32c)WsSI)ofM<+d<^E>sqV_zpa zzNHQI(3$4eFPtOYamfL6M>(uWKbY<4+C+CS8rrQu6UyPLU>F6kK+EhkM>Y!vAh&Ze z4Yrx&V&Gv$br@z7WUcCjH?=9mRjC-7FVf>QZEwS;2(AbJmx{45Sf41qT)3XMLTcM~-HfAF$dn;<%H&ovqPea=-($T5un?TA=Hu zkZq~_xv(X5FfWxqXz9Mym}dNv3@&3V>8I|}@HlN8rJ;wmakK)>ZykB}$6tEp&{O<* z=iS;@K9PgSYdWrO=DS~c8tdiV=9dmPfB5j1-~GyGwC#=XR9~|_M8@~Hjz`m{tv2pQ z^J1}eYn*LdLMIy_o``>}(+%*EL(NYeLfcQ36D;4p@n1LoTeN;QkGdIV>HFYrj7x`` z9ZurADkp)Byf<~o|2vJJ2*}4Y%p=o0`*ict(?nhYClie;bUH*%A8NkD$$nhhM@%b# z{_}^MKTDjSt)L5d6*0r1{(FsohCUz7Q^!Ty9UiNPn`a38JBxS(bHz3OwZqMSz{bnP z#&fCudxx8Ugv2qb$CHgS4BRlka=7`c9Ogqh%ym?4vmAl(yI=X2o}I-qxcN3o{pk`a zrk0uO@y4NMo0K$x@k*#(#>sCw-28TeH^zs?4)!aO#Oh#w=x}q1%}W+VUT%N$aPzm= zw3?3P)c>KzkD^x<$0+hauQ`tW^~T>ppE4De$LiHX&DTksYOKmf7&PvoSIHVI%I04= z-2BCeMuDV7q5p$J&2MDWs@axH+AlVKIm|YZwES%EJ>C2vN?Da+D(ApImo@XLiZ$b& zzI3$z%Z>j4BYdlhr=P4}fz6*kq`Q)djBgR8B{}K(?L*DqCv&RMEoaR?Zu~C#oKyrN z;c&~f<%@WOQ#^Dj64T$o2h&3c(O{!b4#f0^sBU}crexqG-dVp}88^=R)aGs^zm zL(QKi?na`7qTz(&2>PEq-TcoZf+nqt!nN~sbH>(lmTDpmKh^k4XlkJ!_DVO#WHKGY@ho4q2|jZqb<^yq2-eNj}JG0M+PXj z5NN|8Wh1PV|E}>{0AI$`5*hdzGi}WNi7DiX*!-07@+0Mn)HiJWq}UrKAo0vfM*fDU zRRxsU8D(_qKHVIUC6)Voy8d4{-25I=tzbKpt(yP)Q1kyIPs;Y)yczQ&hnoL3+RpYp z%e?j0m!5j6(yr5QO9ynCPn+y}MA2poo=uWrV{V6|fDK!s+7i;)uoXg?+wZk;Ve9a_ zynbI|ltk-I+bnz@(B>vBu`DLSrLD@WfBmLxKZvZKq)|f7Xw%R}1wkyqqsn^9SvLx> zav_+ZtF6kGR|y{rtnp&6U=}diwPA@p?YHvE7CAYnA_IjXGMN=z*%HdZvnC0Da!uxJ zJgQt1+=J;?kcBGTF|Bwk~L{!8-%Thoz0=rbW7%t z%(Ou8s?A+NEN($*`+0_ww%FHR(q{XcNd~TBBl6afHY+1ok*ssHftsNTY#&3%5Yvq` zA%2PKuhiyd)+n&TCQ>aniA<#0eD;-RcK3GVHb(sX-MjEbhA%pUKHlA_^R1hAYk%zY z`cqFKpIV;olXJom_m`B@bAK@x_s9`>0@06v1Y|@ehJ0U10bJ_cZu3d6Ts!xwrM0>! z<6n}ekjA;DTDcenH9X9#qv?iw*tyre{Gij@Wx>$Z>@{9l;Jc^(vwdM9V}8g-phm;0 zKGU!Zxk;6aUv8|De&r_h{{4#P*{Us-Ske}S6KNs`#;cti43i61MnO#4n5Eb#%bNWM z{o%ofQobDEk8??q3r z?4d9uK1XO0EYt_xB{f=>nCK}t9%G;GC9%#31#~+4s_tznhVlM|bF|%R_S|!KQEzyA zk_+61SL#68nmc%^IFb_$OGl408(i#0T1uyf zYr%^p^6ORAik-2x)YRJFyr<)r5LOiK%An|TSai6)Dio7B4seU7bcXyw5(+XrecBrj z_PDesVktPvUtf9IYp6Gpmoq_~EVmXX3g zI~@_Di^Pm^e|L&^1wFo|hzLxnk)I%_!P4uYgG!_}RvIMV$E-Y90vxm=PzC68v~3SE z&x0L_E5!mW#yXRT_+xA4|ALV30r?()ro)l6Q1Sml%OonFbK;B!a? zU`i>}xDQu@Rgh(aigqj~i2OE^ZgiCL1kj!+_K3#=v0EXzjNUxlmX%jjZ83%Iw~8;N z-AmbFD`4p=F3M&%c!s2*y7c(Uk>0rYnjIy=aG9s9R<}Q>g{CQQdc;sod!w_fwpT5G zji7(@=j6 ze`yjN^_p75=ZXe#WYdNuL%|YmAG{iXO>+SwpUCKT$=_)8nGo^U8nCDL15XkfvLP+j z_GY54{moM32UTEBA3sq5ptqcn9@m9HTNrAla{496QJ{&8YUb@ZsTSkG z=Vjdo)=X4Y_-eW`%)NzuG7`NY!xD0;jy z>vD?r7IjWGtSYVSqhDVK%!8+Cak(I+muGICw!?~X+#qYdX6(pkC+p8n!l8@1V4_zK z-U+W;dv^2E`)OC+?0$82<*fU}uIz3h%J8surJ62@X{sM_d)wCpbV|tVN!ytfn*HJ6 zFwnrtbrl5RRW(_j!pZ#R}ahQr8cBrK$qJ0Y6Fh%L0tiSJ( zgOs`|WWJ)TVVyeTq;(rlHV*b`odK*0v#@fC={zc84G?KDj|Yhh0Aem$9K>~mNkU+r zuo~#uh7%Z-ne@a^eD2J?PzE|1FB+rG`(|SgGh7)vf2Fl?_3{k~CwVj9K0M<-J>xsZ zTrSv_y!&KEA|g-I7Mz`U_elKCbq6xg$HOc!=+;qthz_wfJrjN0I^(&+rsexlGTe@l z4B}gqetRZtBxb{YotyM3FQC0{2wo%CTO}eY%ZQs(FsMmK`PeK}&qV#ZrtoQ`b79u6 zzk0FJy7cn3^UX>Suz04nDAj(pKSGBRp3{i$JxGnIoDF|-$fv})cJvUEarZE+)qw9k z2xItp<&9h?7OZq&z26(FJf-pz>)OAH<{Z?1lV=XSXZs51NhxN+Y%^ZU9!VX7{q_rtTR2z*t}U3(p= zBUxU;XYTV6!}a=)tSlDXWkSfg0sg3+}|E=DqfkDBNZ)YHtlu~?9(cXOyAZDoBu zw8~IbO-A*4f}f11v*d4hQBkoo^fDV)!JEOX;dZl>X<-F-mWNgF0NW&-rQV)S+o<*# zRsOIZlj&#|#WKy=8)CZr96nwo-|4{lktCq&W5Mn(7h1B>tqwqNz&bSB2!`*iXK&o; z1F5_8B*TA?Kqfw|8m~R;j^WEwnrz`OL>XB|R1Xkp`1?nCyS;mTOV}XCY*^db)04wi zZ+gE6bJb8b*9VHPI)D4gNl-qqNhumg8HFKO6q=&u=@cm_`8qiu>}TyuXM`$T*iRxZ zsEff7iXLB1QF;is`B!@8;K$;d&mm{5&$V_EfgYD!805M&4U~}aJloUp+{ZD53rvC# z*9h_Bk7BGmFJLSmqdyb5H0iUBgiMG>9s?7L+#Dz$6psW0`z!~+gd&fDeM}TQ1~=3N z8~|YFmsyw;oI95-VSz8DcA>OrA$B=!$)Q(X3d0Le_2Zr$o*bx3fP0x!WUM2qi{k{Q zb+UdsdoHW3p+3o3{O`m{_E{a&%~6%d_aJj?+V4a{2>E5St5k#nhLGs&TJ$!e$v;B$ zdP0v>lfu^3W2+^c;x)L8Sl2W-^ux)GDlif3tfr217KR9z18Rj?-k?N4CeE5f3So(T+XviJ0v$yFHjq?qq$GA@@wYKIrv!sTaA? zfSoX@kW$^B+<_(^NZ=mtl*(q}>!|y_WE1jPwnq^>Gnq^osM2>8z3fBUUI&x^2(*1l zSs9NGF5(4y_MEKiylhewoS1~&pkzC@h5+tcp8->@&{l-2X5$b{~|u@VhD-41y=AL z7O@C0Q)S2g<**x5XylW4hjCQvc_bnoB131CyPcDn2 zv3q4SuDQD>Z=An&b>r&Gk;6mqivHue<6^=Pe61~Y2EF!hwo4^+&uO47K6t=0)v&vs zEy4I)%9iSHjrzmd=AGVy+GyOZJy=0n0wnYS7>K@{(yb`)%n@y`x|&|JVk$(DFd?Pe z;mR{Zj!4X;?l~V?N}z>Tun;}JPO3G7+qr;@UoQ696W?55LA6Y$N56&G^bjmER_O4m z(Dd}9zFI76In3vChFX6<@Dn~# zBV2uhOGj?K8`a5(zw&8u?^?~jj~;5CVGRzu`0WSFH*Cxr{|1_UtkU;l02`lfJcoAQ zk&jTB*Uh#1t;X+FK+~jU*KVuPL%V-94^0x3T$}$#%1wQ|1T#1T;u0-?ywL_QS9Li^aFrvPWAj-pYEAwt*V?>GKY1p?`$o0ktYZ<0FSmZy#n6EQHJi~-CqHNUkAYq>t;ruU}~HUDfm)^W4Og~kT3vSs73uBQxW{AlCH zOL5N?7;83eqFF&qk^%ok^BaklHHt=LlA z7hr|)Qdo^&5bhLNoPb(yoChddSc$;I&6>9kHUA{$7}pF+8~fT8Kl~1A234!Tx8(ad zx=$NaDn0$W6kpL7`hAgKv>o5oFXyQ@ZBeGzY~X^dJF!Xzj(8GbRjs}ZG1bjE!m4~| ziy||1S?jk8DXQwB(wP($llCkleT+mIYi%P^00nhoa0`@m;+%BzE612w;B<^jkzBfN z6=J1^s6xo82K~M;atyn$eq*!>!kx~v&{tPt1=4BXk{L&mU&gx#cwALO!*>8I4DZ0yF+uPB*;NJH)Il}8S`JW?4F3#YN+_AG5q0o7=g&VLF z_=n_~!Jeh$AiCJ?)sGPTkt6Y~96v_Q|7J$D7}O{Z;4Tw*T;-mX9GEN^Aw^IuG>Zj> zlV{E@k1oaYc7liGPhCE2$1UB!xpGyx|Jl(3WIVUD^!`xN z5g$IA&5hyiZ2H+(XH)!h3xr{YvC-BMURAB9fVU)lxPCH0nQokXjD{s)iyVmkh}gFv z2i)lz06AD{dXYL9!A!}i;TcbZ1ET5G(e+v9&h-Hv%=C~#-_xEKBPu1A(;Z9LN_+|mjHwjYabc!ZdKtIL0Js(Ewisi&5fmX4@_m*G5))RF9xYgc-*k(17m zBM5$FJtjC#q|<7)H=60Ka7(^#+v!GuLKLQ`l`hxBCFEo$AQ&cc#ok>?nczVttzIU; z#UAH1^9d`AF{eq+M@J-T>juK{V@KYak^3_2f~fkH*%${BT&Nj!`?vZ2Ij{C2<#E!+ zg^>s>?4=2wC?BAjQZKVwXT2^4K&6jOxIb5MS>e{EqHyc=_5gKHYKH78b}zia4%69F zENrz}u_1pf^nV{Yg2}Mz8vZxE&%pB@Yck=jZ62ePrh=xhD#II6#4j>L>I8s7wt8aqFgJGx?2S#ZADmg{ofo7g_D2~VKFj^jAfF!yj?J;tC z$4EKOw%fZv8ig2<$q=S{{|*umh3kmwqRO529gdJ{A}@*YY8|s>zkh}pEYM{w$H5-q zNQw&NoA(2~WQg2N>POz7EZrUv1$;{eGTw|e`=CuZQTgBuZufhGF0!bvgBxfBDI$$= z+5m+)J4bDJFEDZ+`U95{ksAm{2F{JF>xCl;Ud^r_d3D&!?vKWIQF)82XL@Jc>mA!g zwgSYQE`q>#evPvW&NIM7TGY9?kGRo=eBFKr83wH4VRIB&+kwM@=b#DC3qtmBZyRTw z-gx4;J(OfZR4bFA*A!hb2#3$F$#?qAiR7CT(KjdUnj!=Mh%nz;T4gcmm)rh(f156RbUfr3M(-Mm|wB@NdFqaRX?|4J4E>2MUYQ zvN9uaVgWl&1hRuRNRC0m0=jZoII?i{6PK-!=Cs{AvIRaPsa(pu^&um8Bv02%{Rp=h z(MNtO>N!hKhC=FJ)lRrTRag-kIiwK|A6UTucEB+HdbhV{zbQ>unYYp!Vkfon9H7Cf_|2oSJ`!_0Id82o~HUegKM1QT^JzU zwl>;&3&k3P(@9n`8>%fJ$uNnIkZnYLi@BPl*$$kt?slN8V^NS??ZXL^bXH1zR;7J4)_$sQtOsS z+X)VMdwy6C!B~5wjMU~%5h@Jdx#0D-z9tsu3_W7TAMs-=ZLp{}<BH9R;Tr9>em2ZfQ?BeHz^JP~m zn9xl_5>e4tlFzwhffG$1huVSEex)K*UY)msU_zPrs=&SrG^Omd(#t0{Y1yX}8F{P( z206!lSVv_94ur*mkI`$dx1aC$9`Sn9wB-uNPHidB@^vaSUc-^mV`A>7zure$Dh*Vy zjUHScJkmcdYFN;4!*VOVYics#I1}hrYl4APd!1`S>JWY-IXgw z&9D;FEZAh(MJf9xegfY&KDVg`BO66hjr4JF+EB5bzq)jLZU>8au*-O(GtbJ^f6S6} z-NaiywEJbKaWK7|4H!q0!xQ-cClXKcV61YdblK&$XPcOB3Rb%ee#hcvCx**8Mhhrg z>ah5MOHKa@7Ftxu-8bCS-){La1x~UCT!y!{#0`EpL&XMXDPSdPX<-|6y49pIY=kU# z>?<%^N1%>f=74H)9=gbqHP=8;Sg@D}j%k^?|6*$dP=b9!$qrW>&ts{18&I8kDNjqZ zhTvTz#MNw*|IoTRbNckjGm%mNO`aGkszp)~%KZsQj%pGU?Cf*r9RGq;T3-5R&^B%S zJX{H>fw+>rgjNoib05Z_rn9lT>JZe&K^i@gqE-p=3&+%gVOOqH@{LOm8n!ke&QQw- zY4WIN*RudujAH%cakI@JQYf3!b6xuz*`qoh4`&BmcSj2|g@eU*u(VY&Dj$Zu`_3!` zS>YZB%6`7F;6mey+bq1cptRnr@ zC*IiBi(PEedxULQ`aRs1Yq+Eq?S@yWl{>BTit^lu#3M(t`|!w!8KAb39wR+Nyg{hV zy-T=oLi0Tia7#|jE1h?#Wfd_ma7a}lZ?HZ3-c9SF7ECcCeb92cjaS|r_e3EsORuYc znAgApS;e=7RS;~JV6jBk7-fceQvk|ToT4?_u8Lc1Ev~F2)`6pkfO3jkZUhD(biAe@ zKIlfp6LaF>{2o|KvQzT*>2Y7PK|Fq5+7VjlB1FV1o70-Odz_)*-H<-u7}k>Qb=tY! zpG;<3?9czXm_RC;k?r@ytkBhMG*o}2YJ|=HEpfK@z3;7>86Q|fB08ljRZ6!JYUY0T zfgEN@Es7ofw=;43f7o*qW$FmseP9NHUkSzA(+_3Ua1;fO#Z<6t_-!8L!d^8WWw#AH z&v`rK>jXCZtnoHlE>-$J3i$r%#=FF#3||mh&W{d@%|@rHsXO?)reA9ODKw3)mUv4L zH`SrQT)Q_Ke**2?!>l04ZDt0 z;x%Ha&lHtkX#8FDm_z6M5I-$fz)Ep10N-g$0sO-y^9+e%FA0Txa#F$3WiJ>wa{NT& zrvUO}m2wdP|ESE&?zH5@GPL@8!ioyU6`1kAHU7zb`WAY~{ZYw-t6(7{PTX$qzSZRg zwz&&Vo6KKnbHKPIrcLJXJcrZ#MP*2pFqvx#(J(N57i03ba9m@avZq#Lm-k4ux_}XLE8Jp(wxA zXPaoU4e}lTr$3(LJ6@7RGQRmZ9U~C{FR}Riy!hOwq^yPPk9ZL1hc3+bF#xV8I1(gW z!dEfL2HGai-62=R>+Ugnb&NMFd)-SI@8C0d zt|GG!32fPU$vAa_@mMllbVJdBOaN=1+99wa_MgiGWJZ@H@A+&G;i9ByW)AnJq{50w zUf)Ar+)l>C9o#RZk+*>afZf@67uU5VZBgF4qVOZ-gh{q8rNIQWM!$*Vm-5!)io$pU zs{ltTl*f|vJ2XLZDxyX3{A*aAqAX)F1xs=dnS}`9)iEToO|XGQBQN`K&Aj50EE5z6({u9e*a z!I95tNLoH3gnboRBuKTBR1)MBGIN+ov7p+d&kEyuxr%9V4h8qnAE}FQhAbB5_bSDl zFA~pE?_fm|1dMROolN1+l7C~&?mk2ZD7UN0nKklO0xTGsk5QtuzR0j+D2I!JWO}Yc zgp1J==^O%;rCk-jEJ*~3oylQRe*1L+B#rV>%R&21{HuaeUp|~BI1Nc@V3J2$8P9}O z6B@X7Z7N<|qUpf$Ma+*7)h8@sgDxFrk9Z0@25>IUIl%YcAW!1M3UdhY1srIE;Hv^X zNA~kw;k`&Thph3fC}vz!bgwqAtNbs3Cq^m75~RqvtT{}n!&;^cdE&ppSWFY z%_O|d)LJdZ5U?Xf zrd93ju&jotPSBd}?e<#z?lM(D?q@v&(od}7WfmkOx)ykz@%9u2?|Lm{&~P7ZY38K| zQ|P-E`r2;fUeWP=9PmQl6QS=;yMuBwNZvuxCF;#$3rxEg`koAZcY8QOvh!?$XAHZ! zo=8B*&-Ya5J00Ea4O_h6gs!+7)En4&i?0hN8xp``m@6uOs=4wKAHztH{cKBGr{%SJzo zKIH5r>k zVe}L8MmMY779T*AbdMR2ibE{l+uEA(ZdR+i({3?UZ#*07@P+OtbE6{@1Dx8yi`Ot! z(Xl;f;lCqWv?bl+(WQnr%E$jeFYW|^v7bWsQ_1K^o8(KWT__5b8k>#Nu_fK((XI8k z1z+>_kjK3gi$eF)xzUAmV~jpP5(E`adkY772c)EXJUXuKL(B2OrxubLwx@SozpA<8 zUEoOFc;q|dPOhf_D2#q4kvh+{i19PrVsxA@bWfEXkstJjciqmC$DpJ;<{p+D`*VYF zr66RNh=3IOr`k@uEJKJ|1p!OC$E2sY%!YQO6;I3I_Fy*}ytrmkZI^b(VFUX{;Sj=%ciRP_ zE9sspJAdn}Vh;JapGcJ*j#S$tT<^r*Otpb*M=qP7FbdsMWfvh|O2U%viP&*GC_Aw- zF)nrrNa1cEpX-l=#O~tX+(x#0%ty z3b|WyNU1oSxD;G>)5mv@4itJu;IfW=C*lNv@FI~S#f&y*s|2$W|CC6ep6~p?X-;p> zD^)%V-#5n3d^_}O;eUv>o7aN;j}X=w@VlIMLXLcLPg?v>E?fK|FreE7sZWt-iDRce zfe5Khv}Lf|=MMSgSUr`=_YvlByY3(Xy^PY=>{bsBl-g(?>^%Vk@lT)1*3KNm>gF|W zyn*0vcJLk{Po;V)@;xg^uP*%x+Utu3UxO2v;@~xKw-3mYTR2qD@WLGn*C{vbN?Q%@ zL2cd&=|<#vhaA@gC1jRIiJq%?KPY9t4CMT0mJhPoxs`qHbJ^LI>`RuWvDtZkEgHil zTlykn^q?yTStKk94ZR1!4;^%)3)|I~=vd4ZGnwtucS4c0Kpfl~5fqV7vV|>p-Mwrm zU&>2OyDKGb73mAtitO~+nK}#tOJ`Ppz5b1nAE|=LKW&gEWxY7s|V}Q ztvHV#&0a?Z#nJdGiskvGh3`?Sz`lQNJnGIm(~EFM#0^lfz#25$Z;i&y{%|zDhPWiH z`MBLl-%ba*Io7xdQNuW={MR;49+A_&K@%7Z@?W3vU*AO7=zO3?zTpeLAr&x6%>>ss z&^TNDE!-6k&K}Q>y@Y?ST#*>;?zn#srze@_JIX*f@j*epHWETB%Yn4Z;T@pmh@kPu zMKZ?Udg8?&MkI?r_JoQ*EFq75od$d2TT$GS&&j*hL5aj_H@D++v(c+oev|KMjg*NL z=o$8Uh<%aq{HekD&&%eW-mXTaM1j#cDf`heaOKP@Nsr&IT)71m*MXlCMyTybgkeeA zk?DZYl7xdHg?3l!Z5(-U&w%wq-{At%4Z@=l&j)ddD8r6WEA#7Yn`N6o8=}M?z~L>Q zGrU{EhWH169$(>AE_?xLdPzU$$7gdIT0!`j2Z`!7YK|tqtITPHi}uE%=8w}?fa8Mj zo)BRtE(y++baZ&e1YFPr+SibvV>)L?Ac)71;m#zSg%gZJy1Cbqq01ax*{_E1zuRhM z8Eg5D5>oP<;*A2)>@n|+d- zU<9zRiNNtDja7F~om6CZ&oYn#=CZ_CRm zZ>JR+W1m~ql6Dlyp^nUO{ytZ#wWAaEm@S6UY1@dqcisLFblBgOS4;@v_#WONrrv(9C~_%BSej%3z;M+%UcY<5=1 ztNrz?1Nnrio77M}Om2VM5mW9jW4x0qD=WdSEyBIl+nx>DV?cg5xM%l)d-(y}pxquG zDO(WkS)7Xd`vAQT*Deo&6+lUYzRlK5{?Z%jpjWLkKuRGKkC587DyKMc(w{3*NGOkl zFDWvG2=_Tq^>}V8dAX-$8N=OH6AxO3A@64*>2{HF*8SDc(4Eu%uyPRCXeD3F!|}U| z?YZ1>1ar4TOUYyi9DAz7=DYZrXqSl*HO!EGlbtLWaW~|+jFfl;k*!K*t&idw8sl-s zhaWNCMVvhaLAN>9H}WQy?KEHx#9G(Irk~+0WtxK%vBWmcQfABYsO}jI3*d@!FCZWE zz9h9q1o4?$#@6UCQ{bk;cI@bpqwwKL4$35ZMeb3K4|sq$qsk3sBhB~Y`7K)^@VvoHr~YmA z=|QuZi74j_o?|SV#@G0SmcEdo+AK>ru{y*B1~LPzeiHteNkfAraoTdVBGK z2Ro~`%Z$9}6?N%h@`+L{@G(v$=xEg~flL&FMJAV~SwpQzGO=13-iDIbf#L9C@c`^e zQiRpbCgVIM-3Lp_>Z%@_?IIo8=8}UYP92ubzj*DUxWRaqnxa%IE1`gjaOIHWmfZ{* zUCgo*35_nssOy6&`_hYpNtAPfoKZs^+rySJOKIo)um?(n4dz`VQ{8gtJV}{v&NPi8 zWAI`xj6m3e1Jo45&R?^95cjsX_KQp=feA=hiZ&EB2on(7_VDWPNlX@{;Ix9PhB9d= zIu(}V5}6`N-rz{5J?Ov!gPV;~3`*8B%u0&aay$VEGuEgI-WGA%*uS%1<>nl-HFk zJDnp09*VhU=_mWDEwAP+_n<;!F-(LS+^8nq&q<>fk|7OdO?rXPyyr@TA>6WqDy{x2 z{4G~uTy5i&6s{S9hn`puv20RcQh{4`iW_*Ho;-?_h$s_vTZTfXp0g<+Pb36=$x%lu zuV|2On4QUU;e2Cp>dzNN+2Hpfe;aq3wy|8G;?8$?)dv|**yd|j&o}VWxudq{gV8sg zCocs(iZBMHn!M1l#UoOe+0oc&gP`%DwySKicZ9vtHQTIzs1MK=jCg$05 zCzlsBsLw$GjMe9B4FcRbDtsVb&SsmnzQiAnGcL$(QDKu8S1kF$MV09ajpE7>0o#=0 z2roWO4D8F2OdK3^%d&vHOqYLM0#~|S9bL0cC>~P3I^QUK#^o7*NZg#Ln8=3L8J8~$ zE%k#m8vXFGO*3Yz!i0>LCgo98o%mj2eBnQiY5d!c)Vw6TV3bg;i1Hv|-dXWpLYCRz!RdKk z4tM%yi99;Q1h^#iO+Gb<9zZOf@*VxmQXo@O4e$U6J;}bg*DvIwNI{yN7(A8a6Vo8F zPixKsOJfP#FVVG%wms9%&V-XB2qUSb;Fgkx*1c1f# z1ON!Jmq1tq0HS*ALoVcYodq#?K>_H-lnlQhfU}RoquOLfi&aOkILAPp|BuzTDuFDm z!+l+%7pPKTK`N(*LO4`Y^=bQ|cE@N+YYIk}VGCV}0tKeC3xSUF_)hK_&{Z1BkMOA( zm~~=bS=j@G)Z5!bT;J|@pr0gUq`oWb1y_zeGL_ar5UFUjkUz;H2+QZMU)+DS zy*YNnm?meYAVS_-wAs{6?tIrOc^JJmYPC{)!2qtr#I3DHd4_ocE<9}vKE|=QvZOi39%asgUdI} zaZ37NDA$#p$bJ6A(qQD3{*$^^QK}&oK|at0$u3DVtl#AC&ExB5PTgXjcIOWK(;V{5 zDXE^}a+o{_QzZ4va+-ocz7~!lFv{g)HT!ZI2G`u>4OY@&MhRa=cD0Y3@C(wo54UZn zVh$Tt4jh5Lue5}FR&HpP62@9U&B||eyOyEnU>!&{Iyp~h<4{|~*4Wnaa{Vnlf>qP+ zqa%bwxh{*I6FJDu_9BB|>Y#MyIh8o)sh~T`6|2%iNG zGv2wEvqs(aqjGAp#ciXay;CCEUday;sci4qMmgeM#eb_?b9;+e{8gS3C42%hdroug zX#by^NLnHZ?9Lzi%8^2gX4)1VeIJdKvor*ugI0`3voDB|^0;M6HaMK#b+lJe#LCpL zCKrb@CUm6c&rM<34Oo#2+CvQ~t$kHEE>|Z!W4yS#_Jo%7tSwQ13*1yK!?h6Qexrjxqn>m>?9k-8AEUHCslnnp%xWP0=FIJqMa&ShWsW%+_YNzW8M^8Pe)fAj$Pek*b1JJ{f#}*2Z zkmj;K95j+Dk}|ppk>^0Q@OetB1o|G2PYlC(_dSq9sK`rxK&M%7aRhFHh@^gJKy#Ht zby;J9E&8Kr8p$BqGas& zHoy_K6eI|ow8a}%a?MLj3;)UI9E;u_ z{>%Gw{*T3JYA1yP`8NSGoF_Dh9763WCI&-1K7xCJ>d11Zc{LWHo=bRew9k0G=P~>R z+BedvI-mt?N}5JTvr<}CP5R*TJ1;+A7!`*_=aNE|wFCA;woqVb&}v}?gy^R^SI$ex zSm$C1QBM0hb$?k|Q;L>-U*=4UTiN%8%OG(ZSPA043;xliBe#yk&koqJX=1)T?_ja| z?#-V*)ci|_P-Fe0MNmn_{pK@=o1Zw0hF0g>rY%0%dUW1(aKGVj^IvB3?@+i2t?KYx zxcc(P8|!HG>5|b?o7Tbo)Zyl{gj*}=k*FfKC|t+yJKXHDqt(|gqdtkFwc+hig#V`T zKcdHHbf}6R(BW`d;g+JC(f`|giUj?H_DZF|%mvp}iq(JRqg9;tRr8ylIMjTZK&=#g zLVV0x&$@1=|Kd>dk8q}jLDHB+1!6td_W8rj6Krb?D4nBT&~!Nee&e5`{l`mZCx>F! z@Gms}VvI!MVopWtKRnd@1yHF$~+W5 zg6r1d@V^{t{-1>Hg(4+!!nWpLKGgghZ2ZYGG86>=$MkWJ(zZEte^%b7u+sSHGM9?3 zZdz9wU%>D-tui_DL~H!*=EovbbF|HotN9-tYW|W?p=uRTgdE9M4mD4*@jQ08R~t-z zzVT4=TiC@gPiM%q(tB<(HNLxX84W*GiHP1IakzZm*7S#!$_d~=iw_Ig=Bpq~Fi}Cx zLx-B*K%C1K6s6g3{|=Xp!_DudI9rDV7YIkkm#}u+Txon3&C4{5bAUV0|Ljon4~WZ$ zbege1`&l-B{g5i>O6ioCg&X|G8~;84n%L)Y)%byHy40wl>37X%i9_}Dq2@WFy3ZDo z;PTsz|NYDF%6lW#JLp^g&D0ZBs1CK&UTU9h(l-aINeRi2ET zDh$)$+M-ky>sRxU3L02jmq|*hc$0Q1N{PPJc4ZRf6|FWY)35qXC2v)cX`}htRNL&M z03vX+;_EZmgTL9oNVD6W;W?V${H~{-;vt-S0`f{G*%og*$(=a(0OUAuAowN?>Y+S=GyZ54>DB@AU85@>wFx>9D1vg zs&@i^9{gGQ3y6fk6?VYKXPXOxwgQ~hk+&ru#Xg~N#*yK?&`jf23%;cTM&fA3$Fj25 zF5O%{X!k&T1r+ehuYJns+LA)e1SHj@yq1L=1*MYaB=tN>M`=Jd*Nlbfw4nXMzmJ$Vfb_+`|BASTH z0D!NbL_jXlENgF5Ury_Cv0H_K*|un~%QHCD65IPrPws(whZ)`u!u`VI4{qN^!HzQa z>iaRSxy!AS*>YB2xOVZgycTO-@ep)_H;UnT5sh-Op4{#4wlv+MAUFd5K5ldg_E;Qp zpLw^vH^7xgxu4Y@@V+`ns5tnu7)ck$}P zc0SKP6w5R5;3Cu78&pfV-8Ko5i3dB?NN|bjDAeJ#<>*UPb#%L7{YEGiz0nOZRe|RO z1uHlQ%zYC>dd=DJ7U0E%Q)=CGF~f?iyBNObqSP|lY5 z;x9{TlhWS!?w0^EncBShD_LH+<`nB>Z=*QjN?49BkC{~_B4m3mRB%bY z$8~>JbwR{j5|XG!4A(gAN(1U_xz0s|Eknv1T0IAk=i{AJX+;!&UHQWI47l;MX)Y9JtRToF{f#>vZC9>Ol1gYN`Nns6C0*21xKm2+KY!AYRdh*} zx9pu#mGQNGAz+QGs@w*3TFWiil&$a_!*Vo3_P2P9l$}XidOk_8xdbQ!*YN(pvDm`v zZxw)Ji?*g@VW9^Ux#4Ijh_Hs_L1&ZgYgcYlgyBI zfqE*e_9a~7#`NrDDSK82mvX3TPR3T+HBHtw=Ld*v)Pg=$GchvM@){AXW$6iCi|buz zt_RqY)bij{fL5OYoW?yxJYewy_=NhL)8vnxvmt;kB9T|@LEUsm{)l3Yyt;_wKxQ|C zt%J4dsz-Q(kjJjBEAHV6dqtW_7rO_mky!sHC#E9i@ej)$V-+qa`)2W!?PO4wlU;4; zvhQ`x-8{cid$zlhUFLtmV-G|rhGMR=r8w-RXcY2X9T-&2bPa7e_z~Oy`vCAo+LSrI zm*>?&a%8vYAxKK!oK>xt2kd!*(~hHKAi=`oZaYn;B+)GxPv#r zc4jC)AY#TNm*qlT*5q|Q zkLw`tUukkupvdK{D|i5AhLncrN1B|{Sw!^`q8188U$`j0;$;Kr&6_5oJmbCB@RHhe zPwp%mC>iLi4D>Qi2>07)Greb0^CPI4Q!lR=g3?jwrO7R?8dGqI?IPK#eNRG8B1TPJ4wDg0(=>1QJ{v7T>csfTcv%TJIF}pJpdd#`{V)l>o zDXZDzdkX$hdf%dl#>KFXkBv8AI4GKSY8t_`C$BtZV-XM*q*#JcJY3KnUgNn736K%u z7Wd0JaPc=yhpszfaFs z_E*rS!d!TVaDLMRx329Bn-$K>ex4a0T+NmZc6P;#2|Xf-J2Ett^(}TV6$nl;Vi?0J zCCK&luxO5<+89RV-r?OVa%y+$9jAG0bI(0D8b9}(m%?Loa7Z8Qve-W9!4^v#+t27e z%y8LY;jz*O3<%R+K)v6`GZ-+U#3-Oq z9zCGq@TbT*JuKIq7gWQ^jPklwk)$CXNjqM=C_1Nv=U{|H2&6V1{^09>H2%cNif1pK zTYs=un7z8Hu7dTktJm+_oE^Qi0ioW5UI)PgSyWm}x%VKS)$9}rlC;(6^{j{P5F%Oq zKA5=@xGbPW_YvTlku@8Sc{sBVCEy@ODs_Z=iA>!`YRS0~Or`p^G5c(pdmZC8)M~}y zg%*nS;4Xz}aaNzaJK5XW8VwFQGM7)>T~34-K3)HTvL<}u=`*qVLCgLVM=>@oUv}t% z1l%A08{cy1DgM0kZtW`{DR1espBn#V<9CpC^vUvOwhy?3rhh0Ysoz!6)`ZqI{%rwl znE^0U{gQPJUTD08k-xn#zku6cZ2T8!@oh>x-)<5be7W&6Xz-~Dgq(VF1O7(izenqj zc|eY!z%0&fZ2Y}=SYodF!GXEbXadYfi(t}bf2Z+FXlD6R(NJlY?+-S91g&g}97}C9 zH`eDRtIzUUY(J|k^j~8*u)8MZ({w5m!D~UV?dfpN+-{QVi;S67o1X-Js zAIn(_4ws)0rj*bpo!ZYg{x&fAl#a!jJI74#TI4);KwoWaqV-1{X6Yv28hx?RL8EW- zAOq&lu)Ac+RV|3Oe)S#X$?YfG+Nw;b^_voD)-Q@ete@{IyV`7y&}xHy7O*xd;fcwt zem_rsv_+*j>(@m&*3ah%a00g|Q~GsIUiHJgnChny3d!6`=5F$+{q_|^ZB`|L`fVh7 z^1&>Zc7!~n5BWSHpPhqjq;L5S%|=qu&2CQn19<0=oKbj@<;W4#0!+#icsR0W^Hf7C ziZ;h;HXGXCNBB27?jX~FUrPWHiF!x~;58#9Rrs`ClGl{W5GqLvI`D1!6?t6bpm%3A z`Sg7t@zvx`2T3py~ZBB3!(axN-qRD=tVbEhLPT$2MQaU{jz!o6&SLoXgT;w1F^ zzbP1o8+T0K$ak>kJ(7MjOI&h&O<*LCfaLG!8ji4J_D8O?RG|P^c{pt607}po!t$KM zpR&13dJ9qX;jkkQ5;W401u0uee!(a^>AN78xTp^L>~R5ycBiG?0rhdHIF7-GzSUDy z<8P4$xQJXP2K+g;crN!1P`abI4Z@CLwPOLCNX6w`G~yk zcOMAvWG1?hHbtDiFNC7nD=LDwZ{PZE-%$ssInl#I_monkUqb`|RN77M^BG%iq}uLt z*o#~{mT3QyeGbvJ&yODm1nFziW+0pp-RX7iIuU{on}5cV#J??#$TAmq+EcXBz)TP* zfJnBVg~_ksJ{eaxE9Q)YTTr%r0MSE9I2ACphrt`g0)ZznRWf;z_&)LkWu}g0Hskz4 zp=y@_9SwB3AYnbfkZy9hP;|6~NZ(*I-0n|jNVk@UO}evT7X?>Qil3yC;Vtvt+iXn1 z$C@fzR<@p`nw0c4X?F{(jx5sKGvui2qdL2?6UZT!0NtGo2`WnW|DV0LkC8h+@57Fl zCbijEjx0;EPPQ~h`n*GloLllbh7F5YIbLKId{7=>zSP+X-P>M zppo4u32a|n+d*2VK^r7-)AYqQ8pJOJS~w00I4?#UILSY$3nWN^HfapBZUgl5d0xIR zzn7U=a>zTLxzLHbGvC+e`+T4G@AKGejctTu$~`BxP^WBM@bDa)ahJi7Hd!+EygP*P z5SR|l5tqTzmnCO|>z-U7z*AAekAt0%IC8otq*#2iT@CsO*T`{MHlyvE{D(xCH{sJJ zk=e=eE4?Islsp7K$a&}-v6t9tD5Z!U)@~AY1v-07uq@S@C1{Kh?hhLK?nFXK(Kw5- z<%0Do7~F&wo15NiU%hTO4bIbO*(}~uIGPMohac6E&N7r5BwRBA4~`2;Edzqo;1Oif zG8HMSaGog{h>fD>Zh2=)tG3mV=!3ycw_pg8Ky6tEAA20!1nwqNY!CW~SHV^4?jkZv zU?Imjfdku|!lxSB$i#%QbXW^UqYG3jz zTJ;aE1+(KWTd-uPz!X=hoSEwY#gT_AQYEd?Jh+938x9coEhv>AtiUctKKp|r*##tG z>;iBdY)PaiC>$J&Oq?bQMH?IeoQ`}WR6ZBk5$usnEsK`09!Vt?ZE2E#w*eLMWrq@N z(hF1oYsatSKFSm!Q?(uoWpxZH%ZLzADB}pQVQaxUaY-Rz6|%(e$8Is+gMUSYLt)8J z%S7=beDKWjjRz0faY?N%>W*|h7F9BSW`;_4Sw_CdFNKrxe z2Z4L!j|BIKRTPJFxffwn_;FX^HC_-27`=- zD^PCmM5m8rk|;xS6nl`^BbI7!yw&d`jrL7!6(o4P(;eagNRM=pbxUg8}C~>|fWehJb|``XQXo z_fVLq&>rROo#773f%@ z_XV5Ho=-;9bS2)fa+gUv&Rf}rAj?+hBgW0h84zmxiJ8H!ARu~1z_uw%VJlmY0oj^na|wtnxy7FKiL`#A)Zx z53AG&kLc_HKS4ehe^{+HFnjfyy0z4*NvHP@8z%$Jn zXi^#`d@HUpwZ(HB``RY7mvA?V!<}rv>^XbL#MfzKl33*9Hn&eUzWmi>BwrN@mT)or zDb7+RIT3 zH}28MaQwy z^UIFQu8_PC^~DKDPR2a!uC|)2D@4bRnb)K0ok}&qC$r zs*#If3{ic%>Mg?wr5ZvE3XLp0D`etCQcwx*O1=%V{pJ_ifpD(Ia?+f=EPL~ydp>>E zA2)L6nAPJVZ4#JoOVl_Gkz}vHHA=)?c5EZ%98Wk)Ko5?BY2YjsPKoLRTcyzI_?7(r&J`g*$M$dhv0Hq2epKs8-A+53dAMr?44jsoiGM z>=gBG9pF8qck43eE8cbOikf#_JJYGFzRon;MccWO0}-@#%%b)^r=hCfRgI_uW~;22 zJ-ZrF8FRhbhs~OC+#pL7Tk?|nPpVpryx$*J?>lWMI=Ij4Bk|vY67Ee(OG`CuZDLa*?)T-v>;;^{cPO+cA>D>79y=;GBK>Xh-S)-$y6s^*pI zcvZuKK3>)2YPCW>vuOr~RKcFvD`5CyJt}na`r(68E)FD9h37R7O8K0IiB>+pWsO>1 z-?5~ZS2e9r%&VGJY3APU@K;EBJkrf2cGk1syjOMeN6KMl_*sT>sLIb>m^<{wEo|?Y zr;9y2rj9<1EtQ521IdDxj*a`ImfI={nrcBW&ra_FD(2a|(MlA^_FT=pGTBWrh3k^l za$WRXz1;S8Z;E-QUN`W@2dTJn4PC5J#e7c;I(=cA1Dbvh@6NPh+sa@4d<)VTmohND|}J>#=K)thPK(4iN#CTQ!W zm=kQ`>=+idCs^mZFeq5h#ViWic=;BE2Nxu`k~#Dl$CsHJR;(W2H)YLYT85SOpGC;q zw`YA?xp3eiaDT7;zo6-dvw>PhdcDnU8Sb01;o@XJ+5Wd2A^WyC!tY3%j}+PzD)aq% z`!_Mrx8_Sx{_890wMS_3k-UjJjl9tfNmudhd86vx@3(Jp%6wheyxzgmo70orf= z_8&)>;A|jkn;Piqmj$p|k9s~_*u^!CIN8z?QDqI==s77RPx=lBFGSt zhaU-%hg)KhYi+@mJsKkZ@TWeUC1=o)8&oSnl0zV2?JtZl)+9?Y|Lmd>!0yT4) zjbIjIh%3k8s<_qI9U!I_(Wk)yzQ|gNbBwVjxXTa~h1E2CIg}LzM6>}UP1IY4^MJ^L zY$scc1v-a*)hSG)-QT=X)=||OF{{z%XP;8=e~Q)beBG0VOz+q)Heuxx}) zBpC_$w?GS%sIv$}1eU!Wq=i5bqMQ4otbHENTD)l)!?_s*G=$C|sy8%FMQR_l;+S)I zCC~~3rAlk{sfUB;Sv(y0C;B}8MbH#`R*P|WiVkg2j1PE&n*cg zCRP?tMINOm14s2B+%zKKqSr(wBBu&is}D3~8bx}229HDVwn84Gzuxv-9O2zN9&sh8 zzlJpOs$SA~HboGIl`nR8;@On0jEoFwwk#s%5DzP~W7T<*sfv#+98n6$ z0D;4tk&8f&?$Dt*PjZLcKY4%dk)P3{yL49)f}E4zB|j+-rCi>962a}J2HHcRut@vj zy?U30xUjDGro>S5P9YwWfG=SlhopIOMk2~RI-$E0wTtm5s#+~ersMeti!L3{r&yRT zIr!N!ot(2RN<{$sgJ>_Rkci9FheCe7L?o2%l}b?Q{#dp_)zJbrnhc^_nY|9S;X2Cl zWdRVnk8Ag3TGX7P9fBo~uq_VD;*BZrp}-r~Ts@uu>q zEN0gsPk75zVU4ax4DkRG3o(R)$qNQ6e!w1@CB%*@3}y2bM;eWjfnaaB+i~7K{h}fY zNhw9~Ji^vzAM~;#7ayFT!4sydtx9ZkD+rr4RcG`f|@K72fGo`vr8Wn5g2)c%QGee`3Z&1@`HkM(sQ3Wc2|{t1HPx-mTXjqMOxP zPrK=D7Ne85U6b_XA1nbaI!eApR&GVv)6tBg!|>*V9c!P&2B#NPD9_60Pxw+QK| zImPkjueQI4=1-QE*~*)Tm3%*)DU#v4Vry@{`p4h`S@h7g^@68e+qen`XRo7(6WV%l zWYG3=us|DCoLF+WwQZ79)i(2wQ`;?Yj?!>i>xO}c=39e@W+E?@Tl9s%Kl6>3)jzZD zZwz8B93;r%zMz#VA~n>pw1C&f-8n~NCTymv;}gX2%=}Cj4zJrs?fEtqg?gIduMrZH zBKLy6NM{b5zEngkJmyC_97s~khhr@-YHI08pKBR74yR2!= zk7Aep+XLj$vnAM_L(B1K_rfkVvOseSaqS_u&j9IvG;>&aG+%ZG@uc30Igi?lB&B8j9^bxwJ&=3w9B>0dBph6#b=#oqV6FEhk zEFQ*d)+=TJTE52~QP1z+yaHD&sbk|6aYdkf({cro)QN}u7q(%d3Y-e1Y)RYRfrOP;>>t>jNl})$}c!IDyqaV|mDeX`Q|kyaAo= ziv(VHDz^sLA&H5&5v9C5Jj?1*20a-fPfYNyWpRdu_e#oy;mDRQppiG8nw))VB9E5j zm5z?NVe)nG`st%XlsuBk(^eJL&HB<&(t|N4y8NX8Z0U!xpO$^3Zu#UXVcMQ4yt=)R zLYH49kKvI0YcRQaNa#?!J3N5sfw?;v**1MAnjc@+9DSAUJmUsgWk5vy!iit!+ebfj zU=x4Wv~$EH`1+Ux0{XAL04;ejZB$jN6zX&ls#DQB`4Ofr!qU4_K!Qc13TJDd-moEC z)R{I0y_n;hV+WVyIiEVXi>-e|F=YgmL|&e+-i|6Lhb~~YEdwY$5l3n$z1F{tSBht? zQg>mojW|1pVK3_x$lxJiC-_TY~xV8?}k*qxMo#hTZtaWL5H zGr8=ot{N;P5FkJ%=y5t!aD4kplgdAM?92GomKA@EPyFL942FT}EdV&CcTm}38s7gR zO(?Pi?fRJ!df!6`vcfe|=ecCl!d8%VY6G)2PZVHTaq<;g5ngUJb>l9)Zz~ZWfLcI6 zhf4lMfMMup$e8r7PeM~W=wYwvos7~fmr?OlkEey+15?m+8M2<`Pf1>)TxKS@6h?w# zeB=IBpLxbSmt=raN*6Rdv_?2<9_vV)i&idl#)sR8WM@cHhQWLKlKWUf&?m?zE9;9j zBI6y$)DYbn|Kz8Rij$h=-7R-RB!M1{-zt$lqi#z2rb8|I6CUCFdEe(v9zCubHZ{cG z_zC@WIYmX(N&)3KF-KAsEGD8H$9(*`2Ps7dD9b4tx`Z@!!yTjtPzr}*qv~USA@M_4 z?@?b#83(luSINT-B26t8X6ToV<{0^vtnl2V{&92^V5dTk69nJb7$1kNGIh>yy%G1K&dlq8!D@5NK~*653`$aFcpmObv_R$YN8z#rdi# zn+pg#oaQ}3^Kfdkra)W;`;@{Yjpp^WD@lIvfTy+eZmwj*DvhZ3n29h*rwcv}>k|1S zOH;HO4Y9;ZLU&d$N9ISQ3HBrDx;{yYhqmibUT;nhdVH#dm|>pM0HF$!Y+f_T@9d5? zA+jk~hLU?=nrZVh6HGnqO

IB*J&FkT3}!Ctw7)VVNvhR9SF&NsJANf>Gvz@n#sp zDqb1g>Wkr2S!z4(*j7-FD!%ofJ=tSc7M{0SbHa7j7fz~5LIo!m{ zJMM&aW;iB3$N#3oG0N{TK~|E!=sKf^g$@u#D$OIP{+jtJ4_Y4zBoYUHNdy9*QQT=4%=^> zK+5Sm(9C*a3M_asm3ki(Hqr$fHSzwcGbJDfSqP&%Ac24vP^A9sR6w7lK1^7RU&Om5 z#Oz-n#)lC9eRlsBPd_v@R22(~nK5&I#m>_H&>DkJ%YRL*FuLN`iQX0}4QWgMzC3Up zGd;m)Of>~q6sRZ^Cuf#}CiZ0GjdbH+ z;|tm6xVXv%33wifVGq3+mbx$=N=YnwZZcu)wTlqOVCGUGMXU}q37ot8Mj5MPoc~7_wwbI@KhAgK9OJQbaym7{9 zYJ>fm5jRe2T;UNvn{5H}6XL%)PcZJnIs$LeXCAGg(ObBzP`dT|7_A}1?YswRsEeHn+}6J9i4#$|lxV-s zSMks&S>hNZpJm~9M|ikP4Mb&CTox&R0rk|FhRnbR*iblWyphJ{(>0eq#lu^DI7jhs zX6}~0HX^&zWzOf=sOSitk%T4VC!XQJ9AMT136r79_Q&U#S{b^k1Xms0u|F*=!~QZ| z&;F`@7uaC3bZ#4Pq6Gmy8&v;6QgOHwN`Q!tv~^L&ZF=y|SOO0WmikescPLu7se@|@ zG>sqQhWR5AGc3tW!$f~?{~#GH(eunkXJAm*ohq4%1st0YB_k7ewLp{;SWktUcGTaw zYE=E)ky1`rMzMzj7v;_Ij$Y~(z&xU#rh6{-3&HMbHx#e63=Ahx#%_FYg0cp}2Z3)U zO(bizlVe?VSJ-(VViPcIL!8kB=8o^-^X@KW6e{Nm4?sdKRJl}FTxE6if>@TgG#;Xe zLZZ#!bYMpaj#hk+Y}Xq1pz#!8^i+fq{lTwAsJP92$~PA3164e~X>uQX9S$Cu3{g>yQZ{LD^zkJ7=`@-!Mn>7@{C9 zTEu4S3Qsy;StZ;t##_jS2HI zmgwya8*(Bg(`(~^8cH#Bn$RJ=Ew06zH|QGkwUT>D%o`^Y_}boBiuxGpNrHqmZMO-Y zB_XO+$FUgn6bPc}o84HBuK?9+2cvz9c;vm>0B~vGWisylgnUa)jsZ%=!PJbM0Kq{@ zjkeLQijA;6F@irST$B|t@DChHDTmRN+!CT6wqg)sZjPIWqi!76O(vTca$#0l;#mOz z!I;l=au@rwOOto{O7vb-?yYd0mIL$EPPFSkA$zf=ar9yulJqs1*=*$^9uLWctj|tgI_}Hs zw{W!!+GjD+?O%+BfmZqA(gs1)dFHa6> zvs=Jebak6hg8XZPgF9y%uS+D#TeMCgghxN+YOCh!PJ6VX*?jn`!9T5av?J=h>dC9p zKrn6E;6k|$t;xOhI^ALeydQ)qDP{TqOSU#pxEY?FWw6nx?(<2Rrvij z6k7YoscGz*U7Ui}9Bx8BpMRW=aKWxnVFbGdr4`GaL4TAh4rV|3tk8ecZc1Sf{&BVf zYg!n=uSQ`6`~(EOZtVv&sl88OKUVqPc}TRSG>%dH~)^h8YJ4VWUZ$KPL_JQov=Rr>7s< zA2H~Ui{Ovrt~T?(AimlS(9iv^ivEUW*5CeudqS{RKh@tO8oBRVR&E=(6atN^V!B)? z)~Ki~>MD&IHi_%Wb5fu$n%_1g(0Rj5g;f?v_(-JIDI&0$Ntu{{QtRYFbn77@H-ZiE zet+v`I2{5Hk5CjUHGPhWOd7s?2 zTXhJT71Zz6!)jblEUppgazP8&7y*}ro<>5J+ox@)mi`O!mqT~_9x^eBK5Q+uauawWePbeA;e6G`HMB-f8P&&ZxZ0e9yGcSoz-l zo=lcbM$NMuNSokSA`F98)2Za&mk!OtB4R|uNq5R7#&@}JI+VWQ4-^fT@n}Ga==`{k zC_%r-!;cbrZi=~fhCu%jDvy)@-Ws4}MH6t900qPBh0qNqclI_%yUUhPHa764PU?@}kZm2y#T7&u z=_i3Mg-=qj9Xo0%F~3vE97Kw$&>9m;-}(9<0JVOn{TJJR8<`f5&F(^l#yk9S`|qH` zw`qsKorB}aoBi9)M~|SL@aEX-eSnkP~nCHIER7#l9{*%LxphxW7W&&Juq@+xQl)Dc~3 zCGLR9@+SB?e)>q~KjS*SrHnga>zy|ZVI09K;FzKAj|nJ0kl$RN@i&fiev30&cFu~O zr#I}19JrlI0D4^7GY07=>yNl_$-mtG(Fpf?+z(T<|E^p_!{V@n(k=YVkuKOgD*v*d(pXm14YPmzjB!rH~C^_!=e!*&retu0Fg$m25K z(eD?e%i6f|Qh8ZKZQ|D?#ej?sYqN#PuQqpqy)rGO z9cC6y)fOdEsvplLpxUN_Zt55F$z?W4+(ZTZD^JqNqYhI=74;iG<62Uv&5AToKb=GR zv{8xX>Bml9swTEOstpZPGbo(4t0!#vgel$?=$SU0N5-^OJ%us)l{E{r#j`ef=yQ&& zWn^}uucH+Sm452^p{r#>oncy&YZ(mmiI9XjJib7sOi^KxiuvOoeeAJ3>96__(u}@W zx(wmR`-tF5SSXoqcv2Bk1FswRV~R(RTiWvq$$aAyp%o&N1oG|C74KXh#&l%f=yejZ+PhYj~sj*aQnirjOI|=365+XR*B*jc$(F z$f_Wrf~gjfsvmS9?PcoFT84*LLSM**MYzF(YgaF?(3NwIFMl<(iJ#wC>8-qhtCPO= z!G?nsGC({Kpq8RmGs(D=4!2br4gk6P;RdDQ0E)XG?q+E?oWxxWhbM`n4c?|=^hNjr zqh9pziyuI15cGcHV%yljOBs8BRCvH~Rs8q7x@ZDv0uFs-1A^{#pe`sYQv=E`>?9m& z>Ly;OCozOSDaM$?)nxcaM&pjfYtQu@RQX-6@(ZR=(x<5LhFd_yVC*-&pZ5Q~36wF#0AKfwI&C8vaCq8f1=^Cq0EfmGtcMaP_oTyz zu!qz{h|C~|mbZ;q+_*d3=_^dQ4zpoy-&Wh__H?Lq1d!T+DWaJ9m8VH3L_9MkO~DVw zfHUy(v1H1&Pm7H!>s1*ru~3BD9mFnro{ZX~4HcA99s;S4o&e@*d@Bowo9JTz1Wg5O zKkIM>DY0eaG1%#_4iCDpw`6`UH=gRf(RiwN_Nm@6 zNzSl;%g+#m09oX)*ZX#a0gkhdaJN5f8cdU`JnIgJVdDwf0EM)TFy6v9>06hh z4WK=ckS=8V7Dg@21=KbaBK8}6cX|hj_yz~3kPO}^u|@?#De;HkEy;u!2Z(cSBN1Uf zsVJBb2I%FHiL=ef{F90e@%GA>5V9KuiCx-HEXYK+eU7}Ma0gP+T^}g>du~E8Xc=nF z30o^&2c3<11bPGEj$J?q1K4Y4KZk&{##41&XYnpS9EKhWqH+LGfGjx%pFIqc5-&wP zJzdIfI&x?#Uqdz{5GVXve}Pz%NY5aE$uN0PRdIkX2O;n^;K4dlmu4-#nw<;Kvsxrv z$2SmT#*!37Fi3Jt4-cxaIc&zEnW{pDg%WW?;i?PeAdV{Ab@;_-{1kvXfCy&jzo(28 zHg|5A%**Srw^;fi#Q z!Muk$pkq4oDV|MUROn;_v>vxRy$HvO7eVTkn(N^jk#$Wel`7Zn#9VDZ`?cVd%p@_e zf^gE_`X}0d5v|R?lnsieUl4uFo1Slf4oyGg=I=zri*Cv9&xT9Iz@qQB-EF^x;es_i z84gW(^^`yP><8^Hqq+N^(%rk%J&TAA+NNel5f8Lk)s6xJ)Xx?#Xx^p>V?A_fGo9&xgMaQL!9OPtn>OtA zCwy~1`=XXfy*TJ1wtI3g*n--$g~Z(Wr`vm4U$-A!n~uk@hQdWao=8(;C{hJy0qM3m z(SWqmt)jyXw?6ln8LfeJby_TG%3O?@L(X2e6nuCU&9p9Bp`E=k%tj=6t*K#}`|KD1 z%F3S5LWc)u_}9^+8=bWakdt%==}0t!F5TfJIR`qlgTnHGoa&OxmS#;RV}s@gPsEbv zR4>?7oPBV_B6bPqWanUohwU$udz^8L1t3^qw`i;f^K*%f2&I}7`5PUmkPZ8iP9e<2 z7a2qfiUVMp=J$a-LP-s-AU#iHn5O_9W9SFT9X_R2R@N7Blhg=Jior#ynkY}J>9 zkn|n^Wq}6r46o7Mp@c&t2^|XvFi525U<)An25&368u8+Z@FzVX8~$8_q$iY$nN0Wg zV980I&>CDTudWV{;&@zXa+)S(R2}C9R+r(83KqT07iPPy+uKZUnD^Da=DW3B9IM=h z0J!;7?}Yd+M2OF>5=rn30%lNfl-EB?B&-h}2jalemfAv;VxFlTshl=Q7Y}$o`I1EB zftJxNB{^p3@`u@hPIRKGyyQh0G(MN%XGrfL2uY1s$&8L;$Y8Uh;0jz%m2}7?ZFA*| zS*PDXT@f^A>OHB(4PzGOAr>zzn*W5#SXoBCiYX0+u& zX9qQ#<~>(S^K|>?XwFC;buCN)!|iv|fb79+1AdF`&~Z4xd;|uCPU)r0aj2edI*JRf z+Tp=2BXh-FE=E)xAM5TM53r#_;n6b!OuF!u`U29$+Z|I`twnTfuDo;s?(<}o36WTo zIOCBc(5PaSMT(p!(g)g*aa67}SrAah<*_Dj%#GDIk~Q87A=3k|gX$bgW}U0RjKG}f zo?N4Is7p%UU3Lcw;Pw$_5l8ui}N?u(8u0!XQmjXJU>vdFFj2%6_(gur}J;yTsZ~R%gwmoqG^v zp`+18rX+)9jO3*+l7hnlB`yLK?~U89 zyN}cZDz(CSr8*dTa`4SQL|Dyl(A}n=LbDk_{sKAo*IsEqHkNIL5;5d2bOKmlw;e%}1}lJ3 zOoHJg?Z#w+;4>N9RzcW6hNpB6Po0E*Q0q*`kr6`92`4!d&3Uj7ccZ`;_FDKBFqy!y zureM18yK{?hkWVG@eZ#e2FGCo0(*U2BWIRTT}JIJ3pPn`qdYaS3#ILj%B*( zE!g`iI5q`XB4t2;N#nA}lIakujn&g9xcW7g14DZpJ3<2m)8h0P&m!4uW^_A0U)|W0 znI5SdkJJtFom4moLQ1A?Tq0c)oMC(8QI(|CSdd`0Y16BsX+J}SDbh3Nr6cWl$L8)Ok5T|%V*I&8rf!o|$xWeGq;=2G$KEBms@NSZM2 zoD^fO)d-D%dcev^aBrI~CQE~`uTZ%rpSEZXh;>cHIR_$y&x#FS?*i3^I{_e-s?IB~ zK-V!42*d=439Wh;HJ;M4utQVSrbAQJWc^|#3;WCuzG<+jf?~4GhgWHm1Dm5j&7#Yq zKv9WOQ&OTtE!muIX@lPd6MnjVJk7ZeI?u^eU`92~#NuG*qs$5=bay3-s1ii-G%q+S z_JTw)N`&!*DG1X`sHxcEtqRW;v{wmCV@W@~?ZTAgW`NB!0EeQieMywGH5I6X_}*xq zK8>`K7lbt?3yE5Z2;k&r;=>ke#}7~O5)27bDcL&&CW~-Kgp@!P;+vmc+T@^RP%B{F z5(@hQKMMPrM@Re==E~TI&2M~ax-X_WaAj#KdX{8^B0ONal44Z}IApO=YY^x-A8jN$ z3zU^p;q$8+EP<-zjgB6!Y9ZDE;F595Aj=L~PCo!`_0;pviXjJ@nJ7r22#TBoucK;m zJ*VKZ5n9pRj1uM+ z73{my37mP-VYCa63AIa%q9vFyicCA#c&d@&k2JVP8eCbgVZ~C$(tcSGP81*NK6;N< z{BKCB46)AJ7`20J4QjX2IGcN&Knjc!6uJqvdnY{1$-7-5!L8~sNfsme=1%`W8c&)@ ziSzi1&cwMAZ!>l4Q=b9>;og@d`<-MG^j&TC9hAOeQt<>Ng`UYbb^VAO>15Jng4Q=u&(!-$oi@)MHePlfK9A>z ze0(H_qOeFFAX(2(7kdU(Jf3Q8Q?`wx>m{{MvV*P~3gITLH%9|3Pa@P(uV?>+dL$tD zCBuV<5Qq6=Tu0XxslmHwB`~U2mxgdH^Vj1NHRTXWlpgH)`0Yz&7-= zXpzRbYAZsRhmOtUwnW@0&-l#Q=PG8*&Tdxs=gz*M-SZVIuA$?NxD{~_@j&J6LGy)^ z&M5FiHVNwCCL%^nT6|(K>@~>)82G1-=KdS`YXx9X^_!u&Au}qbC_bcv|0# zKhh*0X_7^{Vuh{;a9@Dcto-2Z7gq7#cmLq+=X>~X8~;6v|IXmE=kVV%D}gQ>$1GeL z)6(Lo4~3crhdqO53Ri!=mR7y_Tqds2(ezGJp+WR+ArO&HxSNbVws^j6L^_Oak!kdA zcNsIGR-@}MB8etMH4B=z+DlUsAx1aS8O~$Iu|trFl8$sHN=5!`NB9sT=fx@sC2V|- z2(-FN8BRnKdGoxCD84v_sx|R%R|_Y6%@L6Eu5>S_pS&XZ87`>TB&#}?Kqagy7rqok z5vuR977>I(-TF24%E^_utmaX|Mg4NK+HP-${hA01!V;8*2%;0vCC-GVQR{$AChsts z+B-@qiOxWIG>+7O|C3Hnc(suLKoiMychx_pK#jU<93;%6n~C$>Csp8@cmrrcPF9ZF zZV|P;KE+bn(72a3r($K6l0)bcz%=e!E(!=1aE5gG@B*#`3HlOl582=rzJa`qM~R37 zzB!u0F|!G(5yr5)LF%EG$zUSn1pQ~kYA&La6wcf=5p+@8>uoOdtHqrQ_6`80Bi0 z#$jb4mKOWEbpP&y&H;ZFnnQ@fzb1s()DdQXul!aI|CpL#GeypPpveHKnisyUA0XPT zIeXe!zR5clBqFh{>!LFOD|ABM`al1>-*V(J{(SYF=GUK0#}A8>VOmPd{kiPd+J73) zWsg_3*Wtmng$Q_$ztjFr^vHHln4!?&FSP#>JInw$%59PC`V3!e{}4JnS=mANkhfov z9M>POY_EHWPnln8Z_io1y=wBs{ABxQ(cu$?6A7Tvhi2Be^CypV{`8UB%^Lji9%_0J zHrr}HhYnbLcCr=Q>}(zB3^@1`l^c~Fai1S*e+ErInx1QdXQ5r^gGV}_XRe}s?e|fykIpWRTvb0iO$jltBY&zeEdkKIb%8b+JDB18q{tzJ9ZSG=sd@< zzqNpZ`B8R0f24Dp&8jJ^Z!)7I?LXQ6Q|R%Xm4{@IbluT$V7+|>U8<=_zV077(%IyK zX0eD2Fzv6me}cQjb@=sN-EkLLYHUJ{A?TTW9{$440TAKxBWlc z{|0T#*Qs(Pol8a$i#Y6Ol`gw8w&N`$jW#bZlmD;t4TSwn>XHNh*V@0%eO4h^3EjW{ zNaqaU2}&b(*Zq=-F+YZ)XKyHa7w3TakHU0|z@hdS6iX=dgY3_q*eD7f<3ilA_i z>P6CVW+6pB+Cqd>2d!>exb@m}F=DH2XJL88Hg38fm%3HRHN)lkl zC;15stEzE5TT?X))Om{Q^~2BZ(<1axhpWaD146o}X>BGKBzgHzNb&;nRe#L4pA%$w zx%f%V@N(tOp4J~-58ocG)cKDdJ&$0JG-c;z7tu8GuwG(sXk5ZGLCx!du*m5SEJ+7P zX}Amh?x3zx<1+0gy(RkL0F)^$HbeK@q}{}JnHzQB@JQRRZxJbhXqCJof%U@^ZRh# zSH>e|scl@_?{6{Z!F@S+D-dx})ctYk^vz#jNleBKR%pSaPMDd9aed2!%fl8)U? z@F}#S@2GpLE3dR*7S_KJG;vF_RPfcUd6b33HJ*l%P3e*hV{7qK4tQvbqi=}|G+&Ul zPOt^&)$qiQ!McpCYF1LUJ(rBrHjLV*xl{wp*b=Z!uRkvEd(nf zj{H@|mIKA5NWH9|om2ex%$Jq4su{Yl+p&%oqL+J;pCgV7;p#mlrzkTXK(#v>y*1sx z(whou7|1ereF1Q<;iSKmHTV+U|M7)439^zVi!8Wu@wKw8KN~@zC_c*Q*s3(R6$>}7Zx4IdH~S2{4jQ9U*=xQH&)IB z<-FxvhPr`5?%d&BP`0YiEMZ{oYUDo{B7IDDr}RQuJq9~oycpR<1F*>k9Jqc=AWVFM z8J_n0b&`qgxg_hf;23aGWvBssKn%F##pUnF5WvLO;_<;6=YcNP&iw9(sguc>M5V3%Hnn9Sad-Og@B+C#rc@$*Hjn%uC6hpuo z|KHa-+?`^WY+Ra{jYp@^lHG4RY98o#ViqLW#{pc3+p7ER~mEHZM zHFpDmauXiv_-;tffwzn4d04*#h{vQ2Jw0fA8XnZ(z=dQXLP6vWGC?1Gs|R7ljm5t++mlU=J_I3dnZ8$6X^U6Y?7mO-)u{|hChh5O1b>go#^&A&QsS?cU|1rviB4oaT#SAefXr5M4lMP6AYmQVH5rS9Q;w(=M}3e zrq4Elu*R191h9%OMRa=|x2`+kt2<<(*&6LjE*eXkhSXI`ngif`ETwJ%Fh(zQeMb7o z#fip{ekrFxMj|-=BT}W$?_iY@C7yI1TpA6u39N`=k zKoqI^-8~Ivg_g^hH$DmOg2(M3O$7$v;Xte!Kz|ikB$h_t=~#xKkZ2OED2+&ZA-wt- z;%T=ek+9uZajb5nI+BXQpU^4`RP@{;iMn+Yxv@YGNkU;8AJ{(u1mL`+OD(R;QfJPbIEED8wS8ACk6sxt2bJs z+fVTrN1Ld)6R`CGh|y?!n`Z|VC$ENR+G2o!<9t+xolcYwB9jQLhksyY)qAKjoQEw8HJQ50kpjX2S$HLD&zqYH-RpsZh4q(tk+bnSIr?= zUhL_RpVY?2_U(;5tzLmQxo6Izz$Kz!pT)m}6@A;9G-*xuaZmfr8_mJV#>&kVeVjC) zLU-etla1$*!4LnPIfMV6dBZ~CYP)Y`-I3nlIdp%H-DFFY!d1o#dnw+m(U4{#rHz3E ziCMr16^V-0(FKhNfHLZGxXOG%j-x3C7x6}~X(d1>Cr%EU11SS~;^fWd2wC*ODNdZ+ zYO?5Ov?w~r6-6XMQbGh10NvQW{YKnZk*m|~xnbPGkyHz?_Y71Hf zjq~*aiKViDo|IE4oYA8yibMwd%r@U0bC8Q>O;uB`a(XHY(TexmvEWiJvy|bSQvir( z9Ka%^H;4bV_gx{uIRFHRDgfvl{Yv-F?x@?7hl+J}Pm%JW7s0R;44#yzV5St~u9zAn zIVPnue7vuN3IU{W9t41~r>2xD5)|5*aZ?OcW@&Jfsq`h=CuiBx=eTs&QXLRA*O(3I z+F%SRnHqzM^UcjIi2Iv^A>55r7P@1xidI=QMV=H^S738jHPa1OV7qZkk65nrYG?u= zek8`4?g4VA(%28jNJ_CF{uJ~g@fVBgoi ziiQr6bTHQEf_Q@x!ru1R+P{IeAGV1vs^7H`ZoQ%vlPVS$iWd8DzbLV;l~V_f<8A-0 z?B`=u!-_2F?f$FwFJOtst(_uW%k=i#NaH=e(*85DsT}oMLbJThKWYDOXydcnsM12U zWN-Ip+dqSL-xy9Vp2r8|%)TjGSN!&@^mA0p4ng$fm-t6(ZiSDx`<@ITmAKz zKHwxmRL1>_G!N#XS`}rsBo1VLGYb;Qhx31V(`r0M3{1W*nv-d4)^)L*9_wbpsO(Pdg~A`#A5==sIZG9koP5eiF1`; zdsSm;4qGC@Jm0jNQ*@_1U3i8^$rwal5<;VR83ouhkHxsZi;4(vg`2>?fAfyGe#C6< z_9vwMDx}R&vv!u)5sCkYyNExODJVo|Ftu0d_BJr;IrIlX1=*#cUQ{5g6*LZhNSI;u zsV$LZ#3Hm}DyBHiU$j}5F;=3mm?nT!W}G|wC{z-o?VaODA$871?|?^YtRvjU-_DCs zXHVl~+`Qz#h>1MTXclaw@Z2bWxvGmVXZd&`8pHhgg&6~RiZZ&DD%W*x40=nezY}Kg z;4DG-93OBIs1ycO$}EdvG1^uCB-U_DxROSDp@&0^xTZA6usb|8unmWNZlS9f55p=E z&KQ4(qFcH(Erj;LQ_hL_BfY~yLog&D7-6oV^Hn-2_y+c!+w+Q^jDo*_X+(8EByblG zU|35E1pNx@fg29h8bdCu3$X@J5r(H4a={Xme>VEd`lCSxNL)AflD}QWxUlsc2|yRfzQ=vkg@At&kIY%V z0c?&8-H<4BP0>QJ9_U}%L5?8tcnv4y1w;wrE`=a%f#uurYn7DwtLSA=bYic68jARG z{ogXHoX1CH=ie*FQ1wm92fXB9=vz{K>*~Q&w3llr;;BLS8qkxVDdumid3&YuQu5QF zY<^>96udmf_jH`IOpq#3Z({64aY7fjMA8rwtwa=V_7Tb85p6NhHb3s+bZ-;JOU$g6 zObfJf0uZ}7%(xy|EKd4GBv_FcN8*OX6ej2z&}54Vh0)$c>ZY#$22%RPO=|F%HhrnF z8g2QUaRVZqh)NqF)rc{$goMMeX9IJAXZe4hK9gh&2}?&N%6zmm;|yErDo&kiXnr() zm;FN zLVt3w7oP!guOnc2Uldj*&cXW}A&pYD7~zT$cP-~hpaJ2)bU|SEwid{LGCDXXu8yR{ ziJQ5B{5H*En%X^R=NlRk!Hu}G-ap33pejhif!pj%GG>LiVuWF?N_okTXb9%35bi%h)5GwT{>tL z5jm$`ecOhzjhXqK0&g!9U7R*m2M%&$_3ZNrxvjx~g8U4e*3r@XOp*bLcVi|h#Exgq zK3nLx7*50yp2fn$g(zN2I2Mh6efg^h!kNSK!Z0a6`-~7E!YGjfhzbd^Ld#eZ9#tI+;E^b4`i^ zg}hN;Y5y3;|E`+xt&0nLzV}^mlh$n{bjslMv+bXo0Wa%g&I;T6e<;2=d3|4dDtV9R z+vhOJGqZOSOHG?{P{JKjD3RT-*Pu3+^?S*e~F|DS%HZk;*)wWCL2uSaAy zpMubw%%GitC`R~0r7C}7f+r%(q-o~1qmU?f2gA3t8>KHq{EkQa;{l)7lbcpJ>Pmhn zd4G>^TXRLJnx$F(=%nMLxIu!VxpC@!*k>hy~z&#W$8 zfQY#?CsWq^Mio}#7jcRqXnK*=>5+^5%avp_{4YW$OFlW@Q^=6QB=v>96<}3bE8P=; z8O+oMeSQ1m@?F_rxB8+8+-2WZefigF`%949<)A5gs4)f!7I3?}>4DF(g1T`e=P{7vCcQzswCpN3JQKdWNN#|?KZOU2ilSjKyTWH1;gfVKbFkIjrwXi0&lm*jM*4R&q1c(9rlnl| z`&6{R+Vz7$?x=Zk%4|jHR^Ti8r-93lD#WTU%2;%i07Y}quHzx{X#5sJwC^yCTTH<4 zf05A|cM`fs!!Lt01fBQ?zC;S70i!qGM)aR}#3lx>{FsN4oNwNtQ%J zS(Y^*g=Li@6gppb)f9{9vKTLsP60`xMu8r7k+%`tC^42J+E8wGcVlH3W4R7qJubZZ zVpfO+ggwby(A^#3_@ux%VU==EZZKt0HCT6OUd6MG(6`eu;7ba|gq~r3H758bC2~<7 z3%fX$WQ|K#JLmad+)OCh{t5zFUmd{@TaCmAs1E!a;jHcyL;U$$7`k67YI=nV%dk$}y5t`&W zk`q~(h&X5>h)tkUh|Biah!AT0ODGXUp3SI9Pj?x)MP2LiIaRWWN7o7XL+)Q6=@+k44Sz6nE8QnQ{eY|KVb`6{e15Rp zi!|f%ESdNpPk3O$V@@x58s{-kEyhy6WjaKzItumh((#|e^PB7)695Ja(=L6BNKU}| zW+6dz@K5mFkOb^=4Sj^O;ZMN=vtUuNVD^Q$w1yPT)}W^TSoNf>-9B^|=4Vikj7&CA z=ZpC~p^$)ueGW7fVa1oJpTNL_V#PzgyD^djKIk0KGVBE**9Id473GF`ek4|Tlkw(C z?qpWx$%PtFoTzeXR4C>w523W>N~-xH1ze*o48%kYurqLF!juV9dLoRbBiR~xfZwfJ zhI=~d0tHR%V6=lg@#iEvWt}QkK_BYas}6UzaSdJ^aMSB!B<`e`AhRr%1hY&W7H6_H zeIPmnPRcs)Crrd@2UHf`x;%_lVyhXN_+-k>x3>?)TGxojhTuqDn%<2>ebnQ(NVBNu z#&<6>dFOFZMZN)PDT?wcM0bo1jhKTOG@+WwE3DORpLP$<-`rDx-fXIlktE5~~swFE?T8v{R?`am+pM**G zqUG0^By-4;eQOy1J2;`sWp@L0fB$i z9kB5LpQosul}86Fl7yorYn~%TE%SIUV8xQJPt7fTX35j&EnP!$;hp|@)>&9*{>qC8 zxWN0O{`ju1DH5C^@da+(%GxXEudV>a<`||n5dsOFQ7#1h8o1wbA5D#fKgd=j-nH#1 zkS^v`ZZz=-bho=j8ze83+4LKqds)U{wl!JIiL$8Ay!%L`OND_+m4&W!A<{$Uf0@CR z8r&np@YYINHzeWUEV|0Z`D<(I>n?^NI~qmHxpMb2QSN?EQxSp=1VS7H9*)%bE*R^! zw^vtBG+uhCp;2wzw2+N}Iq1dC0uFv_vY1+%9@m4>wKAHgThMLJRN|r2r3aCORbx@C`?V@N05K7g# zeDT6-*OUxpwhd3~KA4Pn&| z_V~#;)f6MX7A#>Q7CPEaa@+Wr_iuA|gfbrtfulT}FO9RfNWkCgaACgInKDN#{02-; zOD3MxH2U=Yae9goY>jVLVcxwP>U^E*(}+PJAkiR#VpKywq&zMald%TER4If?$j+k} zmA#uSn3x+=Xd^IY-|CM~P4^eWvGWm&-qUiOP(4t0lqV>~KNk*Vwpd1h#{;ysMf{#C zioM5<@WEWE`{m;y{kbrmbTs~34(D#KR^a~<*`W~xO5ju?`r#>xYgu%gX=?mJ6(qSa zxunFRZ!8lB%@7)%iZzM60&i4fatFp5WWK_~2|gx(T!pA)jVHru=;pv}m1`dEIKmh7 zof%TE;1$B5F6@PeuaqUuFf`ln1f%tx~3H&;j%;uL6HC~5*3lH)PZu! zk&^?8R~4k7kx>G<6NjS)YY#a!C?9AoVJJ6Uj7H4scVEfHdlqXR3^}+z#@|5xL$1RI zOA7Y1%5`{`ZE}P1s%Up$#QVZ@LB?33m~inSCk*+~))Ixh*rIy@pP!SPTV0}PZ}@_n!I zAw0k2Y06~feEYpfPs9<7B%50|>Es=YX$~x?+jte3iPBw z#Bp!+#aV0Oj%q_l?U9*94=J*!$0G>r>@Al}BkQ$V$tG6@r^zmZ=Hw;W1m;@4{(Ygb znCln5B3U$__r9l{AX}C!HM6NIe>&fuMVtbf&9bNZKsg0_uMnj73r;SMl1nB&H8k#p zB~MeLaWLE7d8mk-+ygHY#nngJ76_2Wv@C(PxtG0;*_}=vyga0|i6ERooD%$)OP$JX z-}B_@J%>$8zV9_;<;5jWQ$Y2jnh(Y%OEqTX%c3TYv{8e0%fa#dfW)kp_(fX97!!~%!5*}Zp1DDZ|?59toWrm^SVE#`FDLyi*5 z__82td{`bd;KZdgOD3&>f)&wrHf=1nHY8t!RL<`Do}rwNZpeMOAxkE|HB|n)mpn~M z<=031_e$5#4;$;3uLQDsXo4p?QNP_^wB$;3mPgrs0MkLaR^cYfD-~Lc^ z;_k78YhUEp9?V6&KcT*#?H>q$G;IYdF5FF=@A@#5x^@Qna+Wi)x%%P>xsKPSn}Mx{ zoYYMeh&%lpYAW8A%4EE(aOREgAiYZi@0CtTnYPRBL2raCWYm=8a)Bx9g@j>ffbL9T zzk;nb_>2!m=)u-xg=!E!mEESF=d@V!V{+E$vRBhKtm%LbD|Vj}a>DUf^3Ie)BuR_J z7IPbjFtqt4RgHF(B^0}ccPVPyPkJKYV1Tt_k6RoU8ldj^W`D1hY(&y=cJUHHn?Z+6 zULN>UcVTnVUBez0q)pE~B-VIy(1HXplRj#f@eBlN@iZGnNV7RJI zte1>T`kwi@XFV+f-VY*QTl4hli?Ax-(P6l4zIihSDaU8YR_(tUOgy+Q_L{OBz&u7-drEoVhx<4DQwrS1K!G(OO_-G&-wz65(kYd%Jx#@})wFAWn z6SMAxgHzbZSk(a|`AKNQ;O(s(CVX4F92`aFv5O#*@sqD-4N(-;XKamU??&)kPpg`s zq|g_(S^7R7L=ZinB@9sUUEaBh>xJG`Uxw~h{_$I@?pdhZ*SU41^B){RZNQJG2VXd` z*!sE0JLeup>!%mILM`(kT2;Z$FCFRp3TOMM_WyjOue$6oQ~TH3{|N0+`ED+ujD3Eu z^8pTyvV!#w{E933*(065#7^H9$>%jmF7M%Yarjr;KZ1r&)B`;XJO7w)LLtKX zrNrhxVT<^bHg}}2K~XvW*m>je&OYaAhPmd@s@V0{j&y#Vn@7dM%4HS~rSq4MbpBe> zz6S5(_&@%5=V!RI#tg1f*v->NI^WAFKD`hqiVGY+-uW^od@|`>O~&FPKl*s*6YTSy zGk8{bcJ7G0cce4sGCx^|HZ3jB;N>(A1b0@7t@CHU#aY@v*ZwP(5^k9Yn)+kQkBlib|AVf*LX|09~6NY-4F50 z1CMt;%n6=Idj>+3PtrO5c;^{527Msn7B?!bixYg`2mqy#0^DcW~eVrHW%Ad&(a~Ab04lytqc&cubJ5`0d{Bo|f z+wr912vO25UYzed()ko`f1`qZSK{7ZdA##Ch_U83T#<4nCmK4F zr{eI$j;~U}%n`BkKOO1(W9|oaZo_rTDNW_B{?(Dr|DDk4nUfVy?6+)6 z(D`{6ri7vYy#24R*vRH9w^%&0e|n_zJF_Xa8Yvu(UusV<$tQ}y_gj-UZnnP%jlsU> z?j;w9+W%Tez?0=!bor&Ne}8*p)~a%*^O^PqH2(Muz80~qYYgpU6)0T<<==d~^9#i0 zPs~P_IQYLXL@`blcN?!*0V6+jq;rg?Wt^-eX%w3OiN`yCPF56$&hJWL3+PKzIPgI_60X&zF zbT+u0Cuv5+h-wU}@&hX7@={>~7fgUK))*I7z~Uk-pDJ%aU_7M7yc9^C1Xp4n(9c?;C#nDD{ z>996iL_N`#3u-0WxFW-wQo_InwB5pbh&Eqb`Ox-vqjPA_L#i6u$+XET){$XoJv-HL zig!{wXL^J-TvU0`)(dG3HgN4#%Nd%sHnOvrh7h{U6{ZWg5;@H*jX;N=D~f8fdGf!u zI*j12Jr`EREG!jk^ZBL| zZMTTfEG?&B|M31DO?cAkp^(7Fo_Yx1Ie6#m-x9uoKOIyB)e+ule(^Ux_Sj<#fLim< z8qlTOn|`f7#@mRe*R(R@skuK#k4jK2VgMvC24O6Cae;)V8bP;>ff>Hb_YIbM{pj1> z-6^6E_?2{#2@#fnsJ<q0sOU#xeS8nj2I>-|Z*>vq zN%YLC)&tm>9r5TfQ%v(296ZB>Cw0)qmqXy3A=V*}97sq|a#{dTM{;OcjW2M+fmC{q zSBdcMjcyGa&DH8vU61Fw-pc?af(OwjJ$fzPiRip>!*H~2;49fK9$d zHBf}(txd;cgx8`1n*H9-inZ8h+AOQIyn!S%W}2*FepfY z@9&^2gbv3mW9_Y_UpBiyC#tu2p*!s%w`o5=K*T}ek^X_MToxhmRV2?mbyV(<{Hml? zhB027Ph$oJLy161?d#LueP(sFdJ$I;xR?+UUb2Hb`^Zwiji+$^t+ysq$v}_GPPky! z!M44CBR$_?XCn#v*294Wio@H9;kH4vC7u1*vtg$V#A-G#op>8H{7yAa17rB#R~lD{ zm)L;*pvmPEJ*4r@o1D&@yn2EWg=rI%0z@6Dd{+g4G^JNHL@qFRZtx@du|(RA3PfOF zKyZn&<0h>$!G-; zSPych0|~eJ;;`REDvB)+5z&>JK!Fo<=o+UW#Sg_!_$wm^eG}>0PFJt(2m0et2gMh{ z+SZi=k;m)l>un`$SqwkPibT?VtK!}UM6BjSbTJdb_ zS;sOXQCawZ^_tfu`oA-n;7R(9_%0)85ic!#Fz^kM;=L{^Lz5^p_Ow$&HpN_IidHBn zBl{)eWXzQBA`%y{ez;;8`U`1_^bb_f9wAilQ#lk_2e7LfM$;;sCa3iGrYtQn2A${= zR>Df*#L|S_T~hWv5z96JWkI0L>br2)W&Gb)!Ay@@vld7PBA zwRKar!MWrC$`r8d=)yne8jzx7@g_8dZ}`i(#xvnN7iYYIC++9oCI$Fc@^9?x%sGCI zM-DP>#v<)&|1NU5azEue@pJyB4<}?;r`c(Pa}A-d^1YJN^jmgcc~zszowTIipR+1E ze$DgmPRpo%&GPT02A+Ihfzp^&zdw3ZU-sad;`Facgiw`uEdznH;J8t62`E7;Me)C1OHBV!FJ&eb*y;*TRrO9S^%u zrTAE<9YW<|b!49wo2fd15)8u7e9Ym)6BPa$$WTqM>^6P`P;%C6mc4+wJmg3C;ioKl zC2ax4_~|Ns^}H7b zvu`pFjnnGm9I%mHNUX3Z=yrH{_qwLk6|n7d(r}?Yg~2xmJ2fK%MX36(H@bVyayLid z&R$r_Rszzdm7o2+gTrP2&cRKp%?IP@7AjtkdQ)tIq-XCAlTJW%1)tpN=X{WdA{e#u zy+-k|KKp%3A5U2Tu?U(vCn4|MtCYO9c+1| z|N8DKz&T9meH9x)lzEhn9_bw91~v#chac$FLBtWsfq$#3;tfv&Be!>QOLB z39WGXtF$<--l<0hAAD})LIst=iv3Hx4mAdQQS#NUjY}2`{roe8Q>l5RSZADZvEa+MyNh>1RFqR9fwt~Ln7^I@)qt@ z7cR=~X!A{)Tqt3C9$;D!-i9FqH{bengMony8X=+HP>Kch$SIK#K+ZrgK$G8Td9-x= zR^vQm;HaQ+Hk(@23erpn**haxEr3tdsUhpT<&09%u!lSa@*o+V2SM`BO&r3sW%}-J zHE1r~MmhT)9!)wF3$Ph0=rr}rT|#FxWGSWD(1DHSZERTQas4Y4OxwSC2e^e%9HkEA zNuEKGhXvtL0Ia|gyzBM%xwSfWa?SELgq>e?$%)uctqHOrH8rLIf);59l#^Y#4ZO*6 zV^wB0Y_rc)5pghUJH6Mw0R1dpXR4qVG2y&hOr#O(rrJ3uB!hAD{_BmV@yJ!|P zzUfg8O@=j{@b60^ocW8Q3jXb1mAHbArnrSh_SWSOrxU~ovEBBMBa-YJ92esk|D^pd z@Wmg}WyFtvvi(=t-d7&K`1jgx;)@TKRufzN?e=e@#fK`k65IUs_TT#2I}+NJulLP= z@W&9+6_=@h`|9l5uqgezVlDbb~hja#t&^@9_w`NbEGKla$M zW5cGgnO2XJ-yLh?G| zCmYjY{>k$1{O90<+-hcbDH=t^O@+juC2-)VbmtFy_NU@}Kd3fSz+DDYnd40CG;Y2bSmFVAB-|8A>HMDB# zB=%SIxC$8*29>3Tpg6+}4+N3kh`^y?7(|6}eqrezF272X=Vh=2G7U)IG*l+#9gK(J zDEvlY+{>>%jUE)QAc|lzGwR|Sq|1X>)i6SBl%b={AR>a~p@49wE@6st7!A%K`tr*rJCci<=UFfbMpfi}-W9QvR#O>?8b}wf z>Y+!XeM4tWc5Z-gT)FsK*sCtk(jmE#TQE^MG}MGGdSiKvYSSemTYEqXz#9vtgC6%I zu+r1t0EUll(CLWK>Onxu(*$woC<_KrSd|XG_ro6w*Ck_pfo^$C4HDqX{j7fR<(E_7 z5;DpDlG8wI8EN&4w8!|86hKK2T+jK3A_J-EJ3kZ-luJ8~^IkXmIqADGKA3K7kD(Q9 z&`E?l`=W|j&j>kyr#iO4x7CG3Uie#S;5{ZrNF!2n>n0fZ}8tThYPNI1Aqv zOd2-!Ssts{jk=qVknPiOGiAxVdDcr}B)kvLC0=2ms4h43akZHJGYS!+(QTh$H=(QO z1-_VbrIF=pSqtE|IU4OYS`yv!73mP!U<%M2>j&+&3cnyb<>zS8f9Q^C5Q* zF=P@$U`B?LWTXeH%d>lLI6t|uigg5B#k^K=eA3^5s4aX!`Xw-8 zEvE7ljZZf&tK?)5Yc$UkzY%aX_{9ZU*CQYdH_tZ01nFe9z0;WD4F8Mk-q?WTxUo@O zDQWCgF}#omp$XNc;1N`#8rV14bp>CQs-TCAr+B${CPw=MaY9LXB^vdKryr;z*a zDdaUe_fq3n@oM%VI_+PTF$8 zS~UK`$G7v0kW%`l{@^%EMzSk@iPfl@j2GbIW|OMo`dtpK9M7@4n7gE^iM7$~q%VlfLx zr=dDigGB>3;sSa+Lj{(>IBK05OuLvzO!9skwJ+$wUU5&*lD0u!L5BVfEDv8kFKf^(Eu{6j3LF&0D9lpaSVyccf>@zWA5QHJ2W;>u zF_x4UnKEc%qwBr02?`w!2>$NUfmnF&nFT@Mr_ikvpLJsqybN!I$@{z32$BNdEvSkF z|K|!U3JCJs*jPD{_SCUr|0w!QsJ-gfVRZR69wHhvk-$-yiuU#mAA;gx9hgcvE5a3phBqRN^4d+N-X*#eNk&om4={RfYyXO;GjQAJ02IT|P_t!K6#Rm` z-7jpeCLkbg8-@u?4`TsPe2p01coGCbrwSKnNmJdWu|XDdS4%MU`5p}p37W?1Z{QZC zv>;HKY$n}I{4jEom7>Lsm%KXDqcwiYu8-!F7Amv-1&WCf$e<}>! zmFZs)`u>>y!(JIXn)v`+;V$duvK%#i#&;wt3Al+O@G*x8DNcSy_beF6eNn<=v@YQR zV&xZvOb7uf|D}@spR`}mrlg!7-UA?(_oA>+k`?08lN)}wyuGycWij`-%1VYF%=B{D z>c7Iy?~h4vnHsTC93#7873`g;Q;3zBEI&FSL?lh_>}`(VgI#iHKrtFg7*EM{&uF63 zHwqY!K&s+cqS=JLl@wWHlm7g_^VpHc`193wnqQabnSPqiy9WRj=#!6lp#t z3#&TU2>Krvbopp$3p#LY*O#r9VQve^Z|AM{pTL64jqNVv7wxm{*DOSE23pzpZ+`Zx z2pe30OlZS}=);UL^Yv;&UF0k*)pm79o9$#437ESszxdj)3~f6a!zFE1i9~*H@Eq=7 zW8)odIpZ+05$i5@-Ku;ty-3=seBZoPwxn6-o~@}oUg4hTw1>O6+NbVVv-vBbT)Bi9 zS5)V#y_x!T?Wt#IR&G^++0&Upv51+CIcM}majQGIGu%RQna`Zm zc=rP%xM~88Ymzf%PV8(NS$j0*h1nboyOXWKz~f6d&vZ8spr;|O2Rctna>fi1onkSw z{?N3#Rm;Ej=DNO@kpTrSIF1&gXJJ@^@{|PRUbJ}cLOZ0aVfTE@ixO)yE;OaZOP{&t zF}?z(HH~5^cCptvX-qI%jz_x}kc8*01)87VfdZtQ_A=Xv(}QDK<7iB?uT!RwlR!yG@Yb)NC= zZl^m$&=(&y0!)+9Zoe?+)@W}Zj%hnJ+Q!acNNrSyi+Gzw#8|#&@ww5?4qtC9SD~=I z!7(I*Z}1nyuEG|npR^$0aOVEFxv?>1eB%b=D3-g3<4!rQuU&EKvD_Kb$L`m+_VI8{ zQr0w`G_?GaXku!tJEf!hX;0qCGpPqtBOo@*F^ZOupeb)@E+4$|=^#5qm7QV@XtxPR zfxH<-k_HB=S#AaE9MewVDK|`|e6Bhf(1pqv5?^q`>5tX0gVVDs7anA|_-2(x8vO~q zUE0>Sbom0XdQEPD=oU~AzMI3MwN$weB>#@4;}F}5=r%lzwc?rlHnk8LR-uH%=5(id zY)x}X;Lb6H5*B>psmU8u)WtF(^n&@eh^u7~vC71g`W&ZVYsTz!C!=A(vNYqwdV@*%(9FB2W2re!;k!bM6ep0gk9~Qm9j^1C zb}`J^@0~^56X9m-j(A9pbJbFF+1~h3-OdCLZ_%AC*}M?bq{(~|!&%Yz#NhycI3lc8 zz3#DcBk*201`H;bhBQa^ULK8`PGT-zy71a(leG~T-a%1jrLod_6K~y`Hy{f%oe(!~ zpEx0~yv+;A6}^$5iup`3Jiuv@g|B6!1wzuw-jus#MiTZPdX>jmN5~?K+L}<;nt9$%q!9D$)k~$%iuo zOp#+Q-zq`DloW+qBy!3P8?iN|vM}gHmok^)W>s|ccJ7yu%VGj!Df+kb zMdhb{%!UVr&=e1$6r?1viP*1#t}V6^XXk2x1{n%yf}IV^*|Q-7Px4jhCdK6IB`GEO zO+~(&LiP~{O}GX+lxhVDyeb@XpGCy&t?r#zTPAM9fEWa<1t513mqA6&soXcl#cWS^ zx0&6?pz7d571z61u84duBPro@oJ0~I&n}R~LtmBnc|1K=FvQvXlU5=k0^1TeWm~>ro0EQf3YYa7dV)n8%-{p z(3j6dMgCBb_DipnZgV==?HPTuspBEB%iR!g_RFvH3V}_mTLH^5y{?JXBs80yQU`XF z1#a<)nzRmXL)A7jWv-e1Wk>12y})fkcvD#r9=@Vjr>7`EZc>={=4cnCQ+doL_L0Tt ztwPyeFFrrecUH*tGf^#g6F9-JUK|SL8;Dcdg6ohI4^o&Ht4$Z@Nxi`Z}lP4o4uUj;?Duj0|R0h|b55wrf z-|s>=T#^4N-B?&KX?|%Ff&BIA$z4J5yd@1<_L^t58l|!c%1B1Z%%r|9GMI& z974D~)=xpB9Zf{UEFh~p$VEBgB8oj6ehAA%UP4R7;K>k@9hdq^lC~lbXB5tXoz>uq8yuB+m;nHQ3>!%77NC(z1v4a_#cB^q{^MY<>! zGyaJ$|6+&KBvG8khz#Z_A9b;<>LQ_OW{W7ct>nn)`qr)PcxOT_pt(}n2A)bc&a^6W zota!lXo7$t8;L!dYx=Rf(V@!nk+6Yq90q{ax?BllxSZ|-8T()&GQH(OnBNBHX zNgT-`yv$Y`?IxCG$XU*QkK(L54cO&H%CTko^%oIql zx44DEc}tyTg5M8@Q+;R$>uh&#vlrA77zp_eIanV|Td`vZoIfx!y-+hP9O-;>4IGu{ zed)bu<`8-3{b=5(6p(U_k;iY!)g!Y8aw4}XtS}F;S;KF;T=yE|M&(6)FeVOD(nxYu zMQbAMC>~bO(l6!|(U?RbHOoa3p<2?6oLtT`cpTE$aqlc(0VBs814lT=r90WKdGZ%^ zeY0T6a=mQCI++9p4HeGtfNl_7&eI~3`1|~xc3yXNcU5&&b#-+$1Uq25Bzf>V>M5cEPl`G& zZ#hzHfy)_oU2x!HZv;mmwysgUD;REN(3O8e&p^4im=K2n`%rT48~dUt3=4VvFK{#T z%z^OIeic#Chxy?p>XeC34g)hbK+r~ScWUQ@WG~6cMBgjB zfS$+AQ?1ThrMFw}Qnrw``!F$U&m5XqiWQ@6Z1nwH)c|`Fx9JofcKtR{sd== zl5RAWOs|fTcG`{Xo+pC4Ix~3Wj`C%2s9`a*=MiOeco7Ujc~j7dvPw>bxrI;%X{jg` z!Ol@_iX4;XoQNGl+h+kJESL9p$@XGeI$wL+NPs*;$Bk_39*+u%U&!R3UnHg^Uqtzg zFOfn?{;b%A9nUyWd;%OSI7xHohtOA)WnXIVWq$PjQYif2A4a)0|)*SvwIe@^dF{u}T=2C%>}lN*aGy9kJk` zi$?+R;Rp%HF}19oS{yK}&ypZj%^P$ZLYJx23^3Quq}r6U*}0Y@A@a;-e#AW2@> zAwLvU+(;wwK*Px=$M2wx(qyA)ByO6B}c+Gc9!W#)9lWUPKB({2@4yAm1Lw0BKa~ zI4g+p!K_iD7RDJtXeium*90RNY+8N!QjA=Eg#oD?fId>1$ zOOxoaD%Bw-3%opN9-Eg2EhvPwL*kx2$nVrB9Rz0_T9|l`9>m_)4j{j@CPh8qA-FmQ ztHY0Qx#_Jq9(}I_rXW;p3IM_361H#NswoByU0GXjq7fz~+$gnHvH*m};=N4Lc)<>- z%9!MKcqQi1ZvnIQ7@0E70*hBr3Aia4tK)x)v!Q)mR=ial2zr)8QFLI$Vgpo7 zH1gx%DsF%RoB%6krevKtOZP?fBno#@D;4#9Rbi-fh&qnC3V9?7pA!5*15|Zo|Ku7; z{u|tYv4*LRcBmnO+G)RWrV}|a9RQLhV;y9HAj0_!s3jW6v8(lCJDJnACQEkMA@NsUl_mmdx_os~tOuqgg# zV%kQu!OGMd$lbFa^qR^vB}19%V^m#y01EZ&oA+qAE_+_#8j%|gt6o)DV#Moey2z?~ zDyu5jE|Ii=1Dq4!BbwMB^ekF{N!y_E0;p@y1T_k#OH*-RD(9Rn&o`DK0vGRgfW+1E z!g@d(R+1`PC4`SI$SMqos8w}=M-}BSa6HCej;m~!D3626{;;`#1`fnOA}_NALREuN z3~eoAxU4V&7EycSr2|n2DQa!lxgj7*2Z&Kf6(HFWXCvHJ4KL&|DRZfkNj+JdrIAx; zp(>Wx=tCO=Lfb_lLqZ{HBV~H?^HU=3H?W%&ilF_ubj?a16H&7k2>P8`w`2z>@{LFmH((Cu5>?QIg!0a ztmg3_b;P%KKVnJaQSdo=Ok_o6Q95Qr%!E!J?S8nDz@EcZB$lPiwHBNdrlWSsbef4_ zm%AUfw20FswKBSG^Kb^n24Qr0u2LVzoLp?{m0RSQ z6FaUt{er*?Tsi_iLpZl4!vy;Z+!F`pzS9dQ>Z4f;qmQod=AO6?UN`|l60L(L4h}Xm zFPt19^TKIVsTFYKH5;weVWEkR9#vC0Bn-noD%=2H1$Y^GVZ$VrrE$q229fM;TcBJ^ zF_)mdbYPw~y@Xf2Wh*1~U9OFEVc>gNenuQ>V%)fDR<<@|6aWtkAPq7pFN%FsZVLEl z`q?&!!=p0S1z{0+bcozF2dZ!`68D3Z|0X*&HF6XtsekrFtT zaG4DbZn5YU?o+(&rc}lLMwvv!?Kg6i;u1$SMjWB2Sgq`M!1_=3t zj2dFIgZL34YL);Oy7sDy^|0woTTnP`q{E<=A|Zi*l*dLeX^(=cIW#I+FI9kqd_SgV z-oONC3^=22dt|7wLZdY~3F%$R+FzPDVK6;(qeo2^ymJFkB1hvdb~IMHm?)xUpGhJM z;>8}$2?EQ}9=x(JC{4_#X+k7aY%5?$mc@S_`|K(@tXY*tV>6_^DG0$oK+1@djvmj6 zh8Vx0R`c-BYmS*zDnO)UQbri;j6&QNb{zjR=dx36h?3Z>glVW}EFN>*OG$w)O^44- zMwfN=653s`k~?_0*1#EBhTTc+j8`*A-lYfkxJZTATUflxYA8woqvS{25ih}_Cq6PR z6h2^PIQK9jRA4@z0;JIZ_pEdSIu86CeIC9Ic)>$&o*#7f-op8*t6wTJt(0YlqP{v^mR09JA`6|Ar&{14 z6uG{`e`z;{s!YBvs+GL90K*<3P)TKWE2CV7hcTmFv>vnDb3Wl~oH&qKkl-fDdfvx~ zhoehQ=2&j!O)`TU9x||gmvpMn*?aO7UPyAK^-)z40gT3GgpN0VZSgG-Z+@<;N)&Q_ zX7Sxn=u%f97M6cm@oFfW+y_G}={~%y_!?G4jmdKQf@oJ&1}~m9I0sKbTy6C!Rw-I> z=xPt0HFz>svxlOq>F7({ufHjN7RuVVHql8TCc47jVi_u2VfBesh(=MotN7%^@@5R2 zhQF$~8OmQ|!PlJ^tA1VZ0daNAyots!XvdVRhR`E{g$W>Mi-I218 z8j&AB*ZGg)Z=lX4Rvq0Zea%Drq2NiFD#|k;Hj#8ujP1cSwFY~OxMU=mNMtkW3ilS< z(2tIc6D`bCrNL8X$x}DU?Z`R?ai39~N^6H9cJQ28gBKx#+U;o6q9Pj7j&(hr&lUd( zD%i2jx`LvGiLc)dJ_H+>XVD>6p38~B&9eq?#CkUKX`)!nx4d|LV!?eV!gSC3i#wp8 zd#I}C7NZUpXAKTvCz4r}QLZ>%Y(kBW!{s7raP_RgP1w?9PBbAMHlw3YkK{YWpLXmP zlSIX!ScMuLXHcA@2CtnpxCA@Zv6iG=#D{}RXAQ1OtredogL7vMUW2u4&7k-s(hPqo z31Xv3a|MN9YBbFgN6~D8>%us%<9#nazxYyhiYZy4n9Mr%!pFmDCcDq7fhqaTEmTPI z%R`# zfn>4d`7DWxXD$>9JMw3GO}DpY0KxU%|}`wn0(|eu}>%y7jpC<%F-55T11viW;TZLj^p5> zz?M6z4~lP-TV?aUBiF`B-LbGlbu@WwF|CmlX)}o+yObtJB+Ok1*QIPJE=sl>hYi7w zKZ8yn!YMGgZwL+`K5&6`0C6Z7hwDEITg2zY(}(6oN=g5Q6N->{8R3W{3u+e_LcP`H z4cp)@rOmbRamb!NB2o-CWUB?Z`UUdFPl(X_lhv^iyd470)8p!P6t4hj9+?av76u~; z@Sk`#0*u%SMv?<~Fue-bo!o<4`yqtg_d-@g2)Te?=i>J;DnWFqA0&c9^a$e!di@@%rI70_#H;l0u{gzjZ z2!PUuBKzFgZIaq+MFKgO)EV|II1_pds;B{=&qqx+Jok~nHS9E1}ACWst@+~Aa#{lHxnaBG;R8sZd+*VSDuViv&P0u)T20FHjb ztYS^6yGbCcI)2lUaDqbOjFN2DF%cp1Nu2F~q!yKt!o0=vd&i-d|(Umg_`&?*h{Q0gZ52*=pq ztZh@Cd_`0w$*<^l0SSvPg8zY83%el)J^i@E_2W|4kIUf4%^@5(h6{-51x%3-d9(=5 za{StYAx<>$eD6fzCOnHbQNSBx@Zf*sm|FoQH`U?%_z2t#p!tO0TnAs}rV_gP#LqZ` zvyopK%FSC0wPK*8II{nw`3LISV@{R-AHc`Szy;x8lgI@uf#BlK+45T(ip>%BT=s8 zrlm0iyGa%RTM5pq<2nB-p8BTT2pG#G!kri3&l5HJTg62BNqZ9Di(op6Lydsi!V0Yn zN%cMFM@CSMMH(`jW{UzMP?O0J>6z4I7%mJA ztN&~jgWn?UqRR*=)2KpF@^DGeFRspvZyjszLmI+=cB8U3e(P9yqI5uX$WCDavn z91UXz5G0^o*ZP)FKhog5<8du6X2~(M`aoF^LzW5`NvjmBK`!eTBtdk78^>!<9#E_b zTWC|iNmN97M>LK1WbMHVd{myi=<}bBCWox=H3-umtsE9Myohs^{(up@H;e?QqJ@{n zkIzu7i&3D0{cWm5^HCI9>?{;bJ5gwfvrsg>M4_dzLKe}r9g%E_U{{r~0oI5%Hn!l= zkf3~%u!_;-_qRDzRlaBtSV0wQnE`UOm$GmKeGR$`_u8?$xCE0uiu1FUxgH%X|C|=AOX(7$WWHyVeL4;69kdb!s*teh2QTE>pe)ZA;3*4b99!5Khqte1&#XRXv^T!qMgMIi5Wg*jp8!Oje9E5Ub^K#K{{pF&F zEdZ2M*n%#F7{rehKZz|{BGD`!0e+1rd8ylI=#vUlk7ug*Vt{%v?HTJGMA;!Wr zGOK`#5oOg51hpV^U_1#Z32O?&vQS4xOYM*aDw(w;9ELHgHe)7P$s(s!!G&V0K+^av zEL!lbFG+kN`(?3*_^HMBY+)bwLfTWrbIxMtrmrpp8tmx){Pg3FOWSx%*m8^QK7uNi z7lF`5=YZtjo#^ZkJ1KCDP43~oH`Vs<2fHC>xGJA4m;(a1x@-a#AnF&)&5kVx^`7D3 z2}lY%JdBoZ-r3VN*7Aib@0V7R(;!ZdgJ8zSflC53=<3pX0wv#@veXL>CamaxOqcnG@!Q||apcC^DAQIsMB|Tvgi}*`L1RaQboy3y3VIBWX-D}3a zAuh!cdAu1II|`Sr9F})_LBf&+KsRu;u#*OlD8Zq6L2&GszHJ^lg*gY|kTc%8Ew&SM zRz-&J(Zdqiv{X41h;$BkJv}l3y8Q`(>bL?d5dc*xQa~)ju%!AmURZQowlUEf-v_&< z;7w3iLhON=A61cSbA*g{V$B`vT{-6gn%Z1v@q)bO{}12xr-el?uPZB;vS(OORGxPj!+Gg z@^cF)8ew9=-k8|Df++^u^+7p`8;CInU|qrfhL(n!xnjw*O8@0HM2m^9Y0>wcM%Zq$Lf+Ceb zmy1gX2^mJh8NZsSdGJ4T-Y7XWM_M9kdr_G@Jy$j6qrjA7mwMJ5k*!*>lsz))>BhqC ztqNqX!Swo|5@cp1)TRQ07@d}oR7XfkRNFy4N+o3WTv5c5&tM!rjv$Dkmf>1Hb#qS% zgtWc{Sq=tF@KSlWTxozI)ePWTh{+bDp}=zU?QNrZBk5p7su5@9FuihEtD+TVB=mOm zqLL0sj3F7!U4$JML#LtdU<`e74}}JPurt=O*0#~+u1z_G5b>;i8($eA+-0)5LqbcF zO^N2nK@Thnw{kL0R{#XBOW{z!{aYhT7ux1Bj03XO31ueCIuR)dbH5?>m>@7g)?Oc( z8s?+`BTDwjX>vrp#JK@wM-QW&wPzmgkpqwKT?Ms8s&fSdcg~1oVs%2SQ{i=pBvdh| zHsHXk1zDcKR8q%WoPvAH5-ZxPQxpf-F5wF%xL8f;LS6KFdH&B)GDUVP-J6%BuE{BhvMy2w#R<5HGz4Vii=izFj283cJH zWf2#tBJ#^JE|iKdtxirDpx|tB(TrBA!LW*#1^3K-{W9QwEBuVXn-H8XLWUOJ3fI8E z&B8LpWb(~FD)i{&lcQkK2^AU-dOb=~2^IjZ;P7IWaZvsckApK?c|pK5fMk?0cMo1% zt-eb)&rl#1PwB;^ph+u7VNKAr2B>X}7K+t@O}j~OG^k$SUe6M6LLCJ+jEVhSc$gq( zM~`&KU@MZuQ4GGYBSg@*GRx3ZLmmNBXojp)U8 z%wfiyZKF2E!OjzKSkQM%xOu=~onb#^KH(u%aVvAy@ScF@RyYMqdR{#AQ6w z0Unz}VFeCbh|#G9ymAqssRR}Z33Uxe;vf-{LJ?>gv|$l$5(Gq=TmrySsD(F#qBBbw zzY)vd1`0SM&t_7wp9it1k{aKwUY{5T^N zCX1=u1|3@zGnQVj!WH{fdva3_@jEaziz`|z-G zy1?X(Enjd429BF3H>SAqL!Qe~e!xNJ}bNZ~!YP zP+ZKQ>l$1Dr4#B}v<5z+b_Iph8MI7+z%Pemdh2+vTd0#_t1UIhQCrW?|Oq5SmFYw-(Z0e~akxO_Cf5umFtT_F;xd8=HsRtWG9oL&ICL5D8C|8cAMQ4UOBK~h zm&Ber4644W7_J6nIfgsKaf6`;Y~)__c~$neYOMx%LHCK9$)x=dfe~&@polmmDxg8r z!sdaA4@?RGN>zm|`8kRk5~G5;;CX|6FmYM=JPZa?Y%mYd8^BGFdMm9dklety7!eU` zolw{X<_+~q9PL|GSS$l)wGkFm_gF*FPg`L!e|EIs#sakABI#bxMj33>AR8(Ws|v2V zlJRWoM|j<^r=@aKN#FrnyS)YGYo!TCca3|;j4HUzF}_cPTnQ&Ta=JVTA}}SpuKE=m zo`l=Dfbq0)ULXmBA~}Eqx$p(M4)-%SCJ-{@pWg6SvYD^WlJ9cAKJikMK}j4fckM1dRqSwRn;CWT1}FZgk27@T7rj~ z@NY4V{+}wiH`A-OZI9mQ0oMO zu{72=xJEU2xHb|@SY#pP{8kf7->N77G*%VrUUfB5)vk?!9-vHNsD(;L=t(RtlM|q< z$J6_I@|E_ZzQNl#Q4PQuZ(|+`>rN6Pjth<@Mv8>S9q4uFp6y9jeV}QP=Xd?(`u{a78o$63!hd`c29HY%sVKBp)S{(?VP)f^Oxz^f1@lA-44ge^orp1-_C?=3kq<+NQ8~S&y@42j zwwkpjctJ?v$`Ze(vMr`S-$ zPN|I)FEy`DQi;7EQ_l#0Nbar)vBNHW69R==tqYz@^((}D69R(mpGfy_AW0)Qi&qFB zuq}*Nag^aq4iZ$ex??T2Tof4ozqJ@*>sVNe3F)nsfz%X{st~eNc@3@s7d%Ys>+;YR zOqO@8G-hI9hpasl3J0gyQC{4&-1V zg0K|+r<9Mqth6i+V^PS}4jPj2WhE>?71;O}Sa4d6M;#bWRa{9*>!`0wksXEFF|B48 zpipoHb5W|+fy_iwzyB{>mMYVe83&S;g-bv=myES&QfYfl;<*@wmGVefi+sL#lr)9Iobm(Fk_kSuHPmgH9sy(uC-zy5#|5MSh2D03>erv@4Q_-+6 z-E&N+XtkysEHw@YWiX^7mxiR$?P66qUMp8dkEn&YNbe&2l(69mn{yTL`<3AWUJ-gO z3>Cc-4IAdT9f3I&aJ!E-pTQBk@#cOwZ`Od^N$|(^A^Nx2&9i{agB%VrJtlyWZ96uL zVGB&}&O<0CE|Emy2LY)9VQH}Cj=^9UiHzPVv`%y{Q`MSWt%}v>D5OgZhQ)ZSyOD}BJ4fCY8nBn6};g@2eB)XkEW zsvxQHNkBl7%y6_z00p$RW27mfLwY-JWa>eKQda+@E((98rU-slqqYmE5#auj`e#J# zKgJ%YvJCD0Nx6!Z1Csl9%1Nllr2bSRFgBT_@K!j)wM1-#segud7Zs5@b{|L)-wc!p z5dAmE13O|ZIv1-J6S48h4K%^qa;>6ef^(tr$J;#vFC+Rv_1s+pD8S%9P2U3ipeA!9 zIdINscEQ5s8pUDv$QbOtfoe6_U#dO=PmM-mAfYim6^=$*iaLEd)?Y4hEJvW`3C-Z< z{b~L~-6*R^gM}91#4PZX?gAZJ@alt^evUx(sKYgdt8FsPFWf1Apoxeb$NzNWbPB+^5Sa(@hDkAt#M8b(!7&J|VM1^$!=)x*N z>`%SX>>ZfsmH*h@lJWLETL-popAX@R(6kw=h%1Cxj+5AuL(&t>alw+(Z%k)Q_Tw4L zI;}GVcsS-+!w^N7f9f6-@pIWYw1^2B|t1sBGT>#1YAi$?3 z%P*Gwmykqvs6M3?#E?uJqwJ{uZc1A4(gKP)_A&+=PL~3nwT^~PmtboOQLmelYc&~g zTdskUMH41kl|j+*RJkoLcI8X26_K46TL~ypL5r@O*Hojxs#(@lE-45IYBW9FidqOJ z$Uw3=_UtW)opVs05PQ>taAV*bs2s_AWn)B$J9gGD5Hnzkm1BQ_;*xDD@L@ihgkq|o zP4Ood#h0)&&`g^5(g6Il(h!zxKEJT8uyk<_D;yP!2!V?-Ho|E~#i1sHhoqz?o7R zBYtFYu%Bce6H++xgJ9ksJSGvv-e@QyezGtU29SnBg!|3MECYtnNANQ6P=GN{0*Gi6 zt$S?kh{rT^n2&DC)>S%1?tsi5Cr<%1fHj0O5&slfc41hOLYAJB2M#7g@6>4U zbPp)+MN11kYDHY=$7rlah;^}tjuOB&h@-zUDT(+2=Rc%;8WG{KL(SG!^d0U5FJ8|` z6_Ru9YmGwOP|P8*S(lfpR5%)yU7bjdlEwO zKDlgy9jXA%rIqE_1TbaMNMBtPszVW?$U_>TQ8iP&g%xp70%Rjr5+UHSN8lZg7TncZ zQYkZfTG`7z8s?fcg~cl{kVIF%wvcQB$hnx?5ex}VA_nvMBd^Hc@Lz}*VHAMvCVNc; zGLd7?d{5=CT3JiYP45s!PHPwy(F2JS<6_y2qfq;3~e4RMqj#t{gK|&tf}({)9N3wl2ZLFI2e7}FvHr@@+r^8&8$1z9pBynjG@`SLtKic)(I*&&Jm#&3 zv0RkkO$pTWDbrsU{;ojKrSUPVZb_-6%f7n!c4+zn$DnPj!}axp+i?I%VC51|gMEQW zMXk^tGfi#841Q|X;1?0_`3ZQ8(Dc*63$P%hW44JY2NspPSB&ZMq%p=h={xiMEJ<8!B1lG zv#eQ;DIPRq%_}a1@3Z6FZL>>peep?9ip@e7zKe%NS-V9{U!hxER9ptI+``!+^k93| z;B&F}2{YP~DT7~{HTW$oYzs6yo7n8))lfoS?iOKWNavG_v2gL1#oszwcMW>*#cDn& zM8@b6arzrnFE5WH+)cpZvxA{t=2G;?;L~=7XF;w}n zi|>NmW=RTCeofPhvQ&cjvf4=$NQyNiBvYZuUu?1~J*GOBBvs@F`jjlinA?^OoeNo= zOVlY6Mv^9xUpw=uC8ozQcuj9V+ot|$V~)QO2& zStygtR6}%&S(@y!lr67>gp?l=M5Fx3n8p?kF3>_0$`9^oXCcgHYbDKO?Q}6F%f;#9 z>SBV}k^oX=l`NLTBqk@dlF|n@r&?ntK@P>@()MX}I3*4FW=qvWr6Y~0XHE5t-3=1x z+3gd`)lodpJQbcY|8DqwU;AOr+DHShy&1a#>WyUk`1Axl=2{eSVN^YeGj0 zZkAU8Y&k4a&`jMsC5I}yzYcr89v|OWC?c7m2Acg*S=CmTc~uh%JG)e@bfDiwL6cUm;*$?;hCS60k2x zV6A;)8xTXEhClOVlP^aQ72|w^{qk-0i=gxQH&ynHD^g4PZY_q`4-{l5Of2KM$z_# z1;|$p`OU>OVIna-n&x=(h~1s1lYB=wPExrIaY2GEI z{D&Mj>p1)`HzWHbfGUCIAcc-2U`kd896@x?Am~4?Oj9P*w-j13SnzS!s!YJa?PEx2&=*@vvH3BwswDQ** zXDXlCZs!DU^UqS+y)<7!orQz~*Iut5eO^Q;&4E6DM!<4V4$mN9mU2KIaLO8gpOJZo`m<3bpNWri?<{Z?)^WrTk^_4o`j#bAlNc+VhrR$Of?DY$RLyQ|90yRP zO|68i3&N8bQb~3K{pf$m}RXX+c-s) zzqN9u8!`%#E+PMdWKpEgzB)tt%%8U}*c_H7_9IXC2czQtcX2YL9$SrmkJQ8S1kSzf z6*1y2)WfrhJ~{B@GYD7?Jo#h-7SZ?n#~^*BHHv45_El?eQp&lr_3uRA4`-vV7;zW$ z{QzMx2l~E`faO5nzaU@{egET_qwn0E#uhaNncx;CoLF#@de)s_DGFEDzh)z~7|5PXOi zq!e}>kxT%&2FvC?*%kI2?;~oDWuvwje;3r=PdLqi+GPSJseKeg?ms}VS^ETtK5f>6 zAPU&jE9g_zg$^=YbuYx7KI?uEV$X(0&^|t_K-!9lsr%a}jFiMd?x~yA;-Y<;sz^mn zlqZ#g@>KD-_KD-A!(}-89ZnS=q8D8f>FtN@uh#Yf$dln(ItY=iO;nFe-9IKHGgX{s z`vlk>#T$60phGu{9z6wG#!fwD3c3XWs!(8R3~6Zu!M2ZY)LQkCV5+@g;cmFXr?Ie6 zniwk`S*SN$8w>YWn)rX%+P6^ed@ckwTPTBJ7m6d9eUN=+N{aFOkv=M5_F+}HC2y*D zinJb{sJKp;5=h1_*Gqed6XaCwW|R5s0lfSfGgLw-7aG2?{l2!VfE?C4)Ucw!V$CSd z5Zsi>)IMh}U=+L33tj0|UD5pDiphN&p&^Ia^=1N=gDi~`C;<2S!lNQfyCMC>R?sF{ z#ExjbwIo2losH&V&|L`7e)%x%XP;biO(Mj%8=Frm$dS7IOjU& zCL-@iFUn*Civf2*-s7RU+-%^760jV|`x^&&2WN=9UdB-37R#BCt=DUJz4xfVr`9sn}TA1a}6>Jr#Kfz`eCnAx1=4PA%!)S`nn_f)N)}*K?3FeFW^N8EPzO z*o$Yn+*;W$XyWb9OreP*tc-DPC+%M*EayP75&@ezlKFd{uhO%}wV|T#1hn1IZO=N= zl6z*pl)ZW`P%?32rC06xHahOGJe??#19|TwU^%FUClD~D`6UjKg`5)0e~0BZH)ND2 zT|&Mp4jBy6u?K}ZI|ZWuCK_IGmtV(D@rllq}E6SYROGNNOo-KO=cNfIG6C-K~pND!q9 zNpuZ$J_qKWN5E!I63v8Z{a8U0Z&8#&llG-d6j?mmNfzxT4Cg?uM-i}@BbUEfeTgx5 zhQxi@Vu`v?2*zp!SV$@xzf)5cUbKuMO6R;fk@*M;$^5(v4hG^`iUlQGY#|H;td&^$@8zIyW z7!+>nve_+=pAde`RnaBF0@)%uP=HOeGUkBQd$KmqeV%v@K{;on+x!qz=z`~dL_N=e z=YBxIW=@}Zu}7Dly~|#LH1U=LDKu%H&&&_Sq@9%3#n6Y`_5v;-U^7Q3e_4I53SChm zTTUQrzO>y%q@l4TUuw-pYT-dGd6c}@gI1dey*W&(^#m*jLB4{3Sq293gH!1E8yIJ} zA)`p>67si5szl1?3p1pA{F(OBT_J|b7j~9LgR~9BZ-g|E^X?IpKb9%!wK=KIzi4^BzGH@AX#-O&l9b7Poft@4S;RoCCT3f`H8&x%@T5bC40s2v`m>;#vY`$q1x-moxeJIAoZ~+wOWWn4M=~@U;jnNV7dB z1)7xY>8O_7039c+nFi=(bZ|ffWOTMdM-a*4d>sOFQqgUN3hHzrdB&*kIdJ)Y0ycA! zXC|!BR|=YVYl9S;wCAw>Mb5mPOwpGSnscDpiwW4w(ahfz1&4l9+^FL^I$&=(b}lL> z*QfF&8eBzW#{ubzS+>lXf zbP4$}amb*z%6B~&^wz`0xkihVjqsO;z8q1bbd@TaT|XTMPJ`iFex-?7nr7sQm0GC z?WCs`5#QxNv0egpv?%7t>*24caL)=a0#j3mPApq9yPa4{&ZtM_OT7zpWDMkofL+pF zqFu-6+gl0IIZ$mE0n0%%6$zNsOx+|8xPT~B7#N?d1_^f*Bo~tudwjkWyKpYisJCKw ztJ6e#93dtLk{u>sM}cJOeiWR{PSxRWOk7Fbw9FI~>|H|s1?dI_8H@?M>hRd#dpTu9 z+)dYqmzi0D$1o}0FHo;c3adhP!{WU}19RbfwJylI~_{IMX3_xd-5B#x7YCf{}vbU!5g z=0L3P6R;cv-9HjAOB^9XIGNdB(7hoJ8N|`cXGk3R+dt>2xqVY@zsND`4B2@LP4Y`$ zfq3!eC^6nHCiz9sTyFmL^9fiEd~-ShiWJ-hGgx>1!BC_sTgnjWJjlv zq)_aawzT9I829mvhHzJ!3~APUYQU`iB7or{d%WMcmn**_C6MMCCB4+AT<7Ezac|70&K@)HJlR}gB#Z3Mf zY}!fq{DknE1F?QYz-EqE{!7zybf(CpDbseAkjB^SSK%DWjb7)@)fXG|dJ^hv=s<4f z>KOzq2Q6_t0kgCOGJ{j<_-l#p5IP&p~|LK)`a~%Jl>+TIwvGAqsmbkVFgP6dCl=aWDK%gUoHK zLUtSD2w}>!F;e%!rGL-1fd+{W5vX&Hx@`_YnJ)P7AdMjhK5P)MnNwq4EYqdU@fJZ7 zZylCG6USz_$+(@2jyDp5bD-Ai2-wU~%U^_FW5;L}YNLfxK_>Kp5ECo(&YDW?EET1R z^5uNVd+l61j;pse+FR;vid;lNxp!Qqu9770=xF-_5hw?0e~y6Vpd&s`z%2U$Im#)! z{4JN4xgn!u=@Rl-95PrgH$N!!+G#3Q2JVm>PfjU+#-AgK)Z#f-CA)4r6`=6|@`4rT zB`#yqQ_&USHAY$u!8z&Y)@p(-U1+tFsP{R{oZ|`D%*n}_&}!=iO}w>Q3QZiIJezGh z>9sY4;vDF8Jpr3Jdim=$ohDJv7f4&i<}_tew2MexHJUHcD3hY3Rj(2;ooF>e=*@vv zk0oF^Xr)^Tn5C7FADptsUn?zgLq^HaCFI{bw9En>i3i2Iikd2(RM7ZI==Sn}BfELu$8F+=3dphGSs58q9deRWKysJtaH zSN(lN;m>5Fuo!a}6#f+9F$W5NoPZrI1>p$w%Rr5D74i$37?|7AUgWroNEPw3TuIZO zJvTTkF4*j?O5Ok^0p01OBL0mKoCCG~m4F>BYK=V&u1=hP_taf*J+QtHmR}rv3tk*N zgpZy0*oBYX_;>_9ZpFuK_;@5f9)*uR_;@rv_Tu9)_!x%AF>~`U4he4_#!=xL2ZnDP z8@_RP_{I_98wZJR94EeUsQAXw;u{ByZyYneaoG6Ak>eW&Z{2W=V!^oKc(Vc;7_f^QrQzHvPG#v$PwM}==37`}0A_{QPk z8%Kz59AxV39$QM3G;SZ4)A9<*x{p+>D~^UC;g6+hIa}-It@Rqj55NuNTsbF{k)wN- z8eL8k^E}edqpCyc>bXrM$U!~dPr&}TGqVcZH#Uxs34GMxam>s(>>JJy>>j?chxo=$ zb~R&`NuGMW;wdp>kRUnF7!`|;c5|1IKM+%qC2+#tf9$P?v{O^XCl;<$e`o5xs=j;|k?_yc>U7CD3%;awqu%k7T9m^trAH?Z9>b3p#(s*HKtyLe1 zt%u?t<-9oQHOR2uZip0Ww9lA3DZ9|ykX`7s209+v&dvOJC;^kCaSX}dne`i@bCQ|r zPm~L^IvkRjkP;GxCKr>0>dlu>7m`xc37WhvaK47HoWpFIN5GCTl3f^)OeU>Lpjn4< zl4!T&OSFp&qREc=C3d};5S;_niUjN^P)(^(l(Su`(XYm)FsjiP9!qL8F-GTv$Ef^Zt8jt4E=ZlcC?gwS6+^3=cjnDpov2dPKzdOkvFLY*`>9Aqfhf`CmsK8 zLT(O}dItfUIZF8}dY#5fPnu1wO0^6($y@W7l3lS^w zc+P=nUngKW=!?%2Fl+x38N(@l{H5U=+>lW?bP2f?hYXtNJr52|1lJ8UgTqaWgN+lo z7rhpdBPC4x1YJ10CORMB@JO1AO--aWRX58H*>h^_i=>ATl9OC+nJ385g&sPWI-bKs zIg5ZDi_&e{YUoBm5^pt>LJ~)sU`h_xM;zGU8trX_Omr+3b4iOaQ~J2l;?z#MY6Iam2STkS zU^7Q3e_eF}*>^a9AzopkS+7;ALEY9+$;ISM8q1ez7b4Zrc_WDhQ47?qPITK(sLp|I zWdfFiHrhkLENz6m;S@mr+Gv>@GKz;TA25 zq~7N+XI@6YW=_`4gi`vNpozCqN}-7(uZYQj9b7nHCj90=tS=C-nIo3JVv4ecM03cR zGDcnzql8pPzt5LmMqUw5Lj8ttn**VKMZj{>Gz5~J@zmwb{ingf4+jDY39pYJDNia&wYyN@|qYoE`~%6O}q9N#`d z^!;Tv`ic>ELEm2x7IUEQ0|YDw`u>1`Mf5Gt5PdTkAamHk?#^k)$Ld7t%ij>0tkTb~ z&&Hl8GA~Y)s#Ev1kFN)#t$Jl@ObosYQeOhiq2ZVSF6H#~t{196s*E$6fe%JU*U)k0;{eZhYK>k0;^d$@sVzA5X!@Q}J;h zKJJIdF?0F}k$|V25D)l9RNx!2fp0_zz7Z$*Mzr7?F@tYJ4!#jT_(l}r8?l6ML=?Ue zSNKMB;TtiAZ$uit5pVcL)ZrVkhi^n6z7dD`Ml|9ZF^O+PrgcgSS)H9)zG0fDmery9 z^h3)hN_%m+nwDaB3;DcDqvTAQDv=;-9D9Q7GG&MB6InY-bzzD-&tu(9LhK%eEzk2< zV&Gi}u_q8RbI@0J60oBs#Afk9pC)LgF1N{Tx&)ku_M8t^ZYz{)3E0dL&R>mOV@)A+d8+fh3x|S^heoqhl&a^pd?|hHTus?t6i?{r)MtPp zT5J-+1p>cgrMrnhIZV?b0+xeP8X#awbx1@aM>)lqzw2|38!`%+E+PMn=LocWdpyOUyU-rbBogJomQN>OIk4qD1S}%)+m1OB z_o#KGbwUxO#KQgnGFqXebFL^qNc8?-HhK#TbV2XGBCO^>@4qBqInev91T3QWhh~W0 zUM5JQ1$)YPP)Rdee{7JsZB@u_tNxHMW!kD2$e89W1F>W?v3Ry`5a%Hnrx#_9Rck=%^aa|zhYQOjRT zFWfRQQkrbwh82Wc(k*UP`2$ubsKJw5~ShOX$A2fiZ~aDl4!} zE4@uU1V2l49Z@TXiMpDA<)9*#5HQP9MfP$EGJi|;6gOlPGhIUdI!UTXt$p)Bq1H}- zyA>ft*%5nhK8lCFOQ2oKsx}qQuFmct+?(p`GUa-?9nOw6qh+EntKxYg#{P?x8Uk}t z%&pV}CAv^*hp6v4%#|hqn>jH#6H4u^f+pTdErlkI+$x$;J1Mj`5pr{&)awb@%u&i; zq0Luo66Rx3lc%s%Oze1uqIQOQQi**fU&3CakMJ-LOBokaLA_TJ8av*J)L$g(iChRCB|&5#1~=lSy#&+ii_GZM3w@4D>?LtkQ49(?cO`kx(a^T26IH-F(qG<+BZ2437B1a6Nlfvf` zg;!>yuo!a}6kbk5$wB5UAz(RBcs>D(4A9v#MBxn9#bqjK5nZs_D3nAtY>`wc=ERsw zWFE;zW-;(C$oyDBW)5WDOTdnr72y?C_VoKWE@Np;(ZnT`JsN#1_$nz4BO^u!)Y)6Lq%3q$T6K6sjclM8}&5*ijQ5U!I~%Y*qld z_D=b$>mE&lRoWK~xwf0Nky^E2ABnL@)Ap|>jkxa#0(u*9DFkfyL|4I&%Txl8o?G;~ z*S>(YBC%{7>UBe+v7Ob@!2lCOK|bU{&q%e@XkZ?jL@@KG z#%{U~u!EaRQ5QE113oLw;o+Y7g`UK^eU2u_gJxJO1JrF#Wl+~*mbd2gL2kd7f!uJg zRILCSgXu#(>&Xo2#{EH4=1!eH*t0oSH^S(<1zX@aSU)`6Xx6)-)$Y3)3LZ7gi90+j z(y|YamnJ8H_ot7W-*J@hakd9cT!$T#VPG7{XFL4{|DS=iV63gCu$+!(xAd(M#tc4F zO+We;pKce^te_%B^$X*(mkPz<^ps_;UK|_DQ&}&Xu2c_Z)CHWQ`pOl+4lI_y@!mY* z0pnl!tXwz=w?Pl@t2BX$6jf6?GI|eVm&L7#%wV3xx!}6t;r;T0u3&hiKC*blaI>_p zDkgVIpZ=5g=~}n~eX`XIHV%izq=oe*_Q6`&It|AB=AQCa?A{apk5VS!H(g}?JD)|HV-%Fb%F0DUTz20yeJ(QkKx|awY;@yv*~kTdAs28rPM42d@Yiwp z+kugW)b!2Htgc2DI43i=p1kHH)E; z#0T+~o@q#(VC<`M)%AV(`VaYf$em&n_$>J<$k#&oS|?wF;?<*U;tOFlpR__dUoEBL zMdFL6$V(Y7X{^hbmoi>94s|8+_$Kf*q^!o`a9||XES(~LlQPj60NYGrHVMZ6901#`a72K7X)j;@awLC%Pz6;-??;DnEI z$+jsgCm4+qD>V6}-;j+JTu?vDZK4g?c)JRmb_w<4+$sQxkcnAcNO%kH>~iGR&9zEZ%PrTcB#vv~)PLb}V4XjwS`8AH z7CGhDx@@6%cLeF(AYaTU)Cyz75=ovzeimmT*r0IiCUxqcYLUkLeg_`0gZ-7pNIhr< z!nDswo4@BB-R9p>cgxh_A9IXu^(ImZ?47*h>s`pmM7BG)?7Lz5*of2b35Eg)#>OmT z({5_WlDSJp5s&Q^Ac@ilHtTuS~#qmTjO;<(q?C>Dpcq91lrcHwbN*^|N2L}@>q zW^j0l4Ja_h4{#ym=69o7UqWNVK7TOqrEDDpim96HE!iwUPvv~GrBp5(gSLD;SwJ7= zB6ADK_dGy9gyVNhIjH6V`k5TdE4EffYX)p@HuwaW%IR#7&=|47KX9>^&IV~fKg>mw zFB_zRzKtW)mkrWDKZoPjmkrWDzlU?!l0gxMy0bQNAZUs`G!IGecYG48c8XAQW;q%n z@}JEo>{_uUDSDJRSv!IJ0T=V@OXY)@4t)ARYkc7AD-8h;^^(|^c8Th~PCZ@8d%6~- zRc-qH+`~bx1}QatfUo59bK_)fQsgrj;voyZbbl6~p*O%D|47hi48X?VIBX>BfIa(I zD2*@lS2?hNAp{71T0FIq&mS4-GkwH9fzS4JK&he9q3Of?DHl%bL_A9uxV(wua-n4E zA+`7JAvf;i9b4%sH=GD1KvI^Cf8&T zKMsg*;t<#Ad3^&&w4k0cQ5-NYGmU3oeW290M6URf+ynySg zRi2W@Y=>mc_qn24<1K5P5a)7TvMz(Pal)L(sj)7Dd~m}29PcMcMNjL*3Gvlj&aU#D z&rWzfoYot(4D*`NPN-LMTyC4roOS}=&qd@~|5@z>`4cXKlx@GMGEu4@@trwe;9c{z z?X8Ar>Rink$ltbigWSt!V;0-q4fMMXpcy8Q8|V?voBp=F8{~(%g!HxT-2lJ90cNx9 z-C*C#jh|`R_HO83=AF)9!{R+(lg!y~A}Q=R4F&{p`5JUSK9s5(+fIf_i4UfIbY;F7_m+jYc6efGY z&DMZsw{bpq?<$)095jpjzJJJ7hig|cBh>%qtl-*J%n0>&Tsp1mk8vg3Fec)lM0z-v zf81;n@cITm7u@?SW<7>iyH%PIf5-XExz92k*nh!MygmsT-dy%3E}`A~EM7g1^V$lI zYd9CyY}F@jX$AEonBheQUU(4hxqLz-oC`A~HtaGwnEJ#`Z~k`4j5Xyua?i(HKrs zo2IUB7ACN@ZJ=qK5!<3|0d`dW_j z8$2gUaOM5sI6F@iGBM1pjsKny-a^xEaSKsNX12JyM&Bi zaqipHp|&?Re$A1*dTXsd65NE>?o4c-s2%|?4#X7u>e7$%j&4rHLx&a#14lUB);Q~V zk9`w|xW(yfvgTc_&bW^LLE(Q~W_Gh8ra$&V4m4!OCNh80HlYCu5O>YeRH8=8aAeffg+)}UC zBnS8-U!g0IVU0< zj3qqWTmw5x9M#MyNdBJ7xf`>fBB5cz#zVNSi}%~?wl_XL&au4O#K*>BMnv4fc{p7u zcW99?@Klb0HO_k8V}Cu@oF+t&7e_J1Z8@#n%)?A3+I;Wg&{Y+(O=Fy;KA5yn}~mPXwEg^FLg0EKWm?1I#Xt z##SbeEe+bI`4E>` zOGxGLOdsX9I1j8&9%XVHG|=~RURa$xP!E7_H82;9eL)J-@5t8!^7VW9I`uAbxb)k5;O5AGINF^(L_SIW97zO<=Q>0fcP=o8{uruH6bf0pV4vmtFGLtO~+wBUehx zoRib6*Jm_A6nQ9TmL+7w7xW; zZ{vKllGX9%_1E#q=-x5z+{ZW*y_?TRSG-R)pr>=PyK)m`19}HXfH*UaXRjdipw(%Q z%WMgl{eCVh-DjrFdP;7@8Y5PJKc7Hr(pX&zz9fjxkf1x^d|DN9P*kR#}RB-f+YK25Objx!EBAvIBkt=d8^R zIglOj=eWpnI@Ys8{yLvwLvYdnjCnaD-6=b>xAS8z$orGhb66~$O3hn2HP{wnXc zbGv$4NO>1$5eV${W|7W4e=`?<8(d7Hn9Gw(KEa_5WSQl$KF2xx22RRt(`J)6@O4~5 zZJRcq#DU+;dk)iQy0nZ#Khanf24iK*qB*?*mv)$!XPm0c4)J^3!nlGg%joWmIDpIJ zc1x^i9OiYHdTdZ6e82$dO;yPH;PUmwz<|&h=j;SasnJsMT?L}AeXa&c)_k8&tBx0E zc!2x^XPvZ*Gd!SvkBi*Yi!(gHzK3@<_2LW?nz@EDal(`pf)Ht3jvZHt(H zH51ftaJE`2`Ew^micT~urD{e_J;j)T%KmkmH}Q@pw@VEBHs0MEAuCt%r7V(K$&h0! z!uz?sur=k{m$VkB@57ucwt+3&@s<{E;D5=HzAfzv7;oTX9P8IBlunlFjUXd~e3v64 z;q()TNZCoNtFbl-!RK-uZ1rc37}OYJOmP9UDGOu7pi`em`K;cYi7Ao*ALKOKoQWZl z0AFLs%wX(pOTnHyQmuf@=xZFA7%^7&I=`CnHLe(={Axxa0|d*jW)zFVS`_KL&7wap z4Qtc~?Yf-L`|F*?no-RV*Qyz!>V=$JR*uvrCV~fp(2dZuXo2&*d`NofydMlhgrGE5!d-asIz9jsFvY z-N?JPyfgbJg8B{@ipx85ekC*V)r#HV3G) zc)z@u%>nAg9D~a{OIpbv4p3j`LK|*E>nwW`fqkCyiB4x2)M4e|D}BDkCzCtn31!BZl127IEfS>BAguXsbCiP@O*f;fD8g zPTIZ0lA+8BU~J)0|8daK;$U*33Bjut;OH*o%_tD@e{R?k!Pv{?-qu^?>x1(3S<7ra z6)p}lY|WF$W%>{JHEvqYCZCX9MF)$SpW}6}kX_%=zuRSx0z9xo-_B*mVk6VZa0Md6 z%r;bXEy64{;ZDVUaC;Jfna7ntAEZta*WCNUcrRy!Yv9~?)3^S~T+sB0gk4@ExSAuP zuW_I<2}T@VSLX%eevXA}oJKw1-asVr(fj!{?QytR6KZedBY+Dy**Y<`uGXmPnl2luQAAB}^7`95bW6}Ya? zmL<=wZCr}4XoR&^wX8NI-Ls1Tn^Wu}L&zvQ>$>53vo$=5*IEjuS|xFt2HrBz^_&!t##nY57U(sqT*1Ar(>gSF3?oWazFU>p`6 zkagcs`{ydPZ+(v|@ykj3TEz@7mntysf^m3oB(hW{#@U&c`^#z+1ap%MW_K8iRZ&E+ zB{WK;?csdl3S-F*_|*n+bbO3sMr8;56wZv!FqZ6)*KssE!%MP5{yG=haP-l^5=z=T zrnS{5@Wki2_;v5USQXto5!W%#<+O8!mrMil(>c4j!b_$B`93ato#7?Z0R0#)v({{b z1B{SjNt~<^M|wLZpRpPR;=PO`*k?j_Xp|=O-*LW3pU^&lS8)Wp;?k_4_W1yQHdl8Z z6WRyzC#N-`eIP%E_j#?ep8tfN&++Rsp*yuoOmP>NKj{gKCu{YlNQ*I0?qFV7{0&q21l~<|bg@+tvcUW>my8gr&mB`)VE&fREI5Q@;opCn{*X^4_sN-#J&bGI1DqpWhmbPC zd^jJr>*P!(m`~@7>5O^F1oRsQ&4aOrKOT>7>T{dtRB$_Qv;=pF7}ob$%KDBz#x3qk z$S{w}7yvGco9|JnIHVpK1m48E#Q3s0st2;*TU;2zqH7{J6pP)7D)mLcyYOSmf_s;5V&+Mofxk`M6u#A^c5!373OYrj!KHve>B|HB7*ePYJ+ zba1zEE?vIgb!kyLsGo39t2`bo_0S69#FP{U~JJ!fi9nHN~E5yT3>&0#DPyp~9YSOY}R zhZ&H9u{lC9jxDzI`alIDBVi|=D70F_;jAC(EE2Un-h%99~-%y$; zSKY`m;J_R>mFuW=K*QFgg)O6w+QV_QMRxFqXV(Uo=Q3MYzs8}i zhwQe1yDqxApW}2bi~h>i&qs3sx=IpVS}d2I5)Kq}lF+@jf_tWmf!dAfM`e;n#I zFFfFl#tDrQDlXB>nSYf1~`|CfsMn$ARCsV#=d*ex1YVdpBqHo;ZZn#20T5j z&W>}a>t&C;ridE@|H-*$F>FHCn>6FGuMjOTE<&OT2C{;&n=QlmJQYMZ0=qQUHSl@^*!mtfXrm2atC(RPvkhRYU>x33sVX;% zIPJm8VZgORELk7`;h*FPUkAsa$}k-&Rr_jPtEv)CW@|LPzR1PX4FYBvG-^G7G!T`E z$yRfk(0{{K+B$id8@p`H2=5-hluN4h5zJ|J^bS5HHc6oMU_aiaU{7D~&R)#nZnoi0 zv%?L8*Ogs&qo7+@tCk@@2IzR%?`gsxPT~u}4&6e(na}xc*!x^ib2XnP+r~?c11hbF zM$GiMZ;8?KVC;ZggWn-v_siD{Ex~iVtF%x#o7ChEi4foK28mX>!hA)vV#x4REK0dp~&FIaQs8f> z;-LkOwQ11yE)Eke7A+4iUeN{6Q~0h9LKD>_%wq+W>EV%qiQzDAd?x`ck^X{2Ae@F zGq9_<6wzQaNM;81-5d!jW-yy@W`NtgzZ!5R`OEP-f@OockWY7Ts>FB6v%&n3L1ASnZFKIHX9N3N4tA4!$2=R{;~f&( zy>Ffk?n18mbOssW<=?D%oySqJhJdZ+a&T!GWYk2^Y-P1dd{yBbfN*)*2-d02a8Kg= z3K6{6rBY?05sLxK2>X1F3yg*hn$Yd>?m)kTa~Xgx!=0*KgFb^Z8h{2C?jH0KL*@iy zU$TVi*?@Bhr?W5CIa7I3=v!O>UQBKnDq{F>E{r>3s8Afv)%`MIoAVeR)dK$R=j*El zJ0J+zI8jK&`v|CcJn?GI6$|0gu6hNdCHZjNK;Fr_u?&G6**>vle6o4OAJSYtu@>&C zj0d$=hB2MSEu1BIU540c&oHdl84RLi^738v(nJGpV}r}E2h3BTDQF(zXkM~I9kk8@ z=hqz5eY@eXbru-&IgTL{Qmb5t>}dX!dIKL(-;NSwfzCkf+qv9WwCPAQXjJaV(36)q z#3)dTw{U^{QH(rADiQ`jjPx^)2ucnx$3 z{J5~;)ocMIt_i7+AR+#i%g?2^mMTr?ij&qBY*SDSa{MeF0{^?4+=*b?98BMK*vfK< znnW0X%~@~Z_R-OdKpcn>#L3#5U-JHS=8UAbif?qzgu^=SZvH#69s`4Vl>aOHScU;_ksN;eMObdtrZYurd-1Oh5#{xYv-c<+xt~ zk&TeJclcypkaa!I-p9By!(0>rF3W@u+~q@YgHFMWo?jMFXM#3 zJOhrklo*N=J}t~X#3=)@M4%9z3n&kOKj9K(33%HrKd~H2=Z-zmAdu|;5K|4y< z2UN%zXPG#)lDSilbqJtH7@E?J8yQ5u|K?6rcMPI6HWced14O`o=0XFZrEo(cG~T!6 z4o{8A2T7pzaL&4}(Hb8w)$N3IUZX5H{ zOEbaWVsc<-u-9=K0oVkGh(Flv9PC=Br_>+he9q)c)z~8QW-F|vYjs#ebdWH=cJvJf z>=Jj0@FjTS${k$H+%}w4S)jL@)=uO6`pC|$*t zXb2?1!#VAir?P_uolt#<%O|`%IYj`tVO_#UwgR-V$f4mPkYm);uitUqa2;@!faOGg zCtzRT__}_i8kFkO1NSP9v!y9|%Z;$Fa6oHN2Fd%2w@<{fsVYY6G|~lJtYKp4Ce-O5 zD&4)ionvh^!s-Xl@i=lwR+^s2`C~Q0tCYY8gA2f{0Dt7@Au!4G0ba@hVjlMhpbl`z z+S8XAbP2{zeS&oaJ~%uQOyU9>7Qo{oLK}7o^%3~!V|+Cb9f6O^7y#H2_^4DIk}{6B z=zh55eN-C+&{w#Cc4r@pYOywGs$aur!6M1y1Ka((^tW7!yCYm!m&{hEQ}5)QuoxVu zkQ5LY-@jL9a+ZfYtd2BoMz0*rP`6%a@R3@mtbn!cfX=!aL|MpEiFh}M<<4wk^ew3^ z>R{Qh27=B0a55~5NIX<>qzRL2|kgt2h zOXqsITt`qR-bbnr-M9#J#)odxt$|xNB7(nZ{;TBiI8Qt>{iY5BMiPUl4#YMAnp|(V zlL7m;Ks?ybVY`w6PXqFQb6e1r40sxlpUA~2hCessx8hC%^dSQs!Pqw~adsvo9+ewh z7lK|~eyjPv*l>lXgL+Oa&1TY^pFdU5iN*V^ogLvONH8xwmt`slD6K82Ri=p4o zh0C8iA{w8>W%Onw#(vm#a(dPsBX$Bl;OeO- zL7V`;#SJh&f;gf5mg@oK?cOOAS(sRyGXz!TCXPu(@uo(&lwf_h^Tf^iQ64i7@`8^jmEm!9w(e9R6n3NH>X4KE7| z;T7TB@XGM&a9%h+ye3=__J#|?mxeD7mxjy372(S8`fzo)CR`V;4>yKe!foLV;f-NE zY=$?7JHlJSo#C$V5#gq=KYUd9=x}d196}UkI2wjwB|H$`8a^_tg|~;ra4>9zhr+|* z9pU4`yTZG}CxuTApAx<(d`bA!@c!^=VLN<$_{8wp;d8@hgwG29EPP@3*l=ICC|nZ0 zB79Z&=izI@YB&+THhg{fhVV_{^TOwcZw}wu8k={=amV3+-X6X)d{_9M@Gryng?|-( zApBtX;qW8jN5|fO=(yv?J_wKSZ^Dmr|1fskEcpHkEc7aTJPiLl9v>&*<0O2XjE__CaT-3(z{i>RI2#{-g-w0{ALrno zv+;2rJ}$t=h4{D_AMe1yybB-idl)?4kB`go!xi|LgO4lmaTPx1;iCs1*Wlw?eDva@ z4X zQNzb1KI-^r;G>0)gZMa%k0bba96s*E$K&zwHbmmv@o^9S`DA?Di;t(`<74>Y6Zm*K z{`m}eguf1dGxi+(>v{ON1_`|YA0NVEAHm0u@y~z5$2AZC|18{NlwR4o2GE!t+jhsc zZQJbFw$ZVjjyvhtwr$(Cb!z6``(uuJ>RsR3dui{la(kQr{={sJ=VCFI;$JLB6Es5t z!%c+$#Fbc!_1J(-*o>{%h8@_6-PnVDScNs%5&1MkQrH#4LOh#xseC?ut2AaP)IC-@?u4l z7R#cj4N@HC#0sd0%BX^BsE(Sbg*vE<`e=YgXpE-#3$4%^ZP5-L&=H-{1>MjcJ<$t& z&=>tN0E3Xx7R`)d;s}hy-x!Ut7>5a%h{>3OX_$_gn1wk=Y9f+jl4+WPMG8x>6w9z2 zE3gu)u?Fj~9vcxySMhL2S4Xf_VLSe|;l^OMxEK3y07q~P$8i#wb(Ixo#q+p;OSp`y zxP}{8ukl9Q6mR1W?%_Tj;t`(U1zzDb-r^lT;3Gbxj0Gr%@8VDVLSQ2bj*tk2FbIoq z2#<)kqJwLQBt}70L`Mw7LTtoEJS0FuBt{Y>Lo8jzK`Jo~#+deTNH1nYCS*ZYWXBsH zdxsoiF62gD6hz?wTHJ1Nw`E}61w~oEFOLeSgvzLjYN&xA2!=YShx%xUsk)kurebrn zKufej8?;4xbU-I`Mpt~&!58!td!vLkDTV&xKn%hV48?Gaz$om{co%BfICU^tVJfC! z24-S5Hkhp46IE}8l>W=f`MHCZDAg?LTkE;sTaRaw-4-fDVkMRW0 z(9FcPz$aaO!7GI~c#HS=fKT|0ulR-^_=!M18yGAnf_iuq9hg-{qpaa)tSC@Gf47oC1Xd9flYp$e*^I%=R6YNIadp#d7AF`A$mn&U4d z(tQ%N5!<0XI-(Q0;EY>4haO@t^hRIw!vGA#U<|=9497@}!f1@aIE=?cOu`flb09`w zw*}aX*$Q(p5A(4Ai?A3=@h_I+Kdi(mtif8WM-hW5hWv(K5Ze@X;36(#Cw8MHT4N9P zVLuMy5RRazu8QM?cnYU+7UyswfEG_$JZpJWI*#kOiCegXySR_}x?6|`;v-yg^H)$4 zwed{h1zzGcW;o`v@Lv3gxMFYJI5+Wli#=4>L zh$+U#a!a`a@x_Elgd~{Z;pmq)h^0^(Wl;_lP!W|;1=Ua;H8DX4lTcTzj|OOj#%PLWXn|51m%(3RE3`&i z^s^`f&{6D+F6f3eScmTDiKSSEzUYqu7=*zXim9e}I!20rV>HHM9425QCgTr;$8^j@ zHsnAw#K3$k#3C#~FZ983tiVdF#&821iBtjq2+=YPHYscgpi9dezyD>T$?ZA5hKOFaWZ58r!h{PfGL=U>6nRGn1i|a2Wxb-4#UI|Sc+v> zjuqGwDu8_`17bJi-$^#dEyCE4;>Ayu$~4#AkfLH+;uWTzB!C*e4!9 z3&U!O;0TFO2!r{WEJRo_9Ks_ail7*xB03gnyaX}CSa^bGh=&A7h{Q;OWJr#bNQE>= zkBo>GI)E6+Bxb<}d_oT7LT=eunz@ZBGzm{$Nsy#ZO6FQ?Sx}gV_;9vAXKlH~y48jl$ z#c+(kDEy5v$mkw3V}dvdlQ9+3FayV}-AVi-F2F)8#xnee6_wWD@@ffiY z7q9RJS&<$2Pyk~w9+goQfeke%f*}M#A~eF_4}?PmL_}mnK{P~1OvFMQ#6^50Kq9R4 zv{{YBVp9Bc8-e_k5~+~}Y0(7DkPaEp8-4K%FR1W!zX+}Cv-tq zbjP1MNQdWmiGB(LFc5>W9|ti6!!R5pF$$wG2IH{FqHMt=aSEnlI%Z%N#$zI8V=n%~ zN-V%4EXGp&i{)5pc~)bUxCU#n9viR;o3Rz!umd}>8<7k;3MT4mG7c#mL2-qWI3b?G zIb6VLoJCJfdgG#a89{A^;D~@oc&o{K+|uL@?&3Zk;1M311~r*Q`7aRHZc2lw#=&+!7U@doel1A(l^p_l<2MIwcALGV3s>1 zLLn@gShD7bD#k!uBtYfZ0aQaK9c0Cy3h6OcVFI#<*^vXe(N3WwM%pT)(aeqig&LaF zMjg~gYqUdWbVGOaLT~g#-iQGdz$kGH#$o~{Vlw7q5q?MJ0JB>&8De|9-8z4w8+xJ_`eH05U@B%{8CGB=)?h6*U?a9*oS{y{ zc(*YLdlmNM01o2_j^hMQqo&4na7Db1JGhSrc#J1_jt}^ZFZhnYwn{MUavOUQTKogK zZS;IdCZZJS_|VQs}3P0r&AuHy!7qn<<35HG~n_=4|<A@6cme~B+8&HDxe~&;2$@>5NCYsJQ^xAK{z)Q5r2uT(FX0&1>MmD zz0n8#vC+r2V1)QLMq?Z%V;W{-9{#~XEW%R6^sI}6HR5{QHN_7Q)4_>@6AGts1=n#0 z_wfLa@EFg~%R{U0@7KFWOHc$u$lp&IP4=UZmq<}`wvoEwPfgMz5Ave~O5?3t`+y2! zWmLDlYoWE+4(-tiV=)0iY>VJnA}+&nti&p;#X4-nAsj^*9}9 zR@i2%F-BoLs@smW(A|Tg7e3iOUy;WE^JA;VJFpiAa1S~Wz)Z}+0xZT@hjRipiCb~Y!{aVeifM2RCx1u7N{370RXoB|1b65{;hXpq zL3I@ZArS^)5gri`8Bq`&r*&`+am4sYfz)VZTQo&xF&pxu5DKFhDx(^zqZVqT9vY(= zx}hhE>9iz@xbfmhZ+mCL1QR{TnVGskckp#(6+yN_v{9>Wsze6dMMma38pO+!2$6N~3R;Y)@ zXolu!iC*Z7ei(>h7>Q9BgC$so-nMN&Ofa33u}NVo?kYUME^#k@ihkZs9HxSf0dqCB8*72k|fb5`$Q`pa_9dzBrUc6frt-c%bA)5-~Z_ARW>p6EY(k zaw8u~qa1o!t-h!&)VgyEFH0EF) z7GWv=#eX>OLYJ^cT#r52k0UsaE4Ypac#JRjj=(wyhKG*n6ND2ZqMj|)5V6F#h=+to zgrrD?KamkxkP~@u$!55UWwzrAlyjkqXroDcbU}CA)A%8>o8nxUt}qLWuoVB|KdiuN zY{7O+F~I5AFCM~ioI-Jrj8eESKEh)>!)v_5XMDqV{6Zi@2#P-t0TB@e6*Z}Xgkln; za2u)d&9Hu=fI?v$#1WK0X_P^E6t~Aqp@rD$H)30~7dzp$OWwmag`McHFbKmi5{*4j znqrDL9WyW+Rc+-OSS{z7ZCL3?yT zcVzXD&Vdo)-x!Zc_y-Gd%&X%h{uTej8mz|#Y{m}kMrXIy4adb(IE`~CZG)6U9i7(4 zb%mRFgr|6hm)NKAL3|Rw;v0VA7lN3p2#AcC-nw%T!s3NS3Wd~2gLKG_TqthSl)?f> zaxuy)R6=dkLwz(tV>Cl6v_(G*#2^gCFpR_~jKM@q!A#7-0xZH}{EHlhkQ+BF)NPco zK}zF-CYSL7uMxs*gvJjskW~ndP>A706&sPnsECEQNQ9(Fiwww!EZAu)??FMa2+E=Y zYN8HWpcNWBrp++N(f9}b6$W7x#$dYJorPU)Z7;SM>UPZ4WImQ-CDvjCc3?LS`Pfk$ z5s%{pPU8YD;|}iQ0Ul$c1G@z$aR$L%JQPCX4}?QRoHY>_5Kl~qwzf|Pq!Rx`Mr1)w zwQ&=^h79ARvga0n%a#Z@1>fnnlE9M$Ow%oOLKidY>B#KqWzt=NX0*oD2= zhl4nUvp9!~Sk^OutA2Wfr+9{!c!jt4gs=F9p9pDU!yp18BLNa436diPQX`DX4u>0- z@ixjUR6=D`Lvyr5W)HG#XeV~WO7~pLKAnQ;h_BN`n5xMP%)}hb#e6h&$!3^=*$8PX zhrtK&GmdF|61NQXE?$Xm@d;m1-mO(aSc?}P5fB-15FZJU7_lvUJY;jbInhDvj1^do zd>R+TJMkkbiB-`If1#5b?~1g!Pr3=xN;CE8#F{>FGr!emUt8G}BLuU=z6uvB3={=+J)#yV`q zHf+Z(R6|Xi#yOnFCEUj&JjW}%#yeEBcvTR{#e?DxM8GA}bQMv>7>J7mNQfjziWEqR zG{}I=$b#&6>e2E7Ma1H$fXb+X>ZpVIXn@9OfmUdZc4&`I=#POIhLISH2}tM*K@vcMw}4 z9ugxNk|P!N`ATpQDNR%wlu{^zvZ#Q)3J0*r;a!UNmh=<4YtjqjU3?Pei3@O8lVjK> z?nF`Bumm<>GY;S|$~cPU@loS1_=+Exs4xW~3@|jpBNE~x5fURAQX?%gAuHxPvWxJ} zbbdrJg_5X+y4dM>?m;85DZXj^6D`Fy=!h=piXP~RKKN|--!N1hfsq)E8y(1Tilo9HGCFKunAzNRIT#gxtu7;wXjED2MW>gv+|RhH{Q> z1=Lq)gt@LeAI-&1D;g)tb537Co*n2Y&Xf@N5al?dkH782{k zjhKij*oT8S;N@``6>PoAxTo+C&+ro8@Do8D(-7!wd-ua!%tsW3=!k>(NPxshfz(KY zbV!d(c&CGpxM%7f;*^7P7F}(I9;mNzBeX(WbV65jLr>)Lc*u*k=zxg|Q!o`XFcWhy z7xR(T(&oT&aV1t^E!JTpR+{29*e348AVV06L*h}ab6_{(f(P zN&JeC1|0?okQgbD8XFvg%_ye(lE|-62!&A$?K}=UqP$oMl~E0I4Pic7ifzylT`&+s zFcc#&5~DE&<1quXQNiL>#!7Jw7USOly0lyyV8H*-P|KTsbsLZH1iP^p`)~jUaTrH% z3}#-4+aW#N0EjRZ3 zzoAX98t|)`n1wmmS}%a@*e&kGd@RHwEWuJN!*Z;^N~}i8>H(z2CUFb4Vmtn=8^Chx z5O-l84j_$>rNt5P7}ALua7sLbvpA0nxP;5NikrBNJGh7Yc!)=Mf~RjSDh1iITcu0VR zNQ@*%hU7?zR7itAkq+sR5t)z$S&iLvfTu zDU?A4RKh`>9!52>2Ex|~AR@kY58ylMDAYq<6P6#1#3pEp=4gSIXoWUdYTGVDTd_Sl zqbpjv@z&@m_C|jU#CprP5ktk{7=cmv8)IG!gMSnjU?CQxtFF3ZnfM=0+gxX{T3m~D*nlnAhV9sir!@k2j=kc39KazQ#!(!@ z37o`foWVJq$3-NxP>FF>yp9{Vh11r!RQFp8oWN?@`kQ!x{>QC^`UDxnIhqB?4z7HXp| z>Y)J|qA{AF8JgoS{IHdOp{3XwZO{(w(Gi`{1zph{b8Lor=ppt(Z}de!48TAP#%4>l z6~o1m7=_UogK-#-iI{{bn2PE6YKp&OhByneF&FbN9}BPui?I~{Vmbc9O02>fti^h4 z##U^@4(!Bk?7=?l$3Yyz5gf&FoWLn`aS*%Vw0IWhZ~+%_8O2R!Nn96i;uh}UF7D$2 z9^o;b;u&6Gmrb(=Z^U<~tkbIaB!0nHe8&&`LLfI81VIrTArK1Jy9aO+p~bNH1K|+? zkq{YCQOzZ5Af^}_HO1P9BgR8~Bt#-4K~f|~3Zz16{E4(kj||9!%*cwI$c;U<0@#Nz z2KdMCQT7Pd!iTmpfCDk00v<&hGG~-U?l!VHsruKOu$4;#uQA$bj-w+ z?g3oGZo}G(xeEVaJ{DpTmSCK)Xo}`&ftF~6HfW3X=zvb>jIQX09@x_} zfPIK0M!`PIa{ztBe&~;Z7=$4his2Z6QTQ8UFd0)Z4KpwkvoQzr@DCPXAr@l^{>4mF zG8-$zRalL+SceVRh|So7ZP<>T*o*x*fI~Qpqd0~WIEm9ZgL62Ki@1aGaAfm^tZ zySRr3c!2K;gYG)*iMV2XBtRl0Mp7h03Zz78q(NG2@F>`XAoT+X zhAax%kR3UZ3wcmYlNu->7D8bZMKP2>NtDJlhxi7{ixp7`RZzi{R6-507HXp|>Y)J| zqA{AF8JgoSbn~F?fi_}0v`0rQQTX?F6R{V1n&RGgtMDEJ6$WDnhG95HViZPW48~zR zCSnq%U@E3#24-P4=3*Y^V*wUnF_z+AEXRLXiB(vGwOEf0*o4j4if!0|o!E^$9+vs= z5ufp>b^uSXUz3A4gd;d(DbC@vcos{2Y#AJ43h=X{DkAz5sBuI+nNP$#HjX#kV>5&1MkQrH#4LOh#xv|w`Z$}<6AM&Fh_L`>s zC?pm^Q4~iBltO8g#T$$A4&}rOsEEp_f@-Lany7_3sEhh&fJSJHrf7y1nB`$K2d%}n zXon8yh|cJOZaAy)d2|%)*;9yU}L~$~vU>c@l zCSse!xR@*cgZWs9K^_W2uvA=zphJIE6Dfi}Psdt7&Uo5HH~}uHqVQ;3jV4FSNpaJj7fN>3{H4e2y1*h1YnC zcldyh_>3?3hVS@^UkGf5f*=@{;9mqsNQ6Qdghe>iH0`w!NsNN1h>meK%>={{V_}ZQ z^AJx=fJ@>PBoUJ#IZ`4O(%?^|LwaOHCS<{%Hc~p|5OX0n@**D!pdbpP2#Vo~2i`T5 z63Za47!-MJ@BDZ#end3KJ_a5;uuoCP$LgUz8ln-JppeEz&`NBBW?~Ec^}B!zChQVo z*(!0+Q{&!vq{$Pc*5pt0R~U#v7=ob~ju9AzY9^-!#){)H0h4e?SNAYYoPj7V9u3QU z>_6P?9>9HE6|dtTjTc}c7Nf6y)gQ~m|42C!g;HRbxCa|;i_JJ79>QT9 z#RH4-2*<<|$Zv8A;)KE}oL9JrOSpn(hVTM6#9IjKD^ob!7VqMmCKqr|e1L~|j3;=8 z=Xi-%c!Rfij}Q2S&-jWvCg&c$i9hfYfy_Z*1Vu1}KuCl}82o{7h=7QQjEipfGNOwy z(M``i5Lb+kaV|aq3B*K5jHKAE@lK=^QzH%1A{{ayBQhfkvLQQiA}{iz01Ba~ZB`uN zZJ&rJsZbhaP!5$)1yxZUHBbw+Q5W^l01eR?P0$R@@fS84%x1I^+o2P>pewo~qfL_; zy~V!hhXELf!5D&J7>fytnWl@ylx>u+y_aVG}lEE4E<=c49Y@Sc+uWFCN4p9Klf>#|fOm3f-^5 zIq?E6;xew_8m{9eZs88@;yxbW5gy|yp5X;v;x*pj9p2+3KH&?>qauFb7XsO4K@b$d z5dxtQ8etIukq{YC5e+dA6R{Bo@em&gkqAkU6v>eSsnEyd^g~)PJu)B@G9xQGqBF7~ z2l5~v@}nRMp$JN#6vkSz@raGMsHjjGRZtBlZO7B7F4jaX)InX;M?{-HG8%}D&=^h8 z3@vcWHoJq?Vq3IB2UOKTb#xKCA(utTgI;1E^hJLRz#t69Pz=KejKtptZ}^U%Sc%p6g}~mIrBDXJ5fY&g1_e7Bo|X671H2Oq(gdSL?&cGR%AyG z>MZ{t#j*^In1SpI02#<)UjH>uU2jNjutc}@*H8+4REsq9_+J9a0 z$nT%vDV`%%j{xFeYMTJ26rrBDWCQ63dg36)V5)ldU9 zQ5$to5B1RyjnD*5(Ht$%60Oh%ZP6Yb&q4KV@wvOVj5=Pv#I-vQ7%3ja}?&`A1uH^EXFeYhZR_b)mV$-?E)x?b>aqW z!8UBiPVB-S9KazQ#!(!@37o`foWVJq$3yWG;_A(xm3d66Fl zPzZ%l6eUp_n{~Ps<;9Aqges_kTBwb>sD}oaVAD)O6R{auqBYv1Bf6qHdY~72qc8el z02(?jjWI+VhT#~AQ5cQHZZ|2ybqyc_l8GrWUXzKKgel0PkPTDC>6n38n2ouZhxu55 zMOcib_zx?w3Tv#+fwuo+vi4Lh(CyRirRupb9;2uE-f$8iFua2jV(&!%aBi{fQm z!8KgRO+3IOJjPQz!wbB`YrMfbyvIj;!WVqScl^LF1ZosO5Ofl|AcPnSp%E5;AUq-< z5`H<(fm;UNgh8)O= z+{lA`$d7_3gd!-4;wXVqD2=k{q5EFAW^6Z5QK2%bpc<;9CTgJ$>Y_dxqbZu91^z-S zq;;^5H%4PD#$f^`Vlt*+ z8m40=W?>G7n37?bFD}F)EWt{w#u}`{dThidY{6D+$HdM7OvY|;FZSU84&pG5;24hM zBu+T?r*Kw0j|;ej%eabZe+4iDH^tj1;{jg|_r-^JgeQ24=Xilvc#XGshY$FO&-j9G zIBCnD#&_{2YPe7>1o3(ghTsT^PzZyt2#4^9h)9Tnk2c|F#1`Ws9ulCOjZ^`JJ!p#} zxk5^$LK^&ubV!ekh-m?0Ba@f~S&c7LN}&wOqC6^~ z5~`sFYN9quTF}y{FE&IYG(i;utcDh1OSD28v_*S#KqquV5A;ND^g%!L$3P6i5Ddj| zjKC=TjWHOD@tA-~cxbsFW12VvV;#xy$k{f4+z9It84hzanTO*&12~C)#06N0#R#u) zM07Oh&RC(a3ahae>#zYEu^C&i4coC3xgCSNSmxIL!!CtA*o*x*fI~Qpqd0~WID>P@ zs)Ot}FJ8nYT)|ab#|_-VZQR8@JU}F0%c9_k_zcZ$fxplm9r4W+|M*S&fS-P0rjO0W zMr_7U9R#vF10yJcAp}AqG{WEyMDeXVQAv$6r7UE!_#)FZ>@+3oIg``M^ z6iA8GNQ1OUhYZMw%*cXl*xNCH{m3QeL0;rX0Te=E6vY4!nL#KimPQ-5)(+*xil~Gt zsEX?Np?{J`Kagkr;*17=v+`uE|VH5~pD5?*e9E7G`5E=3zb-U=bE$DgMJs ztil>>z$TPy8bAeX6L(;^A&kUMaX0p09}eLNj^a29+BAi6T0Dz$xPXhej4QZ?>$r*H zK2{PB#7B6Hr+9`JIOO0Q!5i@%-s2;(BPYJ%JAU97cGw%c5Y$kEBLqSrG{PbRA|W!O zA{t^KCSoHF;vqf~A`z0Hg~w7$Bo&h*1yZ4cp;kg_@lT{hdSpN*WJXqGLk{FbZsb8e zglur z{t{cE9Xg;RI-?7^p*wn_7y96#1N#_##r_z8K^Tmo7={rTiNBH8k<5>QHt=AKQ<#8> zn2afyhT9&IcQIX@iCLI~x%db3u@H-}1WU0Dg?s43L92YoD$Cw2Z6Oh)SpdOs$`^+-2qlI=ScF4(M8qi_ zoIwmR7P>i1JrGY!fP_elBuIwjNQqQPgC;g>Go%+YA``M8E3zX8av?YJA|DE%APS=h zilG$Bpe)Lxp$*a)mBp&4h8n1e+Nh6)XoMzcisopAHW*=%N1=n*37ydu-OvL)(Hnix z5B)I^VZ2=bz)*2GCYa7i7$J_r-x!0j7>@~Am>^3eZ+*S5-A9MI$t4&x}^DSW_5@ifY~jdD06 zp2IXZIRk-gr3%79>_wWD@@fc6=4BuVyCtitf(8eX(;e+@IpYavn@B?uz zRDApt1Nr+XFoGf&LLihcUSZJBlng*Pg$Rg<$cTby_@v1fL>FVCwV}2}TroZpAQ2KH zDUu-tQX(}bdj(EKIxzz>A~Uie8?qxO3b{}b-TcI-Ran)un#RA#MU?@9>Gx@$7!6!Ib6U+T*eh# z!*$%mB;8NJUGYA8dY$yfWAQ1T;RRmeHTwCAGXQVIcS!EWQ{uh&5ufk{U-2D3@C#{d zxU>lB5C=yHghFV9#UBWd2#AEph>8mq^b%r$&mu7kk>@yM{4m; zwDwiEEi#CikQrH#4LOh#xseC?kRJt62t`l=r4ZHEvgk;N#HgrH8MjRA9W+&Fj_L|E zQ44iY7xmEqjnEiPan*zNI=0z*JJ4F8E!v?2zUlr4;@VvC(Osb@ZtLJK`ilKA0D~|X zL($O38e^pRH%4PDhA0ffcud4Bg*ljue=r{lu?S1B6w9z2E3gu)(b6=v#u{-Q)?*_! zVGFimJ61ZxtFc?$i^mrJDH52bMA)Zr00(gxTYO2_h9lxJeAm@aMD-?#jn>>R>;P;RHS^e8v}i!*hj~_$3B*E}OZ@7N{Ur zLU4pcD1<>+ghO~lL?lE(R7A&4hj=$)i*a#6JcT4;GK_J=$03!N27e+Q(jy~=dhiTK zRxvwrAQvVY$7GzeSx=*&LSYm^F%(BhT+{dlf{4LT8C6jYHBb|^Q3v%<$rh-B`eH-0 z_oqTfG!mPjDVpP=?QEWko6#uEICW%v)Pu@>vF0UNOyTd)mp z+}bTbqTzwm?vPR``mQI#`XttIA20Tu`!yU8Cv>SYcv=C`u#h!MjNz4KTQT8vZaWMt_t08!bUoUT&6A$`Y8;+ zJRh5nA>uH^(Lp>67e`_gM&q)HxQa32IE=?cOu`gQ#dOTTEX>AS%)@*vz#=ThQv8eM z_zx?w3Tv#+fwkjU*O!8UOR&U@`##D4K04&exn;y6y=6pk3yF`N@G;36*L3a;Tg zZsHd1;4bbXf$2L`Ji;%mIYJG{q7e8Lxe#drL`FO>0*cI6P%|I;iu zLLd}EBP{+vctk)XL`GDcHPrKnDaOVeUkK(Qju;P#kOaLAt1nWEe_<$%TIU1rPCMIe;8B;I~rG2a{ZkmAGn58fWcf@;`FD}F)EWtgG=?7RY zuE0vH#u}`{dThidY{6D+#}4emZtTS^FQ_{RY7&E^p&>NJ5lxQaI8Nde&fqN0;{q<> zGOnVWt}5WBcpGYJkTv)5m6G3I0VSO`;$wq9X=kAvWS79ulB{Em{Z(#l*i09_NXWTug~n zNP|C-4iVi(WMmSvAS<#X2XY}d@**D!AdQcuMG>(WZn@+gyu@of^bZA(QC5@kzZ)x* zz(pJVGAb)nMNQO39n?d8G(;MYkF;niHb)DzL@TsGTeL?9bV6rzMQnd8#6?fBH~OF- z>L}F1P;od$U=;qw7%bFeF@E_&Be0)_o05?@FJ8nPzgez#~Yex(8LLb~ycz`E( zhUa*RS9pU*8b85j@hiUJ2Yw=uQD*d-%Z!j>=-R}p;{S#TI6)dtB@a64XZk8 z=&BZqDU?7-l*TX}j6k5@4-b@AsEA6af~u&F$BxTWG}gE&YAe)5Jv6{J>_93Hw=`%j z{)LukjW%e9wuaCioy0EaitgxvUWn!R#X&!D00v?(_Fx}|V)gf$OtxR9B9kFxK~zM?GKK#z&&TFt0Ty8~mLje#6(9eJE3pb|u-3z9JvNA& zuo+v?5RI`DyD6&^YZC7xi$5i@A(287Bt>$hKq{ohp9t)Rf+DS$9`msf8ITDnyuec-vzQgPJt*$} zMhEwiM9V4>Q&KL zlcs2f7WfOT&>C&g4js@DozVr|&>cMy&N4h>f_2hXknWWA%|lOooCsaABkp(;%GXiGXy5kO5g0vLgp_ zAvf|O9}3`u&GiXI#A3Mbk`GZzEQ7Krj}4Y*6Do+6P#ING4K+{`wNVH4en+=f7fr?H zXn~e!g*Ir5_UM34cxBLU5XUOSLr;a?=!1Ufs{8KfFAl^Y48ar2^9&=zQTQ8UFwPgH z325l+LSsx;n2Kqbfti?%IhcoTj#UpV5&y+9{D&1-g)&|kq zxD)+#IuLus{WyR_IEh7-7^(;JxVV^eWP;T+E6A}-+yuHrgw;1+J21 zcp^T-bG*b;50vM4E564Ee8Nx+$7g)STV1`!Pce`uTwnynLVv6*MzH^pbPwQmUF#Zv z<21G!+jbh;w$<2HV>M2b#Men zKX;x&CiHfJKag3>ifqV%JjjdDeoq;Tf?{DT7ym(Vu_Q{N49cQBDxeb9`0{nACf2}W z%X=y6i1kn(4N=kJs*I*$Gc-p_v_czn^f>8^wqkp9KqquYS9C)U^h9s;L0??55w9Su zB_AFG6$ay?X}pZ#;s|VX`5rUvGk&$j6PBNE5EEgai|)rx3wSp+xxf}A(iBQzd`2s#-F255-JXoePOiPmU? zc4&`|=!7olitY&EcnF1bmQM!sRp^fa7=*zXiu@+IAV!FzFdAbq0e@qki|)r%aXPA5 zdNnXxoQru_fQ49$C0K^nCh9E~dl6ZR)e38|4jZr$o3YTcSd5iegSG~>kwUxi4neh z6pFZ+V)#`d9?olg5xLwhGIDW#7K<77>vbuBy*soKu%wo z8&edfVLE2wnr(Fh-z}OT{x+byLQl-ae8lqN5C@CJrC5d)_y_-D71p2^`XIBTAS*VA zo3I&M@zM8w#!hiJg7~Y0VE9iwfP*-UBRGcRIEhm@gR?k~3%G>KxQc7Ifu%aM95=<= z*k&Mh;EBRBJW_aqr+AJRc!k$^i_JFYR&22tw&A0~XH;>6)$m39hVKaCY!8ay2!T+j zY07G2x5wCCEb~gd0%sjs=Mh=ssECFbh>6&UgSbeD#7KfRZ4Kky9Zz@*pqrp#Yw^g=Z)t7DI8A#BIM;-NjzZ_CLh59Al$`CY8`! zla{C^*1${Mc#WE3ZPYQJ_olnxr6bVOu%GJ#WoYa12e_hsB2l& z$9!=ix`^GdR9ub~Sc#AxuA#9;T!+#Ye_6cqu@Bg!umxMO9cwN0_1Gcq!fx!vKJ3Q< z9KvB7#W9?~Nu0(RoWoMTRxQUR@d~cuI_?;pd$=v$#XUSgLj%?rPsC?A3SDfbZiwiZi;Qs!e<8eIJR@R~I0aKN9bpg-voRO* zumJzK=)ZV`Cs_WofF>5h?}%qfCBQm`4cLgyDCpQMjP2r1?7|-G#edkL$u4~NMS=ef zY&wPGIDu1$VM)b8HN##5zu3-UQAVL0u4sG>Q^o0ss7YkpRk)7_c!bAzif4F%ac=N0 zyb<4_j<2kT_u@xh&Hcnn7GB`=FU+)hhtR~^n$W1rFN%1s# z7@S^sF1|z|Us(hRyi6oQ39%GPqb$my0xF_1W}B$Fs4mvTY5ywLS!6UgnNdrj4(g&l z8lVwUxP?^sU2KjPXoU_s*$M4_Ms!4HbU`=Fb%FWlCHBD|=!cyOyD>-{f}t3Wi8jO} zq|+n=R$&eP`q>1v4P9MK5vO5^2f;EdSNI2W73O0B7Gb7?b~YB7yd~Hz?!_ui)?h8x zV*@s!jj3&iZQ>5(^+oxyN8E@1Z~!Y6R^gy{7)Njn$8i#;a0X{_9wT*VG=e$mL!gU+ z=!TOv`)SQcl(+^;bZNzp6VJU|~XoNvn zghxhQ%Z$ikR767z{hnT5v~aU2SwFvj}jXFL}8%0(!pPzGgD9u-gtl~EO~-Ar556l-IU z?KcGV#fHeGNggy6o1r;cq7~YpE!tzB#kxO0;Gc-=><3-Z4L#5kz0n7K(GLTV#WNxs z?(4`ytTnmoF;bJ!IAfsBA)iT3gWcFS)9WKT*PJE#eGE4I2s;{Pf_wWD@@fc6=4EGHC0~B)6B6zFt9v|=tpYauu;s=O=*!UF*kO*0k9l7xv zPWsqsloU%N48oxXYM}{!M;o+5dvrt(^g?g^fe{#mNtlAwmc?2u6c=NixB(l*&Der% z*p8jpg+17d{}9vf0>9#}cpne&2#@g;&+r0o@D88w1>r2S2nd@bKzPIw7 z2~r>xQX?(WAp=DwH{cJk9|mCvMqv!bVm$uFWc-DRSd67uh7|~FVTMN@f-PnVD_zwqg z5QlLD$I#Zt+T*x*5@&H97jOwF-9l+)+nq)HL(V2qBiQF9_phZ z8leetxKu857Q3PwdY~tIqmw3G&`%tI@tA;#n1pGVfglLQej+BoQY^>6 zSdBGUhxOQq9oU6!F0ca!#6viS6F85HxP&X%ge`c8#|UZiLSu!v60h(EK}={cH1I=gNQ9I~jr7QfOvr+~$d3Xjgz~6}R2EknCbS`4eOQDHN-U>mk$Cw5^E_ToS6$3diU3#o8UynsIw1Q?0y;!T`!)90{CVGVvL z1ohd+{`3@Y@D4?EvKT&zU+@**F;B-AV6rAt5yhpVAv$6r5t1Ml;vhBBA|o;*KMJBK zienIlU=+rn94cTH)}T6SV!p$CAe0j_8ao=!PY3YZ?9&N1}oOtAxMB z$=E0E$3Nn~*nmwa?<*@}kGKy9aTrH%499U27jOxeaTRq@ANTPPAMqLA5yY+tis1O& z&zfT>h9ikWG9*Vz3^nn?kwMIa#BMq%vLZW*C=^3A)Ic57Lk82G2~EXjXoWWD?#p}P zhk*#{+tP^{&`pyb=!XGlph+VP6bEA@Mq>=dp(bi$A|_!nreYdq;G$c&j4$58zagk8 z3y$F!fe46%Xo!J0h>LhgfDFilEN&qi@`!nn4+T&Vg;4~>@R!CDQCX~tMreYjXolu! ziB@QXwrG#b2Ind|i(SzZz0n7KF&R@a6SI*GIWQj!QQ72G#bRAsiUSIVP}tBF#d+}} zp5rB6;SGYD-;fwDPC!&KI$|Ie(jXnuBO@{)3s(5pN)!+ap)iV~qMNRaW15^mZH2mM zh{kA!7HEmqNb0tdqmNtdi>?aY(HH$O0D~|XLopg-F%ExW0{+HSOven&!fedNdwj$a zEW>K7#W`HSAsoR`9LFNZ*Ako%PvJDq;tH@w+C? z(Hd>h5uMQm-B8uXs^cOqqnAP-e6-m=BeJCu75Nnk;(NGxz zpYa_*{46MfBQ(OGhi>#jOffd@n3Q{XfmcYPkPOjuBL<2Y*b>OBkQF(R8~IQG3Efs= z6cjjN}KL5zk>bM&K&0;|6Y_o(nXYqUp4^u{0Pi~bmlp%{n1FbPvI4-3#scl#ii zn+bu$y#ge~QB98H1Ww^J&f*sC;4bbX#Lua~OYt?{<0HcPq6mnH$Vh9Ur^l~iJj6#r zB(?;SBDr(B}UmS=lx_b>{#qpSe zX_$_gn1wl*i}_f9Md;w7ov>D1kImSMZPD{LS#fmSQibCgkoZJMpq0} z7>u-HdSpgcWJ3<*Lje>=Nt8u-R6r$EMpeu-5VJ8}oPhdhh+J+f4}$%?K{Quri3VaL z%oJy%Cwij~`eF!%VK_#hAPOUy2}lv3YpX3G|Nqz2eL@9()ED0aKWP=jpYHq9L(~*& zW)r*H;$a1Wt134>^eftZMmIEafRNQUG{iBw2~v`CLfF8TzS#jMDN9LR~>=!~w2 zjHsxCdZ>?vc;Qm75JC)vR%n9`=!9xT5^mx)p5i&0>P9oX7T@9>KHv+!A*d$7(Ht!i7U2;Akx&X{5Dy8E z5Q&iinUDv0kq-q>5QR|$#ZVk2Q5NM<0hLf0RZ$H!&pZB@PO{}<<#DuEwe zL!H1+TGd0-$^n|8k=W$t&(I9b(GsoD25r$E9nc9iD+H*GZekDgL~ry#U-ZKO48brA z#|VtXXpF%)jK>5_#3W3{R7}GR%*1TW!92{zLNwB~CRi#i#|o^(n~DM6VU4&B>#-4= zumxMO9XqfKyRjGhupb9-2#0YL$8Z8CaT;fE4(D+Zmv9AFaUHjD7x(Z05AhgJ@C?uK z5^qfMJG>R&;{!h7Grl57xd6cs93c@3zaR|4Av_`?5~3g~q9X=kAui%00TLlGk|G&W zASF^G4bmY!GUAu=0m34ym>t0?1qgv0VlI4h3qO!o%#Q*ngu*C_Vkm)ghf5E0UDw)n&5XdLkqM-YqUW-v`0sDLKk#Jcl1CnbhB)G zps&~;1271KF%-k_C;I$sjM3s)jKg1;fWI*bQ!oRwFdK6*4-2pmi?IaDupIwjC01cI z)?yttU?VnT3$|f9c48OyU@!i|ejLOh9Klf>#|fOmX`ID5T);(KMyqN8+F-nan1JgF zH*pJha2NOS0FUq(PchNQCgG*{8gK9p@9`0z@C9G-9X}A%Dh`Ga2#L_hq?!fc#0ZFp z$cTbyh>n(sDt$$KpW9OY=p*Wir>*3n>5*ic47x~ zL}zqCH*`l&^gGd_f)$2yCH@pgVid+;EXLzsO;+P?aWbZ08m40= zLR*AkFiV_+xtNayScJt`ie*@VRak?ySdR_ZgxHqPuc+>}YGS9tZtTH6Y|_asI4B;* z5gfyDoWv=d!C9Qg1zf^qT*Woqz)jr79o)lxJj5eB!BafP3%tT>yu~|wz(;(>7ktBa z1kw9rCjJCMh@lV~VGtJK5do198Bq}pF%T265eIScyM@^t3B|-nf@DaJlt_g%NQ?By zfK14YtjLBO$cfy@gS^Ox0w{>WD1u@rj*=*aGAN7kXs44MP+6>sONQhMI(ry)MID8D zSR^h%Q?VJEqa|9Q4cekTI-nCeqbqt_W`AG=Mxmd=01U)nY}U1{=!HHQsW2L2Fb-E- z;2NIc1tu#@MSOFf5HrQun1gv(ge6#t#-64DI7q5+hrh*Is}hn zhbFtQ8+)-2`*8q=a2Q8%3@30Br*Q`7a2^+N30H6x*Kq^4a1Rgg5RdT$&+rOw(9a|f zz!U>J4IdOf;WNG>yW7f%Z{iOG@q!x+V;n}~5L^t2Q1}I55DwuH5s?rD*$rJz#1La4 zHh#ra(>NUo#6(Dpq)3JoNQu-)gLFubjL3v6$cpU9fn3Oq-;fviQ2>Qd7)4PGB~TKj zG2cKeM0v3yDxnIhqB>R?*fppv)5Xn~e!jW%e9>84^PI*DD-72WY% zhhCz$_y_u;KL%hB24g6O;ZKafD2&EfjKg1;fWI*bQ!o|NF$1$O8*?!a3$PH2u>{Mo z9RFY?R$(>PVjVVM3$|f9c48OyU@!i|ejG$3+b;@^ipTMX0qcj;;#r)-1zf~sT){P5 z$4&g^WBG7Pyo0;AkH>h5XLx~^c#VG@maFkz{D@EZg0J|F9|-C@qWV*GgcL)gwrx-s z;lv1th{%Y7Xo!xOh=n-#74Z-s36Tg%kQB+00;!N1X^{>Ykic*zLKZO_;_764&g*8}<_1J(-*o>{%h8@_6-PnVD_zwqg5Qp*9 z7d^*6;=eeKlQ@MlIE(Yx=w>$KvUnBOa054S8+ULI_wf*q@B~ls953(+ukjY|@BtTa z32{7%;^K?=4c`&OlP)NNBLqSrG{PV(!XpAAAsS*JCSoHF;vyarAR!VX36dc>QX&=7 zAT81(12Un$h13w)#2mVkm_&D2wu_fJ&&0s;GtRXr%QQJ{a7tJ+kiB@QXwrGzI=!DMbif-tECNA(h`iOl|#+R4F zKyfgJU>JsD1V&;s#$X)AV*(~(5+-9RreOwVVm9Vr9_C{q7GVjNVmVe|CH}=~tid|e zwf*X&1zKUN!glPyF6_o$?8AN>z#)V%#G!ClJc^)}MR1%HPvZ>E;XE#)nkF@HRlJTH zxP{xei+gy0hj@%9c!uYAiC1`ow|I{a_=L~+if{OVAf_=Gf+HkC;TMEKID|(;95TsA zFhs|Pp^i({Lu^fcMO?&3Mmsq(5{pTZ3@MNjsgVZhkRBP430aU8*^vXekQ=`tFY==R z3ZXEHq8Lh`Bub+U%Aq_eq7tg0DypLfYN3al?uB|{12jZq^mO~Z(M)WCmS~MOXovRb zh)(E&uIP>)=!M?+1AWmS1271KF%-k_Cq`ftMq@0-;V(?U-(K^(#n6gR{raY8(W z(>RNBxPXhejG8}>K3o@X;uh}UF7D$29^tk{eHZ^Y6#m6ah1YoHQg85H{D=xVUI|~t z@A!eBp1;8m0>2N8lod6Vj&KGMLfhuLL@>GBt>$hKq{n0TBJh;WJG3U zK{jMZPUJ!!{DyqUkAkRTAgZB+SPG?47UfU@6;T;gPz?hO*kIHW>!2>`qX8Nrv#HIB z#$r>%GZhK&pLhT*&++N z5~DB%V=*3&&G}ROB~HZOn2fi+=sl*3GcgNuFcxVV-NP>gpZxVLGdt-;24hMBu?QB&f+{S;1Vw5Dz4!MZsIoX;2!SdA(nX% ztiTZ*!wZF1c#XGshY$FO&-j9G_>Lg(26vJMN z>pzqd%b+aES1CSf>6U?fIk2!>%iCSWqA zVm=mPCT3#}=3yW9qY;{5DVAdeR^k{=U=7w`JvL$!w%{<1Vk@>|2XWzzK0$fHdP3oX7>Z1V~;deAg3$(&7*#d+`mdpXNp})dF48jmx$rRuk{t_o*3Z`Ke z=3p-7V*wVSQT_l;@Q?T})?z(2U=ucDD|TWx_Fx~*;yf}glwYXC%z&*TBc!kUc zCo8^-K{5u2UNAt+pNO#$2XT=KX;8@!S3%BP0dgacLS7U^VH80zltp<|MpaZp4V=s# z;56Eb?a>E)5u`wXU>GBg!+1=jD-{qF%S!} z@hj3G9Wo&cav&G-B0r+_2oM9s#1iQDTYv!=p&O&nOrZt-bo(Q5)RsJs#5n>aMJG+V zpf~(EXt7MJ3cgZm9Oh?}q(TTwV~fTD=(R-@vG!Z94j zNi4MB7GqJ-084O9;Rg0Q!Vlt(cn|OJ0srdcY6R7d;0TQ{2#fGIq~k|W!a^^FgbImK z$`UApHXbqUFjtfL$gD|LWJ3<*L~i6kUgSdo6h}#vMR`<4Ra8R_)ImLrF*xJUTx^L4 zruz|kioMYf127V!(b>nkVvINrR}9!SOcW;}oJVQ|EESjIU#vzoM_&!B7dN7+ol+e; z#9e4rIzSs-60hI}Zs9iW;vpX6WA^}`QC26*Ky zzen3Z9P}(Zj5G@AkRBP471@ykxzNzyG)8%`B7RsPL5v z{DQ&aPz=ML7>%(QhrcihQ!o|NF$1$O4-2py|6nCnVIwx9tzl}9UE&@*wIQBkpTlxL zf-8i?MB&zFBO&shV;4uDH zn2bjXPq0{Aie*@VRak?~*ouQVj2xCgE}Rn2V4qF0ACJT*c#7xvh|dU?CqM{<_9_$x z5fBL{yvUtG95F8XYdjFAa0VYt_a|h~Boi_tE52(I#2Y{!F)s?DFp8iUPC4+-pn_Nl zTYYRhYKpbd94*ln?a>E)(GLSK1j8@}<1ii*FcFim)dJa$V;1!Z)Us6SV38(EumpBQhZi@*+P9pb*0P%J69EQPdh$6{@47A?b|TVqJvuS9TH5 zOl*PXy#lnvJm=a1^i}AO0T_gqHe&0ayHUrR;)Z2=3zIaNf~lB}*_exYSb$yFgZ(&& zuqGfpj*7=|0;jOWgJl~gc}bXpy9)R50FUq(Pw@;dFv(V%f;Zwj1haKR;1`5NI7C1c zL_-2!nFwPI;&{YYNQe|jg=voe8OSJRMlR&RY+pVXg~TGLV-eOv39%I7d;Lv_Dq=O% zMSZkG2P}7~f6zn_kf@w&eD?mz&b)bw#c{f-Q%QRVmjV{0WC*oGz z_rQ3Fo#Jkcw`e9Hh6iLUoHN81&_d%@xTf(9l=GDpa7Vm{hlcJkUWl*o4j=FZ-;l&+ zPlljwAvhu+61KVh9f&6;Ktd!&3Hx2P^L=~eWHhx6{ zBtkNzKuV;>5VtxEecVi61W!-ehv zE}^T~9X-$sIV{#(7$6S9U<}26i{>D*+nhNuT45~4;V(?U-4%=^VC*+tAep>yG#0M-;KRis6Cy2#@g;O-%Ri_#}S8GrT~eJOPp* z93mjJ=??RA;x!5CXR#0mZ#-h&A-QFi66xJwMr79{CvqVVenUQ#Kq*v2WmG{m)J1(X zKqE9pQ-rjSLL-V84PDR;f1n=*VF-p|I8ymVF%8CwM=A?5 z4R(sVu?PDw)WdK%j)=!_7UyvRmv9+ZaTB+39}f}H!5A5@#kY8e5BP}Bm~7amA}E3* zG{PV(!XpAAp}LojnusRGKup9&JS0FuBt~HqS`@i$jo*+*AusZw0E(a(sGUG%*1TW!92{zLae|_{EOAtge};CU8rUW)IcLN z!BvIpXk&}F!#(i<9^x^c;2GZHJ$m*C&>Nq{ugLGDE{H2Gbq&G2u!KZI!`T?&#fW(7 zm#OC%Z_`ac0)<3Kh7?GN)JTJL=-?JQ;l8E!5P3=j$csvvR6z~YLT%JVJv2Zwv_KoQ zLs$n&cytoGpewqgpPL?ltAzqw$1sIIF#@A7MAwF)fLI7qFȽk$IrtFaavu^IJ! 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/asynchronous-client.doctree b/doc/sphinx/doctrees/examples/asynchronous-client.doctree new file mode 100644 index 0000000000000000000000000000000000000000..14bdeb09a88935317cb7338d90f9c7e1f0a81e2a GIT binary patch literal 15603 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 YLUEwVi{`YKPCO0oYqj7syy$xW24HCE%>V!Z literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/asynchronous-processor.doctree b/doc/sphinx/doctrees/examples/asynchronous-processor.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2352191be27223b0197e42547c7257c94f37833b GIT binary patch literal 18069 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 RSbs~0qJ7yOoQ9Vj_us>t=gt5C literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/asynchronous-server.doctree b/doc/sphinx/doctrees/examples/asynchronous-server.doctree new file mode 100644 index 0000000000000000000000000000000000000000..794e0d259555aceb1e3efcb5fb1647e4bf10beef GIT binary patch literal 12967 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/bottle-frontend.doctree b/doc/sphinx/doctrees/examples/bottle-frontend.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f24fb87d3d185976620a41fbb9e9b6d429bf8fdf GIT binary patch literal 3955 zcmd5Y~=8I~i<6lsyN{1KqAUCgD3i&|n1IRwciNu3miQYMX+1UVRs+1(*$qTQX% ze2C=1K#HP3gU+Ss7HCgB_9yi3^?CP;l%NI;dPpP@+8xfk^SsadG0%K^^KbHSr~V0( zR43l4%$^iF6}AfdG?0tJRe!C1`TOcs^(2hAb4JD9;d^@DD|n8_msPlBwKs{V!i(wW zRv0_Ay!e{0r_Wj&cDhiGKGMh2a-Him_I8RLrnZ!-SWU%>=Vd1BG}g{#;&^U!;Y5+1 z80&x~=E=Dc^LnpAl5uOBeRow_kL{~;g{V#+$nncc9@2nYmmqEM<@=w_p3i<$$)lH*m-poTo=~j3A$R4^?#<5Xa0sD!33LHD(=9ySgI{j!^{#ezC+%OFOD7)pGKIZa0 z`E&g1BJ?`mcf!DmgmUA0e#1e|Rl!Q55rn+r9pBCP@n*c?U*4C$>Vx?~OUNG5FB8|> z@9cH)JNPYa_i4M`ma$K2WABE`6E?1X1!sOoKE8i?50B3_kH2o}y3X7#ZNkH*0vY1W zx;V2o1Gc2%z`g{AkJ?VaK5SY}-CCXW*E(H7R!xv|amujR7=5$$4V8#~(m2uaq8JhZqFej|G z>(PCglVa4SO0E*4=cod))aD#k7)P%{Bg7gzchRge*oWq zKa(4Z6JD@bFsX4)qzsKw80MC$e&ZH}m1T_E5eQ^0feL4xDR|b>%s84US($r-Sti#8 zQ^g2T!9SdrDO>nLCE65ES%L{>U8<){xP&e3La_vACz=J$;cL17>4M$F;a?#CpG_Rb zO&kRJ7nJ~2?K66z65jPO{qitM1?b>)yPkzx&!ncM!GuM2?`md|pOf3Xr7-Nv8REByhlF5vtWdwE*Lv!oI;ebYB z4wd3fR)t5>xzfHfojR={<&<#q6Kxh#>GEs}&|siGa-tQ$S(7XBZ+s78j!#Lx`!b3vA^AytMHOP^0N93_cBkR^sa8d}@8}5}CVV#tsyo`R* zu-lPcg}u+uK01CI+rT_g6_Hq}72d8WE?{Gra;Q%Sv51$4O$KH^z=*y^6hqG|I z;W&coI>+q8C{>on89{HuFs{AtGX!)J#0{OSqjR}jo|J1Rby3rqii;^`TB5W`i0DFD z<+Q;*2Nq|Ci@x!ibnJjx4HE3!WV= zgmX}QR3zBc0qk(I3LPFAP;;dP2N9L7;oD{@g#uu`lVx3$*l{#h8ck)@oU zg}c3%L`EX%QrQnIU)35ioxIi#Oi_=EsSIh)&Ra8yc`XN%RN-JohC? znk>1YgAnn7vdyvCqsu9KwLjb;2o^vk=*@`fFm{?sv_ls5&@Z4Z!fo7A&}SMaiLNXC z1JzI$UKI`yT-;QOw!O(u;4|eBE-;s>*~j57#ir*2S!Eo!s1;(wDa3iKvpy~A${KGk zsYfP>H>8cbCN&H7Jq!06`LTQ^zm+SwKp&=?NjTbGO=;HHOcWBD?p5^&`tZ01)s5^U z7dn7pzsW|lSn_TAV%A*iVBx_P@ZI8_aM0nc?^mdgZm${(OwW5G1A1zXh9@$G8?WHb zbNR6k_ph4oe7S@3R-wpT1U8YrzM9GBGaqjEEwA=v*bzaie0=gB D-6Qa* literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/callback-server.doctree b/doc/sphinx/doctrees/examples/callback-server.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bf23e6d7887caf8910fec6a3c79b27cd2131138d GIT binary patch literal 12719 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 KI884`{r>{vU@-^) literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/changing-framers.doctree b/doc/sphinx/doctrees/examples/changing-framers.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a09f163c78632c3899b7d649ca50bf40e9861482 GIT binary patch literal 7861 zcmeHM{c9Y@8J1(qlGfJwBX&utT_%V|5?FUiX~Bf*hs17L<5Ve$Tnfc3bGvglQ_an+ z=RmjpECqOk?Y%uR3dd*f4b3S+r7z+s;sBN7_ts*lX#yS$oU+ zp>@Jx+gjyil>V{~YmSbiq?%s}y^0#k78YeCE3~0;Nqrcu!lq~e)~#FS91I6^x8_)m zj8=}R5(xc)N)NqrFz*Rfd6zR)=n~6vW{fsDc3(5OO+RT5}je8^uG4) zTbASRvGsQs7^l;O%!YMy#9q{y0xW#6|0Xyov%_Tcw zvVOV>NN1IXSI^U8wPZsd*|Pyy3l?J!oOs(r=9dVR3XBGnA`#<0=sC$pS~~?h&S1}N zg|#s2x?z=uovq5Z!cBXs9G&G{jJd=gNPb0X1*d16%K60A(4*ezT$Fhg!)yi;2t?8* zxFysGEK1bE&TfpEb8O~fkU*(}u^VTr_#Nzn4&k)Y@%rg{_)+vVHjG4-BA=<~tP-m> z+gNM!%VEe`&qmH4hTHR9Mo6N!Z4LEzqc4+8Ov@cZA_I4j5iq{@v;AMd=KDx%fD)0{ zzyR%7j?6;Mv9AD9Z%U1dX#f^5I)So#iygFQmbCD5Mm)=%W49A^EHX&Uu#IzrV+tEXFRKP9cA|mSr z7ZTY-A)xq5Sc|J;!t9bCUq$)g*YI!+5%*4)^9gb=_0o|x_t%u)!kioD=j^p}y83`Q zo6l>{--esJD#SB>iC^YF=8DVbP_)9u*J|#hw-UlTkJ{ox9=C>k+!Udje=(OSqD*Y+ z$`Kfc9evBHFY8n{VcVDCDoRN#ru?NJQt%z#ub*D#f8&)OLfWPjAP1HCP-;Zmg1KP> z`SOD%oIolhX=YB~@7_Fsa%xa_P=u~Uxk`7AunFG|mhkESQk>5!GAfT&Zx-eX)LLux z)vuB_;fd(2h$}qu$Ir8sm92LN-kQNsr~wiyX>wb(y}h0NzHI}@BPoCkX|N`ro-l)| zRAzfi`()XNQW8BPjx*Bq9;8T0ErC}+JCq#7O5!x(^n{U0`tdl%OUFdy0W792Nl3LO zrZj?LO)8@icUrcR3hmLylzno<1*A)phQe0+t0Emj##d}EXk0On541M zxEJJF439ZE)jnB|XGDq#n3$kI@`$>pn2Ty*vN&y;7saDw$IfnsQF72(&_@&c35;Q;dD2I>|4Hn!ce=%ofBn(3-|T)L;iH5@+81A( zM`qcGw0IvZWMt(*1XAk#xN&IY)`0CjtzbR^cTai%T(mTOihUpK5vwzxuP7V$l z)oJ;n42F_fp^T!YpTr}G?*Vk2BA~pU1?95w?syZ`fHmj4@qeUl{Hu#r^P<&^o#m)` zU%O~E=dH~}tGNipMXPC>a(vNh&WW+`B?ZhytGR$l`jLQna?xr6j0D9+tJ!v&^LF(I z*lL~~;oiYn?LTpL%m4m#wK=wB_!>`eFUJ#ITxv{)TFx&*(p}Q#`Q!04(kna;wG{4Q znhVpzkZv$v)_le*8;`BSt@DfGeM%#$5V*O)VL~&4v);}5xqF&}k#$^pbVt8oy}5S5 zU1B`GKY!EN+>>Jd-PdgH7O#Zsotf#J8W%yGu4D^DkLE(w;#H9Yw6@9zQrZmH@c0->3-P%FKgz^&j0`b literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/concurrent-client.doctree b/doc/sphinx/doctrees/examples/concurrent-client.doctree new file mode 100644 index 0000000000000000000000000000000000000000..dfc5730c5fd9056851351e0db32f1838139d3bad GIT binary patch literal 22382 zcmeHPZEqyUaX$G(-Er?o>0~KD5DDlUVRI>vyC)|>1Og0VOLvBFHetu7D1dMn%~mP>B3xR_42=#d;hw8wH&sCu&&Ew($u(5-#4;wj*l;w z?ORpelvBNIzZic}>9QJEVfJ;n7=LDHRO6GRrhnpQGAyq={Yuw$lASCTEJ}4rB89A{*!nhoD1vD|Cv8+%^uxTVubCSEw0#R=oFyk1doM6@hzHPdGcSS! z43$}!5~cU2X&#;idLAZe5Jpi6>43*Sw%g@w8enf4nwa9sar=<2OhQPbDbr>9L0s2G zbvPc^c@CpVbUhp8<;gg%=jj+sLjsU&s)Gv>`|{iNZC<>nbQ9&l#XJSc?Y;z-?PgQY z4n8@kz@-ZgZWp@fbH6RpwZdMu z8(+M5cJK+70eKQtFiSv^Z27Lv&Ol=`3Ss9p%o1PzLUf>0%{mCqVab8D!sGUV$T&!o z>=dKl4x*$AC)m7G!xrz}SqQ{QEOz2lR-EVO=c8g#$9cx$jP%(UBP$ZA7({TER7ste zSm$9i56e3Erpf6j`Q}!or*+oMjRKy((LT}_Ne$VBbyEeYKGW&)`36LK zQRL97Zx$Poo-|}Vn-J?%)7gVf{J12`k8n^5STsbLuwi@%^PC5>Jg+nG(TP2%3d{vt z4@+I-;L|MmqxPL@k=5Zv5GN;bihp3_Z>D($r4QmTbptor?XaoyAc=y4j@bo_Ai+u6 zf^8+)3|7RZg`K^9qU%~;)O1L&XbomJyIJvj*he^l(xN(EKEL1o8R;4u22%0K*BL1* z!mKTG)(pNJw*#YDvialoUAIdT32D1pV)^$;mrN7Gf?5N~U^_qrTtE29lfMSfA5P;C zqQuD)F<^B}2eO3aX;VN*+vj1K5e$F>9nP`X2Yr)W#fNu@g$j(u5N}G7Znx^3j;Q6V z-2h&ci)H%&Xb7BV~WKDp}-kEMD?YpEQCl%OM zS(8NWPvay7nq)Xo@tyV_%_hLK;1_Sef5Z=P^Bzu|5`UmN>{o*Q%D9DP7(c?;x4W?i z-B{x%4!W^hFPBaHW2oJ_rFam(5#NpfJkH|uB^JIDCs%S}SBZr}tA5RnN`2~_lKPaL zl6orsY8n6D(N2gqHv8raSR!_MgV}#rvSS6We`w!=tAW0j@vCMM;yl1Qme23T{}va` z1XQ=u1jZAl!6eOb8hh-wo50gUIc_jIfVeKtU=Q2wfCXU*zXT`sfaqqqRaC|Dw_<94 z`+dB(@3JW@xWaW8Fur?c#pSoGZ%CH(NRoz*{^@^ydgsp0Uyhrq98Z#L4CqyYeuLfJ z-GL`}s|gnW;NbTD27?!IQYrjD%&fhse5TIJguJ;56-iMQx+Js-;SHU+iYe4_SgSBi z^Ydz81~bwT5oe{-g_QxV1Uygb#Vs&R0`s2Ue#4i5{rtLj{d`yZIa$25YbAdHx+ zJku&Kv3jZP`HqQ_@QiBe zSgTo6H@LvF>ATZmJ(63MDiH`E5{eYX0iYo!`&T3N^OR$&I)QUt5b5(IO%*^G+SZDo znPiEHBF4qxA!aL8B!z-Is$oTD`D%bkhXdRbMy_DO?B*G>JJ1(XUDWDx-r`dVCB4~} z@BWnA)u1z!Oi#(4Lu}gM`VV9?tRb6Bj7+vbVRD{XRSRkeX8$_5NHS>rc25TsgXobA zhHXV4!J6l-u4R;GY2&}@NSSXV1VF#Snb76%v6aZ}u-nFaZz?#ErOlcH3COak&b9 zoZfIG#YhllHPJ4cObre86P!Ev-y88<@_YON`KSsICn9DKhLuid`|6{QP7x-aRAwiH z4s>JmO`{vFU=DJdtYNsz7kBrVmKzC602?bK`QqwGvxh!Sxrm`m_3v3~bB$~zax72b zvuZs&C4ue()eyV0e>-}Hlv8`0lO8Fj1Ce9-O=5k7@; zZ@okHqJ&W3v_XjcsE+m(^T5}f*d5u!QUmz2>QMb0_~Fbp>ha`oxNpD20sWEk4B0r2c-4Ky`aj|s`zAU$ zl7%|!(NLb8AG<%^#EQeVxci#zyk_)eUazD58?mQ9VQ+@Q4}f-`Ax)(yttl1C2O&H^ z)t!JZfa?h0xZI#g$PMwz2NxhOv9gZvVN{9Wmo6O@U%Kf&Ikh=?2KYyKC=^4A!bQkaR4lt zG?uwdxBDd`=zq|#;fk@W3+RTs-mTqz9LQ3JiCv?V0PK<>Rgt3r03^ITTW(?cZc+sj zSRr|JB=!;inISNtTiw`>@+?TewsR1-yA-<@37P^~$s+Y|hC)SNE(pD;%*a@=Pww0M z2FX-$Q%CuEw(3{=e5*P#7ulrR3RC}^)S*?gNtxxVu<&a7#5rRIboREl0QqWL&N+4pzV(p3`l|GWqhzJVFTM%5YCC!Wh>P?1T**@h&+tK{99>`*ub> zqR$AUynw}JWYznwI9ccwW<+*;&5T zmtmdG3G0zS_y#)|;L#OQ3Im9%pzrTz-&P?Ar`?hG4xAUd0O^oVv(O`pVMogl$@{4n zWP3o%8%ZR2(l01)1$`(CY zecNDdJ+Ua_1_nz4iDnB^SycfeVl**DJ=fd8&(-o~4Po|8s~hH(&P*TPYM zMZ{oM&R@BW(Fef&OEyH(`qhy5Iw&_nN5PBcc6e!(LF57T-ybi3xY*v+5l|A7M;f=f zmXxy)YnedkQ(j|usT{fr>GTxj^79T8H*pkfaF$X{mNuhK7>((P1;9|Hs81nmZt$EQ z@$L);@r?#rg04KG05mQ#U|)tLG+hXkb2TnU84i|&%oH_s5Tar^ft68Sfi?p#cE&hY z*bz4gMnXJwL@k4o3IBP`|EaEav+9(nj;xOUY^+M3g>5{LZm8ZyfBi}t-$07FQW6a93C^xe(uOw%SsK1N%=6}XRjl5tCq@BlXowkA{5QG084%i|R(k-c7{e5Rs{|(coP1ACeCH zsB6SGsC;k9LlIPmHIbH!!fZC|#xYrolSd}b!K~2>j*EwQppRnm(QAUneMg7ZrONaX zSE@(8D)x=}igPvJJX7)_VV|23=XoYYBl5mHM~Gxl5s<|U``7Ir27pqLQHEohYQqUd zZ>Z9pND_no43?#r_R-o#DLtE)YfeG}k}FYlUqD336OuW#RwCU&FjuY+;?-j7IJ_h@ zx^A#A!i^Q9=kvD!0Uo+k6gJdscYvuZHD5HIJQ6w~di?%#U^VK|8As97m_ z1a#@hkkuG_fa&;}UP1EF{v6&9Z4NN{LyBD?0im zDq9)crn!rve#WQ=kf04AQL$-;_-&G(tFD<9 zu@E(raTo?9<1k-{lG%hK;yrG;dRZdBOV8RRaCH-XlM$eHm04i*GlrSro;gDXF-IAC zay%`F<#Z>`vkVsQ(20?>h|qKuq>P8)5SAiWtSpxtn?|PQDqr?=8C0mAXLY(TPxj1u zuTiQ5SB|HiYTbgqiaCga>60~;oNtE{`bsi2KEciNDxi{(4`&G#I#JPtsRR8zVEvvt z_EmLrk#nMjMUnah0afRNKph>a#{s+$f|TH~oUjA3{mA`(j#1^efJhbYP&` zRROzmOQ+M+=bZmE(Jy3i!<3Z{gPC+>I>;Oo!`+X6_P3)a_}|BfvZxv4=x?6<>`51B z$wWBx41E;7$r^i-`?43e$fZEv#)`I37nlpOPOn1P0TNYx$v8UrwrEm$pld822LF}e zl`4nun&=%LCh8;g$-eqzkDsx6zV+iLdtG+dEqNYFlNIVZmM)-zx;Rr^YkyUMu8bgm zZN_$bBawGh%|OXzd$}m;lT^SQcI8=-2(Xw+Nyx!Dq8~YLxHs@y{QiSm{QkJ^T3dIm z;c@1UZ8=-X;p}Az;c=qu1z701YfXCap0S%=cdZ$`S$D0iyVke^&8yL@yVl67bJ)n` zrPZPrU-U{|Jklg){aTw`Tz9SECp*2aOOh}B`C&SO?yeBn53trsT2Zg+ zO!Oazv19dr+}Ztfaivjk-L+P)yVm~ybggx-mU|EHko!-(Q!f7Z=Ns}mIgO9>X1Tlc zra8QfaX!gY_X09vFY8(OIsl;2|a{tC}_@}2gfWs}}I z2LhXRE#~Du7IZ}J(I=bk=Cq|gtggZ)vH<(mjj&c_V?cMS z!*Zna%!(`qLSOTwgx(I!dnzkR8;UH-V{8kB*0~NP&*DUALKIL(IQkYn6k(L7S~l{BQ?g_wXnfK25@ni7NLScI^zjRx*H`qKMqC8RTA11IjpYJn;{1prB3SVp0u_wj|Kyq=ZG04?5LmX@j%)%8Ng^D0Av#pP6_t< zO?AU5FN`STJe;NpL~bo3P*)qJ9qoUzZ(w<~nec2}!c{nVjKKOpWOa2@q(c#h#?BBb zQV81#?mSGkZWW?fwtmZ_+k#zJt1pi}-~R+^AfBKKM+zb-lrM|y1Tr=dfx=isCI0hs z?*owt=Yw#9Kn~j|JglyHjKf4_$5?$MjFmz3lIe{bHr?sF2mzdA;v7!a!a12t`o+x3 zJacfy;$(o8h9LC;5uPZcY_6f_x=FdV;p;M|gnUzNj7268n(o6*BO;rXY2$!rm#SN0 zsw}YMwlrZPPDD~aTLq-kB8OKO!(ufS!;+$B1F%Mdat|@_p{B@>kthWs8c-@1821sL zX*kMro57Ab?4c>J7iL}8qR3%qqw<65rkQ1yPeZB3GQnR2`IRKk;PgQ9q+7UJZSm6P zp^C$T(rk(#P{^cB#FolNh$0tSIN6P{uvSbhB?**T7`rjwCGX%Idhik~Vk3HwJj`LYl4QeiLVa<*C znt5H=pRd_`RhRNZxVf!DGLV<#W%)Ci$>bFjtw{Aw&8>9lB~%|jcEyK1X^Rhg>dR6s zzwKlyl8HlIIYPwYL_e|X``Xn_*!F#O6{UoVsXQ%*9PtkC*Uv7?zsaH;LfU4c5F9)S zUC~pvlD#Tv;ph|9Y?c2 zfmGRB9(bW*!Jdvrh@fEq+-F`EdM z2@wb9tP~AQ3a5E>eHVDT&q3f(Yt0Kv`lG1uUJRBupnj=Hv`e46w(p61_XkuEt41nv zTyu6C63_v;yz_-?$0$2Lqt@`h+?4PW@tE4Msoi7V1aE8e@{AbQNr0-sSIgSJvgPL* zjiGL(d}<=4{Hx%+ao=XXcPO=R{wCxJNrdAV(RtqLf+ncYZj{=4tP#pVop{7~MEptI_oJTV;Y3M{{EEQ?4XKo(`fR={9PVM=c zfb=}1Y)3&}V%%?42JQi~41+uT$k8(*8SSyAz2Ean8zWmoUkK~1(&9Cy6f0uC%n&Iq zQJYsl`yS!gJZ-g~g6PjbGaV0L?l0lq~MnQ-Pp;^kYiU^1HF# z!=_}kOR?7+_RKNo=5DhIJb(bz6gX_cGcak+;+#=8?+)40xo3G4hd9r`_K2sw&X{c` z^NEv^@?+Rc35v$I5rt`prDY`9B-h7oC(AX1za}b47G(HHC15?J?lEBsYLa-8%$V|+ z`;Vwd4FzG^n71GX_TxM=_PSK)`h5HlVueOK&mK%PI&${iDH-?O>4QF%Hg0?FcwIms zLC-r|P^mISXHnlaS?bc$1^;>L3Otky#N>O2d3NpwzJ}0eO{Ol?f?li++}=GYLNvlpi8wgYrFb92w*c!rb^x|_EGpKyql@kf zW!lcV)4!{FqX4w)`d?!<%=IDaB*DJZwhlY<6<_K+E+hLGV?C|-^7+DNe)mhAAc*l9 zO~v?*!GCYm$8dZw`YUuT zhI#@B{&oN1&U;82U80lhD4}DibN6Y1GXN@luVZ>>-cZL6e4iE)!%%-i;8lGp`(|B-UIY%Jdqem9_+E-J^al>NL(DK{^16yA1)2M8vt=C$J0WZIdy9!_TaR<9QOYM5$E=j literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/custom-message.doctree b/doc/sphinx/doctrees/examples/custom-message.doctree new file mode 100644 index 0000000000000000000000000000000000000000..699495de1d745046e2de5bc52d2f5031cab39631 GIT binary patch literal 9525 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/gtk-frontend.doctree b/doc/sphinx/doctrees/examples/gtk-frontend.doctree new file mode 100644 index 0000000000000000000000000000000000000000..54736cf78c7b6e72b1ee42d493d9bcf685fcee32 GIT binary patch literal 47228 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 KBB)l}YyU6wy8RRY literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/index.doctree b/doc/sphinx/doctrees/examples/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0b19c9f3c72957c3fa152c9488cbe968755499be GIT binary patch literal 5190 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 B<1zpM literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/modbus-logging.doctree b/doc/sphinx/doctrees/examples/modbus-logging.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8375918183de0671c0a313df8ba438cbb56beda2 GIT binary patch literal 6223 zcmeHL|7#q_6_+E+l1{p_<=CdBHf$vtS;lvlq%H)5p`>oqtfAf`hO*789p9X{)*M5NqFTChA%BQ zc4%4tCpH^Cp6jr~iFEWU%F(cxWjY;|b_feYTL_s?hkVMiLUB86zUnJInaF%HFxJ79 z5ldbhKCVrzCW=|xm|d1>y|$K?MewEc>xLZ%f0inL-5HkKu{K!@Z!McNvRk$sStlJ1 zt@Ah~?Qbf->ez%dRpOHG70g(^Ak;~Dq75UFYTsXhPvimQ)+~1p4gFp{cmn7INAJ;xB2IKhp|CJ|N0;tfM8yaG zN}}_zoM7*2JjX$F5a2Q^VhM*#&J=07nJCR($2?aD+88!s#`Qyot; z1(m%;1S-E?x^e%LzJ=$$t5`lM5h|QK1+CuWdF8M1Y{b*px*3QfICrh$Hp1j?yGSsEgRwRZ5X=s>05>XPIB=C&M3fne0)48W=`n5hBM_yL+rE!X+wzk zNLuN%ft^j8G2`MtmzvV?tzVz;oP(P6mtD&fmzUW*08cOZEk2bF*fCeySn(sSs;4V} zbXsUc^)xM3Qa&n)J?nrq;goye#QTPrpCVBTFd9(GnizLL&nzBm?Q-~W0()!=$il5n z!wU^R=O*9t*X%5JY#IwW5emN``DLYZ1id4eYB#R<9xI)WWf~WhW>b(rB9pq{mdwXs zQB5tJ?COL&$ES{x1V$a4T|bc$H*gL%LeNqts;6uI7R4F|MwzNJpXU^;6jI%JuFdPq zzVFN)M9 zEX=$v3xL!+W+taH01r6JVC?oHWzW`!Yvh83qXO_MLfUtorW6gH`4!X)Gpqatsv+u3 zb4Y^gO#MJM)QMO5O#~MeF%RW!rOshGIk5@lav`V7k-tt6YEc2Vj3Y$W5+N0;NsfdP zOMaE4sbGfUCsxor#0I`xMaJD~DtZ^{t^&k^9Y8{D9RCZb(I7un2JYABg+bRY>?huhXB|b*8qus{{OV(whvRs(fQeST!2ukb8FSxI)*@yqC|)y z7JvL;b!lnm=fl#P;Yj8~l+&oGXr0~N-Od;D)_)dg+v%U%Pi;tMRCNNWI*b1f=6%*i z%tpU!damtscFxU(et#$G>_jhww9&CtDzb1u%_57^8KL$X)Oe(O?H*4frz7+Vs}(Xy+$U#se9esy$)8RM**7w$|upDo93GV`qVS(4|jv`<0qfK{O#WNiw^$%jYU*<2Q|_>Vn?{gP?6?uK6t<*gBE$>7+gNJxz21;%k(1#y3CP3jl+>vM?@I{XrxMJt$1 z2Le5AfX)Qr?GWobeWoYD!k8rz4SDuxJ7pZr@15p8gl!*Ww>f zSDL3a$47c)FVm|V1E*}HRXe1r=X~AMqlS1KM@9XLEn@UVYVQH-3w@wSu ztgBI#NV?`=h+MDWJ>G3+B4K3>1F7&l_iN2a40B!@t(=}hH#2N#xOv9sAiU%^gPZj% z0YkcAtM&z|$E}i8`qa#)MJcA%-#Du^9O0VGQ;7kei!sB&d$88EPU3D>V9o~+%6;oM R+Bs|O`+7JyZ7)ZI{{q4x4xj)4 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/modbus-payload-server.doctree b/doc/sphinx/doctrees/examples/modbus-payload-server.doctree new file mode 100644 index 0000000000000000000000000000000000000000..591d92cd9331f6c6f13d146ff5c7a0ff5b5ec359 GIT binary patch literal 8899 zcmeHNYik_I6_r<(CAB5_v34NDhK@y|5zIrdK%J@+*=f4Thc|J+-1Klxsi zhStbfcat>Yy2!U^V8jzs{Hr+pYw@ONE4Y7{_e&4#7y z4Q>0{NQ1MdNf6QMZ;E`=upzBfh)eli#+2rBLSDqfR521M&hjhJi8O%RmgdIDWC;9j zG=L6Nni!r$faxn1TkP8)dPgRiH33h;G=f;bl}c40SQ5ot5v;&F#L@TYAq&EEL>AH5 z^loa+kBEw2=U2is8OR~#ZUz+&!h@adC<`PMQVEM`rQ0EpejV@;lX1YJNC6$__o z24R4+aRvP_a+dGVNS^@>tKuTRBaF%PXT6?DQxHdTGw7yj*b`;ZA zoSSCh#=@lQUdFR|?e|J_Yp{!aIrb?##uEKg7c1BoSx&+9xn#~Rxa1J@0xi9dc( z+JML0*&w(8n}eE#XZh6<;~aWNRE4 z0mgYgPsmsiq;@M`tK!R9?p2m0&Y$Hsn^O`bWNlqw``ctowL?wV^E?_Tf!5U#Jc#oNJRV!O05a`UM=fA zMY%%Wed-dK|E$bb{&SbD{Ld?;AJj@eDzjT5zHN4rv=d;t`~t@VCO>(t?+TZcagOiu zD@ak4sl^-HXYeDis(8FE{w6Zp#~!<}1nF2D^y3s>Ja@Ew8*%uv(oI2D1b;dMB2D9% z0aM6lNN!hY-6X9ItexFz2=f;|CG$7wo-$gR{6N;vz}wAg)8eh83VL>kFr z`7QU^B9|#~V3guiEJH+z$RF`hswQ5{u!d>7l|q*I2o{#b@x-^9`$q7_I~=J|7rA5Z zFYOqe&c5&M`*K9F+HH8wluWIzkAOF2`g6fSdrRILmC^_XEJH!J3;|svim+DcIR%#& zVOBbt=gkWsQOc0lb4%ZR=*GT4sxopwXd?tIiZR1966S*BbN-DbDHcD(ga_n0|EFNg z&UqCB+J31fc1TEGBd76Ab@X$||MB$8|q;##MQSr3q1)TDC9 zho~qbt`^q)F$ot}A+hYE?Nhoz9cV!X@-`wM5h_lHL*$-iZ&!g)uU`G%ML{S-Fa?UV z4n2(er?m!M)HqL|3|HkFxQKZ|MO>>Ee)#CY%ikY<0Aw7SC@`ry2rV0qimy2B96c&y zw@_|^SEnVtx=*A*V{zzJLS6JNR5ig$tpnB%(Z>zN!Tjq_PWmW)2WWOo>*S>S$*1$L zkAF+AElS|l(fIge@%4RrTfdx_#2elE^HKY_O~2*8N3TAF5y~{cOl<N`QY zb=)q?MdU|x4vG(@M){*#hlgGn<{ROeK;4QYnCBL6BMeNRg_=Ig=K0V=sBo2OvzV*> z;I}l|LQ#Is^{Lyh?Q7r>^V1i~g0jm-1i^n=Y}8?kD~wWWR3^M7=jnaFDtDqZIWUNm zR4hpCg9R*^_yft~NVkca6CahS4|ilXra}j$5n3ZN0XxW9_0stvU8ctdwO!s<03dqS z^SWOlu%zmYSPhwjx@J6>&UmKM$cE-~WGOe}>CC%Q`lX6}CruqZJ`X8B=<1@v>mizp zi&VXye(E(NU9IdkpV_;rS7#=oh~ROlPr+p8pRIHKkgnKd;s1l zTZW&qP;2VnWfOe9=xbGu*Y;}@p4Ja-zxw#^V8jA&*m3wXfH%BK&aQ@l$>mRQD z`hL|wP@lB)=&))a==1GW1MzNSivDt;(1$y(8i;p+`kx~}a@9agQ34#R24V`wyHDvRQ! z+s#owjhh=$cd5KPdr#&@_Cl-Z;-;bdNXtm50QAhXeC(FX&tgujMAqbboTl4;_rE%P=9vHh literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/modbus-payload.doctree b/doc/sphinx/doctrees/examples/modbus-payload.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a6d0d4bc900e90b891f86f7550da510460a95622 GIT binary patch literal 8627 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 W`UYPzfb0-%&7!UC!D)Ck^!^VNdmNDf literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/modbus-simulator.doctree b/doc/sphinx/doctrees/examples/modbus-simulator.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a0ae5a8fe621553cf857b6ac5cab47cb26188e26 GIT binary patch literal 11210 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/modicon-payload.doctree b/doc/sphinx/doctrees/examples/modicon-payload.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1f175290b54bc5842f56c1e234f14cf5225cbbdc GIT binary patch literal 20990 zcmeHP>u=lE6;GEsv6a|K`dBfn1uhzNmKR%2+@c5!cv!M#Xpqgzx^x|o83aXMiEJp6 zBQI^aK!EK-ffnF44AcJ7ecPw~&V7-RC|h+?Cm&?23oYHpIlp_}JidQ@{XhTx{RR0` zuK9^qh%m}KapLoQR4&s810IXfzegK?8$BPj%a$ud7Iq7P@9FoY*d5^UU{qeplOpr@ zsQknB=Q+>v?c9yObdR?`(QD+}{ZP<f@^&$sba z=q2%1>K;dl>vytTfR?W7J3r0M|+E__X@-QF&RoeOhT0yjHHIZkF@0NiCmyN#@d&(SCUe zG!X@ux14h!!nhCQZdfRLSrQ8#`vB;VZd71ji{-mvoEF02u?L3ZzQeOD$(+EA{fK7- zD3JER`Wii?j+YGREOKo6UQ&n?rUpMNF9E<_*vHt*j>aKq;e?Ap>VzODi`|G;dfNlU z&m2B*!^m-cKLa|T@tblj>v;}%;~D6~C;R19`lRaujUtOi<-36pX}-I?Es_Kx6LQh( zBw2qu5QAtNL<0dJ8*yhyu#dhiugT5RoELuL3?b2j%5z#e)k2Fnvv zPA|lgB*_2wKAe8v!r|JxN#N`<{N04L3Na22YMPckjVf+lEuQ`60yInAE zk6~4EZzTk95{VU@%)ohcbks?YMUcc2PM;rcV`NT{DuHkg!#os8hJCK)12+@SUy6kE z@!N8x&tneJlwYpq+!Jvz&7{EkxpkzLS!g4Iu;}G-(yG6~;YCkrXX(cCF8a z;6p)5f=va8U8!aTZ-EcDi$n88FnY9H{+P}h48u-I&F3*4mXBGhTGzCF*)LoAWJ%`t z%Qq~S1PPsXKEn2I(^<+jG0YJhb_}uui-6C!KDhl6XnxNNTtErUQ!rq6OowH0vu8yL zkk*deEG9Dm3b;GKX77%R?4*6TP9)?YGyuF2AziMDgjCc}RxZI_WXGfO3alaQjAD}D zny??x2B~CFS;&d9Vb6}bTRmQkQQAmwi<;H3^#JRQ36dHBeq_4s6lOW6){^!O?4r#%_z@hv1`s?=eNvF^&gE7Vs#|)hSLLgFa(9 z%>;Q&By_|_SqS$KGxFNKbHsZynAn&c*+DGj z+y%@|ffH-rX&!LrV>@D}8exQW&urU~+qcySLPqX}aFsc5BiO@f=RE3d8ZqD7Ph!3a zV@mR~r^Kl98$b|o4KMM8h1f&P4&5mHibGdo4ndbP=y6gbsSsLQH2@VNyRc}kRjgh1 znR{fmX9%2JLY`>Ts}u4TBRyBqx67VD@zgVd&xwug93v1!IWgODDwxbulCh@;c7__I z7G`WuZ&Ak%Dxjg8faNnTicDJs3qTLCFmqvRNTo@2>`uFx9G@#z3^ma4R}y!S~4OY_hBCP7#`YcT&0usdE{AcvG)3(hqrI9v!AoJp7{aW*{Ejd zbA762J`H!nTRR5~0V@m1+YFJA_IdmECT)j(H!-<(7-T-kNNdGDl&Ryyx!m)8l149y zA{AXp--k)s>gh83muFaZU>r7ns zDk+l|PTQ_qZ2i9Sh9uFAJd#sy>*4z25suBc))O5O5>g*`>@N{SQ0M<$Wvb!_s54CqP%Av+hh>Fw>3R_OaOex1pRgG>1 z*!NS7xfs@(@lrVszCXuGFXrM{tHn#@IIK9f;(p#rp&;v_TsntdXwc;7m*6gXuK-@k zmz{1xw9h+#pPE-7QB>wpRHl5lwXJjdTMuDhbCUasDhITa?w1JBbbw(3o5tK$6%gi2 zZe^yA=uIWDRAfa((!_l>x$13+ROla3p zg}A*CuV#SJo-KQ*C2HYSH5e7Z1O<}m!L`6djV62~v9mK=liUJPdsvt@ozI$NO!HQa zp3Gk<2{nTui)y?Ka_bw|=P_3!U9@~xHTgXRS`jci6j6CfTa@Im?@%-Wf*pMNfl)eO8)Ss zBJ_AI>L*C6!IX0}W_Sp@kRmG8LzYK6M?YV11Tlx0gTtVB8|h@1doHSVl%)hH%2CcB zOAP^Kj1kd$Y^QfQ>OG1}9~;QQ;E_0#&!)gPB@vcl6~dce!3hB*bDbAi*Qj#YdvUE` z;?VjNH;HwDVh`^m5aGrsYueRl6(bURwgw?x z>-sM~UEgHG4VkhI$v7G)@=B>`zD{&cv>8TFtC^V_;v}c5h3)l+F|2UtPvo_BbCwrr z8im|n*HPDr&Ka@e$pp5o{~JW%yZP`jIB+zH=q}ECMcBeYAo}0 z<<=f%+=IxGw5?jR=4fg7L;>Ry8GKNQsG)`-V~10!F5@KJ+GBStrE`@kY^*-!EuW4r zyT$J8j(t*PtlF}ucMw&1L+7kdZ`bN&8jo5mL2J$gq^ZDhCPa4TK%`d3m=lqm7l+71 z1!N{7P1TPxA@b22h%^;BPL`36W+7q`RS&bvAKzV=#>yZwftxCUoC&pgG^Eg+m;Fw3Jnrb8`OUKL5sp%?8j+c*n zcV-HdDxv&fs5MneUOm+4C5w7nrQVKH;6v$d<>6%tb%YLsfD#-Uuj0#7it+UQ`<|~8 z)BCD_=lxAq`%npF_WnVu-ZS-2*)#Rcq9bV05hR<1W)w@cL@hdkRL{_&BM99~i;f`a z_ZJ;Ot}GOh54V-TTB*6JqEgY>R5a@ySc{Gz^zSS>f)*V?47I}^wOu(A#WK@3G@fGI zQ%z<~1+(*iWm~JHjm6%ko298Ipq6P6(-ZZu6Pa$RiJd>wO~tY%Ms0RtGdJ}xyCl|# z;Z%NR`{hiv<3!A+%3oMw zzHuetqn{IBozBy}&{X6YOJ%3J#$HDE!lEOnW@*N2Bs0Zmx;}CyAzE|<;T@1}21Pr< zJUZ1>BYE|7YPyO-jT4KGp#G-*BhE&*w&(~N?|)i!1j+88SGpspx)A9t+@=tz(o0C@U4OZrpWn3R-E>bF&)dgm_m5(mMs^1x?ZXCo4 zZ%@!{CSNG88ZzarPq?LWz(mlJ#WqMM#2?j+l%*(eXS2ZkL4{^B*u45ApZrsA< hXL79-nl6r0+{y+Jiv7I2VsFKhw67S(X?W4?{2!kAspbFx literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/performance.doctree b/doc/sphinx/doctrees/examples/performance.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ea7dba25ff36bd4d688bb49ba6cd81a692c428a5 GIT binary patch literal 10613 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 V^4M0l78laI?i=mKX?Qsr{2RVzK}`Sv literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/redis-datastore.doctree b/doc/sphinx/doctrees/examples/redis-datastore.doctree new file mode 100644 index 0000000000000000000000000000000000000000..dabd7640ac14a849cb0864c98e6aacbf9bd4b947 GIT binary patch literal 21030 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/synchronous-client-ext.doctree b/doc/sphinx/doctrees/examples/synchronous-client-ext.doctree new file mode 100644 index 0000000000000000000000000000000000000000..03c0ca16e88e432898c594f0ae11af68d7561395 GIT binary patch literal 18229 zcmeHPZExJh5mw^JlFpWF=cPc=q+oMsB?Z=<93*XE)E^Sb2@EHS>zB4@VGw)d-f?Rl zm)>1UcLfZz9|9x*+oCA@fBVcX$>T{nMF!5bKAa5OC*JPt>@&~I&hC)>+gtzr=&L3B zlW&AF$c%_}Cy^o7MZQWGhCDIFe~RtD7cYvfyv2-BqL&$bProlGY>1Cfi~O>dnF@H3 z|Ec>#bEUhQC4XV#?tUplcL&1I-ze*K)A3M-y-as8LRY7eNJd>gV#74%=r~S-NXbNI zdMAhl#^2#1(^1+$r5+2ODc-k3t^_gD+6{k6g!bBMn5C6YS-z&&QKi>Xk-u#eOLSkV zp%1M!8@RqVbk@^G7))L!en`?^6#0r_1CmrkZ{!;(Q<_h8YK1(Iicy#1AioTqNCWg+ z)!Z173;^Jb8qq%HV|Wq*r{A+U!?-o1?~5eOjL(xmhUn&VrKIvBmV_}^gew3KF!c@k zkotifl1VfM{Xk~sjIPnI^2>ot`eJ~#D}ISX)PkY2Vd@Jgq!JdBr1yeYvS&UYG7DCUj^F1Ssvr268&}W|R}S*4bfw3DMyBE-e?KxN)wjD{BPEz4xaoJK8gwHwjJr@8 z2mslb`y+zA_#wY$2TwK6Lg|l&F+^@mBT(dPnd$F*wxgkWz8^n22*z3$86px^ARAoz{NCp<97n_pxwV0R1UmZ_3lH)u4r4zS$uqRR=7&PF9wuL#VcpKYW(eRU6(?|d z6`V&$N1b$RBAHk?Lw?vrOHGhELimS53nLZAxvGau8UJ}E$t{1#*9JV{pr-wDUGu;s z*|0Rg{WtO(d?XC8VhHyeQj0-m%EZi%E17FlXxX4eMX7{m&45)5jf?AoMP^e*PXdN5jO zqT>E){u8n_CX8@pJ)b9JtPs7{OJ6JF%R$~MElZp~$ltDKNsy4Wb%EjEBU@UTXyzM^ za0c!mBH;SYFLytI&L0F31C;PQ2Lnb&cSIJZo@FUO+Bjk=p)ddqI2&TH_opd)JU(0} z6*Lr$0B=l4=j%q2i&mQD%ZL|hT;x{}4H0MDBnhr#@dMsq9k0l*!nlZtNfq9ftq;@8 ziA@NXQ$C&b^0&!CH7ekiGK9!#5Q!MkB!NRkOZf`*rhr)mzi1hYNOT2XuE68kjmYo0 z$nU|LM6wVc?D9~s=mwf!JJ!6hP}t^JF{swy40$pS;X+Ua#S_O37r_Ql5g0E9I!g57z#`n2bu8!&-kl`uWmQ z`xo6zt8PyuU4&xKMZ?zS=4R_bnLc>uu!wH$%l=xs97ns3sCfg_h=dk;#+0& zR7p6zj5`*a_S|N>v(xrkZ4atqT&u|;Qvz9;XSt;4o5mz`Ywkl&!P0RNp+lfnN_}Iq z$j3oix+Bw`yX1avwa+QxNjOWwIR!l8O0al_7V`(jnJ#VLINIQb9WbXYok006i#L z*f1h!$sKse^+dpL+DX)@_i?!*vESRQ8?r)yqznn)_@;*eN@XSy#W`%J)kf2M#?z6^ z;?V1Hk5aV|l9;L0(OH_tV>^}f@Dmb8vq}$tjp(K^6Sq4+6jTt_lP0o?JlTJMcA@up z??D;kG=`gREGjK}XUfO7h8$UPcxO|YZ1bi^vFgr;UCNh@8K=7+ZbQq{J8s_k_&1$h z{JB;2`*io?-R+iZ-GPrKz!Vgo_dKRzY8~CH9VtIYE8GX z*=(uVtTvzk(%BzrH00uBlX=gtP3fXyp5o83#Wt^CMY`9weuA{DvJrV~J)-j@qy_LR zj~!w+P06-bI;$fV_&5|Jk=(SBB6f&yRa@NpQmMWd3j`Pn77(BfXW{MJ)`O=_beb9W zV$Rf_%xH_RA38KJ?n`&nDbfvY2d$Jsm_JQA+@uZMT?e!&orsS(&Xo98*_#@PKJq4- z5W|TAzHnV`9+&DaZ)3(D{d77VFGQG?&0+*oj^s#s zLuPQzYK6eA@NIc$GWRezf3Klkw88|CT)r~jQP07OhamC3UEc0ZhAjEHl_kR5xwYL= z>Jm%d*g{wTD7cB9~QRTe>z|Ce(UXyKHEJh zxb4v?5Xb{|9bvsj0I)ue^q7A^-H#2AeBZ+y85@ z0KCJ=GTSlpD{l4>itoa0@WHNauL`EuM$ZXMk5x7+zRf_Xfp$Rf%;vYle1@2lU}G=$ zs(_v=AL|MIco>)y&e+r@blQ9-+O=9(GBVUH6rJDLo=8w@|Lv3s^x4u*l~wH=YH2Y~ zuu68^7~8XXaH_OYv-xKkl&I1%qX=Ggl3_BH{4V2ayw40fH+5fj4LdJ)OY@Y;0IfJD z*PMnWTv|yfZrQP3B|utbLm)Dxz-DXuTf1hQdx|yN&b3OvBUgTo`qcuRcL=iq1siz9>iI7@;C33m9s=IeJl!#+mT+@p(y`MLC)d%jwp+MLD`z?zHz#EXvV~a`d7c-E@ok zGyG#Zo}O06T$H10ypDgc@nuntUX-I3<>=$C@uR=PcNXR7OfSmO?gZ2xPcO>Ri*j^L zhw?+CDzhj@FUrw%^=$5Ur7X(PNZ_nl%we$(iwLjzlNgkq8v>z`;5f7+GSDseo>B|akJ|QkPa5*X!p8-`o^c4 zKXebsq8wd4yD)V_yQ9&f9F51?n)mt7KX3ehm!l^Sguja?zyFOV!J~iPUv>|Hb9}sn zkC*8AaJ)`o*pqSn3I_WYi}mJ%`S!|2kSThqym}$XL2loj@}h`FQL5?D`20q*6TQj7 zi3$Yn$;K_}?h2k9U$39|w{37`6|Y;cd7*v!-@WhwZ!w`42Q=TY;@;4L_U|3jx$3-> zU#--%Prc(66xCQ(msJc{3t6F0?(Hj47L9cN?s2Kr6t0WJJt^tqR!TgjYGtiacRVYI Zw^#s#>_F#N>bHnk-Pfv#Q}e9X`5)!4!sh@0 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/synchronous-client.doctree b/doc/sphinx/doctrees/examples/synchronous-client.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8a09bf07df53e570668b0cbc9a75a5ed542f1cd1 GIT binary patch literal 15969 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 q!Yv&-6^yzZ;@#%Xvq?EMc$=idDQ literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/thread-safe-datastore.doctree b/doc/sphinx/doctrees/examples/thread-safe-datastore.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9a2578f13fdf95ad05829b1235bd46bf97543c16 GIT binary patch literal 19126 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 n8&Z&{Kwc| literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/updating-server.doctree b/doc/sphinx/doctrees/examples/updating-server.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b7a5de333c63c2d513b930c96cb6977f0bb9ec95 GIT binary patch literal 9631 zcmeHN?Q0yz8JA*|I?v7XGQa12Xa98JpXJ9(?x)y@ zRG3?tm`prY_nC?hg`i=8JH=B)BG{{XC61pafWjgJODIaHvFx@2W$?7 z?r3A7%YcUmS`3}6l`!GPc)90gFw&SD=rGWsDO++vy*vr?& z6(>A1B9Bxs9VcM9aU6lNSj+8j=aU@+&5QMfr=uLE!pS4})dwOii>qQh5K&<444x7T zVH?Jcg-O?qOk~Hk-|*yVz+6QtuGKp)}Ge4LO(1m}?t+n=6XP*TvdMqynz#zFapVv}r!B4Dk3|aZOC6 z1$Nx#CP>7gNXo~{fOMKESaselmLoC9$$QoSYbYr8;1eHe^85&alEI?^rF4#Q8}2y{ zhDzBKdK|$Xm<+T~>#`P^f}WMg4~na1mRddyVmXQv{KCmEBr1i`TQN_XjmyOb&#ek% z6l4@;Q#gS{B(1}@WIBWwIoHC;u8f4WVrnT!Ak;$HwIizd2F}3;Fj{2e^6_f%6S6f9 zj0EE%U!-KL2vqA;tX27CuV_`4C7<6bt~aM7NXXizg!r3eOUD!20xOWm;5*0&Sl{`$ z_gm^YaGg>bfChq(A?((1mpz#uu96A{ipGF9A*73S zt0+Wk&5C8@3q31~OUQ=EGyaeS*NOarXmEj77MEdMWW=;iZ_6%*>Ez^1NSDWAIv*6* z$wCb(@GWf#k<~Dk39?CwfQpxj6{4nuStq}E8Py}cgfCYRaUazwpZS!}s#;L;_!_oc zncq@Xg`J}<>-%LMe+VPjB`9vi=i>A6PvbOB_912|mZ!?Cna7?(@zIN_@~~&F^03c+ zNh;&-8kUk+;zSpo!`*P4A1C_0bR`p-eP3Ke8KF8Fzsd(3z7ETmkI%<{iL-nFX6uQB zWAG#xBnpvsOxa=$xpLQs5*!K%nsh@pXo4r;8Z`$6=o0ZwRc!?0u&qHU_THr~H^rE$ zj!NIC$r-$Ar4m=Zc7_CqWGMm_=J?~k)|Zy<{=AzT-5toZi=4`QT5D}?ZnmCQ4M2_b zACOO31OIclG>=+4XZF)-J&&bf_{Y=QxtJQVm>(kK7-tkTBdzi@V%7;~jZ4~Cw2;Or zy|4+qT40B$9Tgl^MkyC;I?M?PAp*r!v4LQbN(G}@(c;zVEB3p)tro)%+JkYmM2g5U zB}(vd=XX0Qb^6s}8xe+N*RRzJCYpR_n~@Xr+m)i*TU&F)9p@44ErK?M=b4G`wsD!mP&nOW+4>KRgt>Xl!sWKGx z)+eqLedyM{KvlDHC_|V3PLgrU4QlHN%4g!+oTzy65F0+D2!2b#gdd6r-m|uuSHtUD zEuLWGIvkV`&hJ%;0t+jTO=V$l{f>j_*{2?Z6%f zH56Yel_7*4@FaN;XGUD1N6caSI{3+h5;Yn@=2=5rWr3P|^|ym&QHF30D1unVD(lx8 zbdVChgfc?=Zx9pqOKR}iHSxpGKYQ`}t@nTorY2M!HpBGCLV!=1lx13BXfS6D3}iKV zxk`L(zP0O89jXfZlueXA5W1ERV{yxLo*D))^o$`Zt0BfQl!3@mxipGImB>TE4&8u8 zb%BfwlT*&`urDk#vC5N(GCH-mp49QiM#=}MD~uXtB8sGoP_(9wjhE2z>3$b|03TDX zc5}7aMOFtn&4EXY%qp({xiS?ADwy;aw(PjZynUxm|MQyO@j1WJo54Hy%ig}D)M7+| zs{sj_BX|yR@(OgX=G*~OF{!@VWp_YFRHf}rb>Qghu-xr^LT`K0vN81@Nk}y+UN8Tt(?cO$fdGB}ozr5G$ZEZV( zP`x8TOdj+u66D(xY&BihkqCPJ^T5Yp+xea8I}o;+LEcS7|GCb^`^ai@My(S*qKAe~ zJ@&o98Midjbsl!s;Cos_g5+NB>wJw7To~9EDI57W zNG zLZAHWK5-sTO>yHS*ZK%oB_0IheF+=*3p>YajmYgR!)p@&A>T8_rRKF2r~6ucaN3>^ GI{yY>^y|O? literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/examples/wx-frontend.doctree b/doc/sphinx/doctrees/examples/wx-frontend.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d6d22193761d4066b1a077d956fd7afe53945b19 GIT binary patch literal 26776 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 Cddw>T literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/index.doctree b/doc/sphinx/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a39d099ec4d48213e0bf882e9a518df79de21a4a GIT binary patch literal 5002 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 Oj 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 Wa3p*UUjm(GUFz40NL19vNB%$jL0}93 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/bit-write-message.doctree b/doc/sphinx/doctrees/library/bit-write-message.doctree new file mode 100644 index 0000000000000000000000000000000000000000..17eab8482e26db8a2d7728e7cdd3de5083ea5842 GIT binary patch literal 64878 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 uOsUGa~Yq_$AdDHW(J3F-EQT^*Plm8EgADl}7 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/client-common.doctree b/doc/sphinx/doctrees/library/client-common.doctree new file mode 100644 index 0000000000000000000000000000000000000000..eefac3cb8cfe3fba968e24843d2f20b416df1c95 GIT binary patch literal 46059 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 F{tpkoJU0LU literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/constants.doctree b/doc/sphinx/doctrees/library/constants.doctree new file mode 100644 index 0000000000000000000000000000000000000000..115467fecb120a4f941cf14d70edb990577e16e9 GIT binary patch literal 46064 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 S)6xjW#_kMQB$M{s^xps=I7piS literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/datastore/context.doctree b/doc/sphinx/doctrees/library/datastore/context.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a0664e4b541af13347b3b02a5e47c1f531aa82de GIT binary patch literal 44330 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 PvTn9UiX|EvQ{(>!6nG^i literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/datastore/index.doctree b/doc/sphinx/doctrees/library/datastore/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a8415c0a81669290707e3c011d7f83408b8aae0d GIT binary patch literal 3067 zcmb_eO>Z1U5Ow0Lch~l=g0)0OHOK_(}W(UiIvZKN7(OOZKj3x~g8idR5h*-}v$GosIb8$GOgG zCkuP1bk1$?1A0($<-!l)l`q0sc;L60b4I4M!+ZL_r&x)vkAmN_x;7aP{)6d9mK!^@ zOnt&u(|6WB>~tX={fauBR;yCyX>F&7FtwGCYB?=rYM5C~bLNi{KX z*|FjC7^WStxT)A zT;Oa!S@R&aQQ*3)5(z*?v4T9^$qLPm6J9b|BrMMj*a60`{n*U21i5hoe0VbRyYwVw zV52rg@b`psm3?zMby`C)lDqk#HjAlnWibV4FaTx?o-B#>@YwIg;FaZdu9Ib1z~%Td z1Hlh#H$Qmezyi4+6-+H^lnR;Wkkxgrg1^bjl;??ctAbm>x$7Kv6(+3XidUD>j~jMd zvV-q^^zhw-HxLHyiK=8S;gW>B$<+yb4534A9V;vR^FmVtUhr6h&W<(X4;xh}xbHNVf7(t$hXYMT`Ngcsqc2TGTfMpZA$ zqL=fuCiM(KYsRVfpowP;DL+S}R8Tailu;P>Av1KCULKOIg$Zr%{q3GL!72Uy}AG6x&MCM6FZMK96BsysXZAmqUilVfT+1`RX z$Cr+p1VJ6Z4$rN`ZREjH6fJim91Z-lRBI%RF%>(XD=JnFtI@jG*7IfNx7U>=&CmR; zE=!_>s%-jGmz*&i4_byBJ>U_9K5G;TS&|47Ge&jT@Xp7AEFfYt1_#I3`%$X)hqU*~1KsUt3 z3w{^H#Y9x?cn&f=}kUDD)}hG=cMp z!;`n(e{VutiRM?V?u4X{Z8dT1n5%6psxlsI1Wz;f)o>xl@76gEpl-peJYQs&YIy~Y z_zA@S98JIW@BMGc!a0Gr!PGBc4j|jY;f+P1 zQ+V2rEpD|cR^f45PT!|dLh~LiG!uV(6=vd3`t#RUfs1dRmRh{LHN6-~yeoc>I{5Zz zfCBv%Yc*?1#Zfg<{3dk(mP489qFX3&Cyy?UnfPR!)rR_}z23}xya}EKu@sf1miPM? zjc6}5t}@v)K=b4bWOef^p23p=mdE)lYt|PeL1XaZjj_3J;{2T}m|NowzuUr$eT{|M z#)?=52-rF4)3@d>DQdB_{`OU`Z3;KRt;8~R3Fa+UU-UI3bGNEcBal$ftl#PGL=pS2 KO`ML`>ESRrgRtht&1{qk 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 Tjc?p>-`HR}7V)GpG4}rf)y!AR literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/diag-message.doctree b/doc/sphinx/doctrees/library/diag-message.doctree new file mode 100644 index 0000000000000000000000000000000000000000..297e8442d98e2cd6ee45d427465f92304aa28418 GIT binary patch literal 175206 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/exceptions.doctree b/doc/sphinx/doctrees/library/exceptions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6699d07b20d3c45392f9311c2be3534b1df30309 GIT binary patch literal 20191 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 N;Y3k1Vsn1x{{S@Ij1z8eqTitcKt2WhDMLlMw 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 F{{cD)?=AoU literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/index.doctree b/doc/sphinx/doctrees/library/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9a7f9d0a19588229971aa8a6679f109f8c3c358f GIT binary patch literal 3651 zcmb_fNsl8*6|U}Tm+h*utE(5FMK`iW0?mx%@*Fs{xFL-Yqe9jkdbqVxk(psfP?-@q z5s_sZsU$eeXj+OHgh&nu@dprhZtVNM{~o><=}a$-fWwqj&-TlRw|sBSuig3f)8Rq* z^TSjprIVSxP&(zd@;zeYT)FC7)hl1GZmO64F>}tyxO8|l*D~y6E*<@gGM*HxT&HnqC(tmlg^+4F$z*JpSxux$`SQY82Loc3 zTp2zK3c5+gtgV$D$~5qLX<0NDl)i7+qOszj^7ou!%FeXOBiLx!yuN#G%h)>U;Hp+p zO44sC-*s$Gk}7e_4+~~2-??<0@wDNy+` z%Sz~N0emb~QM!n$M5nkGabvWJ1XF3o4WS5l6SzL4FGZB-oC08>^ocIrf4M3?0y#-b`|lQ$t+@NYJd)Ge9sTfEQ#P7H?R+!sXrx7 z%z#E|vdTXe&K34^lZn$Bc_O)+U1&3(2$yFQ7!3q~Y{sJ{!Ct-aXF+*kd70{HnP(6= z+(n@B{nE|GPsbLP`$5LkyhNzrd5UDZ%~j>^@;v5gWZf#`R&efG!EJ=e)?vYmUF(N6 zx((Qs@4WTw3*)Cy1Mvh^G?NfX>3hi4HDvTthSYW}FYx1&bqsjMLkyw?k~eCyaOzKL zjH67dE1W)yQfXNX=i4w0g7ayoQMzMy&XilN>xuRgDxHVYU+Pc3?{qZ`o zl=D-6ul153p=jF*>K{@pgG?NY9M6jkxr2@X{`k|ceHJ!9NdyCwsJt2mXvcMQ7G|!> z0w4_+%qVIDuz<51${z2g?0$c^OD0$tDgbXrNc(})RHBV#zJq>YR+T?NH$|5nOac)wH)xsA2M)vI*^Sr>4u;-=he%s35nDBSdA~}=6!#JO zW*UiOaZ4PEM?#70Ig}p=`JvV{dPFV3zx3vMLXEyukEPM)-+W{A`i^nptF3fN(&6%* zXUIqR`+wbkrwTI__P*nfFmh7eyIEZXb`?+^|A?IGFq9U%vWG z@X<_XnO-2hMi4%7;E)qLn2jj)F}+5PU2%1c!Ig)DbpcQhezn^2^BZeFd&qXdtlSK? zo!IV~Bff(Gd^cQu&%g1JSypWTd;p}r2juYaP5SuYveRPMqxPUnOymCvs_?!u6L#G`sS_@e=1dyl~^*?bLM6LiDu7bd!fYS2!8$P;gGOiz1{z1cKJM8m@jR}RSrM<#`yy0Q; zF^eg}>kVv6NGjQUW67|+z^^4WptFWCL#xx&dhRuxFkZmM$k;IXGT{X^1~6Nnca9ZdiuTrA5cyi_NG0 z|HKiWv z2kX>opZ75LW2|mzb$Q@>Ia^|6)9AZRO)a$CJM&D(kaQdxy45OMRWF)i^<98xNGTfS zRQ%{&==m{`pAh*ek)ILyIgwuw`6ZEG5&1Qd-w^pNk>3&dJ&`{U`6H1(5&1KbzYzH= zk-ri7JCT17`6rQoy<2hdJ{H04*MYjLhcbL5ei%B*2bVpR_zyz0PwQgmsC(*}htxx{ zZsf7f+7%^id4ui26*$ABG}L*Ug?Z}3yTwfi$UHVqPorqE_ wt$(mDwQ=DtUbQ6FI~QSsW0?xF`gGl`3giJmD5ut+v|Dztz27)a$IJNQ-(PXNm;e9( literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/interfaces.doctree b/doc/sphinx/doctrees/library/interfaces.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2ef08b579dc72ef92c9027cafed05a5502b1dbd9 GIT binary patch literal 63093 zcmeHw3y>sNb)_^jJ=4?k*UVr>Xi!Q5sau-v*64#i7=(}lkOxf+(g?h;a!qzsR%gAb zt|}_Crl+?N2zJG`AVFbN@(SAs?8O#=i%$?>z+mI`5*XGv0x+x%Hi3iSw;Nv8yZpQ? zm_7HtPrj_m>dGulw@SU9h^fwe`SN}4z3<+0@B8HaTOJWVK9B!JyG!+AE38z5nOeQ% z1?^~@5*EB#*nYS@_4@XG?a64u4Z~(-t`*`r-H+AW1zg_Sj&TXVCGrG|Wm~c827#<`bEU*-kGt%0F@rDx58Ck^)HXM7VEWgWgdCA6%-x(3GlYH&?qozYi^ZF zI#{gM-O~kc!L3vaZmHA+b2yUL8 z4eNCXOT`PzGxg^DtRF5^XVGX-0Fn+TAr9u!cRlUIXywDVEI81Hb-S8U8*6)_o z)x>T`WA~hV(e#a|2E`Mp3grrlBpKf9)y|-d?IjoT9l8q*+&n|_z^i)9gTf*txS*x* zc(g;(xKORsP9yi8La7qCbLhNb!!GW zl1hOnoT&tru--&HJA(zc85UmMs?$h(Fxo!v)jWtMKim~~#jw^|Pz*SBezea!TM0os zH*5uks&~e#wvUa0q-Ps-aMc!zv645}BI(%9nOEP~vy1?|3NJ88W+Nk~@@si6# zwnFGFG^&stXauBBKl|$I(B{KM-vue5)Fc^DJ6?xoahs=G4G?MfqT8&I8bAv?cL9}M zloZ)+{jiss5TKzx$Xg{!N4vs04N={)Xbk$Ixzvt!KpR5O$W9Wuy7UJ|0}s4*v=hvQ zMyzS|HpXL^dQQ>=b(t8`t-0s|;*g;VWUCnxMaGMMr3!6Q!+`S7i?-3*q%gJe^T%K} z{2h3>4I|EpwY@VvJ?#Wb0f=a&wq1W8^6t48#%3RkMyu*g$L~NH#W&OPW&5$`@4C0$ z^7lgyw0-g?{PX?I{vp5SS5c^co?l6Anyyxr5M6OIYQOnZT-_;d@ZGY(cNnA9_Lof+ z6|N%MBQ4wvw5+nMPysd8{AVHENzz2ykQ6R8z|_sC5t^~FL{+2XU#9b~bFNV8~z+9a~kHX4ScD@lB}1{mbvVzfVIj58@&I|bw* zuWa%44;&BW0ALxmBg);PUg} z!zb;USEIiFndqXFu3Ge8jUYXYh?bKmcjio`8MfRi07PKW?Q~=5T7tDmAgg}u%=NRd z-`+Ir)M)~uCZmmcF-AdnGDfv|r(Ska8Vz{L8cYcRi#QP@RSNd&0#cP~WFFgc=Nh%? zFONh|bI95L6Uw)6k~;YpifCHWQu7&E6Wh-}?>xUF&c`1qaWwLO1R|dYg$#Q>-*g*( z*XUP9ty}Vs-RczU)vC0E#8Se3j)IU*=)0i7BoXPECOjXXn& zR`o>ep(c`EeLOm+Rm4O%B#E%k5MhfXg4Tq2N8se$tO3J%&6(u>LncihEd>N^cvy?A zl{{l!Z}$wy${$RANJ}0CN9+L)>1_W#L zaVm}j@UVuQh!^k;xV2L@0Vs`P0GaAPkist- zq;_jg#jQ!to^0D(YTLGR+cGyy@!M`jBW{KzAIZ9#sdaCu*Q!fNdPG|Q91*J6LQX#m zsEvD4M#bxN?QgOyb^@+mRFH!p)hq%^5wc}iJbtF)EplXlQLK%DHwPibTNIG>f1Ag3 z66P`z9zzcJlafjRYH@>O47*kOX~}+bF9~NTr-Vz}r5iNOQ2Ldlg-bWH{KQBqLJSBn#nHJ0{IgrA(4#F4??+MWort}- zvUrl#L&9&bFgnGuUlSC&KqQEQNOtU^QE7NhN>tDXgbBjgYp%ZfhUs5vRhMS3yZ-9u z+<0_G3eTu%C2dzHp*{|#_Bv)_zYJj3$0f6X7a(jhm=?>DG}|vc2jol2(_e6<@SLJ^ zQ8o({52seM(iUGLndt)Aa^%R~`iI2lxPHP1@VmqZB?zhpH+a$ zxA52%FUD^YrO5PS^zuH##kkihws2|Bqsc1~&j^koZK%ou^qfH&z${*wM+fYhVswn7lm6+_< zRjOkhaWP+sEAb}-_r|qIc2yFmC+oSXs~%<575nZ_vQHr_@c@ZMs?tSNGxj>p9ljE8 zQ#IPrMezs{a{#NKQ5k8#O1u+K2GCZ#2YK?KDAy47W#;O|>WYDrB(b9Re?#dQE*}`& z5RIFxp{a3GR@ij#HpKKp&v6}?HMqMN@R(I2S+}&VMjQk<((@ZZ60bwQU=tQ~_t?{UJCSV_XFb*4`3D9WyN6J0nz57VZ0vS-_gQ)5zfUb%j^6ZSqL1#Tb-CqP&6sww zA=U4pUS;&c-;2D)3xAAngqvwpM(K`pvi_WY_s3FNlg*?G$x6HLmNo6>zZuFLiTF%P ztsBY`Fm2Y&68sNE&W`xHx%#VK5-WZ9Fh9v-2`ur}mS8fgDL5qcr=u0<3n>hI8_hSv z9E_qKu*}jbZ8!2Pc5G(Tv>AV7%$$6{pGq3<%{H$8gsR^`ycqF) zj{NOJ_mu{;2>4X*Sj^=Msec`D0scrXZ#G=cH63>yt)?n@{T%(IX^P$asll*fMwXlf zU1;&l>@yy|DBKAu$4%O3Twj}8to zt?z~-*~~Gfc383qWZzCqk;PahS!Xap&8GN8TA~R=-^4fKnb2MXycG(LZc~)(s#5!~ zSslu_n1s`6l9TQIHPzmZIGNJ&4Fw`@MF-c=|=a?Ip1S5i|TG4~VdYGB=2D zUV({c1lJu{Bq`>O>&#cqc$i3KV?|hEbjPw~5eN6gh`V?X7(P zsz^iv>Aocbt~N5K%tHcQF~}>ZPv9x<1iI?!y;Vg;_zYwi#GUMHq`wlEPvd z9%(r|WL7BfRJd9aMyniY!Dn)M6#*`+Rm3vvhF7eVE5-H-H(I&y%B)&y_K^5aOsPKl z@q3C)9r1UPM2|;XsM+!C4O7!RJiK~;3=g6K8Nm}-riZJ)GL4XYqO|vMn)oRG47M#v zNfUpT>7{7fT^<%3)cS~)d20H^l-RySLpqYH^Y~7DDN}_*$d^7__PS&u_Sot0(*@FeugN`Vs^kqX~?GxzW`eE%y3}GKISIfO5R;u)Q{3H+7wxlID)_x8) zvN@*`0(eT|ZcKD8V0Af`YpR8uw5*eEPTYPE1%aZ`*9F>`(khoN)X^9gse9PJKVW(T zTkes&KT=k*tUATpMLaU%pFojn)#|Dv?vIram_|GvU6zITX541WZaN7GW3S?OrHFO1 z!XC5k(|8hV3hZpJKr6$HZo@YfMWx&DRoTxqgm*V4MvitEbRvSSCC^cKA5mSb1a_S= zts=kxim~3L_-+>`XxYm@AT8BH=n^RuWcdkQ4~?X-joLgW!EZvYRC_J_*hZcKV_{Pe60t zVI*1BiT<5GW3?MMradG~M@@douvoy9)s-qSVS?3-bZyj)oK2HAxmOoxwEZH|0D~77 zT(XLXBa6u5(NHVT!PdmZJwpz#-8s z>vljgE|9ZU7QBu+C5t(M$wY-AbOxhkS((2cdCkg#7T-MKl?7J)Iad}ul+v1PQyD^X zQdo6c(->XcPmQLvMa5o+cgbeEMnI9ebGu|Agrc`&sTmGFoY$oQE1qV~4~T9m=`id3j|?>ZGjZ8jP=Jul&j$q3*8u#SsFQmQ0BN#8YXE+L zJZWG+rZX6LdIAh2h@e867xv3B$pOsv$l!%UH3ug->DhT0RxJHK8%k?QvB8lZW|mbO*cUTk#IKP6bi~Uw7uYJ? z$#-J-NZOhP(o6(H57sR4jYZQz>TXSTa1BFfm!E95cn%bpEoc>S99Mu{-bb7l;S4X& zsYAA!iW-K|}N#qhlJAEoI~A$H&2(Loo9p@X`V^;=Ob)jq!kO zf>{8~<0vf+(8zQKG+l5d*>MGFF6z%l32H{0bJmu@jId^Bk_^k@&tkS%z$Tf^jC6)J zpT-*o+I*C6@<1D_!X&g&MQtc(^C_b4x)0Ku($NG4R6_{8+nc}rry`$FQ^YVSf6Y7fr4z!^FLXi5JUN`TSF_r4T zy7}%I9Cy>KlZo?6h#}AlAOs}jL@OPPgJW`#N@pJ6xHH7|YjR=GjB^LhB7KoNgb zh_(4xvQP009k1XvI=<)94gq<}CM_he^qGZvHdsH+$QS#!F-F^gKXTnZ?atVw@5o+D zc^ckC-+%+|PS%Gp&>4LCxa?l@+`DV=9GbytqT8DI^p~OJG!rP((|mfH2+9Cn(ro|@ z3+&bXBjj_~eHhlYx64=-&m#`WqAUwIVP!I-fbHKcw$NY0HyQ1pwE{I!t+s<}v(Wz) zs=YweDJ|bn=JsZEaQ)2f>kMJ*=F00OvC@cF@RK~|))Gu@ZZq!|oV>L}R!;>Fw7rCV zqcmyJ=2~SOEHh#u1#8r)F=-js?42?rR=fjbhjDsD^Mzvzk>thRY`Y3wh9v=x)vIFr zpgL-A&chx+xr9qkT{w$4yVi5C=&?aa0$pKhhe0&9n-2KY4vVHE83fj7n63p)JY*7~7(0XMsq|w^H%UM~!FOx9+T;>F z3f10+g*rBal5k*7EM?O}zLiU66GL*%l1WZ>{oAVR9r3q(g{V*3Y9;gVX(u7FDeX0- zM*VVtva%Ek?|jKrE2&LsA5v-TpGa9tD9qvU)?n^mmi86$I?9$g6Q|=vy zs#p_DxfLa+VM>{v7FJ1;Aw8^O=NY-MirqMMH0}^#m1HT)!XXy*fXbbTY-aSZI=U2Z zn6S!0zR3tH@p_^{4JYM{kt%9K;k?5{-E|AA+^sm%5x1GEo75GnElFafsV4YI9-L>% zN`9OtXN<7Gf@1sB%uwov4GqS|;}Vv|H;E-ZKrGH;MhcJmZ`s2B*L;%)gjtm(L6|CP zLxHew5M|d5gdN;2;c-WdnXCWX%PpmiJ}+7KflL7&#?Kb(a)Yo-Uo5ALtd%;5vDFtC zBE(^~5gub!#3@T>%%Bn1f*G(2S1F#zO>md;-BV%d4s$&V9C)eeAa(aP*}*kjx^sXc zE;3HbKoQfKS6tDxP$xZ);Z2nO9L+DP&UC~p&6VsD8T^}dSIOW@RwhQ(@CN_6je4U+ zUpTwV3tH7MXH4em!Dc^M{yH1~H-c_!WBgx(lGBX8OlRZYwUDKo5DEf3D+v*jxh667 z4X*H7-bY6V4kQ~nG$`2JUCy%j4PsaiH0aJ~#*=gl?7{J7zR3s>==fuzFU9(;nl(ImiFsV)Sgeel(Og0=SP!^Z`8sT3J;C^ptn%Uki9hHL;M&_fqnbF<{C$fzAZVG zHCprv%;UL1rHBsb$r!lF3~*PPsp~rsiw#%^)aX^-zR)}m8notn9_ErG!Dm0`AR6?;W6tA z)vCff@U?9m+A@EFX`2(e-jD&h%EgPxYStOSRzStIL9hjsoQ7a!IwRQ2y0B?FJrt0= zHbdq~Qp86b($1uf8P~pZgm7(o2c&+l~A zqx6fS(S}0SXVBI4L)M=&g#Ea=`hdD(1p?=CHWm&`e?A{9h#_vH|B`-G#6$1KrR)jl=bM zZk6boJOUOQ_)8@`<#||gWfXv(P~^vH1^C`Qa$&b5jx+{DUI;j3Mhw9>Vk;rRX z;{|v(Z!keP8g?9C1Heah)OsvDr6TIs9R{4;s+EqwO~M4N(x})SK<68{;RGL5Fyly! zE;j;5AFD`nzl%N&QN|=Z&EGl4ovWOqvM!pZ{Xf$=RL%2_Wv zM;Xe0kLcPB<^P3LJ*0{y@yAjUzi%XwoQqtN7`=*ywAnXeZM-#mQslQE8m+*G8>W0V zZ4@T-u~78Dhzn$i&addt)U~ZOrq7lgJW_vV=(9bh&r`$sVr`w#`MLcUclGd7vhtu@hIzVsb_EuLAiC7#nC88>+YOx zok3C7sdi~7>P|&UOmy&7AD7NNWS_0OnMMw!OV|AvqA1@d_w5C$Li#3M{}UlQ;(8+S zA@O|9E^fgebr@O>+FqqcZ_kl}7{oMi$vH)wmUe^L6D~Pv9V5r26CI};0x{NJR3zw# z1-|M-bMx?G(p2A6yJ{p)69FXM_FNA7HE?&@!SDGHk!AEHmDvhC=RLu$KHoRYc z<6Ns!Ee++3PY?FSt-{yY2Y(MJwl+TaV<E8S@hZd>}WqS zI*xXt7el(&un0!l$d~;XajD0tPUJGL7;67V^J(Ny9 zx!&}26*wBn!GQuyOz7x{W5qt3`-silH@3Nw|yU8@$-+v3R z-K$c?p7e5={5>3041Brd=oxAK^@<7Y|Hfa4(>^LY6Njj2-5z4JCbh-%xI)t7VnYvd zvJ^drcOoX&^l%<~hDIyRj9$bork^AQ&*8gayoju_az)psFeL)BW`aZw!6$%3jfPJG zQIl+V&4%ifA^?tK;;TM5)I7Y1g}d6TptUTKK;xaJ36lPlHZ3`^UPo55 z7EOrEHvLH)(ikC_W^Nci_)zB$qS!PHFVh*r?@#TxMDOCysaea>LnDCBZ4URY>dJq> z^XI5*(mI|PbingpAg|eL_bI-4!UsHC^`DCCPyf=i8I!C-zM9gSY{xk%ehRDZMqGEQ zBqXc;Zc5b~3f!~6uiGN^-Mge*b;Lg_!gjd)Xi`c6&BD_3fj zuu`w(3jU79)=FEWc6|i*TIx1}r0C;;u0D1}sr!dt_eUSO9ZS$~l7;+c24?Q~``Y%$ zwL=O@*69E*nuL>wE(bTmvB9BQlYv()PfeV0s};ntJ-$8Sl+W@!A9Bzv9j4#H=N+Az zzz&|5yH$KHd(~Vhw0|ztgZHNF;do7e2`lS7V7ksYB{*-C74X1@P@kRPJeRK9R z(M@uj@qp!Mwqj6&5~z8#GcN2mj4C;BJZ!tYpw>PFE%E48c-N?2cf=%L^$GHthgkAvEjCDN zuc2x*I4=k-OQs0p#il8e_>}ewDQ@c(?Cq78KEd9*R9j`R_YS^WOJTX1K4FdtqgRzC zD?zb|HH*R2k;-JH)@X&e@+a$Xr64j>M~aj6N;LrJNCboPzaO(P|GQvZ#W3@fxsqgx z*{YPiR4EC~uWp8b!8b~0WXhS$7zvJ1@M?=e64;5W=#3zc#8hZnLm8Z{4K{xZm}_Bk z@c`XRFnA8|`5RDL8a|iliFGPz{Z{b&87X1#86_rU%ST}bJFWSWjJfxJj4AP47Vn6e zVa0;gb2Gl#_`MTZO&I)be3KEFlS^jTq*1v%a!wVsp@8#m5?R+Rko*P3nU45VbM=Sn zir3Of5-W}Q@A*j{;A{zr2F_UnKS%GPU>??p$j|=8Aek0S5^S!}$@^s&ODG)~gCh^l zQV|wR9il8F!Q%VqHEhmzG+7v_eqG;DKt+>r55JD;OwAtVpO)f-PQbNb1+ecv|d!LRC zsouwRr)exbofszzvNU|0#S9Tv@)shvQS!U^CZm#%4x~}Is|8x~XWq(}B_MN+YBL-K z+2D-Z__krk5DZ~JIM~`LXp)nZdBL!?sA-DsT6A)#!Wyo*mkO*&&)Cg1O{zx9i?^%cqSS)^4OBx5sJSN9kf^$8@ML2;C-*be^XjvD&`rv6ypTlCgzoqZK1G z$%Z}*9=7b2;GrXax*Gk>Lq2k@r?sX`c_dxWb5K{7Ky?1eI@0;sY_c_#YpsPjeBuiM zH=r%79bkXP3$Pw0j;iIP_83<{1z5CJiH0gn=@~=mXYo}ZNjDF9J#F6>o3iD)+rIfg zZ&@Ny{u0%MToO(%enPQK>o!XJElyk0W!@%At1)px9h;|y7EI@ps*^H?dyMbaGKPDd zKG&Hhlr#>2(WfZCw*7-ndmgR~)9+}w_rb)|idY>nXRaj4ViqfWC9QV?Y^j?e;<>*Z zum2gw^FEp}3Or+~S!dV#t)QkAKs|@9_rF8QX|A_SXV?31T4dCsgz~-h5jzP-)@1AN ze7}9f))w1L9@6{XZn{m*?_tGw;(vckwYekS zFB`lj{`Y5wtwlT9FsrtgualGX|8iF?N-HT&Y$*Txx6sw~^S^&)2>TD_>YM7y5_U!J z6@HS(|F(pDo&4|7S6v$P104<#VlV?kT(}RC(h(Qnk6b`XUvu5gcTeEh?seVO$KsJd zeEnB>Tx#ERa#`AHs6+7j{Hp7d3B(_*jWZV3L01SJKnMx$CWmXzkOM_*%E zK6I|mnZY351rETTKdM>8)7KA4whTXgy{7QY_KmgD%ji6R+;o#V{XyByVL;mdceB^u zQIzY5zvHVu&a-)V&YfpjGNH?_s-_Hbp1**68^(FwyI;>`I1}hj^6yFPD6GxqV}z ziIr0H_(>ig#o}>pALWnvV-i?Q>*A{q=9D8CL06ts1NQ|VUMS)zALEPUhSa+JJqU9W zQq!BqsqIk0i%p!|PTz@Gz=t7boI64%@awH=$#LiK(FwO0PLT6MJH?B9mXe2WL(x7= zd5V(U1;cB7DoyxC^kE8oJz{dMh%ZabRcdZ?iM~hSHjg-7Se&AxJx5YoS$@(}oWMpg zh_6E~VduZ11(!Xy&-0z1=iHU+SdjW2yOLD@@n+Mh4Ay&wi_T)hg>3k_IBn&hh%UK9 zsHA}gowo9Q5@$3Eo_PF2)~vX^5-)^)R&&sChk_X^F`CB58I z_VRyA)_ow;G*&n3a@)(x2vAuZ~Ax%S*6h(U6yUi)EP5s#J?gb z=!lnTR&g2~2Z{NMe7BaXzIk4#j&-@i;8<*Yi{5pOkDva1x^sA&?=&S=Tv zgz`~05>q5#yu6`^0j`ei@H>7(UT(tWW|*I7Z?Lp5SFaYz^?Ha87xVFS(Jr?Y))Oha z)fe0fLA}*1dhO%U=1M7O-`AcLv_4tTnoR#I{^tdK7F5ue{`@7sAs*U$F4b?7V2K65zbk_6i$-FWaZs`9DyD?tLH-pOMLj zf^vZ5rY)%DCG=As!%vHT9^ZGu3p$rh(6MP^3g$t)fPTJ3KR?8e|8xIG;>yjqyNQ12TP}h=FCr*ZBFOg_mugP{Lo@pkb{H?ww-7cE;X3!a`dh6s9WLDw!-4G!lP`3 zWq*a`euZUzg~#EF|I_14fEAX;75|IJx!)@+gexqzD=eBTe(N}QbA=^vg=KDqWpIUu g&I-%kilCmXw4xpGv1ZF)>wYw&;f8Ze_hmyX+7&jOYA{o4RPw4;erIRUECit+ zg5X*;U!vMiw4%Y#nWdUq-o|Kq-Dw1__0mYmE!G+iz0#VFwxCbc1H3mBxMAp5XTh|c zhKncdNx(39sedMx)lqdrq}fb{oV?Fu4fQw^O2? zFV-p~h5(K3t2M(OuX>k8TZ*;nj6aLAgL%aVZv?_^R_b{l9comaGS#%FSgtwu=iQ3q zm-9}k)Bw-X$AxHnW2Tq~ZEgeoL(X)xm2wIWxY2BsThU%G4C}#xsj0A5gSPl?I5Sym z%uab>r96dBg9G4f+0D-p+gm529o%?5aGRxCey&nRmD_C&w4&i=I5TnWM1Y=0+saOL zwh09QiTsJfo8wpcix7Xde-TUp5yPDapXyBf^Z=JXn z&7gW>Rer`tm88U*-0D%(F;Gt8glqn+-YAA)yI*bMSz_o!QL9UcHn z=jt^`HLex|CAZKd?HLAJi!O~l=)^e<()om;f zpaecf(l+RpU!8##v1);`9kXs2x^p275;Pj3v%~GTyxpL~DL`nY&}$tYiq0ijgJ75_ z9{FySgjK>@+tgT7_GLO6QIaK{pN@7JDv2c|?VyF`_mC{PP87?BZlzv^?!Y1-f8vrW zuSTEu6+H*6#K@CuKid4+mAVoDwzTFz;!BUY_F}do%Z2u>Oz2ydSGvv zI2~;ZYcxc4&!Pd?i^hB_8ih54osmQmyE^O#MgtGLRDh8CdAsVE&$zW>Z=M7-u@J8`)5F_p)n0swwa}yI2 zIsDGa$pJ~81%j62?L_e%_hG`>g=fvOiy6Ya)`~8O%^CD$LRO%sk)Y*z+wN;My>p-r zdYZVl<(d7qF`GF6_+W!Fe`}SK7LoD==6sL8Pn2Bl6 zohj8|%wa0eszdUW0hwTUKnr5sZ4o8V&-nvv#9GrVhf$Pp4Jjq*+YCBU$UG^5=y0p-S}jQ0b) z$dsk+-tOs8jtExhn2tTo{600UI#iRG&0<-!)2aJ8f+#eZ$)O$_UFWOzG(MY*bqml2 z?@rk7wg*6 z*4+tAU-tv_vv!SDVQt^&7aAZJN>q)^=h@qAE;b8h7eJlP0WE zjxoRt<`U5E`ulSXs%Y*`FvHPA{M8BbD%)Q3V%z*W#{7E6*9nJMN4+#EI(18&O@|0U zOE$sc@6X*$-UYKMZuP&f}f`Odoxc> zvp4rDHQsj|s$blt5T|m#*UwK9D^2_fBPM8h$V_uFv_J-Q0WfX;tmzazR zWd{qzslvUGlT|8=wnb_&=oL3mWwPEIRlS%{bOAHWpcISZW)$Fo1&tI}@((EGR@nsr zHVO=+YJX3XW=wW;=gxL_x|FwjcUNNXhPijCyC&X6ty*kx+WqLQigtI3iQU=7-2rL? zuV5(4KJ-5o%PvW!!W}HEtFDhjOmg^|meaMm-EOtzjfoGo+0psbX23&=0gIx+DRBb- z#DRx$aXKN-Xl!tHG-y4tTZ{T^ZAg#)j;7lAb~_*IXa@+_8V#Fk)$+W}+-Nf#2Slwl zQ~ZbRUmWlzSluVl21C_HV(hZ~m3?_>WRsx~Ks5O_>=+Fl_1$9}C1N)w?gecMLW;d9 zPsaNMPaL+N!>-T(N+7l%hXx>eyT@%8W{dRMZNiyMf|trW<=VFC4oz@G$dMp@Ong}r z{X{hMei>P~uVwT8FAVQbnbhZ1DkcRbk_-5WF;ECMA=sF1w9yn8w~Sv$RdO2K03Q>B zcedfwz2%7|1pmpqJwM3JG^_08=SUPer(CWb3vx8L2&{&loAVJg3jGDcAZfM34 zXh}{2(%d0iON?WYgNnf-AO;Jy37`q2JQT3baiDR8Vt)u^mRJ#T2(@xT7NO8r4gp;! zr$e}tIcnF+$|24$0wtpcqO#buPYMfQ#ZYvg!{w<1^UISZWY;c|#6l!^@!aTUEq_)J`l zKfT`Scc7H*Tgd$D=Uc+V~jf@elDpx>nOeGOJc}|}0PoKj&ITsss}uuX$z#Rv9sEQ*zkEj| z=C+2Wfw*b0$$5t`UHMMge-P8XldHPN5Ea8B7nZ~cRGv=uEe1?_QDwAVJO)lU0-UhdrW^ zJ9J1Qfb^uz9uv>#-aKIyFpOY}{UxTGpbzon6#r^>p-?MzxWh>!Lpy#|g!Z5v>$HGCS%|x&^t%6T9bkGnBVG&`3!9ce^3I3@QExdC7t>^>+%Q{lGAa2Ssj^gfWZaTuyZn zgn9TT^0<;ZZK{pB76B7wJ;e5NRKuCrPA`6q1wg7JhcM-RUghyzBkh|t*Qg)Tsm z+>8Y>_^T^)cCO9t?8tW4*wwicLTMugW9-f9$_iYaccbbgS4ZZvt8-CL-$gS-IXb=l zA}uwV;U8Pa9*iccPyc0$e*d^|NOViQ7hS-NP9F3{HTHP8yqABZ^j+|})s*&1WN=wk zb!H*ypCZPt8Io=((JYFGP3l3Fiit}Zw8Q))3zCkhNp>WC3)?~tnqj(<3(d6G0XvgU zt8u1hS4?*2^`OZN8u1kPOw)`O1moz(B=bMlF+nG<7SX`z#LnW2XElTPWE)H8iqe_$xyok^9Gzz^|ri5buu(4U5x4SB46Oc?A2VAuHvyI<+AX zgw(Z|>3#PipyLHa6{6ZEC21q<@cWu(S{{=!wMN$pumkNfeZ!@%ZM!w%nt zh?1~_%uj(GG(!}2*xwUqD5=r10`Ig~&-g(T)-Qh0?;jU?NPJ82gDPMK8k>nXp{$90 zj_{9^_yIeEz*fu_@%A)`NE_Kyby!RMGSBYjlHI!h*eoa|ri__U%7q8n>IQOM5R2fvhKO}Oz5kKdl24yO9Rn*VNHZfqG)W^C zMMaB+F-wVmiFJxuI)Zzw1r}_H7ci8vN%}cMCK3H%N#-gdmoZ*-R`E6;xVS2cn_G#4^-`t*7Zy=Zy&iJb-wdyb2jNs3FrlPO^a8=I-+mAG{IZLiekfytGgPuHjYN9{REY7LnxBGoFi{*)X`_-7aup4oMD6t|@oe|h#oudt= zIvlye1vFy}>8LT24cwdK*R z1X%sFVgFMmB?)T_LK$#r3M^~B0-&6y75f!$!|VentA^JYDE||a9n(c#J3b7>k?+Dv0eQyHIf(uy~saOB4oU7 zwWX1xuo_Pmr`2FM!IlgyCy(wmyNu!1)E z;WiD}dVMgS&JYklRT$wk8+I{>nwCH_n#2td4JN5~XbCYSo#bCDfTXL6NDXw*BRLJQ zc%LDV$o(-%;3@)(aRL_V2>&w5){X`OYNUV9$S}h@Aibs-u_$ItO0t9C$gP@9wALxr zz#6F*98o{y@ih4(^Q8>ecbN$#4qN_|`rER^@ie&WyjLUnn7YVxG(;a8S3AJv$&g`Z?hs!p2eWj@dJSM{92yKzZHBChM>|(a@yqEP3CyWSQ-^M@Eo4hV zF(Lj0a)23mS__IpH&037^uK>=O;;0HF|6=Se7Vt(%C5sd7&?jSzms&XVg%;~Y2auv z@y47=)9wnaXX~qOc#Bu)IbqIoj=H&m>sAp%EV{VUri4v|?Z8gPZC={`*=vkC*JjK2 z6kBj}2dBC$F`9?h^hbT=ux(MCF@hw{IMOd|SK zNoGGt@tf%n)S7Ez`n+&t1$V<_JGzqn3Yh)FIv#!jr@DAH=Hc?!x){YwcLj{BnSkzI z)s^M$A~^@;Fd3}q3YaTn3qg7(tJ;{tm-ol7?BNskD{wSNV{K72v13KnBf~g`B6k_V z9O@+)^YB9QXnK=i8i-O9hCpQ9B$`|M5e>aKVyKWKmGWNJBbef|(oR{EM*j}YL3w_C zrS43o-Ixlx%a+&JnRyu8T_tDcK~$aO%*gznyD>XBvdnHwtMvFfKCfhTv~TA`Uj>6% zuSL>Z;+p6JX0Wm~_!Tvd7-*g3A1NIZylyq6y$!iMqN+NxaPcn^W7lj&`O8W)i{f`p z>Niy?CN5>w9^xliaB)mcGUMXi_Pr`ng(;H1J~uok4zU;>PA12U6!8+6i#g>VHTM|_ zKPNf9PLZ&Qhw4#k!C>>$(8$){{|tdd?rW03elT##i^bne*uuIX#w-f8!|yPnA-2&j={|*m>gJ+&UqXk^EQoRoC|o;; z@`&N=gCZ z`*ke=hAAJFTwkX!r6XX+0=JM#ynvyUt1XhB5TnE+9r%05ipbsvl_$J~H5It=hT{ZNy2~{VdCz;Ra zsoRyioh(uC>9XGN$q0`O?)toizmu>&!PB5omg8a{NpJ~zG9}EAV*_>p3Y&ZOcJYst z@CmP5ZE55rV=thU#OzQ0_#g)#PlRHu(@p6 zbFfmePq%>=gF2~6Gy_UhAp=ZDGg?TDeeRQjS*O^?1Yz`Gwt$a$YG`Dm@w0|NBKILl z;3}e?{RAMEISQ-wt&M&FOESD@D9rK_sQ)#^i$(FMNlA_nGHGf~QB+52f;C<(WTJk^ zb2;({orXnAVRhJ32dHx+g~#zvXvMyPWY<1t z)jqPMc5v4Ndj!Q{1O)*Eoo?at5rVGR5Oghrpu2p<2wlH5@72BUd9Mjt@Da33AZQ<( zpp7(w(1;+@D(Jfbf-amFbf2Bzo3f~BeB3_9OwN#B z0-(f&p{>IkqahsY#z)iL24u1;XcmId51aIj$~=9nhC~$Y>5#F0c|){Sixr;^by2~v zZj1YZs%K0kgOsvlPT!oCGH1av@%)FSLw~#`nDi{P;dSqOl7-AiW+DG!2J;_gBL89b z^B-m+|6wNbA7&!`X-2y{$(kub1(x;#>%jucd4aWKf#tivvRz=gE;OT2{ti7Yi?b|-wIHeWW?}OG0ZAQ# AGXMYp literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/other-message.doctree b/doc/sphinx/doctrees/library/other-message.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a19f789f9667ca142cc7a6668267e170c03f3453 GIT binary patch literal 79788 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 + + + + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/bit_read_message.html b/doc/sphinx/html/_modules/pymodbus/bit_read_message.html new file mode 100644 index 000000000..650a40dfe --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/bit_read_message.html @@ -0,0 +1,331 @@ + + + + + + + + pymodbus.bit_read_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.bit_read_message

+"""
+Bit Reading Request/Response messages
+--------------------------------------
+
+"""
+import struct
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.utilities import pack_bitstring, unpack_bitstring
+from pymodbus.compat import byte2int
+
+
+
[docs]class ReadBitsRequestBase(ModbusRequest): + ''' Base class for Messages Requesting bit values ''' + + _rtu_frame_size = 8 +
[docs] def __init__(self, address, count, **kwargs): + ''' Initializes the read request data + + :param address: The start address to read from + :param count: The number of bits after 'address' to read + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.count = count
+ +
[docs] def encode(self): + ''' Encodes a request pdu + + :returns: The encoded pdu + ''' + return struct.pack('>HH', self.address, self.count)
+ +
[docs] def decode(self, data): + ''' Decodes a request pdu + + :param data: The packet data to decode + ''' + self.address, self.count = struct.unpack('>HH', data)
+ +
[docs] def get_response_pdu_size(self): + """ + Func_code (1 byte) + Byte Count(1 byte) + Quantity of Coils (n Bytes) + :return: + """ + return 1 + 1 + self.count
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "ReadBitRequest(%d,%d)" % (self.address, self.count)
+ + +
[docs]class ReadBitsResponseBase(ModbusResponse): + ''' Base class for Messages responding to bit-reading values ''' + + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, values, **kwargs): + ''' Initializes a new instance + + :param values: The requested values to be returned + ''' + ModbusResponse.__init__(self, **kwargs) + self.bits = values or []
+ +
[docs] def encode(self): + ''' Encodes response pdu + + :returns: The encoded packet message + ''' + result = pack_bitstring(self.bits) + packet = struct.pack(">B", len(result)) + result + return packet
+ +
[docs] def decode(self, data): + ''' Decodes response pdu + + :param data: The packet data to decode + ''' + self.byte_count = byte2int(data[0]) + self.bits = unpack_bitstring(data[1:])
+ +
[docs] def setBit(self, address, value=1): + ''' Helper function to set the specified bit + + :param address: The bit to set + :param value: The value to set the bit to + ''' + self.bits[address] = (value != 0)
+ +
[docs] def resetBit(self, address): + ''' Helper function to set the specified bit to 0 + + :param address: The bit to reset + ''' + self.setBit(address, 0)
+ +
[docs] def getBit(self, address): + ''' Helper function to get the specified bit's value + + :param address: The bit to query + :returns: The value of the requested bit + ''' + return self.bits[address]
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "ReadBitResponse(%d)" % len(self.bits)
+ + +
[docs]class ReadCoilsRequest(ReadBitsRequestBase): + ''' + This function code is used to read from 1 to 2000(0x7d0) contiguous status + of coils in a remote device. The Request PDU specifies the starting + address, ie the address of the first coil specified, and the number of + coils. In the PDU Coils are addressed starting at zero. Therefore coils + numbered 1-16 are addressed as 0-15. + ''' + function_code = 1 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Initializes a new instance + + :param address: The address to start reading from + :param count: The number of bits to read + ''' + ReadBitsRequestBase.__init__(self, address, count, **kwargs)
+ +
[docs] def execute(self, context): + ''' Run a read coils request against a datastore + + Before running the request, we make sure that the request is in + the max valid range (0x001-0x7d0). Next we make sure that the + request is valid against the current datastore. + + :param context: The datastore to request from + :returns: The initializes response message, exception message otherwise + ''' + if not (1 <= self.count <= 0x7d0): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, self.count): + return self.doException(merror.IllegalAddress) + values = context.getValues(self.function_code, self.address, self.count) + return ReadCoilsResponse(values)
+ + +
[docs]class ReadCoilsResponse(ReadBitsResponseBase): + ''' + The coils in the response message are packed as one coil per bit of + the data field. Status is indicated as 1= ON and 0= OFF. The LSB of the + first data byte contains the output addressed in the query. The other + coils follow toward the high order end of this byte, and from low order + to high order in subsequent bytes. + + If the returned output quantity is not a multiple of eight, the + remaining bits in the final data byte will be padded with zeros + (toward the high order end of the byte). The Byte Count field specifies + the quantity of complete bytes of data. + ''' + function_code = 1 + +
[docs] def __init__(self, values=None, **kwargs): + ''' Intializes a new instance + + :param values: The request values to respond with + ''' + ReadBitsResponseBase.__init__(self, values, **kwargs)
+ + +
[docs]class ReadDiscreteInputsRequest(ReadBitsRequestBase): + ''' + This function code is used to read from 1 to 2000(0x7d0) contiguous status + of discrete inputs in a remote device. The Request PDU specifies the + starting address, ie the address of the first input specified, and the + number of inputs. In the PDU Discrete Inputs are addressed starting at + zero. Therefore Discrete inputs numbered 1-16 are addressed as 0-15. + ''' + function_code = 2 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Intializes a new instance + + :param address: The address to start reading from + :param count: The number of bits to read + ''' + ReadBitsRequestBase.__init__(self, address, count, **kwargs)
+ +
[docs] def execute(self, context): + ''' Run a read discrete input request against a datastore + + Before running the request, we make sure that the request is in + the max valid range (0x001-0x7d0). Next we make sure that the + request is valid against the current datastore. + + :param context: The datastore to request from + :returns: The initializes response message, exception message otherwise + ''' + if not (1 <= self.count <= 0x7d0): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, self.count): + return self.doException(merror.IllegalAddress) + values = context.getValues(self.function_code, self.address, self.count) + return ReadDiscreteInputsResponse(values)
+ + +
[docs]class ReadDiscreteInputsResponse(ReadBitsResponseBase): + ''' + The discrete inputs in the response message are packed as one input per + bit of the data field. Status is indicated as 1= ON; 0= OFF. The LSB of + the first data byte contains the input addressed in the query. The other + inputs follow toward the high order end of this byte, and from low order + to high order in subsequent bytes. + + If the returned input quantity is not a multiple of eight, the + remaining bits in the final data byte will be padded with zeros + (toward the high order end of the byte). The Byte Count field specifies + the quantity of complete bytes of data. + ''' + function_code = 2 + +
[docs] def __init__(self, values=None, **kwargs): + ''' Intializes a new instance + + :param values: The request values to respond with + ''' + ReadBitsResponseBase.__init__(self, values, **kwargs)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ReadCoilsRequest", "ReadCoilsResponse", + "ReadDiscreteInputsRequest", "ReadDiscreteInputsResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/bit_write_message.html b/doc/sphinx/html/_modules/pymodbus/bit_write_message.html new file mode 100644 index 000000000..279ce4fea --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/bit_write_message.html @@ -0,0 +1,353 @@ + + + + + + + + pymodbus.bit_write_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.bit_write_message

+"""
+Bit Writing Request/Response
+------------------------------
+
+TODO write mask request/response
+"""
+import struct
+from pymodbus.constants import ModbusStatus
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.utilities import pack_bitstring, unpack_bitstring
+
+#---------------------------------------------------------------------------#
+# Local Constants
+#---------------------------------------------------------------------------#
+# These are defined in the spec to turn a coil on/off
+#---------------------------------------------------------------------------#
+_turn_coil_on  = struct.pack(">H", ModbusStatus.On)
+_turn_coil_off = struct.pack(">H", ModbusStatus.Off)
+
+
+
[docs]class WriteSingleCoilRequest(ModbusRequest): + ''' + This function code is used to write a single output to either ON or OFF + in a remote device. + + The requested ON/OFF state is specified by a constant in the request + data field. A value of FF 00 hex requests the output to be ON. A value + of 00 00 requests it to be OFF. All other values are illegal and will + not affect the output. + + The Request PDU specifies the address of the coil to be forced. Coils + are addressed starting at zero. Therefore coil numbered 1 is addressed + as 0. The requested ON/OFF state is specified by a constant in the Coil + Value field. A value of 0XFF00 requests the coil to be ON. A value of + 0X0000 requests the coil to be off. All other values are illegal and + will not affect the coil. + ''' + function_code = 5 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, value=None, **kwargs): + ''' Initializes a new instance + + :param address: The variable address to write + :param value: The value to write at address + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.value = bool(value)
+ +
[docs] def encode(self): + ''' Encodes write coil request + + :returns: The byte encoded message + ''' + result = struct.pack('>H', self.address) + if self.value: result += _turn_coil_on + else: result += _turn_coil_off + return result
+ +
[docs] def decode(self, data): + ''' Decodes a write coil request + + :param data: The packet data to decode + ''' + self.address, value = struct.unpack('>HH', data) + self.value = (value == ModbusStatus.On)
+ +
[docs] def execute(self, context): + ''' Run a write coil request against a datastore + + :param context: The datastore to request from + :returns: The populated response or exception message + ''' + #if self.value not in [ModbusStatus.Off, ModbusStatus.On]: + # return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, 1): + return self.doException(merror.IllegalAddress) + + context.setValues(self.function_code, self.address, [self.value]) + values = context.getValues(self.function_code, self.address, 1) + return WriteSingleCoilResponse(self.address, values[0])
+ +
[docs] def get_response_pdu_size(self): + """ + Func_code (1 byte) + Output Address (2 byte) + Output Value (2 Bytes) + :return: + """ + return 1 + 2 + 2
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :return: A string representation of the instance + ''' + return "WriteCoilRequest(%d, %s) => " % (self.address, self.value)
+ + +
[docs]class WriteSingleCoilResponse(ModbusResponse): + ''' + The normal response is an echo of the request, returned after the coil + state has been written. + ''' + function_code = 5 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, value=None, **kwargs): + ''' Initializes a new instance + + :param address: The variable address written to + :param value: The value written at address + ''' + ModbusResponse.__init__(self, **kwargs) + self.address = address + self.value = value
+ +
[docs] def encode(self): + ''' Encodes write coil response + + :return: The byte encoded message + ''' + result = struct.pack('>H', self.address) + if self.value: result += _turn_coil_on + else: result += _turn_coil_off + return result
+ +
[docs] def decode(self, data): + ''' Decodes a write coil response + + :param data: The packet data to decode + ''' + self.address, value = struct.unpack('>HH', data) + self.value = (value == ModbusStatus.On)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "WriteCoilResponse(%d) => %d" % (self.address, self.value)
+ + +
[docs]class WriteMultipleCoilsRequest(ModbusRequest): + ''' + "This function code is used to force each coil in a sequence of coils to + either ON or OFF in a remote device. The Request PDU specifies the coil + references to be forced. Coils are addressed starting at zero. Therefore + coil numbered 1 is addressed as 0. + + The requested ON/OFF states are specified by contents of the request + data field. A logical '1' in a bit position of the field requests the + corresponding output to be ON. A logical '0' requests it to be OFF." + ''' + function_code = 15 + _rtu_byte_count_pos = 6 + +
[docs] def __init__(self, address=None, values=None, **kwargs): + ''' Initializes a new instance + + :param address: The starting request address + :param values: The values to write + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + if not values: values = [] + elif not hasattr(values, '__iter__'): values = [values] + self.values = values + self.byte_count = (len(self.values) + 7) // 8
+ +
[docs] def encode(self): + ''' Encodes write coils request + + :returns: The byte encoded message + ''' + count = len(self.values) + self.byte_count = (count + 7) // 8 + packet = struct.pack('>HHB', self.address, count, self.byte_count) + packet += pack_bitstring(self.values) + return packet
+ +
[docs] def decode(self, data): + ''' Decodes a write coils request + + :param data: The packet data to decode + ''' + self.address, count, self.byte_count = struct.unpack('>HHB', data[0:5]) + values = unpack_bitstring(data[5:]) + self.values = values[:count]
+ +
[docs] def execute(self, context): + ''' Run a write coils request against a datastore + + :param context: The datastore to request from + :returns: The populated response or exception message + ''' + count = len(self.values) + if not (1 <= count <= 0x07b0): + return self.doException(merror.IllegalValue) + if (self.byte_count != (count + 7) // 8): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, count): + return self.doException(merror.IllegalAddress) + + context.setValues(self.function_code, self.address, self.values) + return WriteMultipleCoilsResponse(self.address, count)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + params = (self.address, len(self.values)) + return "WriteNCoilRequest (%d) => %d " % params
+ + +
[docs]class WriteMultipleCoilsResponse(ModbusResponse): + ''' + The normal response returns the function code, starting address, and + quantity of coils forced. + ''' + function_code = 15 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Initializes a new instance + + :param address: The starting variable address written to + :param count: The number of values written + ''' + ModbusResponse.__init__(self, **kwargs) + self.address = address + self.count = count
+ +
[docs] def encode(self): + ''' Encodes write coils response + + :returns: The byte encoded message + ''' + return struct.pack('>HH', self.address, self.count)
+ +
[docs] def decode(self, data): + ''' Decodes a write coils response + + :param data: The packet data to decode + ''' + self.address, self.count = struct.unpack('>HH', data)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "WriteNCoilResponse(%d, %d)" % (self.address, self.count)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "WriteSingleCoilRequest", "WriteSingleCoilResponse", + "WriteMultipleCoilsRequest", "WriteMultipleCoilsResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/async.html b/doc/sphinx/html/_modules/pymodbus/client/async.html new file mode 100644 index 000000000..c79f18c50 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/client/async.html @@ -0,0 +1,305 @@ + + + + + + + + pymodbus.client.async — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.client.async

+"""
+Implementation of a Modbus Client Using Twisted
+--------------------------------------------------
+
+Example run::
+
+    from twisted.internet import reactor, protocol
+    from pymodbus.client.async import ModbusClientProtocol
+
+    def printResult(result):
+        print "Result: %d" % result.bits[0]
+
+    def process(client):
+        result = client.write_coil(1, True)
+        result.addCallback(printResult)
+        reactor.callLater(1, reactor.stop)
+
+    defer = protocol.ClientCreator(reactor, ModbusClientProtocol
+            ).connectTCP("localhost", 502)
+    defer.addCallback(process)
+
+Another example::
+
+    from twisted.internet import reactor
+    from pymodbus.client.async import ModbusClientFactory
+
+    def process():
+        factory = reactor.connectTCP("localhost", 502, ModbusClientFactory())
+        reactor.stop()
+
+    if __name__ == "__main__":
+       reactor.callLater(1, process)
+       reactor.run()
+"""
+from twisted.internet import defer, protocol
+from pymodbus.factory import ClientDecoder
+from pymodbus.exceptions import ConnectionException
+from pymodbus.transaction import ModbusSocketFramer
+from pymodbus.transaction import FifoTransactionManager
+from pymodbus.transaction import DictTransactionManager
+from pymodbus.client.common import ModbusClientMixin
+from twisted.python.failure import Failure
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Connected Client Protocols
+#---------------------------------------------------------------------------#
+
[docs]class ModbusClientProtocol(protocol.Protocol, ModbusClientMixin): + ''' + This represents the base modbus client protocol. All the application + layer code is deferred to a higher level wrapper. + ''' + +
[docs] def __init__(self, framer=None, **kwargs): + ''' Initializes the framer module + + :param framer: The framer to use for the protocol + ''' + self._connected = False + self.framer = framer or ModbusSocketFramer(ClientDecoder()) + if isinstance(self.framer, ModbusSocketFramer): + self.transaction = DictTransactionManager(self, **kwargs) + else: self.transaction = FifoTransactionManager(self, **kwargs)
+ +
[docs] def connectionMade(self): + ''' Called upon a successful client connection. + ''' + _logger.debug("Client connected to modbus server") + self._connected = True
+ +
[docs] def connectionLost(self, reason): + ''' Called upon a client disconnect + + :param reason: The reason for the disconnect + ''' + _logger.debug("Client disconnected from modbus server: %s" % reason) + self._connected = False + for tid in list(self.transaction): + self.transaction.getTransaction(tid).errback(Failure( + ConnectionException('Connection lost during request')))
+ +
[docs] def dataReceived(self, data): + ''' Get response, check for valid message, decode result + + :param data: The data returned from the server + ''' + self.framer.processIncomingPacket(data, self._handleResponse)
+ +
[docs] def execute(self, request): + ''' Starts the producer to send the next request to + consumer.write(Frame(request)) + ''' + request.transaction_id = self.transaction.getNextTID() + packet = self.framer.buildPacket(request) + self.transport.write(packet) + return self._buildResponse(request.transaction_id)
+ +
[docs] def _handleResponse(self, reply): + ''' Handle the processed response and link to correct deferred + + :param reply: The reply to process + ''' + if reply is not None: + tid = reply.transaction_id + handler = self.transaction.getTransaction(tid) + if handler: + handler.callback(reply) + else: _logger.debug("Unrequested message: " + str(reply))
+ +
[docs] def _buildResponse(self, tid): + ''' Helper method to return a deferred response + for the current request. + + :param tid: The transaction identifier for this response + :returns: A defer linked to the latest request + ''' + if not self._connected: + return defer.fail(Failure( + ConnectionException('Client is not connected'))) + + d = defer.Deferred() + self.transaction.addTransaction(d, tid) + return d
+ + #----------------------------------------------------------------------# + # Extra Functions + #----------------------------------------------------------------------# + #if send_failed: + # if self.retry > 0: + # deferLater(clock, self.delay, send, message) + # self.retry -= 1 + + +#---------------------------------------------------------------------------# +# Not Connected Client Protocol +#---------------------------------------------------------------------------# +class ModbusUdpClientProtocol(protocol.DatagramProtocol, ModbusClientMixin): + ''' + This represents the base modbus client protocol. All the application + layer code is deferred to a higher level wrapper. + ''' + + def __init__(self, framer=None, **kwargs): + ''' Initializes the framer module + + :param framer: The framer to use for the protocol + ''' + self.framer = framer or ModbusSocketFramer(ClientDecoder()) + if isinstance(self.framer, ModbusSocketFramer): + self.transaction = DictTransactionManager(self, **kwargs) + else: self.transaction = FifoTransactionManager(self, **kwargs) + + def datagramReceived(self, data, params): + ''' Get response, check for valid message, decode result + + :param data: The data returned from the server + :param params: The host parameters sending the datagram + ''' + _logger.debug("Datagram from: %s:%d" % params) + self.framer.processIncomingPacket(data, self._handleResponse) + + def execute(self, request): + ''' Starts the producer to send the next request to + consumer.write(Frame(request)) + ''' + request.transaction_id = self.transaction.getNextTID() + packet = self.framer.buildPacket(request) + self.transport.write(packet) + return self._buildResponse(request.transaction_id) + + def _handleResponse(self, reply): + ''' Handle the processed response and link to correct deferred + + :param reply: The reply to process + ''' + if reply is not None: + tid = reply.transaction_id + handler = self.transaction.getTransaction(tid) + if handler: + handler.callback(reply) + else: _logger.debug("Unrequested message: " + str(reply)) + + def _buildResponse(self, tid): + ''' Helper method to return a deferred response + for the current request. + + :param tid: The transaction identifier for this response + :returns: A defer linked to the latest request + ''' + d = defer.Deferred() + self.transaction.addTransaction(d, tid) + return d + + +#---------------------------------------------------------------------------# +# Client Factories +#---------------------------------------------------------------------------# +
[docs]class ModbusClientFactory(protocol.ReconnectingClientFactory): + ''' Simple client protocol factory ''' + + protocol = ModbusClientProtocol
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ModbusClientProtocol", "ModbusUdpClientProtocol", + "ModbusClientFactory", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/common.html b/doc/sphinx/html/_modules/pymodbus/client/common.html new file mode 100644 index 000000000..c7ccfe7c5 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/client/common.html @@ -0,0 +1,240 @@ + + + + + + + + pymodbus.client.common — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.client.common

+'''
+Modbus Client Common
+----------------------------------
+
+This is a common client mixin that can be used by
+both the synchronous and asynchronous clients to
+simplify the interface.
+'''
+from pymodbus.bit_read_message import *
+from pymodbus.bit_write_message import *
+from pymodbus.register_read_message import *
+from pymodbus.register_write_message import *
+from pymodbus.diag_message import *
+from pymodbus.file_message import *
+from pymodbus.other_message import *
+
+
+
[docs]class ModbusClientMixin(object): + ''' + This is a modbus client mixin that provides additional factory + methods for all the current modbus methods. This can be used + instead of the normal pattern of:: + + # instead of this + client = ModbusClient(...) + request = ReadCoilsRequest(1,10) + response = client.execute(request) + + # now like this + client = ModbusClient(...) + response = client.read_coils(1, 10) + ''' + +
[docs] def read_coils(self, address, count=1, **kwargs): + ''' + + :param address: The starting address to read from + :param count: The number of coils to read + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = ReadCoilsRequest(address, count, **kwargs) + return self.execute(request)
+ +
[docs] def read_discrete_inputs(self, address, count=1, **kwargs): + ''' + + :param address: The starting address to read from + :param count: The number of discretes to read + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = ReadDiscreteInputsRequest(address, count, **kwargs) + return self.execute(request)
+ +
[docs] def write_coil(self, address, value, **kwargs): + ''' + + :param address: The starting address to write to + :param value: The value to write to the specified address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = WriteSingleCoilRequest(address, value, **kwargs) + return self.execute(request)
+ +
[docs] def write_coils(self, address, values, **kwargs): + ''' + + :param address: The starting address to write to + :param values: The values to write to the specified address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = WriteMultipleCoilsRequest(address, values, **kwargs) + return self.execute(request)
+ +
[docs] def write_register(self, address, value, **kwargs): + ''' + + :param address: The starting address to write to + :param value: The value to write to the specified address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = WriteSingleRegisterRequest(address, value, **kwargs) + return self.execute(request)
+ +
[docs] def write_registers(self, address, values, **kwargs): + ''' + + :param address: The starting address to write to + :param values: The values to write to the specified address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = WriteMultipleRegistersRequest(address, values, **kwargs) + return self.execute(request)
+ +
[docs] def read_holding_registers(self, address, count=1, **kwargs): + ''' + + :param address: The starting address to read from + :param count: The number of registers to read + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = ReadHoldingRegistersRequest(address, count, **kwargs) + return self.execute(request)
+ +
[docs] def read_input_registers(self, address, count=1, **kwargs): + ''' + + :param address: The starting address to read from + :param count: The number of registers to read + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = ReadInputRegistersRequest(address, count, **kwargs) + return self.execute(request)
+ +
[docs] def readwrite_registers(self, *args, **kwargs): + ''' + + :param read_address: The address to start reading from + :param read_count: The number of registers to read from address + :param write_address: The address to start writing to + :param write_registers: The registers to write to the specified address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = ReadWriteMultipleRegistersRequest(*args, **kwargs) + return self.execute(request)
+ +
[docs] def mask_write_register(self, *args, **kwargs): + ''' + + :param address: The address of the register to write + :param and_mask: The and bitmask to apply to the register address + :param or_mask: The or bitmask to apply to the register address + :param unit: The slave unit this request is targeting + :returns: A deferred response handle + ''' + request = MaskWriteRegisterRequest(*args, **kwargs) + return self.execute(request)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ 'ModbusClientMixin' ] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/sync.html b/doc/sphinx/html/_modules/pymodbus/client/sync.html new file mode 100644 index 000000000..9bf42e515 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/client/sync.html @@ -0,0 +1,503 @@ + + + + + + + + pymodbus.client.sync — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.client.sync

+import socket
+import serial
+import time
+
+from pymodbus.constants import Defaults
+from pymodbus.factory import ClientDecoder
+from pymodbus.exceptions import NotImplementedException, ParameterException
+from pymodbus.exceptions import ConnectionException
+from pymodbus.transaction import FifoTransactionManager
+from pymodbus.transaction import DictTransactionManager
+from pymodbus.transaction import ModbusSocketFramer, ModbusBinaryFramer
+from pymodbus.transaction import ModbusAsciiFramer, ModbusRtuFramer
+from pymodbus.client.common import ModbusClientMixin
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# The Synchronous Clients
+#---------------------------------------------------------------------------#
+
[docs]class BaseModbusClient(ModbusClientMixin): + ''' + Inteface for a modbus synchronous client. Defined here are all the + methods for performing the related request methods. Derived classes + simply need to implement the transport methods and set the correct + framer. + ''' + +
[docs] def __init__(self, framer, **kwargs): + ''' Initialize a client instance + + :param framer: The modbus framer implementation to use + ''' + self.framer = framer + if isinstance(self.framer, ModbusSocketFramer): + self.transaction = DictTransactionManager(self, **kwargs) + else: self.transaction = FifoTransactionManager(self, **kwargs)
+ + #-----------------------------------------------------------------------# + # Client interface + #-----------------------------------------------------------------------# +
[docs] def connect(self): + ''' Connect to the modbus remote host + + :returns: True if connection succeeded, False otherwise + ''' + raise NotImplementedException("Method not implemented by derived class")
+ +
[docs] def close(self): + ''' Closes the underlying socket connection + ''' + pass
+ +
[docs] def _send(self, request): + ''' Sends data on the underlying socket + + :param request: The encoded request to send + :return: The number of bytes written + ''' + raise NotImplementedException("Method not implemented by derived class")
+ +
[docs] def _recv(self, size): + ''' Reads data from the underlying descriptor + + :param size: The number of bytes to read + :return: The bytes read + ''' + raise NotImplementedException("Method not implemented by derived class")
+ + #-----------------------------------------------------------------------# + # Modbus client methods + #-----------------------------------------------------------------------# +
[docs] def execute(self, request=None): + ''' + :param request: The request to process + :returns: The result of the request execution + ''' + if not self.connect(): + raise ConnectionException("Failed to connect[%s]" % (self.__str__())) + return self.transaction.execute(request)
+ + #-----------------------------------------------------------------------# + # The magic methods + #-----------------------------------------------------------------------# +
[docs] def __enter__(self): + ''' Implement the client with enter block + + :returns: The current instance of the client + ''' + if not self.connect(): + raise ConnectionException("Failed to connect[%s]" % (self.__str__())) + return self
+ +
[docs] def __exit__(self, klass, value, traceback): + ''' Implement the client with exit block ''' + self.close()
+ +
[docs] def __str__(self): + ''' Builds a string representation of the connection + + :returns: The string representation + ''' + return "Null Transport"
+ + +#---------------------------------------------------------------------------# +# Modbus TCP Client Transport Implementation +#---------------------------------------------------------------------------# +
[docs]class ModbusTcpClient(BaseModbusClient): + ''' Implementation of a modbus tcp client + ''' + +
[docs] def __init__(self, host='127.0.0.1', port=Defaults.Port, + framer=ModbusSocketFramer, **kwargs): + ''' Initialize a client instance + + :param host: The host to connect to (default 127.0.0.1) + :param port: The modbus port to connect to (default 502) + :param source_address: The source address tuple to bind to (default ('', 0)) + :param framer: The modbus framer to use (default ModbusSocketFramer) + + .. note:: The host argument will accept ipv4 and ipv6 hosts + ''' + self.host = host + self.port = port + self.source_address = kwargs.get('source_address', ('', 0)) + self.socket = None + BaseModbusClient.__init__(self, framer(ClientDecoder()), **kwargs)
+ +
[docs] def connect(self): + ''' Connect to the modbus tcp server + + :returns: True if connection succeeded, False otherwise + ''' + if self.socket: return True + try: + address = (self.host, self.port) + self.socket = socket.create_connection((self.host, self.port), + timeout=Defaults.Timeout, source_address=self.source_address) + except socket.error as msg: + _logger.error('Connection to (%s, %s) failed: %s' % \ + (self.host, self.port, msg)) + self.close() + return self.socket != None
+ +
[docs] def close(self): + ''' Closes the underlying socket connection + ''' + if self.socket: + self.socket.close() + self.socket = None
+ +
[docs] def _send(self, request): + ''' Sends data on the underlying socket + + :param request: The encoded request to send + :return: The number of bytes written + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + if request: + return self.socket.send(request) + return 0
+ +
[docs] def _recv(self, size): + ''' Reads data from the underlying descriptor + + :param size: The number of bytes to read + :return: The bytes read + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + return self.socket.recv(size)
+ +
[docs] def __str__(self): + ''' Builds a string representation of the connection + + :returns: The string representation + ''' + return "%s:%s" % (self.host, self.port)
+ + +#---------------------------------------------------------------------------# +# Modbus UDP Client Transport Implementation +#---------------------------------------------------------------------------# +
[docs]class ModbusUdpClient(BaseModbusClient): + ''' Implementation of a modbus udp client + ''' + +
[docs] def __init__(self, host='127.0.0.1', port=Defaults.Port, + framer=ModbusSocketFramer, **kwargs): + ''' Initialize a client instance + + :param host: The host to connect to (default 127.0.0.1) + :param port: The modbus port to connect to (default 502) + :param framer: The modbus framer to use (default ModbusSocketFramer) + :param timeout: The timeout to use for this socket (default None) + ''' + self.host = host + self.port = port + self.socket = None + self.timeout = kwargs.get('timeout', None) + BaseModbusClient.__init__(self, framer(ClientDecoder()), **kwargs)
+ + @classmethod +
[docs] def _get_address_family(cls, address): + ''' A helper method to get the correct address family + for a given address. + + :param address: The address to get the af for + :returns: AF_INET for ipv4 and AF_INET6 for ipv6 + ''' + try: + _ = socket.inet_pton(socket.AF_INET6, address) + except socket.error: # not a valid ipv6 address + return socket.AF_INET + return socket.AF_INET6
+ +
[docs] def connect(self): + ''' Connect to the modbus tcp server + + :returns: True if connection succeeded, False otherwise + ''' + if self.socket: return True + try: + family = ModbusUdpClient._get_address_family(self.host) + self.socket = socket.socket(family, socket.SOCK_DGRAM) + self.socket.settimeout(self.timeout) + except socket.error as ex: + _logger.error('Unable to create udp socket %s' % ex) + self.close() + return self.socket != None
+ +
[docs] def close(self): + ''' Closes the underlying socket connection + ''' + self.socket = None
+ +
[docs] def _send(self, request): + ''' Sends data on the underlying socket + + :param request: The encoded request to send + :return: The number of bytes written + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + if request: + return self.socket.sendto(request, (self.host, self.port)) + return 0
+ +
[docs] def _recv(self, size): + ''' Reads data from the underlying descriptor + + :param size: The number of bytes to read + :return: The bytes read + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + return self.socket.recvfrom(size)[0]
+ +
[docs] def __str__(self): + ''' Builds a string representation of the connection + + :returns: The string representation + ''' + return "%s:%s" % (self.host, self.port)
+ + +#---------------------------------------------------------------------------# +# Modbus Serial Client Transport Implementation +#---------------------------------------------------------------------------# +
[docs]class ModbusSerialClient(BaseModbusClient): + ''' Implementation of a modbus serial client + ''' + +
[docs] def __init__(self, method='ascii', **kwargs): + ''' Initialize a serial client instance + + The methods to connect are:: + + - ascii + - rtu + - binary + + :param method: The method to use for connection + :param port: The serial port to attach to + :param stopbits: The number of stop bits to use + :param bytesize: The bytesize of the serial messages + :param parity: Which kind of parity to use + :param baudrate: The baud rate to use for the serial device + :param timeout: The timeout between serial requests (default 3s) + ''' + self.method = method + self.socket = None + BaseModbusClient.__init__(self, self.__implementation(method), **kwargs) + + self.port = kwargs.get('port', 0) + self.stopbits = kwargs.get('stopbits', Defaults.Stopbits) + self.bytesize = kwargs.get('bytesize', Defaults.Bytesize) + self.parity = kwargs.get('parity', Defaults.Parity) + self.baudrate = kwargs.get('baudrate', Defaults.Baudrate) + self.timeout = kwargs.get('timeout', Defaults.Timeout) + if self.method == "rtu": + self._last_frame_end = 0.0 + self._silent_interval = 3.5 * (1 + 8 + 2) / self.baudrate
+ + @staticmethod + def __implementation(method): + ''' Returns the requested framer + + :method: The serial framer to instantiate + :returns: The requested serial framer + ''' + method = method.lower() + if method == 'ascii': return ModbusAsciiFramer(ClientDecoder()) + elif method == 'rtu': return ModbusRtuFramer(ClientDecoder()) + elif method == 'binary': return ModbusBinaryFramer(ClientDecoder()) + elif method == 'socket': return ModbusSocketFramer(ClientDecoder()) + raise ParameterException("Invalid framer method requested") + +
[docs] def connect(self): + ''' Connect to the modbus serial server + + :returns: True if connection succeeded, False otherwise + ''' + if self.socket: return True + try: + self.socket = serial.Serial(port=self.port, timeout=self.timeout, + bytesize=self.bytesize, stopbits=self.stopbits, + baudrate=self.baudrate, parity=self.parity) + except serial.SerialException as msg: + _logger.error(msg) + self.close() + if self.method == "rtu": + self._last_frame_end = time.time() + return self.socket != None
+ +
[docs] def close(self): + ''' Closes the underlying socket connection + ''' + if self.socket: + self.socket.close() + self.socket = None
+ +
[docs] def _send(self, request): + ''' Sends data on the underlying socket + + If receive buffer still holds some data then flush it. + + Sleep if last send finished less than 3.5 character + times ago. + + :param request: The encoded request to send + :return: The number of bytes written + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + if request: + ts = time.time() + if self.method == "rtu": + if ts < self._last_frame_end + self._silent_interval: + _logger.debug("will sleep to wait for 3.5 char") + time.sleep(self._last_frame_end + self._silent_interval - ts) + + try: + in_waiting = "in_waiting" if hasattr(self.socket, "in_waiting") else "inWaiting" + if in_waiting == "in_waiting": + waitingbytes = getattr(self.socket, in_waiting) + else: + waitingbytes = getattr(self.socket, in_waiting)() + if waitingbytes: + result = self.socket.read(waitingbytes) + if _logger.isEnabledFor(logging.WARNING): + _logger.warning("cleanup recv buffer before send: " + " ".join([hex(ord(x)) for x in result])) + except NotImplementedError: + pass + + size = self.socket.write(request) + if self.method == "rtu": + self._last_frame_end = time.time() + return size + return 0
+ +
[docs] def _recv(self, size): + ''' Reads data from the underlying descriptor + + :param size: The number of bytes to read + :return: The bytes read + ''' + if not self.socket: + raise ConnectionException(self.__str__()) + result = self.socket.read(size) + if self.method == "rtu": + self._last_frame_end = time.time() + return result
+ +
[docs] def __str__(self): + ''' Builds a string representation of the connection + + :returns: The string representation + ''' + return "%s baud[%s]" % (self.method, self.baudrate)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ModbusTcpClient", "ModbusUdpClient", "ModbusSerialClient" +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/constants.html b/doc/sphinx/html/_modules/pymodbus/constants.html new file mode 100644 index 000000000..492bf301a --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/constants.html @@ -0,0 +1,331 @@ + + + + + + + + pymodbus.constants — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.constants

+'''
+Constants For Modbus Server/Client
+----------------------------------
+
+This is the single location for storing default
+values for the servers and clients.
+'''
+from pymodbus.interfaces import Singleton
+
+
+
[docs]class Defaults(Singleton): + ''' A collection of modbus default values + + .. attribute:: Port + + The default modbus tcp server port (502) + + .. attribute:: Retries + + The default number of times a client should retry the given + request before failing (3) + + .. attribute:: RetryOnEmpty + + A flag indicating if a transaction should be retried in the + case that an empty response is received. This is useful for + slow clients that may need more time to process a requst. + + .. attribute:: Timeout + + The default amount of time a client should wait for a request + to be processed (3 seconds) + + .. attribute:: Reconnects + + The default number of times a client should attempt to reconnect + before deciding the server is down (0) + + .. attribute:: TransactionId + + The starting transaction identifier number (0) + + .. attribute:: ProtocolId + + The modbus protocol id. Currently this is set to 0 in all + but proprietary implementations. + + .. attribute:: UnitId + + The modbus slave addrss. Currently this is set to 0x00 which + means this request should be broadcast to all the slave devices + (really means that all the devices should respons). + + .. attribute:: Baudrate + + The speed at which the data is transmitted over the serial line. + This defaults to 19200. + + .. attribute:: Parity + + The type of checksum to use to verify data integrity. This can be + on of the following:: + + - (E)ven - 1 0 1 0 | P(0) + - (O)dd - 1 0 1 0 | P(1) + - (N)one - 1 0 1 0 | no parity + + This defaults to (N)one. + + .. attribute:: Bytesize + + The number of bits in a byte of serial data. This can be one of + 5, 6, 7, or 8. This defaults to 8. + + .. attribute:: Stopbits + + The number of bits sent after each character in a message to + indicate the end of the byte. This defaults to 1. + + .. attribute:: ZeroMode + + Indicates if the slave datastore should use indexing at 0 or 1. + More about this can be read in section 4.4 of the modbus specification. + + .. attribute:: IgnoreMissingSlaves + + In case a request is made to a missing slave, this defines if an error + should be returned or simply ignored. This is useful for the case of a + serial server emulater where a request to a non-existant slave on a bus + will never respond. The client in this case will simply timeout. + ''' + Port = 502 + Retries = 3 + RetryOnEmpty = False + Timeout = 3 + Reconnects = 0 + TransactionId = 0 + ProtocolId = 0 + UnitId = 0x00 + Baudrate = 19200 + Parity = 'N' + Bytesize = 8 + Stopbits = 1 + ZeroMode = False + IgnoreMissingSlaves = False
+ + +
[docs]class ModbusStatus(Singleton): + ''' + These represent various status codes in the modbus + protocol. + + .. attribute:: Waiting + + This indicates that a modbus device is currently + waiting for a given request to finish some running task. + + .. attribute:: Ready + + This indicates that a modbus device is currently + free to perform the next request task. + + .. attribute:: On + + This indicates that the given modbus entity is on + + .. attribute:: Off + + This indicates that the given modbus entity is off + + .. attribute:: SlaveOn + + This indicates that the given modbus slave is running + + .. attribute:: SlaveOff + + This indicates that the given modbus slave is not running + ''' + Waiting = 0xffff + Ready = 0x0000 + On = 0xff00 + Off = 0x0000 + SlaveOn = 0xff + SlaveOff = 0x00
+ + +
[docs]class Endian(Singleton): + ''' An enumeration representing the various byte endianess. + + .. attribute:: Auto + + This indicates that the byte order is chosen by the + current native environment. + + .. attribute:: Big + + This indicates that the bytes are in little endian format + + .. attribute:: Little + + This indicates that the bytes are in big endian format + + .. note:: I am simply borrowing the format strings from the + python struct module for my convenience. + ''' + Auto = '@' + Big = '>' + Little = '<'
+ + +
[docs]class ModbusPlusOperation(Singleton): + ''' Represents the type of modbus plus request + + .. attribute:: GetStatistics + + Operation requesting that the current modbus plus statistics + be returned in the response. + + .. attribute:: ClearStatistics + + Operation requesting that the current modbus plus statistics + be cleared and not returned in the response. + ''' + GetStatistics = 0x0003 + ClearStatistics = 0x0004
+ + +
[docs]class DeviceInformation(Singleton): + ''' Represents what type of device information to read + + .. attribute:: Basic + + This is the basic (required) device information to be returned. + This includes VendorName, ProductCode, and MajorMinorRevision + code. + + .. attribute:: Regular + + In addition to basic data objects, the device provides additional + and optinoal identification and description data objects. All of + the objects of this category are defined in the standard but their + implementation is optional. + + .. attribute:: Extended + + In addition to regular data objects, the device provides additional + and optional identification and description private data about the + physical device itself. All of these data are device dependent. + + .. attribute:: Specific + + Request to return a single data object. + ''' + Basic = 0x01 + Regular = 0x02 + Extended = 0x03 + Specific = 0x04
+ + +
[docs]class MoreData(Singleton): + ''' Represents the more follows condition + + .. attribute:: Nothing + + This indiates that no more objects are going to be returned. + + .. attribute:: KeepReading + + This indicates that there are more objects to be returned. + ''' + Nothing = 0x00 + KeepReading = 0xFF
+ +#---------------------------------------------------------------------------# +# Exported Identifiers +#---------------------------------------------------------------------------# +__all__ = [ + "Defaults", "ModbusStatus", "Endian", + "ModbusPlusOperation", + "DeviceInformation", "MoreData", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/context.html b/doc/sphinx/html/_modules/pymodbus/datastore/context.html new file mode 100644 index 000000000..6d396f415 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/datastore/context.html @@ -0,0 +1,246 @@ + + + + + + + + pymodbus.datastore.context — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.datastore.context

+from pymodbus.exceptions import ParameterException, NoSuchSlaveException
+from pymodbus.interfaces import IModbusSlaveContext
+from pymodbus.datastore.store import ModbusSequentialDataBlock
+from pymodbus.constants import Defaults
+from pymodbus.compat import iteritems, itervalues
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging;
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Slave Contexts
+#---------------------------------------------------------------------------#
+
[docs]class ModbusSlaveContext(IModbusSlaveContext): + ''' + This creates a modbus data model with each data access + stored in its own personal block + ''' + +
[docs] def __init__(self, *args, **kwargs): + ''' Initializes the datastores, defaults to fully populated + sequential data blocks if none are passed in. + + :param kwargs: Each element is a ModbusDataBlock + + 'di' - Discrete Inputs initializer + 'co' - Coils initializer + 'hr' - Holding Register initializer + 'ir' - Input Registers iniatializer + ''' + self.store = {} + self.store['d'] = kwargs.get('di', ModbusSequentialDataBlock.create()) + self.store['c'] = kwargs.get('co', ModbusSequentialDataBlock.create()) + self.store['i'] = kwargs.get('ir', ModbusSequentialDataBlock.create()) + self.store['h'] = kwargs.get('hr', ModbusSequentialDataBlock.create()) + self.zero_mode = kwargs.get('zero_mode', Defaults.ZeroMode)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the context + + :returns: A string representation of the context + ''' + return "Modbus Slave Context"
+ +
[docs] def reset(self): + ''' Resets all the datastores to their default values ''' + for datastore in itervalues(self.store): + datastore.reset()
+ +
[docs] def validate(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to test + :returns: True if the request in within range, False otherwise + ''' + if not self.zero_mode: address = address + 1 + _logger.debug("validate[%d] %d:%d" % (fx, address, count)) + return self.store[self.decode(fx)].validate(address, count)
+ +
[docs] def getValues(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + if not self.zero_mode: address = address + 1 + _logger.debug("getValues[%d] %d:%d" % (fx, address, count)) + return self.store[self.decode(fx)].getValues(address, count)
+ +
[docs] def setValues(self, fx, address, values): + ''' Sets the datastore with the supplied values + + :param fx: The function we are working with + :param address: The starting address + :param values: The new values to be set + ''' + if not self.zero_mode: address = address + 1 + _logger.debug("setValues[%d] %d:%d" % (fx, address, len(values))) + self.store[self.decode(fx)].setValues(address, values)
+ + +
[docs]class ModbusServerContext(object): + ''' This represents a master collection of slave contexts. + If single is set to true, it will be treated as a single + context so every unit-id returns the same context. If single + is set to false, it will be interpreted as a collection of + slave contexts. + ''' + +
[docs] def __init__(self, slaves=None, single=True): + ''' Initializes a new instance of a modbus server context. + + :param slaves: A dictionary of client contexts + :param single: Set to true to treat this as a single context + ''' + self.single = single + self.__slaves = slaves or {} + if self.single: + self.__slaves = {Defaults.UnitId: self.__slaves}
+ +
[docs] def __iter__(self): + ''' Iterater over the current collection of slave + contexts. + + :returns: An iterator over the slave contexts + ''' + return iteritems(self.__slaves)
+ +
[docs] def __contains__(self, slave): + ''' Check if the given slave is in this list + + :param slave: slave The slave to check for existance + :returns: True if the slave exists, False otherwise + ''' + return slave in self.__slaves
+ +
[docs] def __setitem__(self, slave, context): + ''' Used to set a new slave context + + :param slave: The slave context to set + :param context: The new context to set for this slave + ''' + if self.single: slave = Defaults.UnitId + if 0xf7 >= slave >= 0x00: + self.__slaves[slave] = context + else: + raise NoSuchSlaveException('slave index :{} out of range'.format(slave))
+ +
[docs] def __delitem__(self, slave): + ''' Wrapper used to access the slave context + + :param slave: The slave context to remove + ''' + if not self.single and (0xf7 >= slave >= 0x00): + del self.__slaves[slave] + else: + raise NoSuchSlaveException('slave index: {} out of range'.format(slave))
+ +
[docs] def __getitem__(self, slave): + ''' Used to get access to a slave context + + :param slave: The slave context to get + :returns: The requested slave context + ''' + if self.single: slave = Defaults.UnitId + if slave in self.__slaves: + return self.__slaves.get(slave) + else: + raise NoSuchSlaveException("slave - {} does not exist, or is out of range".format(slave))
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/remote.html b/doc/sphinx/html/_modules/pymodbus/datastore/remote.html new file mode 100644 index 000000000..6b49c37d5 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/datastore/remote.html @@ -0,0 +1,190 @@ + + + + + + + + pymodbus.datastore.remote — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.datastore.remote

+from pymodbus.exceptions import NotImplementedException
+from pymodbus.interfaces import IModbusSlaveContext
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Context
+#---------------------------------------------------------------------------#
+
[docs]class RemoteSlaveContext(IModbusSlaveContext): + ''' TODO + This creates a modbus data model that connects to + a remote device (depending on the client used) + ''' + +
[docs] def __init__(self, client): + ''' Initializes the datastores + + :param client: The client to retrieve values with + ''' + self._client = client + self.__build_mapping()
+ +
[docs] def reset(self): + ''' Resets all the datastores to their default values ''' + raise NotImplementedException()
+ +
[docs] def validate(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to test + :returns: True if the request in within range, False otherwise + ''' + _logger.debug("validate[%d] %d:%d" % (fx, address, count)) + result = self.__get_callbacks[self.decode(fx)](address, count) + return result.function_code < 0x80
+ +
[docs] def getValues(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + # TODO deal with deferreds + _logger.debug("get values[%d] %d:%d" % (fx, address, count)) + result = self.__get_callbacks[self.decode(fx)](address, count) + return self.__extract_result(self.decode(fx), result)
+ +
[docs] def setValues(self, fx, address, values): + ''' Sets the datastore with the supplied values + + :param fx: The function we are working with + :param address: The starting address + :param values: The new values to be set + ''' + # TODO deal with deferreds + _logger.debug("set values[%d] %d:%d" % (fx, address, len(values))) + self.__set_callbacks[self.decode(fx)](address, values)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the context + + :returns: A string representation of the context + ''' + return "Remote Slave Context(%s)" % self._client
+ + def __build_mapping(self): + ''' + A quick helper method to build the function + code mapper. + ''' + self.__get_callbacks = { + 'd': lambda a, c: self._client.read_discrete_inputs(a, c), + 'c': lambda a, c: self._client.read_coils(a, c), + 'h': lambda a, c: self._client.read_holding_registers(a, c), + 'i': lambda a, c: self._client.read_input_registers(a, c), + } + self.__set_callbacks = { + 'd': lambda a, v: self._client.write_coils(a, v), + 'c': lambda a, v: self._client.write_coils(a, v), + 'h': lambda a, v: self._client.write_registers(a, v), + 'i': lambda a, v: self._client.write_registers(a, v), + } + + def __extract_result(self, fx, result): + ''' A helper method to extract the values out of + a response. TODO make this consistent (values?) + ''' + if result.function_code < 0x80: + if fx in ['d', 'c']: return result.bits + if fx in ['h', 'i']: return result.registers + else: return result
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/store.html b/doc/sphinx/html/_modules/pymodbus/datastore/store.html new file mode 100644 index 000000000..cb58897fd --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/datastore/store.html @@ -0,0 +1,343 @@ + + + + + + + + pymodbus.datastore.store — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.datastore.store

+"""
+Modbus Server Datastore
+-------------------------
+
+For each server, you will create a ModbusServerContext and pass
+in the default address space for each data access.  The class
+will create and manage the data.
+
+Further modification of said data accesses should be performed
+with [get,set][access]Values(address, count)
+
+Datastore Implementation
+-------------------------
+
+There are two ways that the server datastore can be implemented.
+The first is a complete range from 'address' start to 'count'
+number of indecies.  This can be thought of as a straight array::
+
+    data = range(1, 1 + count)
+    [1,2,3,...,count]
+
+The other way that the datastore can be implemented (and how
+many devices implement it) is a associate-array::
+
+    data = {1:'1', 3:'3', ..., count:'count'}
+    [1,3,...,count]
+
+The difference between the two is that the latter will allow
+arbitrary gaps in its datastore while the former will not.
+This is seen quite commonly in some modbus implementations.
+What follows is a clear example from the field:
+
+Say a company makes two devices to monitor power usage on a rack.
+One works with three-phase and the other with a single phase. The
+company will dictate a modbus data mapping such that registers::
+
+    n:      phase 1 power
+    n+1:    phase 2 power
+    n+2:    phase 3 power
+
+Using this, layout, the first device will implement n, n+1, and n+2,
+however, the second device may set the latter two values to 0 or
+will simply not implmented the registers thus causing a single read
+or a range read to fail.
+
+I have both methods implemented, and leave it up to the user to change
+based on their preference.
+"""
+from pymodbus.exceptions import NotImplementedException, ParameterException
+from pymodbus.compat import iteritems, iterkeys, itervalues, get_next
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Datablock Storage
+#---------------------------------------------------------------------------#
+
[docs]class BaseModbusDataBlock(object): + ''' + Base class for a modbus datastore + + Derived classes must create the following fields: + @address The starting address point + @defult_value The default value of the datastore + @values The actual datastore values + + Derived classes must implemented the following methods: + validate(self, address, count=1) + getValues(self, address, count=1) + setValues(self, address, values) + ''' + +
[docs] def default(self, count, value=False): + ''' Used to initialize a store to one value + + :param count: The number of fields to set + :param value: The default value to set to the fields + ''' + self.default_value = value + self.values = [self.default_value] * count + self.address = 0x00
+ +
[docs] def reset(self): + ''' Resets the datastore to the initialized default value ''' + self.values = [self.default_value] * len(self.values)
+ +
[docs] def validate(self, address, count=1): + ''' Checks to see if the request is in range + + :param address: The starting address + :param count: The number of values to test for + :returns: True if the request in within range, False otherwise + ''' + raise NotImplementedException("Datastore Address Check")
+ +
[docs] def getValues(self, address, count=1): + ''' Returns the requested values from the datastore + + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + raise NotImplementedException("Datastore Value Retrieve")
+ +
[docs] def setValues(self, address, values): + ''' Returns the requested values from the datastore + + :param address: The starting address + :param values: The values to store + ''' + raise NotImplementedException("Datastore Value Retrieve")
+ +
[docs] def __str__(self): + ''' Build a representation of the datastore + + :returns: A string representation of the datastore + ''' + return "DataStore(%d, %d)" % (len(self.values), self.default_value)
+ +
[docs] def __iter__(self): + ''' Iterater over the data block data + + :returns: An iterator of the data block data + ''' + if isinstance(self.values, dict): + return iteritems(self.values) + return enumerate(self.values, self.address)
+ + +
[docs]class ModbusSequentialDataBlock(BaseModbusDataBlock): + ''' Creates a sequential modbus datastore ''' + +
[docs] def __init__(self, address, values): + ''' Initializes the datastore + + :param address: The starting address of the datastore + :param values: Either a list or a dictionary of values + ''' + self.address = address + if hasattr(values, '__iter__'): + self.values = list(values) + else: self.values = [values] + self.default_value = self.values[0].__class__()
+ + @classmethod +
[docs] def create(klass): + ''' Factory method to create a datastore with the + full address space initialized to 0x00 + + :returns: An initialized datastore + ''' + return klass(0x00, [0x00] * 65536)
+ +
[docs] def validate(self, address, count=1): + ''' Checks to see if the request is in range + + :param address: The starting address + :param count: The number of values to test for + :returns: True if the request in within range, False otherwise + ''' + result = (self.address <= address) + result &= ((self.address + len(self.values)) >= (address + count)) + return result
+ +
[docs] def getValues(self, address, count=1): + ''' Returns the requested values of the datastore + + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + start = address - self.address + return self.values[start:start + count]
+ +
[docs] def setValues(self, address, values): + ''' Sets the requested values of the datastore + + :param address: The starting address + :param values: The new values to be set + ''' + if not isinstance(values, list): + values = [values] + start = address - self.address + self.values[start:start + len(values)] = values
+ + +
[docs]class ModbusSparseDataBlock(BaseModbusDataBlock): + ''' Creates a sparse modbus datastore ''' + +
[docs] def __init__(self, values): + ''' Initializes the datastore + + Using the input values we create the default + datastore value and the starting address + + :param values: Either a list or a dictionary of values + ''' + if isinstance(values, dict): + self.values = values + elif hasattr(values, '__iter__'): + self.values = dict(enumerate(values)) + else: raise ParameterException( + "Values for datastore must be a list or dictionary") + self.default_value = get_next(itervalues(self.values)).__class__() + self.address = get_next(iterkeys(self.values))
+ + @classmethod +
[docs] def create(klass): + ''' Factory method to create a datastore with the + full address space initialized to 0x00 + + :returns: An initialized datastore + ''' + return klass([0x00] * 65536)
+ +
[docs] def validate(self, address, count=1): + ''' Checks to see if the request is in range + + :param address: The starting address + :param count: The number of values to test for + :returns: True if the request in within range, False otherwise + ''' + if count == 0: return False + handle = set(range(address, address + count)) + return handle.issubset(set(iterkeys(self.values)))
+ +
[docs] def getValues(self, address, count=1): + ''' Returns the requested values of the datastore + + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + return [self.values[i] for i in range(address, address + count)]
+ +
[docs] def setValues(self, address, values): + ''' Sets the requested values of the datastore + + :param address: The starting address + :param values: The new values to be set + ''' + if isinstance(values, dict): + for idx, val in iteritems(values): + self.values[idx] = val + else: + if not isinstance(values, list): + values = [values] + for idx, val in enumerate(values): + self.values[address + idx] = val
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/device.html b/doc/sphinx/html/_modules/pymodbus/device.html new file mode 100644 index 000000000..62651ec79 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/device.html @@ -0,0 +1,712 @@ + + + + + + + + pymodbus.device — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.device

+"""
+Modbus Device Controller
+-------------------------
+
+These are the device management handlers.  They should be
+maintained in the server context and the various methods
+should be inserted in the correct locations.
+"""
+from pymodbus.constants import DeviceInformation
+from pymodbus.interfaces import Singleton
+from pymodbus.utilities import dict_property
+from pymodbus.compat import iteritems, itervalues, izip, int2byte
+
+from collections import OrderedDict
+
+#---------------------------------------------------------------------------#
+# Network Access Control
+#---------------------------------------------------------------------------#
+
[docs]class ModbusAccessControl(Singleton): + ''' + This is a simple implementation of a Network Management System table. + Its purpose is to control access to the server (if it is used). + We assume that if an entry is in the table, it is allowed accesses to + resources. However, if the host does not appear in the table (all + unknown hosts) its connection will simply be closed. + + Since it is a singleton, only one version can possible exist and all + instances pull from here. + ''' + __nmstable = [ + "127.0.0.1", + ] + +
[docs] def __iter__(self): + ''' Iterater over the network access table + + :returns: An iterator of the network access table + ''' + return self.__nmstable.__iter__()
+ +
[docs] def __contains__(self, host): + ''' Check if a host is allowed to access resources + + :param host: The host to check + ''' + return host in self.__nmstable
+ +
[docs] def add(self, host): + ''' Add allowed host(s) from the NMS table + + :param host: The host to add + ''' + if not isinstance(host, list): + host = [host] + for entry in host: + if entry not in self.__nmstable: + self.__nmstable.append(entry)
+ +
[docs] def remove(self, host): + ''' Remove allowed host(s) from the NMS table + + :param host: The host to remove + ''' + if not isinstance(host, list): + host = [host] + for entry in host: + if entry in self.__nmstable: + self.__nmstable.remove(entry)
+ +
[docs] def check(self, host): + ''' Check if a host is allowed to access resources + + :param host: The host to check + ''' + return host in self.__nmstable
+ + +#---------------------------------------------------------------------------# +# Modbus Plus Statistics +#---------------------------------------------------------------------------# +
[docs]class ModbusPlusStatistics(object): + ''' + This is used to maintain the current modbus plus statistics count. As of + right now this is simply a stub to complete the modbus implementation. + For more information, see the modbus implementation guide page 87. + ''' + + __data = OrderedDict({ + 'node_type_id' : [0x00] * 2, # 00 + 'software_version_number' : [0x00] * 2, # 01 + 'network_address' : [0x00] * 2, # 02 + 'mac_state_variable' : [0x00] * 2, # 03 + 'peer_status_code' : [0x00] * 2, # 04 + 'token_pass_counter' : [0x00] * 2, # 05 + 'token_rotation_time' : [0x00] * 2, # 06 + + 'program_master_token_failed' : [0x00], # 07 hi + 'data_master_token_failed' : [0x00], # 07 lo + 'program_master_token_owner' : [0x00], # 08 hi + 'data_master_token_owner' : [0x00], # 08 lo + 'program_slave_token_owner' : [0x00], # 09 hi + 'data_slave_token_owner' : [0x00], # 09 lo + 'data_slave_command_transfer' : [0x00], # 10 hi + '__unused_10_lowbit' : [0x00], # 10 lo + + 'program_slave_command_transfer' : [0x00], # 11 hi + 'program_master_rsp_transfer' : [0x00], # 11 lo + 'program_slave_auto_logout' : [0x00], # 12 hi + 'program_master_connect_status' : [0x00], # 12 lo + 'receive_buffer_dma_overrun' : [0x00], # 13 hi + 'pretransmit_deferral_error' : [0x00], # 13 lo + 'frame_size_error' : [0x00], # 14 hi + 'repeated_command_received' : [0x00], # 14 lo + 'receiver_alignment_error' : [0x00], # 15 hi + 'receiver_collision_abort_error' : [0x00], # 15 lo + 'bad_packet_length_error' : [0x00], # 16 hi + 'receiver_crc_error' : [0x00], # 16 lo + 'transmit_buffer_dma_underrun' : [0x00], # 17 hi + 'bad_link_address_error' : [0x00], # 17 lo + + 'bad_mac_function_code_error' : [0x00], # 18 hi + 'internal_packet_length_error' : [0x00], # 18 lo + 'communication_failed_error' : [0x00], # 19 hi + 'communication_retries' : [0x00], # 19 lo + 'no_response_error' : [0x00], # 20 hi + 'good_receive_packet' : [0x00], # 20 lo + 'unexpected_path_error' : [0x00], # 21 hi + 'exception_response_error' : [0x00], # 21 lo + 'forgotten_transaction_error' : [0x00], # 22 hi + 'unexpected_response_error' : [0x00], # 22 lo + + 'active_station_bit_map' : [0x00] * 8, # 23-26 + 'token_station_bit_map' : [0x00] * 8, # 27-30 + 'global_data_bit_map' : [0x00] * 8, # 31-34 + 'receive_buffer_use_bit_map' : [0x00] * 8, # 35-37 + 'data_master_output_path' : [0x00] * 8, # 38-41 + 'data_slave_input_path' : [0x00] * 8, # 42-45 + 'program_master_outptu_path' : [0x00] * 8, # 46-49 + 'program_slave_input_path' : [0x00] * 8, # 50-53 + }) + +
[docs] def __init__(self): + ''' + Initialize the modbus plus statistics with the default + information. + ''' + self.reset()
+ +
[docs] def __iter__(self): + ''' Iterater over the statistics + + :returns: An iterator of the modbus plus statistics + ''' + return iteritems(self.__data)
+ +
[docs] def reset(self): + ''' This clears all of the modbus plus statistics + ''' + for key in self.__data: + self.__data[key] = [0x00] * len(self.__data[key])
+ +
[docs] def summary(self): + ''' Returns a summary of the modbus plus statistics + + :returns: 54 16-bit words representing the status + ''' + return itervalues(self.__data)
+ +
[docs] def encode(self): + ''' Returns a summary of the modbus plus statistics + + :returns: 54 16-bit words representing the status + ''' + total, values = [], sum(self.__data.values(), []) + for c in range(0, len(values), 2): + total.append((values[c] << 8) | values[c+1]) + return total
+ + +#---------------------------------------------------------------------------# +# Device Information Control +#---------------------------------------------------------------------------# +
[docs]class ModbusDeviceIdentification(object): + ''' + This is used to supply the device identification + for the readDeviceIdentification function + + For more information read section 6.21 of the modbus + application protocol. + ''' + __data = { + 0x00: '', # VendorName + 0x01: '', # ProductCode + 0x02: '', # MajorMinorRevision + 0x03: '', # VendorUrl + 0x04: '', # ProductName + 0x05: '', # ModelName + 0x06: '', # UserApplicationName + 0x07: '', # reserved + 0x08: '', # reserved + # 0x80 -> 0xFF are private + } + + __names = [ + 'VendorName', + 'ProductCode', + 'MajorMinorRevision', + 'VendorUrl', + 'ProductName', + 'ModelName', + 'UserApplicationName', + ] + +
[docs] def __init__(self, info=None): + ''' + Initialize the datastore with the elements you need. + (note acceptable range is [0x00-0x06,0x80-0xFF] inclusive) + + :param information: A dictionary of {int:string} of values + ''' + if isinstance(info, dict): + for key in info: + if (0x06 >= key >= 0x00) or (0x80 > key > 0x08): + self.__data[key] = info[key]
+ +
[docs] def __iter__(self): + ''' Iterater over the device information + + :returns: An iterator of the device information + ''' + return iteritems(self.__data)
+ +
[docs] def summary(self): + ''' Return a summary of the main items + + :returns: An dictionary of the main items + ''' + return dict(zip(self.__names, itervalues(self.__data)))
+ +
[docs] def update(self, value): + ''' Update the values of this identity + using another identify as the value + + :param value: The value to copy values from + ''' + self.__data.update(value)
+ +
[docs] def __setitem__(self, key, value): + ''' Wrapper used to access the device information + + :param key: The register to set + :param value: The new value for referenced register + ''' + if key not in [0x07, 0x08]: + self.__data[key] = value
+ +
[docs] def __getitem__(self, key): + ''' Wrapper used to access the device information + + :param key: The register to read + ''' + return self.__data.setdefault(key, '')
+ +
[docs] def __str__(self): + ''' Build a representation of the device + + :returns: A string representation of the device + ''' + return "DeviceIdentity"
+ + #-------------------------------------------------------------------------# + # Properties + #-------------------------------------------------------------------------# + VendorName = dict_property(lambda s: s.__data, 0) + ProductCode = dict_property(lambda s: s.__data, 1) + MajorMinorRevision = dict_property(lambda s: s.__data, 2) + VendorUrl = dict_property(lambda s: s.__data, 3) + ProductName = dict_property(lambda s: s.__data, 4) + ModelName = dict_property(lambda s: s.__data, 5) + UserApplicationName = dict_property(lambda s: s.__data, 6)
+ + +
[docs]class DeviceInformationFactory(Singleton): + ''' This is a helper factory that really just hides + some of the complexity of processing the device information + requests (function code 0x2b 0x0e). + ''' + + __lookup = { + DeviceInformation.Basic: lambda c,r,i: c.__gets(r, list(range(0x00, 0x03))), + DeviceInformation.Regular: lambda c,r,i: c.__gets(r, list(range(0x00, 0x08))), + DeviceInformation.Extended: lambda c,r,i: c.__gets(r, list(range(0x80, i))), + DeviceInformation.Specific: lambda c,r,i: c.__get(r, i), + } + + @classmethod +
[docs] def get(cls, control, read_code=DeviceInformation.Basic, object_id=0x00): + ''' Get the requested device data from the system + + :param control: The control block to pull data from + :param read_code: The read code to process + :param object_id: The specific object_id to read + :returns: The requested data (id, length, value) + ''' + identity = control.Identity + return cls.__lookup[read_code](cls, identity, object_id)
+ + @classmethod + def __get(cls, identity, object_id): + ''' Read a single object_id from the device information + + :param identity: The identity block to pull data from + :param object_id: The specific object id to read + :returns: The requested data (id, length, value) + ''' + return { object_id:identity[object_id] } + + @classmethod + def __gets(cls, identity, object_ids): + ''' Read multiple object_ids from the device information + + :param identity: The identity block to pull data from + :param object_ids: The specific object ids to read + :returns: The requested data (id, length, value) + ''' + return dict((oid, identity[oid]) for oid in object_ids)
+ + +#---------------------------------------------------------------------------# +# Counters Handler +#---------------------------------------------------------------------------# +class ModbusCountersHandler(object): + ''' + This is a helper class to simplify the properties for the counters:: + + 0x0B 1 Return Bus Message Count + + Quantity of messages that the remote + device has detected on the communications system since its + last restart, clear counters operation, or power-up. Messages + with bad CRC are not taken into account. + + 0x0C 2 Return Bus Communication Error Count + + Quantity of CRC errors encountered by the remote device since its + last restart, clear counters operation, or power-up. In case of + an error detected on the character level, (overrun, parity error), + or in case of a message length < 3 bytes, the receiving device is + not able to calculate the CRC. In such cases, this counter is + also incremented. + + 0x0D 3 Return Slave Exception Error Count + + Quantity of MODBUS exception error detected by the remote device + since its last restart, clear counters operation, or power-up. It + comprises also the error detected in broadcast messages even if an + exception message is not returned in this case. + Exception errors are described and listed in "MODBUS Application + Protocol Specification" document. + + 0xOE 4 Return Slave Message Count + + Quantity of messages addressed to the remote device, including + broadcast messages, that the remote device has processed since its + last restart, clear counters operation, or power-up. + + 0x0F 5 Return Slave No Response Count + + Quantity of messages received by the remote device for which it + returned no response (neither a normal response nor an exception + response), since its last restart, clear counters operation, or + power-up. Then, this counter counts the number of broadcast + messages it has received. + + 0x10 6 Return Slave NAK Count + + Quantity of messages addressed to the remote device for which it + returned a Negative Acknowledge (NAK) exception response, since + its last restart, clear counters operation, or power-up. Exception + responses are described and listed in "MODBUS Application Protocol + Specification" document. + + 0x11 7 Return Slave Busy Count + + Quantity of messages addressed to the remote device for which it + returned a Slave Device Busy exception response, since its last + restart, clear counters operation, or power-up. Exception + responses are described and listed in "MODBUS Application + Protocol Specification" document. + + 0x12 8 Return Bus Character Overrun Count + + Quantity of messages addressed to the remote device that it could + not handle due to a character overrun condition, since its last + restart, clear counters operation, or power-up. A character + overrun is caused by data characters arriving at the port faster + than they can. + + .. note:: I threw the event counter in here for convinience + ''' + __data = dict([(i, 0x0000) for i in range(9)]) + __names = [ + 'BusMessage', + 'BusCommunicationError', + 'SlaveExceptionError', + 'SlaveMessage', + 'SlaveNoResponse', + 'SlaveNAK', + 'SlaveBusy', + 'BusCharacterOverrun' + 'Event ' + ] + + def __iter__(self): + ''' Iterater over the device counters + + :returns: An iterator of the device counters + ''' + return izip(self.__names, itervalues(self.__data)) + + def update(self, values): + ''' Update the values of this identity + using another identify as the value + + :param values: The value to copy values from + ''' + for k, v in iteritems(values): + v += self.__getattribute__(k) + self.__setattr__(k, v) + + def reset(self): + ''' This clears all of the system counters + ''' + self.__data = dict([(i, 0x0000) for i in range(9)]) + + def summary(self): + ''' Returns a summary of the counters current status + + :returns: A byte with each bit representing each counter + ''' + count, result = 0x01, 0x00 + for i in itervalues(self.__data): + if i != 0x00: result |= count + count <<= 1 + return result + + #-------------------------------------------------------------------------# + # Properties + #-------------------------------------------------------------------------# + BusMessage = dict_property(lambda s: s.__data, 0) + BusCommunicationError = dict_property(lambda s: s.__data, 1) + BusExceptionError = dict_property(lambda s: s.__data, 2) + SlaveMessage = dict_property(lambda s: s.__data, 3) + SlaveNoResponse = dict_property(lambda s: s.__data, 4) + SlaveNAK = dict_property(lambda s: s.__data, 5) + SlaveBusy = dict_property(lambda s: s.__data, 6) + BusCharacterOverrun = dict_property(lambda s: s.__data, 7) + Event = dict_property(lambda s: s.__data, 8) + + +#---------------------------------------------------------------------------# +# Main server controll block +#---------------------------------------------------------------------------# +
[docs]class ModbusControlBlock(Singleton): + ''' + This is a global singleotn that controls all system information + + All activity should be logged here and all diagnostic requests + should come from here. + ''' + + __mode = 'ASCII' + __diagnostic = [False] * 16 + __instance = None + __listen_only = False + __delimiter = '\r' + __counters = ModbusCountersHandler() + __identity = ModbusDeviceIdentification() + __plus = ModbusPlusStatistics() + __events = [] + + #-------------------------------------------------------------------------# + # Magic + #-------------------------------------------------------------------------# +
[docs] def __str__(self): + ''' Build a representation of the control block + + :returns: A string representation of the control block + ''' + return "ModbusControl"
+ +
[docs] def __iter__(self): + ''' Iterater over the device counters + + :returns: An iterator of the device counters + ''' + return self.__counters.__iter__()
+ + #-------------------------------------------------------------------------# + # Events + #-------------------------------------------------------------------------# +
[docs] def addEvent(self, event): + ''' Adds a new event to the event log + + :param event: A new event to add to the log + ''' + self.__events.insert(0, event) + self.__events = self.__events[0:64] # chomp to 64 entries + self.Counter.Event += 1
+ +
[docs] def getEvents(self): + ''' Returns an encoded collection of the event log. + + :returns: The encoded events packet + ''' + events = [event.encode() for event in self.__events] + return b''.join(events)
+ +
[docs] def clearEvents(self): + ''' Clears the current list of events + ''' + self.__events = []
+ + #-------------------------------------------------------------------------# + # Other Properties + #-------------------------------------------------------------------------# + Identity = property(lambda s: s.__identity) + Counter = property(lambda s: s.__counters) + Events = property(lambda s: s.__events) + Plus = property(lambda s: s.__plus) + +
[docs] def reset(self): + ''' This clears all of the system counters and the + diagnostic register + ''' + self.__events = [] + self.__counters.reset() + self.__diagnostic = [False] * 16
+ + #-------------------------------------------------------------------------# + # Listen Properties + #-------------------------------------------------------------------------# +
[docs] def _setListenOnly(self, value): + ''' This toggles the listen only status + + :param value: The value to set the listen status to + ''' + self.__listen_only = bool(value)
+ + ListenOnly = property(lambda s: s.__listen_only, _setListenOnly) + + #-------------------------------------------------------------------------# + # Mode Properties + #-------------------------------------------------------------------------# +
[docs] def _setMode(self, mode): + ''' This toggles the current serial mode + + :param mode: The data transfer method in (RTU, ASCII) + ''' + if mode in ['ASCII', 'RTU']: + self.__mode = mode
+ + Mode = property(lambda s: s.__mode, _setMode) + + #-------------------------------------------------------------------------# + # Delimiter Properties + #-------------------------------------------------------------------------# +
[docs] def _setDelimiter(self, char): + ''' This changes the serial delimiter character + + :param char: The new serial delimiter character + ''' + if isinstance(char, str): + self.__delimiter = char.encode() + if isinstance(char, bytes): + self.__delimiter = char + elif isinstance(char, int): + self.__delimiter = int2byte(char)
+ + Delimiter = property(lambda s: s.__delimiter, _setDelimiter) + + #-------------------------------------------------------------------------# + # Diagnostic Properties + #-------------------------------------------------------------------------# +
[docs] def setDiagnostic(self, mapping): + ''' This sets the value in the diagnostic register + + :param mapping: Dictionary of key:value pairs to set + ''' + for entry in iteritems(mapping): + if entry[0] >= 0 and entry[0] < len(self.__diagnostic): + self.__diagnostic[entry[0]] = (entry[1] != 0)
+ +
[docs] def getDiagnostic(self, bit): + ''' This gets the value in the diagnostic register + + :param bit: The bit to get + :returns: The current value of the requested bit + ''' + try: + if bit and bit >= 0 and bit < len(self.__diagnostic): + return self.__diagnostic[bit] + except Exception: + return None
+ +
[docs] def getDiagnosticRegister(self): + ''' This gets the entire diagnostic register + + :returns: The diagnostic register collection + ''' + return self.__diagnostic
+ +#---------------------------------------------------------------------------# +# Exported Identifiers +#---------------------------------------------------------------------------# +__all__ = [ + "ModbusAccessControl", + "ModbusPlusStatistics", + "ModbusDeviceIdentification", + "DeviceInformationFactory", + "ModbusControlBlock" +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/diag_message.html b/doc/sphinx/html/_modules/pymodbus/diag_message.html new file mode 100644 index 000000000..ac913e5fd --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/diag_message.html @@ -0,0 +1,845 @@ + + + + + + + + pymodbus.diag_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.diag_message

+'''
+Diagnostic Record Read/Write
+------------------------------
+
+These need to be tied into a the current server context
+or linked to the appropriate data
+'''
+import struct
+
+from pymodbus.constants import ModbusStatus, ModbusPlusOperation
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.device import ModbusControlBlock
+from pymodbus.exceptions import NotImplementedException
+from pymodbus.utilities import pack_bitstring
+
+_MCB = ModbusControlBlock()
+
+
+#---------------------------------------------------------------------------#
+# Diagnostic Function Codes Base Classes
+# diagnostic 08, 00-18,20
+#---------------------------------------------------------------------------#
+# TODO Make sure all the data is decoded from the response
+#---------------------------------------------------------------------------#
+
[docs]class DiagnosticStatusRequest(ModbusRequest): + ''' + This is a base class for all of the diagnostic request functions + ''' + function_code = 0x08 + _rtu_frame_size = 8 + +
[docs] def __init__(self, **kwargs): + ''' + Base initializer for a diagnostic request + ''' + ModbusRequest.__init__(self, **kwargs) + self.message = None
+ +
[docs] def encode(self): + ''' + Base encoder for a diagnostic response + we encode the data set in self.message + + :returns: The encoded packet + ''' + packet = struct.pack('>H', self.sub_function_code) + if self.message is not None: + if isinstance(self.message, str): + packet += self.message.encode() + elif isinstance(self.message, bytes): + packet += self.message + elif isinstance(self.message, list): + for piece in self.message: + packet += struct.pack('>H', piece) + elif isinstance(self.message, int): + packet += struct.pack('>H', self.message) + return packet
+ +
[docs] def decode(self, data): + ''' Base decoder for a diagnostic request + + :param data: The data to decode into the function code + ''' + self.sub_function_code, self.message = struct.unpack('>HH', data)
+ +
[docs] def get_response_pdu_size(self): + """ + Func_code (1 byte) + Sub function code (2 byte) + Data (2 * N bytes) + :return: + """ + if not isinstance(self.message,list): + self.message = [self.message] + return 1 + 2 + 2 * len(self.message)
+ + + +
[docs]class DiagnosticStatusResponse(ModbusResponse): + ''' + This is a base class for all of the diagnostic response functions + + It works by performing all of the encoding and decoding of variable + data and lets the higher classes define what extra data to append + and how to execute a request + ''' + function_code = 0x08 + _rtu_frame_size = 8 + +
[docs] def __init__(self, **kwargs): + ''' + Base initializer for a diagnostic response + ''' + ModbusResponse.__init__(self, **kwargs) + self.message = None
+ +
[docs] def encode(self): + ''' + Base encoder for a diagnostic response + we encode the data set in self.message + + :returns: The encoded packet + ''' + packet = struct.pack('>H', self.sub_function_code) + if self.message is not None: + if isinstance(self.message, str): + packet += self.message.encode() + elif isinstance(self.message, bytes): + packet += self.message + elif isinstance(self.message, list): + for piece in self.message: + packet += struct.pack('>H', piece) + elif isinstance(self.message, int): + packet += struct.pack('>H', self.message) + return packet
+ +
[docs] def decode(self, data): + ''' Base decoder for a diagnostic response + + :param data: The data to decode into the function code + ''' + self.sub_function_code, self.message = struct.unpack('>HH', data)
+ + +
[docs]class DiagnosticStatusSimpleRequest(DiagnosticStatusRequest): + ''' + A large majority of the diagnostic functions are simple + status request functions. They work by sending 0x0000 + as data and their function code and they are returned + 2 bytes of data. + + If a function inherits this, they only need to implement + the execute method + ''' + +
[docs] def __init__(self, data=0x0000, **kwargs): + ''' + General initializer for a simple diagnostic request + + The data defaults to 0x0000 if not provided as over half + of the functions require it. + + :param data: The data to send along with the request + ''' + DiagnosticStatusRequest.__init__(self, **kwargs) + self.message = data
+ +
[docs] def execute(self, *args): + ''' Base function to raise if not implemented ''' + raise NotImplementedException("Diagnostic Message Has No Execute Method")
+ + +
[docs]class DiagnosticStatusSimpleResponse(DiagnosticStatusResponse): + ''' + A large majority of the diagnostic functions are simple + status request functions. They work by sending 0x0000 + as data and their function code and they are returned + 2 bytes of data. + ''' + +
[docs] def __init__(self, data=0x0000, **kwargs): + ''' General initializer for a simple diagnostic response + + :param data: The resulting data to return to the client + ''' + DiagnosticStatusResponse.__init__(self, **kwargs) + self.message = data
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 00 +#---------------------------------------------------------------------------# +
[docs]class ReturnQueryDataRequest(DiagnosticStatusRequest): + ''' + The data passed in the request data field is to be returned (looped back) + in the response. The entire response message should be identical to the + request. + ''' + sub_function_code = 0x0000 + +
[docs] def __init__(self, message=0x0000, **kwargs): + ''' Initializes a new instance of the request + + :param message: The message to send to loopback + ''' + DiagnosticStatusRequest.__init__(self, **kwargs) + if isinstance(message, list): + self.message = message + else: + self.message = [message]
+ +
[docs] def execute(self, *args): + ''' Executes the loopback request (builds the response) + + :returns: The populated loopback response message + ''' + return ReturnQueryDataResponse(self.message)
+ + +
[docs]class ReturnQueryDataResponse(DiagnosticStatusResponse): + ''' + The data passed in the request data field is to be returned (looped back) + in the response. The entire response message should be identical to the + request. + ''' + sub_function_code = 0x0000 + +
[docs] def __init__(self, message=0x0000, **kwargs): + ''' Initializes a new instance of the response + + :param message: The message to loopback + ''' + DiagnosticStatusResponse.__init__(self, **kwargs) + if isinstance(message, list): + self.message = message + else: self.message = [message]
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 01 +#---------------------------------------------------------------------------# +
[docs]class RestartCommunicationsOptionRequest(DiagnosticStatusRequest): + ''' + The remote device serial line port must be initialized and restarted, and + all of its communications event counters are cleared. If the port is + currently in Listen Only Mode, no response is returned. This function is + the only one that brings the port out of Listen Only Mode. If the port is + not currently in Listen Only Mode, a normal response is returned. This + occurs before the restart is executed. + ''' + sub_function_code = 0x0001 + +
[docs] def __init__(self, toggle=False, **kwargs): + ''' Initializes a new request + + :param toggle: Set to True to toggle, False otherwise + ''' + DiagnosticStatusRequest.__init__(self, **kwargs) + if toggle: + self.message = [ModbusStatus.On] + else: self.message = [ModbusStatus.Off]
+ +
[docs] def execute(self, *args): + ''' Clear event log and restart + + :returns: The initialized response message + ''' + #if _MCB.ListenOnly: + return RestartCommunicationsOptionResponse(self.message)
+ +
[docs]class RestartCommunicationsOptionResponse(DiagnosticStatusResponse): + ''' + The remote device serial line port must be initialized and restarted, and + all of its communications event counters are cleared. If the port is + currently in Listen Only Mode, no response is returned. This function is + the only one that brings the port out of Listen Only Mode. If the port is + not currently in Listen Only Mode, a normal response is returned. This + occurs before the restart is executed. + ''' + sub_function_code = 0x0001 + +
[docs] def __init__(self, toggle=False, **kwargs): + ''' Initializes a new response + + :param toggle: Set to True if we toggled, False otherwise + ''' + DiagnosticStatusResponse.__init__(self, **kwargs) + if toggle: + self.message = [ModbusStatus.On] + else: self.message = [ModbusStatus.Off]
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 02 +#---------------------------------------------------------------------------# +
[docs]class ReturnDiagnosticRegisterRequest(DiagnosticStatusSimpleRequest): + ''' + The contents of the remote device's 16-bit diagnostic register are + returned in the response + ''' + sub_function_code = 0x0002 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + #if _MCB.isListenOnly(): + register = pack_bitstring(_MCB.getDiagnosticRegister()) + return ReturnDiagnosticRegisterResponse(register)
+ + +
[docs]class ReturnDiagnosticRegisterResponse(DiagnosticStatusSimpleResponse): + ''' + The contents of the remote device's 16-bit diagnostic register are + returned in the response + ''' + sub_function_code = 0x0002
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 03 +#---------------------------------------------------------------------------# +
[docs]class ChangeAsciiInputDelimiterRequest(DiagnosticStatusSimpleRequest): + ''' + The character 'CHAR' passed in the request data field becomes the end of + message delimiter for future messages (replacing the default LF + character). This function is useful in cases of a Line Feed is not + required at the end of ASCII messages. + ''' + sub_function_code = 0x0003 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + char = (self.message & 0xff00) >> 8 + _MCB.Delimiter = char + return ChangeAsciiInputDelimiterResponse(self.message)
+ + +
[docs]class ChangeAsciiInputDelimiterResponse(DiagnosticStatusSimpleResponse): + ''' + The character 'CHAR' passed in the request data field becomes the end of + message delimiter for future messages (replacing the default LF + character). This function is useful in cases of a Line Feed is not + required at the end of ASCII messages. + ''' + sub_function_code = 0x0003
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 04 +#---------------------------------------------------------------------------# +
[docs]class ForceListenOnlyModeRequest(DiagnosticStatusSimpleRequest): + ''' + Forces the addressed remote device to its Listen Only Mode for MODBUS + communications. This isolates it from the other devices on the network, + allowing them to continue communicating without interruption from the + addressed remote device. No response is returned. + ''' + sub_function_code = 0x0004 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + _MCB.ListenOnly = True + return ForceListenOnlyModeResponse()
+ + +
[docs]class ForceListenOnlyModeResponse(DiagnosticStatusResponse): + ''' + Forces the addressed remote device to its Listen Only Mode for MODBUS + communications. This isolates it from the other devices on the network, + allowing them to continue communicating without interruption from the + addressed remote device. No response is returned. + + This does not send a response + ''' + sub_function_code = 0x0004 + should_respond = False + +
[docs] def __init__(self, **kwargs): + ''' Initializer to block a return response + ''' + DiagnosticStatusResponse.__init__(self, **kwargs) + self.message = []
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 10 +#---------------------------------------------------------------------------# +
[docs]class ClearCountersRequest(DiagnosticStatusSimpleRequest): + ''' + The goal is to clear ll counters and the diagnostic register. + Also, counters are cleared upon power-up + ''' + sub_function_code = 0x000A + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + _MCB.reset() + return ClearCountersResponse(self.message)
+ + +
[docs]class ClearCountersResponse(DiagnosticStatusSimpleResponse): + ''' + The goal is to clear ll counters and the diagnostic register. + Also, counters are cleared upon power-up + ''' + sub_function_code = 0x000A
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 11 +#---------------------------------------------------------------------------# +
[docs]class ReturnBusMessageCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages that the + remote device has detected on the communications systems since its last + restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000B + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.BusMessage + return ReturnBusMessageCountResponse(count)
+ + +
[docs]class ReturnBusMessageCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages that the + remote device has detected on the communications systems since its last + restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000B
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 12 +#---------------------------------------------------------------------------# +
[docs]class ReturnBusCommunicationErrorCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of CRC errors encountered + by the remote device since its last restart, clear counter operation, or + power-up + ''' + sub_function_code = 0x000C + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.BusCommunicationError + return ReturnBusCommunicationErrorCountResponse(count)
+ + +
[docs]class ReturnBusCommunicationErrorCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of CRC errors encountered + by the remote device since its last restart, clear counter operation, or + power-up + ''' + sub_function_code = 0x000C
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 13 +#---------------------------------------------------------------------------# +
[docs]class ReturnBusExceptionErrorCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of modbus exception + responses returned by the remote device since its last restart, + clear counters operation, or power-up + ''' + sub_function_code = 0x000D + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.BusExceptionError + return ReturnBusExceptionErrorCountResponse(count)
+ + +
[docs]class ReturnBusExceptionErrorCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of modbus exception + responses returned by the remote device since its last restart, + clear counters operation, or power-up + ''' + sub_function_code = 0x000D
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 14 +#---------------------------------------------------------------------------# +
[docs]class ReturnSlaveMessageCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages addressed to the + remote device, or broadcast, that the remote device has processed since + its last restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000E + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.SlaveMessage + return ReturnSlaveMessageCountResponse(count)
+ + +
[docs]class ReturnSlaveMessageCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages addressed to the + remote device, or broadcast, that the remote device has processed since + its last restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000E
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 15 +#---------------------------------------------------------------------------# +
[docs]class ReturnSlaveNoResponseCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages addressed to the + remote device, or broadcast, that the remote device has processed since + its last restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000F + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.SlaveNoResponse + return ReturnSlaveNoReponseCountResponse(count)
+ + +
[docs]class ReturnSlaveNoReponseCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages addressed to the + remote device, or broadcast, that the remote device has processed since + its last restart, clear counters operation, or power-up + ''' + sub_function_code = 0x000F
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 16 +#---------------------------------------------------------------------------# +
[docs]class ReturnSlaveNAKCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages addressed to the + remote device for which it returned a Negative Acknowledge (NAK) exception + response, since its last restart, clear counters operation, or power-up. + Exception responses are described and listed in section 7 . + ''' + sub_function_code = 0x0010 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.SlaveNAK + return ReturnSlaveNAKCountResponse(count)
+ + +
[docs]class ReturnSlaveNAKCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages addressed to the + remote device for which it returned a Negative Acknowledge (NAK) exception + response, since its last restart, clear counters operation, or power-up. + Exception responses are described and listed in section 7. + ''' + sub_function_code = 0x0010
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 17 +#---------------------------------------------------------------------------# +
[docs]class ReturnSlaveBusyCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages addressed to the + remote device for which it returned a Slave Device Busy exception response, + since its last restart, clear counters operation, or power-up. + ''' + sub_function_code = 0x0011 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.SlaveBusy + return ReturnSlaveBusyCountResponse(count)
+ + +
[docs]class ReturnSlaveBusyCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages addressed to the + remote device for which it returned a Slave Device Busy exception response, + since its last restart, clear counters operation, or power-up. + ''' + sub_function_code = 0x0011
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 18 +#---------------------------------------------------------------------------# +
[docs]class ReturnSlaveBusCharacterOverrunCountRequest(DiagnosticStatusSimpleRequest): + ''' + The response data field returns the quantity of messages addressed to the + remote device that it could not handle due to a character overrun condition, + since its last restart, clear counters operation, or power-up. A character + overrun is caused by data characters arriving at the port faster than they + can be stored, or by the loss of a character due to a hardware malfunction. + ''' + sub_function_code = 0x0012 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.BusCharacterOverrun + return ReturnSlaveBusCharacterOverrunCountResponse(count)
+ + +
[docs]class ReturnSlaveBusCharacterOverrunCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages addressed to the + remote device that it could not handle due to a character overrun condition, + since its last restart, clear counters operation, or power-up. A character + overrun is caused by data characters arriving at the port faster than they + can be stored, or by the loss of a character due to a hardware malfunction. + ''' + sub_function_code = 0x0012
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 19 +#---------------------------------------------------------------------------# +
[docs]class ReturnIopOverrunCountRequest(DiagnosticStatusSimpleRequest): + ''' + An IOP overrun is caused by data characters arriving at the port + faster than they can be stored, or by the loss of a character due + to a hardware malfunction. This function is specific to the 884. + ''' + sub_function_code = 0x0013 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + count = _MCB.Counter.BusCharacterOverrun + return ReturnIopOverrunCountResponse(count)
+ + +
[docs]class ReturnIopOverrunCountResponse(DiagnosticStatusSimpleResponse): + ''' + The response data field returns the quantity of messages + addressed to the slave that it could not handle due to an 884 + IOP overrun condition, since its last restart, clear counters + operation, or power-up. + ''' + sub_function_code = 0x0013
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 20 +#---------------------------------------------------------------------------# +
[docs]class ClearOverrunCountRequest(DiagnosticStatusSimpleRequest): + ''' + Clears the overrun error counter and reset the error flag + + An error flag should be cleared, but nothing else in the + specification mentions is, so it is ignored. + ''' + sub_function_code = 0x0014 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + _MCB.Counter.BusCharacterOverrun = 0x0000 + return ClearOverrunCountResponse(self.message)
+ + +
[docs]class ClearOverrunCountResponse(DiagnosticStatusSimpleResponse): + ''' + Clears the overrun error counter and reset the error flag + ''' + sub_function_code = 0x0014
+ + +#---------------------------------------------------------------------------# +# Diagnostic Sub Code 21 +#---------------------------------------------------------------------------# +
[docs]class GetClearModbusPlusRequest(DiagnosticStatusSimpleRequest): + ''' + In addition to the Function code (08) and Subfunction code + (00 15 hex) in the query, a two-byte Operation field is used + to specify either a 'Get Statistics' or a 'Clear Statistics' + operation. The two operations are exclusive - the 'Get' + operation cannot clear the statistics, and the 'Clear' + operation does not return statistics prior to clearing + them. Statistics are also cleared on power-up of the slave + device. + ''' + sub_function_code = 0x0015 + +
[docs] def execute(self, *args): + ''' Execute the diagnostic request on the given device + + :returns: The initialized response message + ''' + message = None # the clear operation does not return info + if self.message == ModbusPlusOperation.ClearStatistics: + _MCB.Plus.reset() + else: message = _MCB.Plus.encode() + return GetClearModbusPlusResponse(message)
+ + +
[docs]class GetClearModbusPlusResponse(DiagnosticStatusSimpleResponse): + ''' + Returns a series of 54 16-bit words (108 bytes) in the data field + of the response (this function differs from the usual two-byte + length of the data field). The data contains the statistics for + the Modbus Plus peer processor in the slave device. + ''' + sub_function_code = 0x0015
+ + +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "DiagnosticStatusRequest", "DiagnosticStatusResponse", + "ReturnQueryDataRequest", "ReturnQueryDataResponse", + "RestartCommunicationsOptionRequest", "RestartCommunicationsOptionResponse", + "ReturnDiagnosticRegisterRequest", "ReturnDiagnosticRegisterResponse", + "ChangeAsciiInputDelimiterRequest", "ChangeAsciiInputDelimiterResponse", + "ForceListenOnlyModeRequest", "ForceListenOnlyModeResponse", + "ClearCountersRequest", "ClearCountersResponse", + "ReturnBusMessageCountRequest", "ReturnBusMessageCountResponse", + "ReturnBusCommunicationErrorCountRequest", "ReturnBusCommunicationErrorCountResponse", + "ReturnBusExceptionErrorCountRequest", "ReturnBusExceptionErrorCountResponse", + "ReturnSlaveMessageCountRequest", "ReturnSlaveMessageCountResponse", + "ReturnSlaveNoResponseCountRequest", "ReturnSlaveNoReponseCountResponse", + "ReturnSlaveNAKCountRequest", "ReturnSlaveNAKCountResponse", + "ReturnSlaveBusyCountRequest", "ReturnSlaveBusyCountResponse", + "ReturnSlaveBusCharacterOverrunCountRequest", "ReturnSlaveBusCharacterOverrunCountResponse", + "ReturnIopOverrunCountRequest", "ReturnIopOverrunCountResponse", + "ClearOverrunCountRequest", "ClearOverrunCountResponse", + "GetClearModbusPlusRequest", "GetClearModbusPlusResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/events.html b/doc/sphinx/html/_modules/pymodbus/events.html new file mode 100644 index 000000000..4424ecff6 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/events.html @@ -0,0 +1,287 @@ + + + + + + + + pymodbus.events — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.events

+'''
+Modbus Remote Events
+------------------------------------------------------------
+
+An event byte returned by the Get Communications Event Log function
+can be any one of four types. The type is defined by bit 7
+(the high-order bit) in each byte. It may be further defined by bit 6.
+'''
+from pymodbus.exceptions import NotImplementedException
+from pymodbus.exceptions import ParameterException
+from pymodbus.utilities import pack_bitstring, unpack_bitstring
+
+
+
[docs]class ModbusEvent(object): + +
[docs] def encode(self): + ''' Encodes the status bits to an event message + + :returns: The encoded event message + ''' + raise NotImplementedException()
+ +
[docs] def decode(self, event): + ''' Decodes the event message to its status bits + + :param event: The event to decode + ''' + raise NotImplementedException()
+ + +
[docs]class RemoteReceiveEvent(ModbusEvent): + ''' Remote device MODBUS Receive Event + + The remote device stores this type of event byte when a query message + is received. It is stored before the remote device processes the message. + This event is defined by bit 7 set to logic '1'. The other bits will be + set to a logic '1' if the corresponding condition is TRUE. The bit layout + is:: + + Bit Contents + ---------------------------------- + 0 Not Used + 2 Not Used + 3 Not Used + 4 Character Overrun + 5 Currently in Listen Only Mode + 6 Broadcast Receive + 7 1 + ''' + +
[docs] def __init__(self, **kwargs): + ''' Initialize a new event instance + ''' + self.overrun = kwargs.get('overrun', False) + self.listen = kwargs.get('listen', False) + self.broadcast = kwargs.get('broadcast', False)
+ +
[docs] def encode(self): + ''' Encodes the status bits to an event message + + :returns: The encoded event message + ''' + bits = [False] * 3 + bits += [self.overrun, self.listen, self.broadcast, True] + packet = pack_bitstring(bits) + return packet
+ +
[docs] def decode(self, event): + ''' Decodes the event message to its status bits + + :param event: The event to decode + ''' + bits = unpack_bitstring(event) + self.overrun = bits[4] + self.listen = bits[5] + self.broadcast = bits[6]
+ + +
[docs]class RemoteSendEvent(ModbusEvent): + ''' Remote device MODBUS Send Event + + The remote device stores this type of event byte when it finishes + processing a request message. It is stored if the remote device + returned a normal or exception response, or no response. + + This event is defined by bit 7 set to a logic '0', with bit 6 set to a '1'. + The other bits will be set to a logic '1' if the corresponding + condition is TRUE. The bit layout is:: + + Bit Contents + ----------------------------------------------------------- + 0 Read Exception Sent (Exception Codes 1-3) + 1 Slave Abort Exception Sent (Exception Code 4) + 2 Slave Busy Exception Sent (Exception Codes 5-6) + 3 Slave Program NAK Exception Sent (Exception Code 7) + 4 Write Timeout Error Occurred + 5 Currently in Listen Only Mode + 6 1 + 7 0 + ''' + +
[docs] def __init__(self, **kwargs): + ''' Initialize a new event instance + ''' + self.read = kwargs.get('read', False) + self.slave_abort = kwargs.get('slave_abort', False) + self.slave_busy = kwargs.get('slave_busy', False) + self.slave_nak = kwargs.get('slave_nak', False) + self.write_timeout = kwargs.get('write_timeout', False) + self.listen = kwargs.get('listen', False)
+ +
[docs] def encode(self): + ''' Encodes the status bits to an event message + + :returns: The encoded event message + ''' + bits = [self.read, self.slave_abort, self.slave_busy, + self.slave_nak, self.write_timeout, self.listen] + bits += [True, False] + packet = pack_bitstring(bits) + return packet
+ +
[docs] def decode(self, event): + ''' Decodes the event message to its status bits + + :param event: The event to decode + ''' + # todo fix the start byte count + bits = unpack_bitstring(event) + self.read = bits[0] + self.slave_abort = bits[1] + self.slave_busy = bits[2] + self.slave_nak = bits[3] + self.write_timeout = bits[4] + self.listen = bits[5]
+ + +
[docs]class EnteredListenModeEvent(ModbusEvent): + ''' Remote device Entered Listen Only Mode + + The remote device stores this type of event byte when it enters + the Listen Only Mode. The event is defined by a content of 04 hex. + ''' + + value = 0x04 + __encoded = b'\x04' + +
[docs] def encode(self): + ''' Encodes the status bits to an event message + + :returns: The encoded event message + ''' + return self.__encoded
+ +
[docs] def decode(self, event): + ''' Decodes the event message to its status bits + + :param event: The event to decode + ''' + if event != self.__encoded: + raise ParameterException('Invalid decoded value')
+ + +
[docs]class CommunicationRestartEvent(ModbusEvent): + ''' Remote device Initiated Communication Restart + + The remote device stores this type of event byte when its communications + port is restarted. The remote device can be restarted by the Diagnostics + function (code 08), with sub-function Restart Communications Option + (code 00 01). + + That function also places the remote device into a 'Continue on Error' + or 'Stop on Error' mode. If the remote device is placed into 'Continue on + Error' mode, the event byte is added to the existing event log. If the + remote device is placed into 'Stop on Error' mode, the byte is added to + the log and the rest of the log is cleared to zeros. + + The event is defined by a content of zero. + ''' + + value = 0x00 + __encoded = b'\x00' + +
[docs] def encode(self): + ''' Encodes the status bits to an event message + + :returns: The encoded event message + ''' + return self.__encoded
+ +
[docs] def decode(self, event): + ''' Decodes the event message to its status bits + + :param event: The event to decode + ''' + if event != self.__encoded: + raise ParameterException('Invalid decoded value')
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/exceptions.html b/doc/sphinx/html/_modules/pymodbus/exceptions.html new file mode 100644 index 000000000..2877ea08c --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/exceptions.html @@ -0,0 +1,177 @@ + + + + + + + + pymodbus.exceptions — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.exceptions

+'''
+Pymodbus Exceptions
+--------------------
+
+Custom exceptions to be used in the Modbus code.
+'''
+
+
+
[docs]class ModbusException(Exception): + ''' Base modbus exception ''' + +
[docs] def __init__(self, string): + ''' Initialize the exception + :param string: The message to append to the error + ''' + self.string = string
+ + def __str__(self): + return 'Modbus Error: %s' % self.string
+ + +
[docs]class ModbusIOException(ModbusException): + ''' Error resulting from data i/o ''' + +
[docs] def __init__(self, string=""): + ''' Initialize the exception + :param string: The message to append to the error + ''' + message = "[Input/Output] %s" % string + ModbusException.__init__(self, message)
+ + +
[docs]class ParameterException(ModbusException): + ''' Error resulting from invalid parameter ''' + +
[docs] def __init__(self, string=""): + ''' Initialize the exception + + :param string: The message to append to the error + ''' + message = "[Invalid Parameter] %s" % string + ModbusException.__init__(self, message)
+ + +class NoSuchSlaveException(ModbusException): + ''' Error resulting from making a request to a slave + that does not exist ''' + + def __init__(self, string=""): + ''' Initialize the exception + + :param string: The message to append to the error + ''' + message = "[No Such Slave] %s" % string + ModbusException.__init__(self, message) + + +
[docs]class NotImplementedException(ModbusException): + ''' Error resulting from not implemented function ''' + +
[docs] def __init__(self, string=""): + ''' Initialize the exception + :param string: The message to append to the error + ''' + message = "[Not Implemented] %s" % string + ModbusException.__init__(self, message)
+ + +class ConnectionException(ModbusException): + ''' Error resulting from a bad connection ''' + + def __init__(self, string=""): + ''' Initialize the exception + + :param string: The message to append to the error + ''' + message = "[Connection] %s" % string + ModbusException.__init__(self, message) + +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ModbusException", "ModbusIOException", + "ParameterException", "NotImplementedException", + "ConnectionException", "NoSuchSlaveException", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/factory.html b/doc/sphinx/html/_modules/pymodbus/factory.html new file mode 100644 index 000000000..4c91f32bd --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/factory.html @@ -0,0 +1,347 @@ + + + + + + + + pymodbus.factory — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.factory

+"""
+Modbus Request/Response Decoder Factories
+-------------------------------------------
+
+The following factories make it easy to decode request/response messages.
+To add a new request/response pair to be decodeable by the library, simply
+add them to the respective function lookup table (order doesn't matter, but
+it does help keep things organized).
+
+Regardless of how many functions are added to the lookup, O(1) behavior is
+kept as a result of a pre-computed lookup dictionary.
+"""
+
+from pymodbus.pdu import IllegalFunctionRequest
+from pymodbus.pdu import ExceptionResponse
+from pymodbus.pdu import ModbusExceptions as ecode
+from pymodbus.interfaces import IModbusDecoder
+from pymodbus.exceptions import ModbusException
+from pymodbus.bit_read_message import *
+from pymodbus.bit_write_message import *
+from pymodbus.diag_message import *
+from pymodbus.file_message import *
+from pymodbus.other_message import *
+from pymodbus.mei_message import *
+from pymodbus.register_read_message import *
+from pymodbus.register_write_message import *
+from pymodbus.compat import byte2int
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Server Decoder
+#---------------------------------------------------------------------------#
+
[docs]class ServerDecoder(IModbusDecoder): + ''' Request Message Factory (Server) + + To add more implemented functions, simply add them to the list + ''' + __function_table = [ + ReadHoldingRegistersRequest, + ReadDiscreteInputsRequest, + ReadInputRegistersRequest, + ReadCoilsRequest, + WriteMultipleCoilsRequest, + WriteMultipleRegistersRequest, + WriteSingleRegisterRequest, + WriteSingleCoilRequest, + ReadWriteMultipleRegistersRequest, + + DiagnosticStatusRequest, + + ReadExceptionStatusRequest, + GetCommEventCounterRequest, + GetCommEventLogRequest, + ReportSlaveIdRequest, + + ReadFileRecordRequest, + WriteFileRecordRequest, + MaskWriteRegisterRequest, + ReadFifoQueueRequest, + + ReadDeviceInformationRequest, + ] + __sub_function_table = [ + ReturnQueryDataRequest, + RestartCommunicationsOptionRequest, + ReturnDiagnosticRegisterRequest, + ChangeAsciiInputDelimiterRequest, + ForceListenOnlyModeRequest, + ClearCountersRequest, + ReturnBusMessageCountRequest, + ReturnBusCommunicationErrorCountRequest, + ReturnBusExceptionErrorCountRequest, + ReturnSlaveMessageCountRequest, + ReturnSlaveNoResponseCountRequest, + ReturnSlaveNAKCountRequest, + ReturnSlaveBusyCountRequest, + ReturnSlaveBusCharacterOverrunCountRequest, + ReturnIopOverrunCountRequest, + ClearOverrunCountRequest, + GetClearModbusPlusRequest, + + ReadDeviceInformationRequest, + ] + +
[docs] def __init__(self): + ''' Initializes the client lookup tables + ''' + functions = set(f.function_code for f in self.__function_table) + self.__lookup = dict([(f.function_code, f) for f in self.__function_table]) + self.__sub_lookup = dict((f, {}) for f in functions) + for f in self.__sub_function_table: + self.__sub_lookup[f.function_code][f.sub_function_code] = f
+ +
[docs] def decode(self, message): + ''' Wrapper to decode a request packet + + :param message: The raw modbus request packet + :return: The decoded modbus message or None if error + ''' + try: + return self._helper(message) + except ModbusException as er: + _logger.warning("Unable to decode request %s" % er) + return None
+ +
[docs] def lookupPduClass(self, function_code): + ''' Use `function_code` to determine the class of the PDU. + + :param function_code: The function code specified in a frame. + :returns: The class of the PDU that has a matching `function_code`. + ''' + return self.__lookup.get(function_code, ExceptionResponse)
+ +
[docs] def _helper(self, data): + ''' + This factory is used to generate the correct request object + from a valid request packet. This decodes from a list of the + currently implemented request types. + + :param data: The request packet to decode + :returns: The decoded request or illegal function request object + ''' + function_code = byte2int(data[0]) + _logger.debug("Factory Request[%d]" % function_code) + request = self.__lookup.get(function_code, lambda: None)() + if not request: + request = IllegalFunctionRequest(function_code) + request.decode(data[1:]) + + if hasattr(request, 'sub_function_code'): + lookup = self.__sub_lookup.get(request.function_code, {}) + subtype = lookup.get(request.sub_function_code, None) + if subtype: request.__class__ = subtype + + return request
+ + +#---------------------------------------------------------------------------# +# Client Decoder +#---------------------------------------------------------------------------# +
[docs]class ClientDecoder(IModbusDecoder): + ''' Response Message Factory (Client) + + To add more implemented functions, simply add them to the list + ''' + __function_table = [ + ReadHoldingRegistersResponse, + ReadDiscreteInputsResponse, + ReadInputRegistersResponse, + ReadCoilsResponse, + WriteMultipleCoilsResponse, + WriteMultipleRegistersResponse, + WriteSingleRegisterResponse, + WriteSingleCoilResponse, + ReadWriteMultipleRegistersResponse, + + DiagnosticStatusResponse, + + ReadExceptionStatusResponse, + GetCommEventCounterResponse, + GetCommEventLogResponse, + ReportSlaveIdResponse, + + ReadFileRecordResponse, + WriteFileRecordResponse, + MaskWriteRegisterResponse, + ReadFifoQueueResponse, + + ReadDeviceInformationResponse, + ] + __sub_function_table = [ + ReturnQueryDataResponse, + RestartCommunicationsOptionResponse, + ReturnDiagnosticRegisterResponse, + ChangeAsciiInputDelimiterResponse, + ForceListenOnlyModeResponse, + ClearCountersResponse, + ReturnBusMessageCountResponse, + ReturnBusCommunicationErrorCountResponse, + ReturnBusExceptionErrorCountResponse, + ReturnSlaveMessageCountResponse, + ReturnSlaveNoReponseCountResponse, + ReturnSlaveNAKCountResponse, + ReturnSlaveBusyCountResponse, + ReturnSlaveBusCharacterOverrunCountResponse, + ReturnIopOverrunCountResponse, + ClearOverrunCountResponse, + GetClearModbusPlusResponse, + + ReadDeviceInformationResponse, + ] + +
[docs] def __init__(self): + ''' Initializes the client lookup tables + ''' + functions = set(f.function_code for f in self.__function_table) + self.__lookup = dict([(f.function_code, f) for f in self.__function_table]) + self.__sub_lookup = dict((f, {}) for f in functions) + for f in self.__sub_function_table: + self.__sub_lookup[f.function_code][f.sub_function_code] = f
+ +
[docs] def lookupPduClass(self, function_code): + ''' Use `function_code` to determine the class of the PDU. + + :param function_code: The function code specified in a frame. + :returns: The class of the PDU that has a matching `function_code`. + ''' + return self.__lookup.get(function_code, ExceptionResponse)
+ +
[docs] def decode(self, message): + ''' Wrapper to decode a response packet + + :param message: The raw packet to decode + :return: The decoded modbus message or None if error + ''' + try: + return self._helper(message) + except ModbusException as er: + _logger.error("Unable to decode response %s" % er) + return None
+ +
[docs] def _helper(self, data): + ''' + This factory is used to generate the correct response object + from a valid response packet. This decodes from a list of the + currently implemented request types. + + :param data: The response packet to decode + :returns: The decoded request or an exception response object + ''' + function_code = byte2int(data[0]) + _logger.debug("Factory Response[%d]" % function_code) + response = self.__lookup.get(function_code, lambda: None)() + if function_code > 0x80: + code = function_code & 0x7f # strip error portion + response = ExceptionResponse(code, ecode.IllegalFunction) + if not response: + raise ModbusException("Unknown response %d" % function_code) + response.decode(data[1:]) + + if hasattr(response, 'sub_function_code'): + lookup = self.__sub_lookup.get(response.function_code, {}) + subtype = lookup.get(response.sub_function_code, None) + if subtype: response.__class__ = subtype + + return response
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = ['ServerDecoder', 'ClientDecoder'] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/file_message.html b/doc/sphinx/html/_modules/pymodbus/file_message.html new file mode 100644 index 000000000..670a5c638 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/file_message.html @@ -0,0 +1,576 @@ + + + + + + + + pymodbus.file_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.file_message

+'''
+File Record Read/Write Messages
+-------------------------------
+
+Currently none of these messages are implemented
+'''
+import struct
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.compat import byte2int
+
+
+#---------------------------------------------------------------------------#
+# File Record Types
+#---------------------------------------------------------------------------#
+
[docs]class FileRecord(object): + ''' Represents a file record and its relevant data. + ''' + +
[docs] def __init__(self, **kwargs): + ''' Initializes a new instance + + :params reference_type: Defaults to 0x06 (must be) + :params file_number: Indicates which file number we are reading + :params record_number: Indicates which record in the file + :params record_data: The actual data of the record + :params record_length: The length in registers of the record + :params response_length: The length in bytes of the record + ''' + self.reference_type = kwargs.get('reference_type', 0x06) + self.file_number = kwargs.get('file_number', 0x00) + self.record_number = kwargs.get('record_number', 0x00) + self.record_data = kwargs.get('record_data', '') + + self.record_length = kwargs.get('record_length', len(self.record_data) // 2) + self.response_length = kwargs.get('response_length', len(self.record_data) + 1)
+ +
[docs] def __eq__(self, relf): + ''' Compares the left object to the right + ''' + return self.reference_type == relf.reference_type \ + and self.file_number == relf.file_number \ + and self.record_number == relf.record_number \ + and self.record_length == relf.record_length \ + and self.record_data == relf.record_data
+ +
[docs] def __ne__(self, relf): + ''' Compares the left object to the right + ''' + return not self.__eq__(relf)
+ +
[docs] def __repr__(self): + ''' Gives a representation of the file record + ''' + params = (self.file_number, self.record_number, self.record_length) + return 'FileRecord(file=%d, record=%d, length=%d)' % params
+ + +#---------------------------------------------------------------------------# +# File Requests/Responses +#---------------------------------------------------------------------------# +
[docs]class ReadFileRecordRequest(ModbusRequest): + ''' + This function code is used to perform a file record read. All request + data lengths are provided in terms of number of bytes and all record + lengths are provided in terms of registers. + + A file is an organization of records. Each file contains 10000 records, + addressed 0000 to 9999 decimal or 0x0000 to 0x270f. For example, record + 12 is addressed as 12. The function can read multiple groups of + references. The groups can be separating (non-contiguous), but the + references within each group must be sequential. Each group is defined + in a seperate 'sub-request' field that contains seven bytes:: + + The reference type: 1 byte (must be 0x06) + The file number: 2 bytes + The starting record number within the file: 2 bytes + The length of the record to be read: 2 bytes + + The quantity of registers to be read, combined with all other fields + in the expected response, must not exceed the allowable length of the + MODBUS PDU: 235 bytes. + ''' + function_code = 0x14 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, records=None, **kwargs): + ''' Initializes a new instance + + :param records: The file record requests to be read + ''' + ModbusRequest.__init__(self, **kwargs) + self.records = records or []
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :returns: The byte encoded packet + ''' + packet = struct.pack('B', len(self.records) * 7) + for record in self.records: + packet += struct.pack('>BHHH', 0x06, record.file_number, + record.record_number, record.record_length) + return packet
+ +
[docs] def decode(self, data): + ''' Decodes the incoming request + + :param data: The data to decode into the address + ''' + self.records = [] + byte_count = byte2int(data[0]) + for count in range(1, byte_count, 7): + decoded = struct.unpack('>BHHH', data[count:count+7]) + record = FileRecord(file_number=decoded[1], + record_number=decoded[2], record_length=decoded[3]) + if decoded[0] == 0x06: self.records.append(record)
+ +
[docs] def execute(self, context): + ''' Run a read exeception status request against the store + + :param context: The datastore to request from + :returns: The populated response + ''' + # TODO do some new context operation here + # if file number, record number, or address + length + # is too big, return an error. + files = [] + return ReadFileRecordResponse(files)
+ + +
[docs]class ReadFileRecordResponse(ModbusResponse): + ''' + The normal response is a series of 'sub-responses,' one for each + 'sub-request.' The byte count field is the total combined count of + bytes in all 'sub-responses.' In addition, each 'sub-response' + contains a field that shows its own byte count. + ''' + function_code = 0x14 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, records=None, **kwargs): + ''' Initializes a new instance + + :param records: The requested file records + ''' + ModbusResponse.__init__(self, **kwargs) + self.records = records or []
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + total = sum(record.response_length + 1 for record in self.records) + packet = struct.pack('B', total) + for record in self.records: + packet += struct.pack('>BB', 0x06, record.record_length) + packet += record.record_data + return packet
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + count, self.records = 1, [] + byte_count = byte2int(data[0]) + while count < byte_count: + response_length, reference_type = struct.unpack('>BB', data[count:count+2]) + count += response_length + 1 # the count is not included + record = FileRecord(response_length=response_length, + record_data=data[count - response_length + 1:count]) + if reference_type == 0x06: self.records.append(record)
+ + +
[docs]class WriteFileRecordRequest(ModbusRequest): + ''' + This function code is used to perform a file record write. All + request data lengths are provided in terms of number of bytes + and all record lengths are provided in terms of the number of 16 + bit words. + ''' + function_code = 0x15 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, records=None, **kwargs): + ''' Initializes a new instance + + :param records: The file record requests to be read + ''' + ModbusRequest.__init__(self, **kwargs) + self.records = records or []
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :returns: The byte encoded packet + ''' + total_length = sum((record.record_length * 2) + 7 for record in self.records) + packet = struct.pack('B', total_length) + for record in self.records: + packet += struct.pack('>BHHH', 0x06, record.file_number, + record.record_number, record.record_length) + packet += record.record_data + return packet
+ +
[docs] def decode(self, data): + ''' Decodes the incoming request + + :param data: The data to decode into the address + ''' + count, self.records = 1, [] + byte_count = byte2int(data[0]) + while count < byte_count: + decoded = struct.unpack('>BHHH', data[count:count+7]) + response_length = decoded[3] * 2 + count += response_length + 7 + record = FileRecord(record_length=decoded[3], + file_number=decoded[1], record_number=decoded[2], + record_data=data[count - response_length:count]) + if decoded[0] == 0x06: self.records.append(record)
+ +
[docs] def execute(self, context): + ''' Run the write file record request against the context + + :param context: The datastore to request from + :returns: The populated response + ''' + # TODO do some new context operation here + # if file number, record number, or address + length + # is too big, return an error. + return WriteFileRecordResponse(self.records)
+ + +
[docs]class WriteFileRecordResponse(ModbusResponse): + ''' + The normal response is an echo of the request. + ''' + function_code = 0x15 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, records=None, **kwargs): + ''' Initializes a new instance + + :param records: The file record requests to be read + ''' + ModbusResponse.__init__(self, **kwargs) + self.records = records or []
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + total_length = sum((record.record_length * 2) + 7 for record in self.records) + packet = struct.pack('B', total_length) + for record in self.records: + packet += struct.pack('>BHHH', 0x06, record.file_number, + record.record_number, record.record_length) + packet += record.record_data + return packet
+ +
[docs] def decode(self, data): + ''' Decodes the incoming request + + :param data: The data to decode into the address + ''' + count, self.records = 1, [] + byte_count = byte2int(data[0]) + while count < byte_count: + decoded = struct.unpack('>BHHH', data[count:count+7]) + response_length = decoded[3] * 2 + count += response_length + 7 + record = FileRecord(record_length=decoded[3], + file_number=decoded[1], record_number=decoded[2], + record_data=data[count - response_length:count]) + if decoded[0] == 0x06: self.records.append(record)
+ + +class MaskWriteRegisterRequest(ModbusRequest): + ''' + This function code is used to modify the contents of a specified holding + register using a combination of an AND mask, an OR mask, and the + register's current contents. The function can be used to set or clear + individual bits in the register. + ''' + function_code = 0x16 + _rtu_frame_size = 10 + + + def __init__(self, address=0x0000, and_mask=0xffff, or_mask=0x0000, **kwargs): + ''' Initializes a new instance + + :param address: The mask pointer address (0x0000 to 0xffff) + :param and_mask: The and bitmask to apply to the register address + :param or_mask: The or bitmask to apply to the register address + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.and_mask = and_mask + self.or_mask = or_mask + + def encode(self): + ''' Encodes the request packet + + :returns: The byte encoded packet + ''' + return struct.pack('>HHH', self.address, self.and_mask, self.or_mask) + + def decode(self, data): + ''' Decodes the incoming request + + :param data: The data to decode into the address + ''' + self.address, self.and_mask, self.or_mask = struct.unpack('>HHH', data) + + def execute(self, context): + ''' Run a mask write register request against the store + + :param context: The datastore to request from + :returns: The populated response + ''' + if not (0x0000 <= self.and_mask <= 0xffff): + return self.doException(merror.IllegalValue) + if not (0x0000 <= self.or_mask <= 0xffff): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, 1): + return self.doException(merror.IllegalAddress) + values = context.getValues(self.function_code, self.address, 1)[0] + values = ((values & self.and_mask) | self.or_mask) + context.setValues(self.function_code, self.address, [values]) + return MaskWriteRegisterResponse(self.address, self.and_mask, self.or_mask) + + +class MaskWriteRegisterResponse(ModbusResponse): + ''' + The normal response is an echo of the request. The response is returned + after the register has been written. + ''' + function_code = 0x16 + _rtu_frame_size = 10 + + def __init__(self, address=0x0000, and_mask=0xffff, or_mask=0x0000, **kwargs): + ''' Initializes a new instance + + :param address: The mask pointer address (0x0000 to 0xffff) + :param and_mask: The and bitmask applied to the register address + :param or_mask: The or bitmask applied to the register address + ''' + ModbusResponse.__init__(self, **kwargs) + self.address = address + self.and_mask = and_mask + self.or_mask = or_mask + + def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + return struct.pack('>HHH', self.address, self.and_mask, self.or_mask) + + def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + self.address, self.and_mask, self.or_mask = struct.unpack('>HHH', data) + + +
[docs]class ReadFifoQueueRequest(ModbusRequest): + ''' + This function code allows to read the contents of a First-In-First-Out + (FIFO) queue of register in a remote device. The function returns a + count of the registers in the queue, followed by the queued data. + Up to 32 registers can be read: the count, plus up to 31 queued data + registers. + + The queue count register is returned first, followed by the queued data + registers. The function reads the queue contents, but does not clear + them. + ''' + function_code = 0x18 + _rtu_frame_size = 6 + +
[docs] def __init__(self, address=0x0000, **kwargs): + ''' Initializes a new instance + + :param address: The fifo pointer address (0x0000 to 0xffff) + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.values = [] # this should be added to the context
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :returns: The byte encoded packet + ''' + return struct.pack('>H', self.address)
+ +
[docs] def decode(self, data): + ''' Decodes the incoming request + + :param data: The data to decode into the address + ''' + self.address = struct.unpack('>H', data)[0]
+ +
[docs] def execute(self, context): + ''' Run a read exeception status request against the store + + :param context: The datastore to request from + :returns: The populated response + ''' + if not (0x0000 <= self.address <= 0xffff): + return self.doException(merror.IllegalValue) + if len(self.values) > 31: + return self.doException(merror.IllegalValue) + # TODO pull the values from some context + return ReadFifoQueueResponse(self.values)
+ + +
[docs]class ReadFifoQueueResponse(ModbusResponse): + ''' + In a normal response, the byte count shows the quantity of bytes to + follow, including the queue count bytes and value register bytes + (but not including the error check field). The queue count is the + quantity of data registers in the queue (not including the count register). + + If the queue count exceeds 31, an exception response is returned with an + error code of 03 (Illegal Data Value). + ''' + function_code = 0x18 + + @classmethod +
[docs] def calculateRtuFrameSize(cls, buffer): + ''' Calculates the size of the message + + :param buffer: A buffer containing the data that have been received. + :returns: The number of bytes in the response. + ''' + hi_byte = byte2int(buffer[2]) + lo_byte = byte2int(buffer[3]) + return (hi_byte << 16) + lo_byte + 6
+ +
[docs] def __init__(self, values=None, **kwargs): + ''' Initializes a new instance + + :param values: The list of values of the fifo to return + ''' + ModbusResponse.__init__(self, **kwargs) + self.values = values or []
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + length = len(self.values) * 2 + packet = struct.pack('>HH', 2 + length, length) + for value in self.values: + packet += struct.pack('>H', value) + return packet
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + self.values = [] + _, count = struct.unpack('>HH', data[0:4]) + for index in range(0, count - 4): + idx = 4 + index * 2 + self.values.append(struct.unpack('>H', data[idx:idx + 2])[0])
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "FileRecord", + "ReadFileRecordRequest", "ReadFileRecordResponse", + "WriteFileRecordRequest", "WriteFileRecordResponse", + "MaskWriteRegisterRequest", "MaskWriteRegisterResponse", + "ReadFifoQueueRequest", "ReadFifoQueueResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/interfaces.html b/doc/sphinx/html/_modules/pymodbus/interfaces.html new file mode 100644 index 000000000..a3c802e4b --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/interfaces.html @@ -0,0 +1,327 @@ + + + + + + + + pymodbus.interfaces — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.interfaces

+'''
+Pymodbus Interfaces
+---------------------
+
+A collection of base classes that are used throughout
+the pymodbus library.
+'''
+from pymodbus.exceptions import NotImplementedException
+
+
+#---------------------------------------------------------------------------#
+# Generic
+#---------------------------------------------------------------------------#
+
[docs]class Singleton(object): + ''' + Singleton base class + http://mail.python.org/pipermail/python-list/2007-July/450681.html + ''' +
[docs] def __new__(cls, *args, **kwargs): + ''' Create a new instance + ''' + if '_inst' not in vars(cls): + cls._inst = object.__new__(cls) + return cls._inst
+ + +#---------------------------------------------------------------------------# +# Project Specific +#---------------------------------------------------------------------------# +
[docs]class IModbusDecoder(object): + ''' Modbus Decoder Base Class + + This interface must be implemented by a modbus message + decoder factory. These factories are responsible for + abstracting away converting a raw packet into a request / response + message object. + ''' + +
[docs] def decode(self, message): + ''' Wrapper to decode a given packet + + :param message: The raw modbus request packet + :return: The decoded modbus message or None if error + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def lookupPduClass(self, function_code): + ''' Use `function_code` to determine the class of the PDU. + + :param function_code: The function code specified in a frame. + :returns: The class of the PDU that has a matching `function_code`. + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ + +
[docs]class IModbusFramer(object): + ''' + A framer strategy interface. The idea is that we abstract away all the + detail about how to detect if a current message frame exists, decoding + it, sending it, etc so that we can plug in a new Framer object (tcp, + rtu, ascii). + ''' + +
[docs] def checkFrame(self): + ''' Check and decode the next frame + + :returns: True if we successful, False otherwise + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def advanceFrame(self): + ''' Skip over the current framed message + This allows us to skip over the current message after we have processed + it or determined that it contains an error. It also has to reset the + current frame header handle + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def addToFrame(self, message): + ''' Add the next message to the frame buffer + + This should be used before the decoding while loop to add the received + data to the buffer handle. + + :param message: The most recent packet + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def isFrameReady(self): + ''' Check if we should continue decode logic + + This is meant to be used in a while loop in the decoding phase to let + the decoder know that there is still data in the buffer. + + :returns: True if ready, False otherwise + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def getFrame(self): + ''' Get the next frame from the buffer + + :returns: The frame data or '' + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def populateResult(self, result): + ''' Populates the modbus result with current frame header + + We basically copy the data back over from the current header + to the result header. This may not be needed for serial messages. + + :param result: The response packet + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def processIncomingPacket(self, data, callback): + ''' The new packet processing pattern + + This takes in a new request packet, adds it to the current + packet stream, and performs framing on it. That is, checks + for complete messages, and once found, will process all that + exist. This handles the case when we read N + 1 or 1 / N + messages at a time instead of 1. + + The processed and decoded messages are pushed to the callback + function to process and send. + + :param data: The new packet data + :param callback: The function to send results to + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ +
[docs] def buildPacket(self, message): + ''' Creates a ready to send modbus packet + + The raw packet is built off of a fully populated modbus + request / response message. + + :param message: The request/response to send + :returns: The built packet + ''' + raise NotImplementedException( + "Method not implemented by derived class")
+ + +
[docs]class IModbusSlaveContext(object): + ''' + Interface for a modbus slave data context + + Derived classes must implemented the following methods: + reset(self) + validate(self, fx, address, count=1) + getValues(self, fx, address, count=1) + setValues(self, fx, address, values) + ''' + __fx_mapper = {2: 'd', 4: 'i'} + __fx_mapper.update([(i, 'h') for i in [3, 6, 16, 22, 23]]) + __fx_mapper.update([(i, 'c') for i in [1, 5, 15]]) + +
[docs] def decode(self, fx): + ''' Converts the function code to the datastore to + + :param fx: The function we are working with + :returns: one of [d(iscretes),i(inputs),h(oliding),c(oils) + ''' + return self.__fx_mapper[fx]
+ +
[docs] def reset(self): + ''' Resets all the datastores to their default values + ''' + raise NotImplementedException("Context Reset")
+ +
[docs] def validate(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to test + :returns: True if the request in within range, False otherwise + ''' + raise NotImplementedException("validate context values")
+ +
[docs] def getValues(self, fx, address, count=1): + ''' Validates the request to make sure it is in range + + :param fx: The function we are working with + :param address: The starting address + :param count: The number of values to retrieve + :returns: The requested values from a:a+c + ''' + raise NotImplementedException("get context values")
+ +
[docs] def setValues(self, fx, address, values): + ''' Sets the datastore with the supplied values + + :param fx: The function we are working with + :param address: The starting address + :param values: The new values to be set + ''' + raise NotImplementedException("set context values")
+ + +
[docs]class IPayloadBuilder(object): + ''' + This is an interface to a class that can build a payload + for a modbus register write command. It should abstract + the codec for encoding data to the required format + (bcd, binary, char, etc). + ''' + +
[docs] def build(self): + ''' Return the payload buffer as a list + + This list is two bytes per element and can + thus be treated as a list of registers. + + :returns: The payload buffer as a list + ''' + raise NotImplementedException("set context values")
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + 'Singleton', + 'IModbusDecoder', 'IModbusFramer', 'IModbusSlaveContext', + 'IPayloadBuilder', +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/mei_message.html b/doc/sphinx/html/_modules/pymodbus/mei_message.html new file mode 100644 index 000000000..7f892182a --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/mei_message.html @@ -0,0 +1,256 @@ + + + + + + + + pymodbus.mei_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.mei_message

+'''
+Encapsulated Interface (MEI) Transport Messages
+-----------------------------------------------
+
+'''
+import struct
+from pymodbus.constants import DeviceInformation, MoreData
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.device import ModbusControlBlock
+from pymodbus.device import DeviceInformationFactory
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.compat import iteritems, byte2int
+
+_MCB = ModbusControlBlock()
+
+
+#---------------------------------------------------------------------------#
+# Read Device Information
+#---------------------------------------------------------------------------#
+
[docs]class ReadDeviceInformationRequest(ModbusRequest): + ''' + This function code allows reading the identification and additional + information relative to the physical and functional description of a + remote device, only. + + The Read Device Identification interface is modeled as an address space + composed of a set of addressable data elements. The data elements are + called objects and an object Id identifies them. + ''' + function_code = 0x2b + sub_function_code = 0x0e + _rtu_frame_size = 7 + +
[docs] def __init__(self, read_code=None, object_id=0x00, **kwargs): + ''' Initializes a new instance + + :param read_code: The device information read code + :param object_id: The object to read from + ''' + ModbusRequest.__init__(self, **kwargs) + self.read_code = read_code or DeviceInformation.Basic + self.object_id = object_id
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :returns: The byte encoded packet + ''' + packet = struct.pack('>BBB', self.sub_function_code, + self.read_code, self.object_id) + return packet
+ +
[docs] def decode(self, data): + ''' Decodes data part of the message. + + :param data: The incoming data + ''' + params = struct.unpack('>BBB', data) + self.sub_function_code, self.read_code, self.object_id = params
+ +
[docs] def execute(self, context): + ''' Run a read exeception status request against the store + + :param context: The datastore to request from + :returns: The populated response + ''' + if not (0x00 <= self.object_id <= 0xff): + return self.doException(merror.IllegalValue) + if not (0x00 <= self.read_code <= 0x04): + return self.doException(merror.IllegalValue) + + information = DeviceInformationFactory.get(_MCB, + self.read_code, self.object_id) + return ReadDeviceInformationResponse(self.read_code, information)
+ +
[docs] def __str__(self): + ''' Builds a representation of the request + + :returns: The string representation of the request + ''' + params = (self.read_code, self.object_id) + return "ReadDeviceInformationRequest(%d,%d)" % params
+ + +
[docs]class ReadDeviceInformationResponse(ModbusResponse): + ''' + ''' + function_code = 0x2b + sub_function_code = 0x0e + + @classmethod +
[docs] def calculateRtuFrameSize(cls, buffer): + ''' Calculates the size of the message + + :param buffer: A buffer containing the data that have been received. + :returns: The number of bytes in the response. + ''' + size = 8 # skip the header information + count = byte2int(buffer[7]) + + while count > 0: + _, object_length = struct.unpack('>BB', buffer[size:size+2]) + size += object_length + 2 + count -= 1 + return size + 2
+ +
[docs] def __init__(self, read_code=None, information=None, **kwargs): + ''' Initializes a new instance + + :param read_code: The device information read code + :param information: The requested information request + ''' + ModbusResponse.__init__(self, **kwargs) + self.read_code = read_code or DeviceInformation.Basic + self.information = information or {} + self.number_of_objects = len(self.information) + self.conformity = 0x83 # I support everything right now + + # TODO calculate + self.next_object_id = 0x00 # self.information[-1](0) + self.more_follows = MoreData.Nothing
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + packet = struct.pack('>BBBBBB', self.sub_function_code, + self.read_code, self.conformity, self.more_follows, + self.next_object_id, self.number_of_objects) + + for (object_id, data) in iteritems(self.information): + packet += struct.pack('>BB', object_id, len(data)) + packet += data.encode() + return packet
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + params = struct.unpack('>BBBBBB', data[0:6]) + self.sub_function_code, self.read_code = params[0:2] + self.conformity, self.more_follows = params[2:4] + self.next_object_id, self.number_of_objects = params[4:6] + self.information, count = {}, 6 # skip the header information + + while count < len(data): + object_id, object_length = struct.unpack('>BB', data[count:count+2]) + count += object_length + 2 + self.information[object_id] = data[count-object_length:count]
+ +
[docs] def __str__(self): + ''' Builds a representation of the response + + :returns: The string representation of the response + ''' + return "ReadDeviceInformationResponse(%d)" % self.read_code
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ReadDeviceInformationRequest", "ReadDeviceInformationResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/other_message.html b/doc/sphinx/html/_modules/pymodbus/other_message.html new file mode 100644 index 000000000..4e755b533 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/other_message.html @@ -0,0 +1,533 @@ + + + + + + + + pymodbus.other_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.other_message

+'''
+Diagnostic record read/write
+
+Currently not all implemented
+'''
+import struct
+from pymodbus.constants import ModbusStatus
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.device import ModbusControlBlock
+from pymodbus.compat import byte2int, int2byte
+
+_MCB = ModbusControlBlock()
+
+
+#---------------------------------------------------------------------------#
+# TODO Make these only work on serial
+#---------------------------------------------------------------------------#
+
[docs]class ReadExceptionStatusRequest(ModbusRequest): + ''' + This function code is used to read the contents of eight Exception Status + outputs in a remote device. The function provides a simple method for + accessing this information, because the Exception Output references are + known (no output reference is needed in the function). + ''' + function_code = 0x07 + _rtu_frame_size = 4 + +
[docs] def __init__(self, **kwargs): + ''' Initializes a new instance + ''' + ModbusRequest.__init__(self, **kwargs)
+ +
[docs] def encode(self): + ''' Encodes the message + ''' + return b''
+ +
[docs] def decode(self, data): + ''' Decodes data part of the message. + + :param data: The incoming data + ''' + pass
+ +
[docs] def execute(self): + ''' Run a read exeception status request against the store + + :returns: The populated response + ''' + status = _MCB.Counter.summary() + return ReadExceptionStatusResponse(status)
+ +
[docs] def __str__(self): + ''' Builds a representation of the request + + :returns: The string representation of the request + ''' + return "ReadExceptionStatusRequest(%d)" % (self.function_code)
+ + +
[docs]class ReadExceptionStatusResponse(ModbusResponse): + ''' + The normal response contains the status of the eight Exception Status + outputs. The outputs are packed into one data byte, with one bit + per output. The status of the lowest output reference is contained + in the least significant bit of the byte. The contents of the eight + Exception Status outputs are device specific. + ''' + function_code = 0x07 + _rtu_frame_size = 5 + +
[docs] def __init__(self, status=0x00, **kwargs): + ''' Initializes a new instance + + :param status: The status response to report + ''' + ModbusResponse.__init__(self, **kwargs) + self.status = status
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + return struct.pack('>B', self.status)
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + self.status = byte2int(data[0])
+ +
[docs] def __str__(self): + ''' Builds a representation of the response + + :returns: The string representation of the response + ''' + arguments = (self.function_code, self.status) + return "ReadExceptionStatusResponse(%d, %s)" % arguments
+ +# Encapsulate interface transport 43, 14 +# CANopen general reference 43, 13 + + +#---------------------------------------------------------------------------# +# TODO Make these only work on serial +#---------------------------------------------------------------------------# +
[docs]class GetCommEventCounterRequest(ModbusRequest): + ''' + This function code is used to get a status word and an event count from + the remote device's communication event counter. + + By fetching the current count before and after a series of messages, a + client can determine whether the messages were handled normally by the + remote device. + + The device's event counter is incremented once for each successful + message completion. It is not incremented for exception responses, + poll commands, or fetch event counter commands. + + The event counter can be reset by means of the Diagnostics function + (code 08), with a subfunction of Restart Communications Option + (code 00 01) or Clear Counters and Diagnostic Register (code 00 0A). + ''' + function_code = 0x0b + _rtu_frame_size = 4 + +
[docs] def __init__(self, **kwargs): + ''' Initializes a new instance + ''' + ModbusRequest.__init__(self, **kwargs)
+ +
[docs] def encode(self): + ''' Encodes the message + ''' + return b''
+ +
[docs] def decode(self, data): + ''' Decodes data part of the message. + + :param data: The incoming data + ''' + pass
+ +
[docs] def execute(self): + ''' Run a read exeception status request against the store + + :returns: The populated response + ''' + status = _MCB.Counter.Event + return GetCommEventCounterResponse(status)
+ +
[docs] def __str__(self): + ''' Builds a representation of the request + + :returns: The string representation of the request + ''' + return "GetCommEventCounterRequest(%d)" % (self.function_code)
+ + +
[docs]class GetCommEventCounterResponse(ModbusResponse): + ''' + The normal response contains a two-byte status word, and a two-byte + event count. The status word will be all ones (FF FF hex) if a + previously-issued program command is still being processed by the + remote device (a busy condition exists). Otherwise, the status word + will be all zeros. + ''' + function_code = 0x0b + _rtu_frame_size = 8 + +
[docs] def __init__(self, count=0x0000, **kwargs): + ''' Initializes a new instance + + :param count: The current event counter value + ''' + ModbusResponse.__init__(self, **kwargs) + self.count = count + self.status = True # this means we are ready, not waiting
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + if self.status: ready = ModbusStatus.Ready + else: ready = ModbusStatus.Waiting + return struct.pack('>HH', ready, self.count)
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + ready, self.count = struct.unpack('>HH', data) + self.status = (ready == ModbusStatus.Ready)
+ +
[docs] def __str__(self): + ''' Builds a representation of the response + + :returns: The string representation of the response + ''' + arguments = (self.function_code, self.count, self.status) + return "GetCommEventCounterResponse(%d, %d, %d)" % arguments
+ + +#---------------------------------------------------------------------------# +# TODO Make these only work on serial +#---------------------------------------------------------------------------# +class GetCommEventLogRequest(ModbusRequest): + ''' + This function code is used to get a status word, event count, message + count, and a field of event bytes from the remote device. + + The status word and event counts are identical to that returned by + the Get Communications Event Counter function (11, 0B hex). + + The message counter contains the quantity of messages processed by the + remote device since its last restart, clear counters operation, or + power-up. This count is identical to that returned by the Diagnostic + function (code 08), sub-function Return Bus Message Count (code 11, + 0B hex). + + The event bytes field contains 0-64 bytes, with each byte corresponding + to the status of one MODBUS send or receive operation for the remote + device. The remote device enters the events into the field in + chronological order. Byte 0 is the most recent event. Each new byte + flushes the oldest byte from the field. + ''' + function_code = 0x0c + _rtu_frame_size = 4 + + def __init__(self, **kwargs): + ''' Initializes a new instance + ''' + ModbusRequest.__init__(self, **kwargs) + + def encode(self): + ''' Encodes the message + ''' + return b'' + + def decode(self, data): + ''' Decodes data part of the message. + + :param data: The incoming data + ''' + pass + + def execute(self): + ''' Run a read exeception status request against the store + + :returns: The populated response + ''' + results = { + 'status' : True, + 'message_count' : _MCB.Counter.BusMessage, + 'event_count' : _MCB.Counter.Event, + 'events' : _MCB.getEvents(), + } + return GetCommEventLogResponse(**results) + + def __str__(self): + ''' Builds a representation of the request + + :returns: The string representation of the request + ''' + return "GetCommEventLogRequest(%d)" % self.function_code + + +class GetCommEventLogResponse(ModbusResponse): + ''' + The normal response contains a two-byte status word field, + a two-byte event count field, a two-byte message count field, + and a field containing 0-64 bytes of events. A byte count + field defines the total length of the data in these four field + ''' + function_code = 0x0c + _rtu_byte_count_pos = 3 + + def __init__(self, **kwargs): + ''' Initializes a new instance + + :param status: The status response to report + :param message_count: The current message count + :param event_count: The current event count + :param events: The collection of events to send + ''' + ModbusResponse.__init__(self, **kwargs) + self.status = kwargs.get('status', True) + self.message_count = kwargs.get('message_count', 0) + self.event_count = kwargs.get('event_count', 0) + self.events = kwargs.get('events', []) + + def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + if self.status: ready = ModbusStatus.Ready + else: ready = ModbusStatus.Waiting + packet = struct.pack('>B', 6 + len(self.events)) + packet += struct.pack('>H', ready) + packet += struct.pack('>HH', self.event_count, self.message_count) + packet += b''.join(struct.pack('>B', e) for e in self.events) + return packet + + def decode(self, data): + ''' Decodes a the response + + :param data: The packet data to decode + ''' + length = byte2int(data[0]) + status = struct.unpack('>H', data[1:3])[0] + self.status = (status == ModbusStatus.Ready) + self.event_count = struct.unpack('>H', data[3:5])[0] + self.message_count = struct.unpack('>H', data[5:7])[0] + + self.events = [] + for e in range(7, length + 1): + self.events.append(byte2int(data[e])) + + def __str__(self): + ''' Builds a representation of the response + + :returns: The string representation of the response + ''' + arguments = (self.function_code, self.status, self.message_count, self.event_count) + return "GetCommEventLogResponse(%d, %d, %d, %d)" % arguments + + +#---------------------------------------------------------------------------# +# TODO Make these only work on serial +#---------------------------------------------------------------------------# +
[docs]class ReportSlaveIdRequest(ModbusRequest): + ''' + This function code is used to read the description of the type, the + current status, and other information specific to a remote device. + ''' + function_code = 0x11 + _rtu_frame_size = 4 + +
[docs] def __init__(self, **kwargs): + ''' Initializes a new instance + ''' + ModbusRequest.__init__(self, **kwargs)
+ +
[docs] def encode(self): + ''' Encodes the message + ''' + return b''
+ +
[docs] def decode(self, data): + ''' Decodes data part of the message. + + :param data: The incoming data + ''' + pass
+ +
[docs] def execute(self): + ''' Run a read exeception status request against the store + + :returns: The populated response + ''' + identifier = b'\x70\x79\x6d\x6f\x64\x62\x75\x73' + return ReportSlaveIdResponse(identifier)
+ +
[docs] def __str__(self): + ''' Builds a representation of the request + + :returns: The string representation of the request + ''' + return "ResportSlaveIdRequest(%d)" % self.function_code
+ + +
[docs]class ReportSlaveIdResponse(ModbusResponse): + ''' + The format of a normal response is shown in the following example. + The data contents are specific to each type of device. + ''' + function_code = 0x11 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, identifier=b'\x00', status=True, **kwargs): + ''' Initializes a new instance + + :param identifier: The identifier of the slave + :param status: The status response to report + ''' + ModbusResponse.__init__(self, **kwargs) + self.identifier = identifier + self.status = status
+ +
[docs] def encode(self): + ''' Encodes the response + + :returns: The byte encoded message + ''' + if self.status: status = ModbusStatus.SlaveOn + else: status = ModbusStatus.SlaveOff + length = len(self.identifier) + 2 + packet = int2byte(length) + packet += self.identifier # we assume it is already encoded + packet += int2byte(status) + return packet
+ +
[docs] def decode(self, data): + ''' Decodes a the response + + Since the identifier is device dependent, we just return the + raw value that a user can decode to whatever it should be. + + :param data: The packet data to decode + ''' + length = byte2int(data[0]) + self.identifier = data[1:length + 1] + status = byte2int(data[-1]) + self.status = status == ModbusStatus.SlaveOn
+ +
[docs] def __str__(self): + ''' Builds a representation of the response + + :returns: The string representation of the response + ''' + arguments = (self.function_code, self.identifier, self.status) + return "ResportSlaveIdResponse(%d, %d, %d)" % arguments
+ +#---------------------------------------------------------------------------# +# TODO Make these only work on serial +#---------------------------------------------------------------------------# +# report device identification 43, 14 + +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ReadExceptionStatusRequest", "ReadExceptionStatusResponse", + "GetCommEventCounterRequest", "GetCommEventCounterResponse", + "GetCommEventLogRequest", "GetCommEventLogResponse", + "ReportSlaveIdRequest", "ReportSlaveIdResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/payload.html b/doc/sphinx/html/_modules/pymodbus/payload.html new file mode 100644 index 000000000..5e86e02ef --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/payload.html @@ -0,0 +1,432 @@ + + + + + + + + pymodbus.payload — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.payload

+'''
+Modbus Payload Builders
+------------------------
+
+A collection of utilities for building and decoding
+modbus messages payloads.
+'''
+from struct import pack, unpack
+from pymodbus.interfaces import IPayloadBuilder
+from pymodbus.constants import Endian
+from pymodbus.utilities import pack_bitstring
+from pymodbus.utilities import unpack_bitstring
+from pymodbus.exceptions import ParameterException
+
+
+
[docs]class BinaryPayloadBuilder(IPayloadBuilder): + ''' + A utility that helps build payload messages to be + written with the various modbus messages. It really is just + a simple wrapper around the struct module, however it saves + time looking up the format strings. What follows is a simple + example:: + + builder = BinaryPayloadBuilder(endian=Endian.Little) + builder.add_8bit_uint(1) + builder.add_16bit_uint(2) + payload = builder.build() + ''' + +
[docs] def __init__(self, payload=None, endian=Endian.Little): + ''' Initialize a new instance of the payload builder + + :param payload: Raw payload data to initialize with + :param endian: The endianess of the payload + ''' + self._payload = payload or [] + self._endian = endian
+ +
[docs] def to_string(self): + ''' Return the payload buffer as a string + + :returns: The payload buffer as a string + ''' + return b''.join(self._payload)
+ +
[docs] def __str__(self): + ''' Return the payload buffer as a string + + :returns: The payload buffer as a string + ''' + return self.to_string().decode('utf-8')
+ +
[docs] def reset(self): + ''' Reset the payload buffer + ''' + self._payload = []
+ +
[docs] def to_registers(self): + ''' Convert the payload buffer into a register + layout that can be used as a context block. + + :returns: The register layout to use as a block + ''' + fstring = self._endian + 'H' + payload = self.build() + return [unpack(fstring, value)[0] for value in payload]
+ +
[docs] def build(self): + ''' Return the payload buffer as a list + + This list is two bytes per element and can + thus be treated as a list of registers. + + :returns: The payload buffer as a list + ''' + string = self.to_string() + length = len(string) + string = string + (b'\x00' * (length % 2)) + return [string[i:i+2] for i in range(0, length, 2)]
+ +
[docs] def add_bits(self, values): + ''' Adds a collection of bits to be encoded + + If these are less than a multiple of eight, + they will be left padded with 0 bits to make + it so. + + :param value: The value to add to the buffer + ''' + value = pack_bitstring(values) + self._payload.append(value)
+ +
[docs] def add_8bit_uint(self, value): + ''' Adds a 8 bit unsigned int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'B' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_16bit_uint(self, value): + ''' Adds a 16 bit unsigned int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'H' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_32bit_uint(self, value): + ''' Adds a 32 bit unsigned int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'I' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_64bit_uint(self, value): + ''' Adds a 64 bit unsigned int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'Q' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_8bit_int(self, value): + ''' Adds a 8 bit signed int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'b' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_16bit_int(self, value): + ''' Adds a 16 bit signed int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'h' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_32bit_int(self, value): + ''' Adds a 32 bit signed int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'i' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_64bit_int(self, value): + ''' Adds a 64 bit signed int to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'q' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_32bit_float(self, value): + ''' Adds a 32 bit float to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'f' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_64bit_float(self, value): + ''' Adds a 64 bit float(double) to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + 'd' + self._payload.append(pack(fstring, value))
+ +
[docs] def add_string(self, value): + ''' Adds a string to the buffer + + :param value: The value to add to the buffer + ''' + fstring = self._endian + str(len(value)) + 's' + self._payload.append(pack(fstring, value))
+ + +
[docs]class BinaryPayloadDecoder(object): + ''' + A utility that helps decode payload messages from a modbus + reponse message. It really is just a simple wrapper around + the struct module, however it saves time looking up the format + strings. What follows is a simple example:: + + decoder = BinaryPayloadDecoder(payload) + first = decoder.decode_8bit_uint() + second = decoder.decode_16bit_uint() + ''' + +
[docs] def __init__(self, payload, endian=Endian.Little): + ''' Initialize a new payload decoder + + :param payload: The payload to decode with + :param endian: The endianess of the payload + ''' + self._payload = payload + self._pointer = 0x00 + self._endian = endian
+ + @classmethod +
[docs] def fromRegisters(klass, registers, endian=Endian.Little): + ''' Initialize a payload decoder with the result of + reading a collection of registers from a modbus device. + + The registers are treated as a list of 2 byte values. + We have to do this because of how the data has already + been decoded by the rest of the library. + + :param registers: The register results to initialize with + :param endian: The endianess of the payload + :returns: An initialized PayloadDecoder + ''' + if isinstance(registers, list): # repack into flat binary + payload = b''.join(pack(endian + 'H', x) for x in registers) + return klass(payload, endian) + raise ParameterException('Invalid collection of registers supplied')
+ + @classmethod +
[docs] def fromCoils(klass, coils, endian=Endian.Little): + ''' Initialize a payload decoder with the result of + reading a collection of coils from a modbus device. + + The coils are treated as a list of bit(boolean) values. + + :param coils: The coil results to initialize with + :param endian: The endianess of the payload + :returns: An initialized PayloadDecoder + ''' + if isinstance(coils, list): + payload = pack_bitstring(coils) + return klass(payload, endian) + raise ParameterException('Invalid collection of coils supplied')
+ +
[docs] def reset(self): + ''' Reset the decoder pointer back to the start + ''' + self._pointer = 0x00
+ +
[docs] def decode_8bit_uint(self): + ''' Decodes a 8 bit unsigned int from the buffer + ''' + self._pointer += 1 + fstring = self._endian + 'B' + handle = self._payload[self._pointer - 1:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_bits(self): + ''' Decodes a byte worth of bits from the buffer + ''' + self._pointer += 1 + fstring = self._endian + 'B' + handle = self._payload[self._pointer - 1:self._pointer] + return unpack_bitstring(handle)
+ +
[docs] def decode_16bit_uint(self): + ''' Decodes a 16 bit unsigned int from the buffer + ''' + self._pointer += 2 + fstring = self._endian + 'H' + handle = self._payload[self._pointer - 2:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_32bit_uint(self): + ''' Decodes a 32 bit unsigned int from the buffer + ''' + self._pointer += 4 + fstring = self._endian + 'I' + handle = self._payload[self._pointer - 4:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_64bit_uint(self): + ''' Decodes a 64 bit unsigned int from the buffer + ''' + self._pointer += 8 + fstring = self._endian + 'Q' + handle = self._payload[self._pointer - 8:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_8bit_int(self): + ''' Decodes a 8 bit signed int from the buffer + ''' + self._pointer += 1 + fstring = self._endian + 'b' + handle = self._payload[self._pointer - 1:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_16bit_int(self): + ''' Decodes a 16 bit signed int from the buffer + ''' + self._pointer += 2 + fstring = self._endian + 'h' + handle = self._payload[self._pointer - 2:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_32bit_int(self): + ''' Decodes a 32 bit signed int from the buffer + ''' + self._pointer += 4 + fstring = self._endian + 'i' + handle = self._payload[self._pointer - 4:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_64bit_int(self): + ''' Decodes a 64 bit signed int from the buffer + ''' + self._pointer += 8 + fstring = self._endian + 'q' + handle = self._payload[self._pointer - 8:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_32bit_float(self): + ''' Decodes a 32 bit float from the buffer + ''' + self._pointer += 4 + fstring = self._endian + 'f' + handle = self._payload[self._pointer - 4:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_64bit_float(self): + ''' Decodes a 64 bit float(double) from the buffer + ''' + self._pointer += 8 + fstring = self._endian + 'd' + handle = self._payload[self._pointer - 8:self._pointer] + return unpack(fstring, handle)[0]
+ +
[docs] def decode_string(self, size=1): + ''' Decodes a string from the buffer + + :param size: The size of the string to decode + ''' + self._pointer += size + return self._payload[self._pointer - size:self._pointer]
+ +#---------------------------------------------------------------------------# +# Exported Identifiers +#---------------------------------------------------------------------------# +__all__ = ["BinaryPayloadBuilder", "BinaryPayloadDecoder"] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/pdu.html b/doc/sphinx/html/_modules/pymodbus/pdu.html new file mode 100644 index 000000000..50659e9cf --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/pdu.html @@ -0,0 +1,330 @@ + + + + + + + + pymodbus.pdu — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.pdu

+'''
+Contains base classes for modbus request/response/error packets
+'''
+from pymodbus.interfaces import Singleton
+from pymodbus.exceptions import NotImplementedException
+from pymodbus.constants import Defaults
+from pymodbus.utilities import rtuFrameSize
+from pymodbus.compat import iteritems, int2byte, byte2int
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Base PDU's
+#---------------------------------------------------------------------------#
+
[docs]class ModbusPDU(object): + ''' + Base class for all Modbus mesages + + .. attribute:: transaction_id + + This value is used to uniquely identify a request + response pair. It can be implemented as a simple counter + + .. attribute:: protocol_id + + This is a constant set at 0 to indicate Modbus. It is + put here for ease of expansion. + + .. attribute:: unit_id + + This is used to route the request to the correct child. In + the TCP modbus, it is used for routing (or not used at all. However, + for the serial versions, it is used to specify which child to perform + the requests against. The value 0x00 represents the broadcast address + (also 0xff). + + .. attribute:: check + + This is used for LRC/CRC in the serial modbus protocols + + .. attribute:: skip_encode + + This is used when the message payload has already been encoded. + Generally this will occur when the PayloadBuilder is being used + to create a complicated message. By setting this to True, the + request will pass the currently encoded message through instead + of encoding it again. + ''' + +
[docs] def __init__(self, **kwargs): + ''' Initializes the base data for a modbus request ''' + self.transaction_id = kwargs.get('transaction', Defaults.TransactionId) + self.protocol_id = kwargs.get('protocol', Defaults.ProtocolId) + self.unit_id = kwargs.get('unit', Defaults.UnitId) + self.skip_encode = kwargs.get('skip_encode', False) + self.check = 0x0000
+ +
[docs] def encode(self): + ''' Encodes the message + + :raises: A not implemented exception + ''' + raise NotImplementedException()
+ +
[docs] def decode(self, data): + ''' Decodes data part of the message. + + :param data: is a string object + :raises: A not implemented exception + ''' + raise NotImplementedException()
+ + @classmethod +
[docs] def calculateRtuFrameSize(cls, buffer): + ''' Calculates the size of a PDU. + + :param buffer: A buffer containing the data that have been received. + :returns: The number of bytes in the PDU. + ''' + if hasattr(cls, '_rtu_frame_size'): + return cls._rtu_frame_size + elif hasattr(cls, '_rtu_byte_count_pos'): + return rtuFrameSize(buffer, cls._rtu_byte_count_pos) + else: raise NotImplementedException( + "Cannot determine RTU frame size for %s" % cls.__name__)
+ + +
[docs]class ModbusRequest(ModbusPDU): + ''' Base class for a modbus request PDU ''' + +
[docs] def __init__(self, **kwargs): + ''' Proxy to the lower level initializer ''' + ModbusPDU.__init__(self, **kwargs)
+ +
[docs] def doException(self, exception): + ''' Builds an error response based on the function + + :param exception: The exception to return + :raises: An exception response + ''' + _logger.error("Exception Response F(%d) E(%d)" % + (self.function_code, exception)) + return ExceptionResponse(self.function_code, exception)
+ + +
[docs]class ModbusResponse(ModbusPDU): + ''' Base class for a modbus response PDU + + .. attribute:: should_respond + + A flag that indicates if this response returns a result back + to the client issuing the request + + .. attribute:: _rtu_frame_size + + Indicates the size of the modbus rtu response used for + calculating how much to read. + ''' + + should_respond = True + +
[docs] def __init__(self, **kwargs): + ''' Proxy to the lower level initializer ''' + ModbusPDU.__init__(self, **kwargs)
+ + +#---------------------------------------------------------------------------# +# Exception PDU's +#---------------------------------------------------------------------------# +
[docs]class ModbusExceptions(Singleton): + ''' + An enumeration of the valid modbus exceptions + ''' + IllegalFunction = 0x01 + IllegalAddress = 0x02 + IllegalValue = 0x03 + SlaveFailure = 0x04 + Acknowledge = 0x05 + SlaveBusy = 0x06 + MemoryParityError = 0x08 + GatewayPathUnavailable = 0x0A + GatewayNoResponse = 0x0B + + @classmethod +
[docs] def decode(cls, code): + ''' Given an error code, translate it to a + string error name. + + :param code: The code number to translate + ''' + values = dict((v, k) for k, v in iteritems(cls.__dict__) + if not k.startswith('__') and not callable(v)) + return values.get(code, None)
+ + +
[docs]class ExceptionResponse(ModbusResponse): + ''' Base class for a modbus exception PDU ''' + ExceptionOffset = 0x80 + _rtu_frame_size = 5 + +
[docs] def __init__(self, function_code, exception_code=None, **kwargs): + ''' Initializes the modbus exception response + + :param function_code: The function to build an exception response for + :param exception_code: The specific modbus exception to return + ''' + ModbusResponse.__init__(self, **kwargs) + self.original_code = function_code + self.function_code = function_code | self.ExceptionOffset + self.exception_code = exception_code
+ +
[docs] def encode(self): + ''' Encodes a modbus exception response + + :returns: The encoded exception packet + ''' + return int2byte(self.exception_code)
+ +
[docs] def decode(self, data): + ''' Decodes a modbus exception response + + :param data: The packet data to decode + ''' + self.exception_code = byte2int(data[0])
+ +
[docs] def __str__(self): + ''' Builds a representation of an exception response + + :returns: The string representation of an exception response + ''' + message = ModbusExceptions.decode(self.exception_code) + parameters = (self.function_code, self.original_code, message) + return "Exception Response(%d, %d, %s)" % parameters
+ + +
[docs]class IllegalFunctionRequest(ModbusRequest): + ''' + Defines the Modbus slave exception type 'Illegal Function' + This exception code is returned if the slave:: + + - does not implement the function code **or** + - is not in a state that allows it to process the function + ''' + ErrorCode = 1 + +
[docs] def __init__(self, function_code, **kwargs): + ''' Initializes a IllegalFunctionRequest + + :param function_code: The function we are erroring on + ''' + ModbusRequest.__init__(self, **kwargs) + self.function_code = function_code
+ +
[docs] def decode(self, data): + ''' This is here so this failure will run correctly + + :param data: Not used + ''' + pass
+ +
[docs] def execute(self, context): + ''' Builds an illegal function request error response + + :param context: The current context for the message + :returns: The error response packet + ''' + return ExceptionResponse(self.function_code, self.ErrorCode)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + 'ModbusRequest', 'ModbusResponse', 'ModbusExceptions', + 'ExceptionResponse', 'IllegalFunctionRequest', +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/register_read_message.html b/doc/sphinx/html/_modules/pymodbus/register_read_message.html new file mode 100644 index 000000000..660d248d4 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/register_read_message.html @@ -0,0 +1,442 @@ + + + + + + + + pymodbus.register_read_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.register_read_message

+'''
+Register Reading Request/Response
+---------------------------------
+'''
+import struct
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.compat import int2byte, byte2int
+
+
+
[docs]class ReadRegistersRequestBase(ModbusRequest): + ''' + Base class for reading a modbus register + ''' + _rtu_frame_size = 8 + +
[docs] def __init__(self, address, count, **kwargs): + ''' Initializes a new instance + + :param address: The address to start the read from + :param count: The number of registers to read + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.count = count
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :return: The encoded packet + ''' + return struct.pack('>HH', self.address, self.count)
+ +
[docs] def decode(self, data): + ''' Decode a register request packet + + :param data: The request to decode + ''' + self.address, self.count = struct.unpack('>HH', data)
+ +
[docs] def get_response_pdu_size(self): + """ + Func_code (1 byte) + Byte Count(1 byte) + 2 * Quantity of Coils (n Bytes) + :return: + """ + return 1 + 1 + 2 * self.count
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "ReadRegisterRequest (%d,%d)" % (self.address, self.count)
+ + +
[docs]class ReadRegistersResponseBase(ModbusResponse): + ''' + Base class for responsing to a modbus register read + ''' + + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, values, **kwargs): + ''' Initializes a new instance + + :param values: The values to write to + ''' + ModbusResponse.__init__(self, **kwargs) + self.registers = values or []
+ +
[docs] def encode(self): + ''' Encodes the response packet + + :returns: The encoded packet + ''' + result = int2byte(len(self.registers) * 2) + for register in self.registers: + result += struct.pack('>H', register) + return result
+ +
[docs] def decode(self, data): + ''' Decode a register response packet + + :param data: The request to decode + ''' + byte_count = byte2int(data[0]) + self.registers = [] + for i in range(1, byte_count + 1, 2): + self.registers.append(struct.unpack('>H', data[i:i + 2])[0])
+ +
[docs] def getRegister(self, index): + ''' Get the requested register + + :param index: The indexed register to retrieve + :returns: The request register + ''' + return self.registers[index]
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "ReadRegisterResponse (%d)" % len(self.registers)
+ + +
[docs]class ReadHoldingRegistersRequest(ReadRegistersRequestBase): + ''' + This function code is used to read the contents of a contiguous block + of holding registers in a remote device. The Request PDU specifies the + starting register address and the number of registers. In the PDU + Registers are addressed starting at zero. Therefore registers numbered + 1-16 are addressed as 0-15. + ''' + function_code = 3 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Initializes a new instance of the request + + :param address: The starting address to read from + :param count: The number of registers to read from address + ''' + ReadRegistersRequestBase.__init__(self, address, count, **kwargs)
+ +
[docs] def execute(self, context): + ''' Run a read holding request against a datastore + + :param context: The datastore to request from + :returns: An initialized response, exception message otherwise + ''' + if not (1 <= self.count <= 0x7d): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, self.count): + return self.doException(merror.IllegalAddress) + values = context.getValues(self.function_code, self.address, self.count) + return ReadHoldingRegistersResponse(values)
+ + +
[docs]class ReadHoldingRegistersResponse(ReadRegistersResponseBase): + ''' + This function code is used to read the contents of a contiguous block + of holding registers in a remote device. The Request PDU specifies the + starting register address and the number of registers. In the PDU + Registers are addressed starting at zero. Therefore registers numbered + 1-16 are addressed as 0-15. + ''' + function_code = 3 + +
[docs] def __init__(self, values=None, **kwargs): + ''' Initializes a new response instance + + :param values: The resulting register values + ''' + ReadRegistersResponseBase.__init__(self, values, **kwargs)
+ + +
[docs]class ReadInputRegistersRequest(ReadRegistersRequestBase): + ''' + This function code is used to read from 1 to approx. 125 contiguous + input registers in a remote device. The Request PDU specifies the + starting register address and the number of registers. In the PDU + Registers are addressed starting at zero. Therefore input registers + numbered 1-16 are addressed as 0-15. + ''' + function_code = 4 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Initializes a new instance of the request + + :param address: The starting address to read from + :param count: The number of registers to read from address + ''' + ReadRegistersRequestBase.__init__(self, address, count, **kwargs)
+ +
[docs] def execute(self, context): + ''' Run a read input request against a datastore + + :param context: The datastore to request from + :returns: An initialized response, exception message otherwise + ''' + if not (1 <= self.count <= 0x7d): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, self.count): + return self.doException(merror.IllegalAddress) + values = context.getValues(self.function_code, self.address, self.count) + return ReadInputRegistersResponse(values)
+ + +
[docs]class ReadInputRegistersResponse(ReadRegistersResponseBase): + ''' + This function code is used to read from 1 to approx. 125 contiguous + input registers in a remote device. The Request PDU specifies the + starting register address and the number of registers. In the PDU + Registers are addressed starting at zero. Therefore input registers + numbered 1-16 are addressed as 0-15. + ''' + function_code = 4 + +
[docs] def __init__(self, values=None, **kwargs): + ''' Initializes a new response instance + + :param values: The resulting register values + ''' + ReadRegistersResponseBase.__init__(self, values, **kwargs)
+ + +
[docs]class ReadWriteMultipleRegistersRequest(ModbusRequest): + ''' + This function code performs a combination of one read operation and one + write operation in a single MODBUS transaction. The write + operation is performed before the read. + + Holding registers are addressed starting at zero. Therefore holding + registers 1-16 are addressed in the PDU as 0-15. + + The request specifies the starting address and number of holding + registers to be read as well as the starting address, number of holding + registers, and the data to be written. The byte count specifies the + number of bytes to follow in the write data field." + ''' + function_code = 23 + _rtu_byte_count_pos = 10 + +
[docs] def __init__(self, **kwargs): + ''' Initializes a new request message + + :param read_address: The address to start reading from + :param read_count: The number of registers to read from address + :param write_address: The address to start writing to + :param write_registers: The registers to write to the specified address + ''' + ModbusRequest.__init__(self, **kwargs) + self.read_address = kwargs.get('read_address', 0x00) + self.read_count = kwargs.get('read_count', 0) + self.write_address = kwargs.get('write_address', 0x00) + self.write_registers = kwargs.get('write_registers', None) + if not hasattr(self.write_registers, '__iter__'): + self.write_registers = [self.write_registers] + self.write_count = len(self.write_registers) + self.write_byte_count = self.write_count * 2
+ +
[docs] def encode(self): + ''' Encodes the request packet + + :returns: The encoded packet + ''' + result = struct.pack('>HHHHB', + self.read_address, self.read_count, \ + self.write_address, self.write_count, self.write_byte_count) + for register in self.write_registers: + result += struct.pack('>H', register) + return result
+ +
[docs] def decode(self, data): + ''' Decode the register request packet + + :param data: The request to decode + ''' + self.read_address, self.read_count, \ + self.write_address, self.write_count, \ + self.write_byte_count = struct.unpack('>HHHHB', data[:9]) + self.write_registers = [] + for i in range(9, self.write_byte_count + 9, 2): + register = struct.unpack('>H', data[i:i + 2])[0] + self.write_registers.append(register)
+ +
[docs] def execute(self, context): + ''' Run a write single register request against a datastore + + :param context: The datastore to request from + :returns: An initialized response, exception message otherwise + ''' + if not (1 <= self.read_count <= 0x07d): + return self.doException(merror.IllegalValue) + if not (1 <= self.write_count <= 0x079): + return self.doException(merror.IllegalValue) + if (self.write_byte_count != self.write_count * 2): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.write_address, + self.write_count): + return self.doException(merror.IllegalAddress) + if not context.validate(self.function_code, self.read_address, + self.read_count): + return self.doException(merror.IllegalAddress) + context.setValues(self.function_code, self.write_address, + self.write_registers) + registers = context.getValues(self.function_code, self.read_address, + self.read_count) + return ReadWriteMultipleRegistersResponse(registers)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + params = (self.read_address, self.read_count, self.write_address, + self.write_count) + return "ReadWriteNRegisterRequest R(%d,%d) W(%d,%d)" % params
+ + +
[docs]class ReadWriteMultipleRegistersResponse(ModbusResponse): + ''' + The normal response contains the data from the group of registers that + were read. The byte count field specifies the quantity of bytes to + follow in the read data field. + ''' + function_code = 23 + _rtu_byte_count_pos = 2 + +
[docs] def __init__(self, values=None, **kwargs): + ''' Initializes a new instance + + :param values: The register values to write + ''' + ModbusResponse.__init__(self, **kwargs) + self.registers = values or []
+ +
[docs] def encode(self): + ''' Encodes the response packet + + :returns: The encoded packet + ''' + result = int2byte(len(self.registers) * 2) + for register in self.registers: + result += struct.pack('>H', register) + return result
+ +
[docs] def decode(self, data): + ''' Decode the register response packet + + :param data: The response to decode + ''' + bytecount = byte2int(data[0]) + for i in range(1, bytecount, 2): + self.registers.append(struct.unpack('>H', data[i:i + 2])[0])
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "ReadWriteNRegisterResponse (%d)" % len(self.registers)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "ReadHoldingRegistersRequest", "ReadHoldingRegistersResponse", + "ReadInputRegistersRequest", "ReadInputRegistersResponse", + "ReadWriteMultipleRegistersRequest", "ReadWriteMultipleRegistersResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/register_write_message.html b/doc/sphinx/html/_modules/pymodbus/register_write_message.html new file mode 100644 index 000000000..15f34b204 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/register_write_message.html @@ -0,0 +1,337 @@ + + + + + + + + pymodbus.register_write_message — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.register_write_message

+'''
+Register Writing Request/Response Messages
+-------------------------------------------
+'''
+import struct
+from pymodbus.pdu import ModbusRequest
+from pymodbus.pdu import ModbusResponse
+from pymodbus.pdu import ModbusExceptions as merror
+
+
+
[docs]class WriteSingleRegisterRequest(ModbusRequest): + ''' + This function code is used to write a single holding register in a + remote device. + + The Request PDU specifies the address of the register to + be written. Registers are addressed starting at zero. Therefore register + numbered 1 is addressed as 0. + ''' + function_code = 6 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, value=None, **kwargs): + ''' Initializes a new instance + + :param address: The address to start writing add + :param value: The values to write + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + self.value = value
+ +
[docs] def encode(self): + ''' Encode a write single register packet packet request + + :returns: The encoded packet + ''' + if self.skip_encode: + return self.value + return struct.pack('>HH', self.address, self.value)
+ +
[docs] def decode(self, data): + ''' Decode a write single register packet packet request + + :param data: The request to decode + ''' + self.address, self.value = struct.unpack('>HH', data)
+ +
[docs] def execute(self, context): + ''' Run a write single register request against a datastore + + :param context: The datastore to request from + :returns: An initialized response, exception message otherwise + ''' + if not (0 <= self.value <= 0xffff): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, 1): + return self.doException(merror.IllegalAddress) + + context.setValues(self.function_code, self.address, [self.value]) + values = context.getValues(self.function_code, self.address, 1) + return WriteSingleRegisterResponse(self.address, values[0])
+ +
[docs] def get_response_pdu_size(self): + """ + Func_code (1 byte) + Register Address(2 byte) + Register Value (2 bytes) + :return: + """ + return 1 + 2 + 2
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + return "WriteRegisterRequest %d => %d" % (self.address, self.value)
+ + +
[docs]class WriteSingleRegisterResponse(ModbusResponse): + ''' + The normal response is an echo of the request, returned after the + register contents have been written. + ''' + function_code = 6 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, value=None, **kwargs): + ''' Initializes a new instance + + :param address: The address to start writing add + :param value: The values to write + ''' + ModbusResponse.__init__(self, **kwargs) + self.address = address + self.value = value
+ +
[docs] def encode(self): + ''' Encode a write single register packet packet request + + :returns: The encoded packet + ''' + return struct.pack('>HH', self.address, self.value)
+ +
[docs] def decode(self, data): + ''' Decode a write single register packet packet request + + :param data: The request to decode + ''' + self.address, self.value = struct.unpack('>HH', data)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + params = (self.address, self.value) + return "WriteRegisterResponse %d => %d" % params
+ + +#---------------------------------------------------------------------------# +# Write Multiple Registers +#---------------------------------------------------------------------------# +
[docs]class WriteMultipleRegistersRequest(ModbusRequest): + ''' + This function code is used to write a block of contiguous registers (1 + to approx. 120 registers) in a remote device. + + The requested written values are specified in the request data field. + Data is packed as two bytes per register. + ''' + function_code = 16 + _rtu_byte_count_pos = 6 + _pdu_length = 5 #func + adress1 + adress2 + outputQuant1 + outputQuant2 + +
[docs] def __init__(self, address=None, values=None, **kwargs): + ''' Initializes a new instance + + :param address: The address to start writing to + :param values: The values to write + ''' + ModbusRequest.__init__(self, **kwargs) + self.address = address + if values is None: + values = [] + elif not hasattr(values, '__iter__'): + values = [values] + self.values = values + self.count = len(self.values) + self.byte_count = self.count * 2
+ +
[docs] def encode(self): + ''' Encode a write single register packet packet request + + :returns: The encoded packet + ''' + packet = struct.pack('>HHB', self.address, self.count, self.byte_count) + if self.skip_encode: + return packet + b''.join(self.values) + + for value in self.values: + packet += struct.pack('>H', value) + + return packet
+ +
[docs] def decode(self, data): + ''' Decode a write single register packet packet request + + :param data: The request to decode + ''' + self.address, self.count, \ + self.byte_count = struct.unpack('>HHB', data[:5]) + self.values = [] # reset + for idx in range(5, (self.count * 2) + 5, 2): + self.values.append(struct.unpack('>H', data[idx:idx + 2])[0])
+ +
[docs] def execute(self, context): + ''' Run a write single register request against a datastore + + :param context: The datastore to request from + :returns: An initialized response, exception message otherwise + ''' + if not (1 <= self.count <= 0x07b): + return self.doException(merror.IllegalValue) + if (self.byte_count != self.count * 2): + return self.doException(merror.IllegalValue) + if not context.validate(self.function_code, self.address, self.count): + return self.doException(merror.IllegalAddress) + + context.setValues(self.function_code, self.address, self.values) + return WriteMultipleRegistersResponse(self.address, self.count)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + params = (self.address, self.count) + return "WriteMultipleRegisterRequest %d => %d" % params
+ + +
[docs]class WriteMultipleRegistersResponse(ModbusResponse): + ''' + "The normal response returns the function code, starting address, and + quantity of registers written. + ''' + function_code = 16 + _rtu_frame_size = 8 + +
[docs] def __init__(self, address=None, count=None, **kwargs): + ''' Initializes a new instance + + :param address: The address to start writing to + :param count: The number of registers to write to + ''' + ModbusResponse.__init__(self, **kwargs) + self.address = address + self.count = count
+ +
[docs] def encode(self): + ''' Encode a write single register packet packet request + + :returns: The encoded packet + ''' + return struct.pack('>HH', self.address, self.count)
+ +
[docs] def decode(self, data): + ''' Decode a write single register packet packet request + + :param data: The request to decode + ''' + self.address, self.count = struct.unpack('>HH', data)
+ +
[docs] def __str__(self): + ''' Returns a string representation of the instance + + :returns: A string representation of the instance + ''' + params = (self.address, self.count) + return "WriteMultipleRegisterResponse (%d,%d)" % params
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "WriteSingleRegisterRequest", "WriteSingleRegisterResponse", + "WriteMultipleRegistersRequest", "WriteMultipleRegistersResponse", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/server/async.html b/doc/sphinx/html/_modules/pymodbus/server/async.html new file mode 100644 index 000000000..26b6f30ef --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/server/async.html @@ -0,0 +1,370 @@ + + + + + + + + pymodbus.server.async — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.server.async

+'''
+Implementation of a Twisted Modbus Server
+------------------------------------------
+
+'''
+from binascii import b2a_hex
+from twisted.internet import protocol
+from twisted.internet.protocol import ServerFactory
+
+from pymodbus.constants import Defaults
+from pymodbus.factory import ServerDecoder
+from pymodbus.datastore import ModbusServerContext
+from pymodbus.device import ModbusControlBlock
+from pymodbus.device import ModbusAccessControl
+from pymodbus.device import ModbusDeviceIdentification
+from pymodbus.exceptions import NoSuchSlaveException
+from pymodbus.transaction import ModbusSocketFramer, ModbusAsciiFramer
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.internal.ptwisted import InstallManagementConsole
+from pymodbus.compat import byte2int
+from twisted.internet import reactor
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Modbus TCP Server
+#---------------------------------------------------------------------------#
+
[docs]class ModbusTcpProtocol(protocol.Protocol): + ''' Implements a modbus server in twisted ''' + +
[docs] def connectionMade(self): + ''' Callback for when a client connects + + ..note:: since the protocol factory cannot be accessed from the + protocol __init__, the client connection made is essentially + our __init__ method. + ''' + _logger.debug("Client Connected [%s]" % self.transport.getHost()) + self.framer = self.factory.framer(decoder=self.factory.decoder)
+ +
[docs] def connectionLost(self, reason): + ''' Callback for when a client disconnects + + :param reason: The client's reason for disconnecting + ''' + _logger.debug("Client Disconnected: %s" % reason)
+ +
[docs] def dataReceived(self, data): + ''' Callback when we receive any data + + :param data: The data sent by the client + ''' + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug(' '.join([hex(byte2int(x)) for x in data])) + if not self.factory.control.ListenOnly: + self.framer.processIncomingPacket(data, self._execute)
+ +
[docs] def _execute(self, request): + ''' Executes the request and returns the result + + :param request: The decoded request message + ''' + try: + context = self.factory.store[request.unit_id] + response = request.execute(context) + except NoSuchSlaveException as ex: + _logger.debug("requested slave does not exist: %s" % request.unit_id ) + if self.factory.ignore_missing_slaves: + return # the client will simply timeout waiting for a response + response = request.doException(merror.GatewayNoResponse) + except Exception as ex: + _logger.debug("Datastore unable to fulfill request: %s" % ex) + response = request.doException(merror.SlaveFailure) + #self.framer.populateResult(response) + response.transaction_id = request.transaction_id + response.unit_id = request.unit_id + self._send(response)
+ +
[docs] def _send(self, message): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + ''' + if message.should_respond: + self.factory.control.Counter.BusMessage += 1 + pdu = self.framer.buildPacket(message) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug('send: %s' % b2a_hex(pdu)) + return self.transport.write(pdu)
+ + +
[docs]class ModbusServerFactory(ServerFactory): + ''' + Builder class for a modbus server + + This also holds the server datastore so that it is + persisted between connections + ''' + + protocol = ModbusTcpProtocol + +
[docs] def __init__(self, store, framer=None, identity=None, **kwargs): + ''' Overloaded initializer for the modbus factory + + If the identify structure is not passed in, the ModbusControlBlock + uses its own empty structure. + + :param store: The ModbusServerContext datastore + :param framer: The framer strategy to use + :param identity: An optional identify structure + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + self.decoder = ServerDecoder() + self.framer = framer or ModbusSocketFramer + self.store = store or ModbusServerContext() + self.control = ModbusControlBlock() + self.access = ModbusAccessControl() + self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) + + if isinstance(identity, ModbusDeviceIdentification): + self.control.Identity.update(identity)
+ + +#---------------------------------------------------------------------------# +# Modbus UDP Server +#---------------------------------------------------------------------------# +
[docs]class ModbusUdpProtocol(protocol.DatagramProtocol): + ''' Implements a modbus udp server in twisted ''' + +
[docs] def __init__(self, store, framer=None, identity=None, **kwargs): + ''' Overloaded initializer for the modbus factory + + If the identify structure is not passed in, the ModbusControlBlock + uses its own empty structure. + + :param store: The ModbusServerContext datastore + :param framer: The framer strategy to use + :param identity: An optional identify structure + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + framer = framer or ModbusSocketFramer + self.framer = framer(decoder=ServerDecoder()) + self.store = store or ModbusServerContext() + self.control = ModbusControlBlock() + self.access = ModbusAccessControl() + self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) + + if isinstance(identity, ModbusDeviceIdentification): + self.control.Identity.update(identity)
+ +
[docs] def datagramReceived(self, data, addr): + ''' Callback when we receive any data + + :param data: The data sent by the client + ''' + _logger.debug("Client Connected [%s:%s]" % addr) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug(" ".join([hex(ord(x)) for x in data])) + if not self.control.ListenOnly: + continuation = lambda request: self._execute(request, addr) + self.framer.processIncomingPacket(data, continuation)
+ +
[docs] def _execute(self, request, addr): + ''' Executes the request and returns the result + + :param request: The decoded request message + ''' + try: + context = self.store[request.unit_id] + response = request.execute(context) + except NoSuchSlaveException as ex: + _logger.debug("requested slave does not exist: %s" % request.unit_id ) + if self.ignore_missing_slaves: + return # the client will simply timeout waiting for a response + response = request.doException(merror.GatewayNoResponse) + except Exception as ex: + _logger.debug("Datastore unable to fulfill request: %s" % ex) + response = request.doException(merror.SlaveFailure) + #self.framer.populateResult(response) + response.transaction_id = request.transaction_id + response.unit_id = request.unit_id + self._send(response, addr)
+ +
[docs] def _send(self, message, addr): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + :param addr: The (host, port) to send the message to + ''' + self.control.Counter.BusMessage += 1 + pdu = self.framer.buildPacket(message) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug('send: %s' % b2a_hex(pdu)) + return self.transport.write(pdu, addr)
+ + +#---------------------------------------------------------------------------# +# Starting Factories +#---------------------------------------------------------------------------# +
[docs]def StartTcpServer(context, identity=None, address=None, console=False, **kwargs): + ''' Helper method to start the Modbus Async TCP server + + :param context: The server data context + :param identify: The server identity to use (default empty) + :param address: An optional (interface, port) to bind to. + :param console: A flag indicating if you want the debug console + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + from twisted.internet import reactor + + address = address or ("", Defaults.Port) + framer = ModbusSocketFramer + factory = ModbusServerFactory(context, framer, identity, **kwargs) + if console: + InstallManagementConsole({'factory': factory}) + + _logger.info("Starting Modbus TCP Server on %s:%s" % address) + reactor.listenTCP(address[1], factory, interface=address[0]) + reactor.run()
+ + +
[docs]def StartUdpServer(context, identity=None, address=None, **kwargs): + ''' Helper method to start the Modbus Async Udp server + + :param context: The server data context + :param identify: The server identity to use (default empty) + :param address: An optional (interface, port) to bind to. + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + from twisted.internet import reactor + + address = address or ("", Defaults.Port) + framer = ModbusSocketFramer + server = ModbusUdpProtocol(context, framer, identity, **kwargs) + + _logger.info("Starting Modbus UDP Server on %s:%s" % address) + reactor.listenUDP(address[1], server, interface=address[0]) + reactor.run()
+ + +
[docs]def StartSerialServer(context, identity=None, + framer=ModbusAsciiFramer, **kwargs): + ''' Helper method to start the Modbus Async Serial server + + :param context: The server data context + :param identify: The server identity to use (default empty) + :param framer: The framer to use (default ModbusAsciiFramer) + :param port: The serial port to attach to + :param baudrate: The baud rate to use for the serial device + :param console: A flag indicating if you want the debug console + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + from twisted.internet import reactor + from twisted.internet.serialport import SerialPort + + port = kwargs.get('port', '/dev/ttyS0') + baudrate = kwargs.get('baudrate', Defaults.Baudrate) + console = kwargs.get('console', False) + + _logger.info("Starting Modbus Serial Server on %s" % port) + factory = ModbusServerFactory(context, framer, identity, **kwargs) + if console: + InstallManagementConsole({'factory': factory}) + + protocol = factory.buildProtocol(None) + SerialPort.getHost = lambda self: port # hack for logging + SerialPort(protocol, port, reactor, baudrate) + reactor.run()
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "StartTcpServer", "StartUdpServer", "StartSerialServer", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/server/sync.html b/doc/sphinx/html/_modules/pymodbus/server/sync.html new file mode 100644 index 000000000..9fd4b7496 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/server/sync.html @@ -0,0 +1,597 @@ + + + + + + + + pymodbus.server.sync — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.server.sync

+'''
+Implementation of a Threaded Modbus Server
+------------------------------------------
+
+'''
+from binascii import b2a_hex
+import serial
+import socket
+import traceback
+
+from pymodbus.constants import Defaults
+from pymodbus.factory import ServerDecoder
+from pymodbus.datastore import ModbusServerContext
+from pymodbus.device import ModbusControlBlock
+from pymodbus.device import ModbusDeviceIdentification
+from pymodbus.transaction import *
+from pymodbus.exceptions import NotImplementedException, NoSuchSlaveException
+from pymodbus.pdu import ModbusExceptions as merror
+from pymodbus.compat import socketserver, byte2int
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# Protocol Handlers
+#---------------------------------------------------------------------------#
+
[docs]class ModbusBaseRequestHandler(socketserver.BaseRequestHandler): + ''' Implements the modbus server protocol + + This uses the socketserver.BaseRequestHandler to implement + the client handler. + ''' + +
[docs] def setup(self): + ''' Callback for when a client connects + ''' + _logger.debug("Client Connected [%s:%s]" % self.client_address) + self.running = True + self.framer = self.server.framer(self.server.decoder) + self.server.threads.append(self)
+ +
[docs] def finish(self): + ''' Callback for when a client disconnects + ''' + _logger.debug("Client Disconnected [%s:%s]" % self.client_address) + self.server.threads.remove(self)
+ +
[docs] def execute(self, request): + ''' The callback to call with the resulting message + + :param request: The decoded request message + ''' + try: + context = self.server.context[request.unit_id] + response = request.execute(context) + except NoSuchSlaveException as ex: + _logger.debug("requested slave does not exist: %s" % request.unit_id ) + if self.server.ignore_missing_slaves: + return # the client will simply timeout waiting for a response + response = request.doException(merror.GatewayNoResponse) + except Exception as ex: + _logger.debug("Datastore unable to fulfill request: %s; %s", ex, traceback.format_exc() ) + response = request.doException(merror.SlaveFailure) + response.transaction_id = request.transaction_id + response.unit_id = request.unit_id + self.send(response)
+ + #---------------------------------------------------------------------------# + # Base class implementations + #---------------------------------------------------------------------------# +
[docs] def handle(self): + ''' Callback when we receive any data + ''' + raise NotImplementedException("Method not implemented by derived class")
+ +
[docs] def send(self, message): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + ''' + raise NotImplementedException("Method not implemented by derived class")
+ + +# class ModbusSingleRequestHandler(ModbusBaseRequestHandler): +# ''' Implements the modbus server protocol +# +# This uses the socketserver.BaseRequestHandler to implement +# the client handler for a single client(serial clients) +# ''' +# +# def handle(self): +# ''' Callback when we receive any data +# ''' +# while self.running: +# try: +# data = self.request.recv(1024) +# if data: +# if _logger.isEnabledFor(logging.DEBUG): +# _logger.debug(' '.join([hex(byte2int(x)) for x in data])) +# self.framer.processIncomingPacket(data, self.execute) +# except Exception as msg: +# # since we only have a single socket, we cannot exit +# _logger.error("Socket error occurred %s" % msg) +# +# def send(self, message): +# ''' Send a request (string) to the network +# +# :param message: The unencoded modbus response +# ''' + + +
[docs]class ModbusSingleRequestHandler(ModbusBaseRequestHandler): + ''' Implements the modbus server protocol + + This uses the socketserver.BaseRequestHandler to implement + the client handler for a single client(serial clients) + ''' + +
[docs] def handle(self): + ''' Callback when we receive any data + ''' + while self.running: + try: + data = self.request.recv(1024) + if data: + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug(" ".join([hex(byte2int(x)) for x in data])) + self.framer.processIncomingPacket(data, self.execute) + except Exception as msg: + # since we only have a single socket, we cannot exit + _logger.error("Socket error occurred %s" % msg)
+ +
[docs] def send(self, message): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + ''' + if message.should_respond: + #self.server.control.Counter.BusMessage += 1 + pdu = self.framer.buildPacket(message) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug('send: %s' % b2a_hex(pdu)) + return self.request.send(pdu)
+ + +
[docs]class ModbusConnectedRequestHandler(ModbusBaseRequestHandler): + ''' Implements the modbus server protocol + + This uses the socketserver.BaseRequestHandler to implement + the client handler for a connected protocol (TCP). + ''' + +
[docs] def handle(self): + '''Callback when we receive any data, until self.running becomes not True. Blocks indefinitely + awaiting data. If shutdown is required, then the global socket.settimeout(<seconds>) may be + used, to allow timely checking of self.running. However, since this also affects socket + connects, if there are outgoing socket connections used in the same program, then these will + be prevented, if the specfied timeout is too short. Hence, this is unreliable. + + To respond to Modbus...Server.server_close() (which clears each handler's self.running), + derive from this class to provide an alternative handler that awakens from time to time when + no input is available and checks self.running. Use Modbus...Server( handler=... ) keyword + to supply the alternative request handler class. + + ''' + while self.running: + try: + data = self.request.recv(1024) + if not data: self.running = False + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug(' '.join([hex(byte2int(x)) for x in data])) + # if not self.server.control.ListenOnly: + self.framer.processIncomingPacket(data, self.execute) + except socket.timeout as msg: + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug("Socket timeout occurred %s", msg) + pass + except socket.error as msg: + _logger.error("Socket error occurred %s" % msg) + self.running = False + except: + _logger.error("Socket exception occurred %s" % traceback.format_exc() ) + self.running = False
+ +
[docs] def send(self, message): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + ''' + if message.should_respond: + #self.server.control.Counter.BusMessage += 1 + pdu = self.framer.buildPacket(message) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug('send: %s' % b2a_hex(pdu)) + return self.request.send(pdu)
+ + +
[docs]class ModbusDisconnectedRequestHandler(ModbusBaseRequestHandler): + ''' Implements the modbus server protocol + + This uses the socketserver.BaseRequestHandler to implement + the client handler for a disconnected protocol (UDP). The + only difference is that we have to specify who to send the + resulting packet data to. + ''' + +
[docs] def handle(self): + ''' Callback when we receive any data + ''' + while self.running: + try: + data, self.request = self.request + if not data: self.running = False + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug(' '.join([hex(byte2int(x)) for x in data])) + # if not self.server.control.ListenOnly: + self.framer.processIncomingPacket(data, self.execute) + except socket.timeout: pass + except socket.error as msg: + _logger.error("Socket error occurred %s" % msg) + self.running = False + except: self.running = False
+ +
[docs] def send(self, message): + ''' Send a request (string) to the network + + :param message: The unencoded modbus response + ''' + if message.should_respond: + #self.server.control.Counter.BusMessage += 1 + pdu = self.framer.buildPacket(message) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug('send: %s' % b2a_hex(pdu)) + return self.request.sendto(pdu, self.client_address)
+ + +#---------------------------------------------------------------------------# +# Server Implementations +#---------------------------------------------------------------------------# +
[docs]class ModbusTcpServer(socketserver.ThreadingTCPServer): + ''' + A modbus threaded tcp socket server + + We inherit and overload the socket server so that we + can control the client threads as well as have a single + server context instance. + ''' + +
[docs] def __init__(self, context, framer=None, identity=None, address=None, handler=None, **kwargs): + ''' Overloaded initializer for the socket server + + If the identify structure is not passed in, the ModbusControlBlock + uses its own empty structure. + + :param context: The ModbusServerContext datastore + :param framer: The framer strategy to use + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param handler: A handler for each client session; default is ModbusConnectedRequestHandler + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + self.threads = [] + self.decoder = ServerDecoder() + self.framer = framer or ModbusSocketFramer + self.context = context or ModbusServerContext() + self.control = ModbusControlBlock() + self.address = address or ("", Defaults.Port) + self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) + + if isinstance(identity, ModbusDeviceIdentification): + self.control.Identity.update(identity) + + socketserver.ThreadingTCPServer.__init__(self, + self.address, ModbusConnectedRequestHandler)
+ +
[docs] def process_request(self, request, client): + ''' Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + ''' + _logger.debug("Started thread to serve client at " + str(client)) + socketserver.ThreadingTCPServer.process_request(self, request, client)
+ +
[docs] def shutdown(self): + ''' Stops the serve_forever loop. + + Overridden to signal handlers to stop. + ''' + for thread in self.threads: + thread.running = False + socketserver.ThreadingTCPServer.shutdown(self)
+ +
[docs] def server_close(self): + ''' Callback for stopping the running server + ''' + _logger.debug("Modbus server stopped") + self.socket.close() + for thread in self.threads: + thread.running = False
+ + +
[docs]class ModbusUdpServer(socketserver.ThreadingUDPServer): + ''' + A modbus threaded udp socket server + + We inherit and overload the socket server so that we + can control the client threads as well as have a single + server context instance. + ''' + +
[docs] def __init__(self, context, framer=None, identity=None, address=None, handler=None, **kwargs): + ''' Overloaded initializer for the socket server + + If the identify structure is not passed in, the ModbusControlBlock + uses its own empty structure. + + :param context: The ModbusServerContext datastore + :param framer: The framer strategy to use + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param handler: A handler for each client session; default is ModbusDisonnectedRequestHandler + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + self.threads = [] + self.decoder = ServerDecoder() + self.framer = framer or ModbusSocketFramer + self.context = context or ModbusServerContext() + self.control = ModbusControlBlock() + self.address = address or ("", Defaults.Port) + self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) + + if isinstance(identity, ModbusDeviceIdentification): + self.control.Identity.update(identity) + + socketserver.ThreadingUDPServer.__init__(self, + self.address, ModbusDisconnectedRequestHandler)
+ +
[docs] def process_request(self, request, client): + ''' Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + ''' + packet, socket = request # TODO I might have to rewrite + _logger.debug("Started thread to serve client at " + str(client)) + socketserver.ThreadingUDPServer.process_request(self, request, client)
+ +
[docs] def server_close(self): + ''' Callback for stopping the running server + ''' + _logger.debug("Modbus server stopped") + self.socket.close() + for thread in self.threads: + thread.running = False
+ + +
[docs]class ModbusSerialServer(object): + ''' + A modbus threaded serial socket server + + We inherit and overload the socket server so that we + can control the client threads as well as have a single + server context instance. + ''' + +
[docs] def __init__(self, context, framer=None, identity=None, **kwargs): + ''' Overloaded initializer for the socket server + + If the identify structure is not passed in, the ModbusControlBlock + uses its own empty structure. + + :param context: The ModbusServerContext datastore + :param framer: The framer strategy to use + :param identity: An optional identify structure + :param port: The serial port to attach to + :param stopbits: The number of stop bits to use + :param bytesize: The bytesize of the serial messages + :param parity: Which kind of parity to use + :param baudrate: The baud rate to use for the serial device + :param timeout: The timeout to use for the serial device + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + self.threads = [] + self.decoder = ServerDecoder() + self.framer = framer or ModbusAsciiFramer + self.context = context or ModbusServerContext() + self.control = ModbusControlBlock() + + if isinstance(identity, ModbusDeviceIdentification): + self.control.Identity.update(identity) + + self.device = kwargs.get('port', 0) + self.stopbits = kwargs.get('stopbits', Defaults.Stopbits) + self.bytesize = kwargs.get('bytesize', Defaults.Bytesize) + self.parity = kwargs.get('parity', Defaults.Parity) + self.baudrate = kwargs.get('baudrate', Defaults.Baudrate) + self.timeout = kwargs.get('timeout', Defaults.Timeout) + self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) + self.socket = None + self._connect() + self.is_running = True
+ +
[docs] def _connect(self): + ''' Connect to the serial server + + :returns: True if connection succeeded, False otherwise + ''' + if self.socket: return True + try: + self.socket = serial.Serial(port=self.device, timeout=self.timeout, + bytesize=self.bytesize, stopbits=self.stopbits, + baudrate=self.baudrate, parity=self.parity) + except serial.SerialException as msg: + _logger.error(msg) + return self.socket != None
+ +
[docs] def _build_handler(self): + ''' A helper method to create and monkeypatch + a serial handler. + + :returns: A patched handler + ''' + request = self.socket + request.send = request.write + request.recv = request.read + handler = ModbusSingleRequestHandler(request, + (self.device, self.device), self) + return handler
+ +
[docs] def serve_forever(self): + ''' Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + ''' + _logger.debug("Started thread to serve client") + handler = self._build_handler() + while self.is_running: + handler.handle()
+ +
[docs] def server_close(self): + ''' Callback for stopping the running server + ''' + _logger.debug("Modbus server stopped") + self.is_running = False + self.socket.close()
+ + +#---------------------------------------------------------------------------# +# Creation Factories +#---------------------------------------------------------------------------# +
[docs]def StartTcpServer(context=None, identity=None, address=None, **kwargs): + ''' A factory to start and run a tcp modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + framer = ModbusSocketFramer + server = ModbusTcpServer(context, framer, identity, address, **kwargs) + server.serve_forever()
+ + +
[docs]def StartUdpServer(context=None, identity=None, address=None, **kwargs): + ''' A factory to start and run a udp modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param framer: The framer to operate with (default ModbusSocketFramer) + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + framer = kwargs.pop('framer', ModbusSocketFramer) + server = ModbusUdpServer(context, framer, identity, address, **kwargs) + server.serve_forever()
+ + +
[docs]def StartSerialServer(context=None, identity=None, **kwargs): + ''' A factory to start and run a serial modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param framer: The framer to operate with (default ModbusAsciiFramer) + :param port: The serial port to attach to + :param stopbits: The number of stop bits to use + :param bytesize: The bytesize of the serial messages + :param parity: Which kind of parity to use + :param baudrate: The baud rate to use for the serial device + :param timeout: The timeout to use for the serial device + :param ignore_missing_slaves: True to not send errors on a request to a missing slave + ''' + framer = kwargs.pop('framer', ModbusAsciiFramer) + server = ModbusSerialServer(context, framer, identity, **kwargs) + server.serve_forever()
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "StartTcpServer", "StartUdpServer", "StartSerialServer" +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/transaction.html b/doc/sphinx/html/_modules/pymodbus/transaction.html new file mode 100644 index 000000000..03717b500 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/transaction.html @@ -0,0 +1,1064 @@ + + + + + + + + pymodbus.transaction — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.transaction

+'''
+Collection of transaction based abstractions
+'''
+import sys
+import struct
+import socket
+from binascii import b2a_hex, a2b_hex
+
+from pymodbus.exceptions import ModbusIOException, NotImplementedException
+from pymodbus.constants  import Defaults
+from pymodbus.interfaces import IModbusFramer
+from pymodbus.utilities  import checkCRC, computeCRC
+from pymodbus.utilities  import checkLRC, computeLRC
+from pymodbus.compat import iterkeys, imap, byte2int
+
+#---------------------------------------------------------------------------#
+# Logging
+#---------------------------------------------------------------------------#
+import logging
+_logger = logging.getLogger(__name__)
+
+
+#---------------------------------------------------------------------------#
+# The Global Transaction Manager
+#---------------------------------------------------------------------------#
+class ModbusTransactionManager(object):
+    ''' Impelements a transaction for a manager
+
+    The transaction protocol can be represented by the following pseudo code::
+
+        count = 0
+        do
+          result = send(message)
+          if (timeout or result == bad)
+             count++
+          else break
+        while (count < 3)
+
+    This module helps to abstract this away from the framer and protocol.
+    '''
+
+    def __init__(self, client, **kwargs):
+        ''' Initializes an instance of the ModbusTransactionManager
+
+        :param client: The client socket wrapper
+        :param retry_on_empty: Should the client retry on empty
+        :param retries: The number of retries to allow
+        '''
+        self.tid = Defaults.TransactionId
+        self.client = client
+        self.retry_on_empty = kwargs.get('retry_on_empty', Defaults.RetryOnEmpty)
+        self.retries = kwargs.get('retries', Defaults.Retries)
+        if client:
+            self._set_adu_size()
+
+    def _set_adu_size(self):
+        # base ADU size of modbus frame in bytes
+        if isinstance(self.client.framer, ModbusSocketFramer):
+            self.base_adu_size = 7 # tid(2), pid(2), length(2), uid(1)
+        elif isinstance(self.client.framer, ModbusRtuFramer):
+            self.base_adu_size = 3 # address(1), CRC(2)
+        elif isinstance(self.client.framer, ModbusAsciiFramer):
+            self.base_adu_size = 4 # Address(2), LRC(2)
+        elif isinstance(self.client.framer, ModbusBinaryFramer):
+            self.base_adu_size = 3 #, Address(1), CRC(2)
+        else:
+            self.base_adu_size = -1
+
+    def _calculate_response_length(self, expected_pdu_size):
+        if self.base_adu_size == -1:
+            return 1024
+        else:
+            return self.base_adu_size + expected_pdu_size
+
+    def execute(self, request):
+        ''' Starts the producer to send the next request to
+        consumer.write(Frame(request))
+        '''
+        retries = self.retries
+        request.transaction_id = self.getNextTID()
+        _logger.debug("Running transaction %d" % request.transaction_id)
+        if hasattr(request, "get_response_pdu_size"):
+            response_pdu_size = request.get_response_pdu_size()
+            expected_response_length = self._calculate_response_length(response_pdu_size)
+        else:
+            expected_response_length = 1024
+
+        while retries > 0:
+            try:
+                self.client.connect()
+                self.client._send(self.client.framer.buildPacket(request))
+                result = self.client._recv(expected_response_length)
+
+                if not result and self.retry_on_empty:
+                    retries -= 1
+                    continue
+                if _logger.isEnabledFor(logging.DEBUG):
+                    _logger.debug("recv: " + " ".join([hex(ord(x)) for x in result]))
+                self.client.framer.processIncomingPacket(result, self.addTransaction)
+                break;
+            except socket.error as msg:
+                self.client.close()
+                _logger.debug("Transaction failed. (%s) " % msg)
+                retries -= 1
+        return self.getTransaction(request.transaction_id)
+
+
+    def addTransaction(self, request, tid=None):
+        ''' Adds a transaction to the handler
+
+        This holds the requets in case it needs to be resent.
+        After being sent, the request is removed.
+
+        :param request: The request to hold on to
+        :param tid: The overloaded transaction id to use
+        '''
+        raise NotImplementedException("addTransaction")
+
+    def getTransaction(self, tid):
+        ''' Returns a transaction matching the referenced tid
+
+        If the transaction does not exist, None is returned
+
+        :param tid: The transaction to retrieve
+        '''
+        raise NotImplementedException("getTransaction")
+
+    def delTransaction(self, tid):
+        ''' Removes a transaction matching the referenced tid
+
+        :param tid: The transaction to remove
+        '''
+        raise NotImplementedException("delTransaction")
+
+    def getNextTID(self):
+        ''' Retrieve the next unique transaction identifier
+
+        This handles incrementing the identifier after
+        retrieval
+
+        :returns: The next unique transaction identifier
+        '''
+        self.tid = (self.tid + 1) & 0xffff
+        return self.tid
+
+    def reset(self):
+        ''' Resets the transaction identifier '''
+        self.tid = Defaults.TransactionId
+        self.transactions = type(self.transactions)()
+
+
+
[docs]class DictTransactionManager(ModbusTransactionManager): + ''' Impelements a transaction for a manager where the + results are keyed based on the supplied transaction id. + ''' + +
[docs] def __init__(self, client, **kwargs): + ''' Initializes an instance of the ModbusTransactionManager + + :param client: The client socket wrapper + ''' + self.transactions = {} + super(DictTransactionManager, self).__init__(client, **kwargs)
+ +
[docs] def __iter__(self): + ''' Iterater over the current managed transactions + + :returns: An iterator of the managed transactions + ''' + return iterkeys(self.transactions)
+ +
[docs] def addTransaction(self, request, tid=None): + ''' Adds a transaction to the handler + + This holds the requets in case it needs to be resent. + After being sent, the request is removed. + + :param request: The request to hold on to + :param tid: The overloaded transaction id to use + ''' + tid = tid if tid != None else request.transaction_id + _logger.debug("adding transaction %d" % tid) + self.transactions[tid] = request
+ +
[docs] def getTransaction(self, tid): + ''' Returns a transaction matching the referenced tid + + If the transaction does not exist, None is returned + + :param tid: The transaction to retrieve + ''' + _logger.debug("getting transaction %d" % tid) + return self.transactions.pop(tid, None)
+ +
[docs] def delTransaction(self, tid): + ''' Removes a transaction matching the referenced tid + + :param tid: The transaction to remove + ''' + _logger.debug("deleting transaction %d" % tid) + self.transactions.pop(tid, None)
+ + +
[docs]class FifoTransactionManager(ModbusTransactionManager): + ''' Impelements a transaction for a manager where the + results are returned in a FIFO manner. + ''' + +
[docs] def __init__(self, client, **kwargs): + ''' Initializes an instance of the ModbusTransactionManager + + :param client: The client socket wrapper + ''' + super(FifoTransactionManager, self).__init__(client, **kwargs) + self.transactions = []
+ +
[docs] def __iter__(self): + ''' Iterater over the current managed transactions + + :returns: An iterator of the managed transactions + ''' + return iter(self.transactions)
+ +
[docs] def addTransaction(self, request, tid=None): + ''' Adds a transaction to the handler + + This holds the requets in case it needs to be resent. + After being sent, the request is removed. + + :param request: The request to hold on to + :param tid: The overloaded transaction id to use + ''' + tid = tid if tid != None else request.transaction_id + _logger.debug("adding transaction %d" % tid) + self.transactions.append(request)
+ +
[docs] def getTransaction(self, tid): + ''' Returns a transaction matching the referenced tid + + If the transaction does not exist, None is returned + + :param tid: The transaction to retrieve + ''' + _logger.debug("getting transaction %s" % str(tid)) + return self.transactions.pop(0) if self.transactions else None
+ +
[docs] def delTransaction(self, tid): + ''' Removes a transaction matching the referenced tid + + :param tid: The transaction to remove + ''' + _logger.debug("deleting transaction %d" % tid) + if self.transactions: self.transactions.pop(0)
+ + +#---------------------------------------------------------------------------# +# Modbus TCP Message +#---------------------------------------------------------------------------# +
[docs]class ModbusSocketFramer(IModbusFramer): + ''' Modbus Socket Frame controller + + Before each modbus TCP message is an MBAP header which is used as a + message frame. It allows us to easily separate messages as follows:: + + [ MBAP Header ] [ Function Code] [ Data ] + [ tid ][ pid ][ length ][ uid ] + 2b 2b 2b 1b 1b Nb + + while len(message) > 0: + tid, pid, length`, uid = struct.unpack(">HHHB", message) + request = message[0:7 + length - 1`] + message = [7 + length - 1:] + + * length = uid + function code + data + * The -1 is to account for the uid byte + ''' + +
[docs] def __init__(self, decoder): + ''' Initializes a new instance of the framer + + :param decoder: The decoder factory implementation to use + ''' + self.__buffer = b'' + self.__header = {'tid':0, 'pid':0, 'len':0, 'uid':0} + self.__hsize = 0x07 + self.decoder = decoder
+ + #-----------------------------------------------------------------------# + # Private Helper Functions + #-----------------------------------------------------------------------# +
[docs] def checkFrame(self): + ''' + Check and decode the next frame Return true if we were successful + ''' + if len(self.__buffer) > self.__hsize: + self.__header['tid'], self.__header['pid'], \ + self.__header['len'], self.__header['uid'] = struct.unpack( + '>HHHB', self.__buffer[0:self.__hsize]) + + # someone sent us an error? ignore it + if self.__header['len'] < 2: + self.advanceFrame() + # we have at least a complete message, continue + elif len(self.__buffer) - self.__hsize + 1 >= self.__header['len']: + return True + # we don't have enough of a message yet, wait + return False
+ +
[docs] def advanceFrame(self): + ''' Skip over the current framed message + This allows us to skip over the current message after we have processed + it or determined that it contains an error. It also has to reset the + current frame header handle + ''' + length = self.__hsize + self.__header['len'] - 1 + self.__buffer = self.__buffer[length:] + self.__header = {'tid':0, 'pid':0, 'len':0, 'uid':0}
+ +
[docs] def isFrameReady(self): + ''' Check if we should continue decode logic + This is meant to be used in a while loop in the decoding phase to let + the decoder factory know that there is still data in the buffer. + + :returns: True if ready, False otherwise + ''' + return len(self.__buffer) > self.__hsize
+ +
[docs] def addToFrame(self, message): + ''' Adds new packet data to the current frame buffer + + :param message: The most recent packet + ''' + self.__buffer += message
+ +
[docs] def getFrame(self): + ''' Return the next frame from the buffered data + + :returns: The next full frame buffer + ''' + length = self.__hsize + self.__header['len'] - 1 + return self.__buffer[self.__hsize:length]
+ +
[docs] def populateResult(self, result): + ''' + Populates the modbus result with the transport specific header + information (pid, tid, uid, checksum, etc) + + :param result: The response packet + ''' + result.transaction_id = self.__header['tid'] + result.protocol_id = self.__header['pid'] + result.unit_id = self.__header['uid']
+ + #-----------------------------------------------------------------------# + # Public Member Functions + #-----------------------------------------------------------------------# +
[docs] def processIncomingPacket(self, data, callback): + ''' The new packet processing pattern + + This takes in a new request packet, adds it to the current + packet stream, and performs framing on it. That is, checks + for complete messages, and once found, will process all that + exist. This handles the case when we read N + 1 or 1 / N + messages at a time instead of 1. + + The processed and decoded messages are pushed to the callback + function to process and send. + + :param data: The new packet data + :param callback: The function to send results to + ''' + _logger.debug(' '.join([hex(byte2int(x)) for x in data])) + self.addToFrame(data) + while True: + if self.isFrameReady(): + if self.checkFrame(): + self._process(callback) + else: self.resetFrame() + else: + if len(self.__buffer): + # Possible error ??? + if self.__header['len'] < 2: + self._process(callback, error=True) + break
+ +
[docs] def _process(self, callback, error=False): + """ + Process incoming packets irrespective error condition + """ + data = self.getRawFrame() if error else self.getFrame() + result = self.decoder.decode(data) + if result is None: + raise ModbusIOException("Unable to decode request") + self.populateResult(result) + self.advanceFrame() + callback(result) # defer or push to a thread?
+ +
[docs] def resetFrame(self): + ''' Reset the entire message frame. + This allows us to skip ovver errors that may be in the stream. + It is hard to know if we are simply out of sync or if there is + an error in the stream as we have no way to check the start or + end of the message (python just doesn't have the resolution to + check for millisecond delays). + ''' + self.__buffer = '' + self.__header = {}
+ +
[docs] def getRawFrame(self): + """ + Returns the complete buffer + """ + return self.__buffer
+ +
[docs] def buildPacket(self, message): + ''' Creates a ready to send modbus packet + + :param message: The populated request/response to send + ''' + data = message.encode() + packet = struct.pack('>HHHBB', + message.transaction_id, + message.protocol_id, + len(data) + 2, + message.unit_id, + message.function_code) + data + return packet
+ + +#---------------------------------------------------------------------------# +# Modbus RTU Message +#---------------------------------------------------------------------------# +
[docs]class ModbusRtuFramer(IModbusFramer): + ''' + Modbus RTU Frame controller:: + + [ Start Wait ] [Address ][ Function Code] [ Data ][ CRC ][ End Wait ] + 3.5 chars 1b 1b Nb 2b 3.5 chars + + Wait refers to the amount of time required to transmist at least x many + characters. In this case it is 3.5 characters. Also, if we recieve a + wait of 1.5 characters at any point, we must trigger an error message. + Also, it appears as though this message is little endian. The logic is + simplified as the following:: + + block-on-read: + read until 3.5 delay + check for errors + decode + + The following table is a listing of the baud wait times for the specified + baud rates:: + + ------------------------------------------------------------------ + Baud 1.5c (18 bits) 3.5c (38 bits) + ------------------------------------------------------------------ + 1200 13333.3 us 31666.7 us + 4800 3333.3 us 7916.7 us + 9600 1666.7 us 3958.3 us + 19200 833.3 us 1979.2 us + 38400 416.7 us 989.6 us + ------------------------------------------------------------------ + 1 Byte = start + 8 bits + parity + stop = 11 bits + (1/Baud)(bits) = delay seconds + ''' + +
[docs] def __init__(self, decoder): + ''' Initializes a new instance of the framer + + :param decoder: The decoder factory implementation to use + ''' + self.__buffer = b'' + self.__header = {} + self.__hsize = 0x01 + self.__end = b'\x0d\x0a' + self.__min_frame_size = 4 + self.decoder = decoder
+ + #-----------------------------------------------------------------------# + # Private Helper Functions + #-----------------------------------------------------------------------# +
[docs] def checkFrame(self): + ''' + Check if the next frame is available. Return True if we were + successful. + ''' + try: + self.populateHeader() + frame_size = self.__header['len'] + data = self.__buffer[:frame_size - 2] + crc = self.__buffer[frame_size - 2:frame_size] + crc_val = (byte2int(crc[0]) << 8) + byte2int(crc[1]) + return checkCRC(data, crc_val) + except (IndexError, KeyError): + return False
+ +
[docs] def advanceFrame(self): + ''' Skip over the current framed message + This allows us to skip over the current message after we have processed + it or determined that it contains an error. It also has to reset the + current frame header handle + ''' + try: + self.__buffer = self.__buffer[self.__header['len']:] + except KeyError: + # Error response, no header len found + self.resetFrame() + self.__header = {}
+ +
[docs] def resetFrame(self): + ''' Reset the entire message frame. + This allows us to skip ovver errors that may be in the stream. + It is hard to know if we are simply out of sync or if there is + an error in the stream as we have no way to check the start or + end of the message (python just doesn't have the resolution to + check for millisecond delays). + ''' + self.__buffer = b'' + self.__header = {}
+ +
[docs] def isFrameReady(self): + ''' Check if we should continue decode logic + This is meant to be used in a while loop in the decoding phase to let + the decoder know that there is still data in the buffer. + + :returns: True if ready, False otherwise + ''' + return len(self.__buffer) > self.__hsize
+ +
[docs] def populateHeader(self): + ''' Try to set the headers `uid`, `len` and `crc`. + + This method examines `self.__buffer` and writes meta + information into `self.__header`. It calculates only the + values for headers that are not already in the dictionary. + + Beware that this method will raise an IndexError if + `self.__buffer` is not yet long enough. + ''' + self.__header['uid'] = byte2int(self.__buffer[0]) + func_code = byte2int(self.__buffer[1]) + pdu_class = self.decoder.lookupPduClass(func_code) + size = pdu_class.calculateRtuFrameSize(self.__buffer) + self.__header['len'] = size + self.__header['crc'] = self.__buffer[size - 2:size]
+ +
[docs] def addToFrame(self, message): + ''' + This should be used before the decoding while loop to add the received + data to the buffer handle. + + :param message: The most recent packet + ''' + self.__buffer += message
+ +
[docs] def getFrame(self): + ''' Get the next frame from the buffer + + :returns: The frame data or '' + ''' + start = self.__hsize + end = self.__header['len'] - 2 + buffer = self.__buffer[start:end] + if end > 0: return buffer + return ''
+ +
[docs] def populateResult(self, result): + ''' Populates the modbus result header + + The serial packets do not have any header information + that is copied. + + :param result: The response packet + ''' + result.unit_id = self.__header['uid']
+ + #-----------------------------------------------------------------------# + # Public Member Functions + #-----------------------------------------------------------------------# +
[docs] def processIncomingPacket(self, data, callback): + ''' The new packet processing pattern + + This takes in a new request packet, adds it to the current + packet stream, and performs framing on it. That is, checks + for complete messages, and once found, will process all that + exist. This handles the case when we read N + 1 or 1 / N + messages at a time instead of 1. + + The processed and decoded messages are pushed to the callback + function to process and send. + + :param data: The new packet data + :param callback: The function to send results to + ''' + self.addToFrame(data) + while True: + if self.isFrameReady(): + if self.checkFrame(): + self._process(callback) + else: + # Could be an error response + if len(self.__buffer): + # Possible error ??? + self._process(callback, error=True) + else: + if len(self.__buffer): + # Possible error ??? + if self.__header.get('len', 0) < 2: + self._process(callback, error=True) + break
+ +
[docs] def buildPacket(self, message): + ''' Creates a ready to send modbus packet + + :param message: The populated request/response to send + ''' + data = message.encode() + packet = struct.pack('>BB', + message.unit_id, + message.function_code) + data + packet += struct.pack(">H", computeCRC(packet)) + return packet
+ +
[docs] def _process(self, callback, error=False): + """ + Process incoming packets irrespective error condition + """ + data = self.getRawFrame() if error else self.getFrame() + result = self.decoder.decode(data) + if result is None: + raise ModbusIOException("Unable to decode request") + self.populateResult(result) + self.advanceFrame() + callback(result) # defer or push to a thread?
+ +
[docs] def getRawFrame(self): + """ + Returns the complete buffer + """ + return self.__buffer
+ + + +#---------------------------------------------------------------------------# +# Modbus ASCII Message +#---------------------------------------------------------------------------# +
[docs]class ModbusAsciiFramer(IModbusFramer): + ''' + Modbus ASCII Frame Controller:: + + [ Start ][Address ][ Function ][ Data ][ LRC ][ End ] + 1c 2c 2c Nc 2c 2c + + * data can be 0 - 2x252 chars + * end is '\\r\\n' (Carriage return line feed), however the line feed + character can be changed via a special command + * start is ':' + + This framer is used for serial transmission. Unlike the RTU protocol, + the data in this framer is transferred in plain text ascii. + ''' + +
[docs] def __init__(self, decoder): + ''' Initializes a new instance of the framer + + :param decoder: The decoder implementation to use + ''' + self.__buffer = b'' + self.__header = {'lrc':'0000', 'len':0, 'uid':0x00} + self.__hsize = 0x02 + self.__start = b':' + self.__end = b"\r\n" + self.decoder = decoder
+ + #-----------------------------------------------------------------------# + # Private Helper Functions + #-----------------------------------------------------------------------# +
[docs] def checkFrame(self): + ''' Check and decode the next frame + + :returns: True if we successful, False otherwise + ''' + start = self.__buffer.find(self.__start) + if start == -1: return False + if start > 0 : # go ahead and skip old bad data + self.__buffer = self.__buffer[start:] + start = 0 + + end = self.__buffer.find(self.__end) + if (end != -1): + self.__header['len'] = end + self.__header['uid'] = int(self.__buffer[1:3], 16) + self.__header['lrc'] = int(self.__buffer[end - 2:end], 16) + data = a2b_hex(self.__buffer[start + 1:end - 2]) + return checkLRC(data, self.__header['lrc']) + return False
+ +
[docs] def advanceFrame(self): + ''' Skip over the current framed message + This allows us to skip over the current message after we have processed + it or determined that it contains an error. It also has to reset the + current frame header handle + ''' + self.__buffer = self.__buffer[self.__header['len'] + 2:] + self.__header = {'lrc':'0000', 'len':0, 'uid':0x00}
+ +
[docs] def isFrameReady(self): + ''' Check if we should continue decode logic + This is meant to be used in a while loop in the decoding phase to let + the decoder know that there is still data in the buffer. + + :returns: True if ready, False otherwise + ''' + return len(self.__buffer) > 1
+ +
[docs] def addToFrame(self, message): + ''' Add the next message to the frame buffer + This should be used before the decoding while loop to add the received + data to the buffer handle. + + :param message: The most recent packet + ''' + self.__buffer += message
+ +
[docs] def getFrame(self): + ''' Get the next frame from the buffer + + :returns: The frame data or '' + ''' + start = self.__hsize + 1 + end = self.__header['len'] - 2 + buffer = self.__buffer[start:end] + if end > 0: return a2b_hex(buffer) + return b''
+ +
[docs] def populateResult(self, result): + ''' Populates the modbus result header + + The serial packets do not have any header information + that is copied. + + :param result: The response packet + ''' + result.unit_id = self.__header['uid']
+ + #-----------------------------------------------------------------------# + # Public Member Functions + #-----------------------------------------------------------------------# +
[docs] def processIncomingPacket(self, data, callback): + ''' The new packet processing pattern + + This takes in a new request packet, adds it to the current + packet stream, and performs framing on it. That is, checks + for complete messages, and once found, will process all that + exist. This handles the case when we read N + 1 or 1 / N + messages at a time instead of 1. + + The processed and decoded messages are pushed to the callback + function to process and send. + + :param data: The new packet data + :param callback: The function to send results to + ''' + self.addToFrame(data) + while self.isFrameReady(): + if self.checkFrame(): + result = self.decoder.decode(self.getFrame()) + if result is None: + raise ModbusIOException("Unable to decode response") + self.populateResult(result) + self.advanceFrame() + callback(result) # defer this + else: break
+ +
[docs] def buildPacket(self, message): + ''' Creates a ready to send modbus packet + Built off of a modbus request/response + + :param message: The request/response to send + :return: The encoded packet + ''' + encoded = message.encode() + buffer = struct.pack('>BB', message.unit_id, message.function_code) + checksum = computeLRC(encoded + buffer) + + packet = bytearray() + params = (message.unit_id, message.function_code) + packet.extend(self.__start) + packet.extend(('%02x%02x' % params).encode()) + packet.extend(b2a_hex(encoded)) + packet.extend(('%02x' % checksum).encode()) + packet.extend(self.__end) + return bytes(packet).upper()
+ + +#---------------------------------------------------------------------------# +# Modbus Binary Message +#---------------------------------------------------------------------------# +
[docs]class ModbusBinaryFramer(IModbusFramer): + ''' + Modbus Binary Frame Controller:: + + [ Start ][Address ][ Function ][ Data ][ CRC ][ End ] + 1b 1b 1b Nb 2b 1b + + * data can be 0 - 2x252 chars + * end is '}' + * start is '{' + + The idea here is that we implement the RTU protocol, however, + instead of using timing for message delimiting, we use start + and end of message characters (in this case { and }). Basically, + this is a binary framer. + + The only case we have to watch out for is when a message contains + the { or } characters. If we encounter these characters, we + simply duplicate them. Hopefully we will not encounter those + characters that often and will save a little bit of bandwitch + without a real-time system. + + Protocol defined by jamod.sourceforge.net. + ''' + +
[docs] def __init__(self, decoder): + ''' Initializes a new instance of the framer + + :param decoder: The decoder implementation to use + ''' + self.__buffer = b'' + self.__header = {'crc':0x0000, 'len':0, 'uid':0x00} + self.__hsize = 0x02 + self.__start = b'\x7b' # { + self.__end = b'\x7d' # } + self.__repeat = [b'}'[0], b'{'[0]] # python3 hack + self.decoder = decoder
+ + #-----------------------------------------------------------------------# + # Private Helper Functions + #-----------------------------------------------------------------------# +
[docs] def checkFrame(self): + ''' Check and decode the next frame + + :returns: True if we are successful, False otherwise + ''' + start = self.__buffer.find(self.__start) + if start == -1: return False + if start > 0 : # go ahead and skip old bad data + self.__buffer = self.__buffer[start:] + + end = self.__buffer.find(self.__end) + if (end != -1): + self.__header['len'] = end + self.__header['uid'] = struct.unpack('>B', self.__buffer[1:2]) + self.__header['crc'] = struct.unpack('>H', self.__buffer[end - 2:end])[0] + data = self.__buffer[start + 1:end - 2] + return checkCRC(data, self.__header['crc']) + return False
+ +
[docs] def advanceFrame(self): + ''' Skip over the current framed message + This allows us to skip over the current message after we have processed + it or determined that it contains an error. It also has to reset the + current frame header handle + ''' + self.__buffer = self.__buffer[self.__header['len'] + 2:] + self.__header = {'crc':0x0000, 'len':0, 'uid':0x00}
+ +
[docs] def isFrameReady(self): + ''' Check if we should continue decode logic + This is meant to be used in a while loop in the decoding phase to let + the decoder know that there is still data in the buffer. + + :returns: True if ready, False otherwise + ''' + return len(self.__buffer) > 1
+ +
[docs] def addToFrame(self, message): + ''' Add the next message to the frame buffer + This should be used before the decoding while loop to add the received + data to the buffer handle. + + :param message: The most recent packet + ''' + self.__buffer += message
+ +
[docs] def getFrame(self): + ''' Get the next frame from the buffer + + :returns: The frame data or '' + ''' + start = self.__hsize + 1 + end = self.__header['len'] - 2 + buffer = self.__buffer[start:end] + if end > 0: return buffer + return b''
+ +
[docs] def populateResult(self, result): + ''' Populates the modbus result header + + The serial packets do not have any header information + that is copied. + + :param result: The response packet + ''' + result.unit_id = self.__header['uid']
+ + #-----------------------------------------------------------------------# + # Public Member Functions + #-----------------------------------------------------------------------# +
[docs] def processIncomingPacket(self, data, callback): + ''' The new packet processing pattern + + This takes in a new request packet, adds it to the current + packet stream, and performs framing on it. That is, checks + for complete messages, and once found, will process all that + exist. This handles the case when we read N + 1 or 1 / N + messages at a time instead of 1. + + The processed and decoded messages are pushed to the callback + function to process and send. + + :param data: The new packet data + :param callback: The function to send results to + ''' + self.addToFrame(data) + while self.isFrameReady(): + if self.checkFrame(): + result = self.decoder.decode(self.getFrame()) + if result is None: + raise ModbusIOException("Unable to decode response") + self.populateResult(result) + self.advanceFrame() + callback(result) # defer or push to a thread? + else: break
+ +
[docs] def buildPacket(self, message): + ''' Creates a ready to send modbus packet + + :param message: The request/response to send + :returns: The encoded packet + ''' + data = self._preflight(message.encode()) + packet = struct.pack('>BB', + message.unit_id, + message.function_code) + data + packet += struct.pack(">H", computeCRC(packet)) + packet = self.__start + packet + self.__end + return packet
+ +
[docs] def _preflight(self, data): + ''' Preflight buffer test + + This basically scans the buffer for start and end + tags and if found, escapes them. + + :param data: The message to escape + :returns: the escaped packet + ''' + array = bytearray() + for d in data: + if d in self.__repeat: + array.append(d) + array.append(d) + return bytes(array)
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + "FifoTransactionManager", + "DictTransactionManager", + "ModbusSocketFramer", "ModbusRtuFramer", + "ModbusAsciiFramer", "ModbusBinaryFramer", +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/utilities.html b/doc/sphinx/html/_modules/pymodbus/utilities.html new file mode 100644 index 000000000..93e57f540 --- /dev/null +++ b/doc/sphinx/html/_modules/pymodbus/utilities.html @@ -0,0 +1,290 @@ + + + + + + + + pymodbus.utilities — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +

Source code for pymodbus.utilities

+'''
+Modbus Utilities
+-----------------
+
+A collection of utilities for packing data, unpacking
+data computing checksums, and decode checksums.
+'''
+from pymodbus.compat import int2byte, byte2int
+
+
+#---------------------------------------------------------------------------#
+# Helpers
+#---------------------------------------------------------------------------#
+
[docs]def default(value): + ''' + Given a python object, return the default value + of that object. + + :param value: The value to get the default of + :returns: The default value + ''' + return type(value)()
+ + +
[docs]def dict_property(store, index): + ''' Helper to create class properties from a dictionary. + Basically this allows you to remove a lot of possible + boilerplate code. + + :param store: The store store to pull from + :param index: The index into the store to close over + :returns: An initialized property set + ''' + if hasattr(store, '__call__'): + getter = lambda self: store(self)[index] + setter = lambda self, value: store(self).__setitem__(index, value) + elif isinstance(store, str): + getter = lambda self: self.__getattribute__(store)[index] + setter = lambda self, value: self.__getattribute__(store).__setitem__( + index, value) + else: + getter = lambda self: store[index] + setter = lambda self, value: store.__setitem__(index, value) + + return property(getter, setter)
+ + +#---------------------------------------------------------------------------# +# Bit packing functions +#---------------------------------------------------------------------------# +
[docs]def pack_bitstring(bits): + ''' Creates a string out of an array of bits + + :param bits: A bit array + + example:: + + bits = [False, True, False, True] + result = pack_bitstring(bits) + ''' + ret = b'' + i = packed = 0 + for bit in bits: + if bit: packed += 128 + i += 1 + if i == 8: + ret += int2byte(packed) + i = packed = 0 + else: packed >>= 1 + if i > 0 and i < 8: + packed >>= (7 - i) + ret += int2byte(packed) + return ret
+ + +
[docs]def unpack_bitstring(string): + ''' Creates bit array out of a string + + :param string: The modbus data packet to decode + + example:: + + bytes = 'bytes to decode' + result = unpack_bitstring(bytes) + ''' + byte_count = len(string) + bits = [] + for byte in range(byte_count): + value = byte2int(string[byte]) + for _ in range(8): + bits.append((value & 1) == 1) + value >>= 1 + return bits
+ + +#---------------------------------------------------------------------------# +# Error Detection Functions +#---------------------------------------------------------------------------# +
[docs]def __generate_crc16_table(): + ''' Generates a crc16 lookup table + + .. note:: This will only be generated once + ''' + result = [] + for byte in range(256): + crc = 0x0000 + for _ in range(8): + if (byte ^ crc) & 0x0001: + crc = (crc >> 1) ^ 0xa001 + else: crc >>= 1 + byte >>= 1 + result.append(crc) + return result
+ +__crc16_table = __generate_crc16_table() + + +
[docs]def computeCRC(data): + ''' Computes a crc16 on the passed in string. For modbus, + this is only used on the binary serial protocols (in this + case RTU). + + The difference between modbus's crc16 and a normal crc16 + is that modbus starts the crc value out at 0xffff. + + :param data: The data to create a crc16 of + :returns: The calculated CRC + ''' + crc = 0xffff + for a in data: + idx = __crc16_table[(crc ^ byte2int(a)) & 0xff]; + crc = ((crc >> 8) & 0xff) ^ idx + swapped = ((crc << 8) & 0xff00) | ((crc >> 8) & 0x00ff) + return swapped
+ + +
[docs]def checkCRC(data, check): + ''' Checks if the data matches the passed in CRC + + :param data: The data to create a crc16 of + :param check: The CRC to validate + :returns: True if matched, False otherwise + ''' + return computeCRC(data) == check
+ + +
[docs]def computeLRC(data): + ''' Used to compute the longitudinal redundancy check + against a string. This is only used on the serial ASCII + modbus protocol. A full description of this implementation + can be found in appendex B of the serial line modbus description. + + :param data: The data to apply a lrc to + :returns: The calculated LRC + + ''' + lrc = sum(byte2int(a) for a in data) & 0xff + lrc = (lrc ^ 0xff) + 1 + return lrc & 0xff
+ + +
[docs]def checkLRC(data, check): + ''' Checks if the passed in data matches the LRC + + :param data: The data to calculate + :param check: The LRC to validate + :returns: True if matched, False otherwise + ''' + return computeLRC(data) == check
+ + +
[docs]def rtuFrameSize(data, byte_count_pos): + ''' Calculates the size of the frame based on the byte count. + + :param data: The buffer containing the frame. + :param byte_count_pos: The index of the byte count in the buffer. + :returns: The size of the frame. + + The structure of frames with a byte count field is always the + same: + + - first, there are some header fields + - then the byte count field + - then as many data bytes as indicated by the byte count, + - finally the CRC (two bytes). + + To calculate the frame size, it is therefore sufficient to extract + the contents of the byte count field, add the position of this + field, and finally increment the sum by three (one byte for the + byte count field, two for the CRC). + ''' + return byte2int(data[byte_count_pos]) + byte_count_pos + 3
+ +#---------------------------------------------------------------------------# +# Exported symbols +#---------------------------------------------------------------------------# +__all__ = [ + 'pack_bitstring', 'unpack_bitstring', 'default', + 'computeCRC', 'checkCRC', 'computeLRC', 'checkLRC', 'rtuFrameSize' +] +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt new file mode 100644 index 000000000..7f5b7d3c3 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt @@ -0,0 +1,16 @@ +================================================== +Asynchronous Client Example +================================================== + +The asynchronous client functions in the same way as the synchronous +client, however, the asynchronous client uses twisted to return deferreds +for the response result. Just like the synchronous version, it works against +TCP, UDP, serial ASCII, and serial RTU devices. + +Below an asynchronous tcp client is demonstrated running against a +reference server. If you do not have a device to test with, feel free +to run a pymodbus server instance or start the reference tester in +the tools directory. + +.. literalinclude:: ../../../examples/common/asynchronous-client.py + diff --git a/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt new file mode 100644 index 000000000..4afd8504e --- /dev/null +++ b/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt @@ -0,0 +1,15 @@ +================================================== +Asynchronous Processor Example +================================================== + +Below is a simplified asynchronous client skeleton that was +submitted by a user of the library. It can be used as a guide +for implementing more complex pollers or state machines. + +Feel free to test it against whatever device you currently have +available. If you do not have a device to test with, feel free +to run a pymodbus server instance or start the reference tester in +the tools directory. + +.. literalinclude:: ../../../examples/common/asynchronous-processor.py + diff --git a/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt new file mode 100644 index 000000000..14aeef298 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt @@ -0,0 +1,6 @@ +================================================== +Asynchronous Server Example +================================================== + +.. literalinclude:: ../../../examples/common/asynchronous-server.py + diff --git a/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt b/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt new file mode 100644 index 000000000..a95c5e7a6 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt @@ -0,0 +1,6 @@ +================================================== +Binary Coded Decimal Example +================================================== + +.. literalinclude:: ../../../examples/contrib/bcd-payload.py + diff --git a/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt b/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt new file mode 100644 index 000000000..662f2a7a0 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt @@ -0,0 +1,22 @@ +================================================== +Bottle Web Frontend Example +================================================== + +-------------------------------------------------- +Summary +-------------------------------------------------- + +This is a simple example of adding a live REST api +on top of a running pymodbus server. This uses the +bottle microframework to achieve this. + +The example can be hosted under twisted as well as +the bottle internal server and can furthermore be +run behind gunicorn, cherrypi, etc wsgi containers. + +-------------------------------------------------- +Main Program +-------------------------------------------------- + +.. literalinclude:: ../../../examples/gui/web/frontend.py + diff --git a/doc/sphinx/html/_sources/examples/callback-server.rst.txt b/doc/sphinx/html/_sources/examples/callback-server.rst.txt new file mode 100644 index 000000000..e57475216 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/callback-server.rst.txt @@ -0,0 +1,6 @@ +================================================== +Callback Server Example +================================================== + +.. literalinclude:: ../../../examples/common/callback-server.py + diff --git a/doc/sphinx/html/_sources/examples/changing-framers.rst.txt b/doc/sphinx/html/_sources/examples/changing-framers.rst.txt new file mode 100644 index 000000000..3679aa43f --- /dev/null +++ b/doc/sphinx/html/_sources/examples/changing-framers.rst.txt @@ -0,0 +1,6 @@ +================================================== +Changing Default Framers +================================================== + +.. literalinclude:: ../../../examples/common/changing-framers.py + diff --git a/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt b/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt new file mode 100644 index 000000000..1a3799ac9 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modbus Concurrent Client Example +================================================== + +.. literalinclude:: ../../../examples/contrib/concurrent-client.py + diff --git a/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt b/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt new file mode 100644 index 000000000..7139c0f08 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt @@ -0,0 +1,6 @@ +================================================== +Custom Datablock Example +================================================== + +.. literalinclude:: ../../../examples/common/custom-datablock.py + diff --git a/doc/sphinx/html/_sources/examples/custom-message.rst.txt b/doc/sphinx/html/_sources/examples/custom-message.rst.txt new file mode 100644 index 000000000..2ced10cbc --- /dev/null +++ b/doc/sphinx/html/_sources/examples/custom-message.rst.txt @@ -0,0 +1,6 @@ +================================================== +Custom Message Example +================================================== + +.. literalinclude:: ../../../examples/common/custom-message.py + diff --git a/doc/sphinx/html/_sources/examples/database-datastore.rst.txt b/doc/sphinx/html/_sources/examples/database-datastore.rst.txt new file mode 100644 index 000000000..9186be812 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/database-datastore.rst.txt @@ -0,0 +1,6 @@ +================================================== +Database Datastore Example +================================================== + +.. literalinclude:: ../../../examples/contrib/database-datastore.py + diff --git a/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt b/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt new file mode 100644 index 000000000..3efc72644 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt @@ -0,0 +1,26 @@ +================================================== +Glade/GTK Frontend Example +================================================== + +Main Program +-------------------------------------------------- + +This is an example simulator that is written using the pygtk +bindings. Although it currently does not have a frontend for +modifying the context values, it does allow one to expose N +virtual modbus devices to a network which is useful for testing +data center monitoring tools. + +.. note:: The virtual networking code will only work on linux + +.. literalinclude:: ../../../examples/gui/gtk/simulator.py + :language: python + +Glade Layout File +-------------------------------------------------- + +The following is the glade layout file that is used by this script: + +.. literalinclude:: ../../../examples/gui/gtk/simulator.glade + :language: xml + diff --git a/doc/sphinx/html/_sources/examples/index.rst.txt b/doc/sphinx/html/_sources/examples/index.rst.txt new file mode 100644 index 000000000..84f5c941c --- /dev/null +++ b/doc/sphinx/html/_sources/examples/index.rst.txt @@ -0,0 +1,59 @@ + +Pymodbus Library Examples +==================================== + +*What follows is a collection of examples using the pymodbus +library in various ways* + +Example Library Code +-------------------------------------------------- + +.. toctree:: + :maxdepth: 2 + + asynchronous-client + asynchronous-server + asynchronous-processor + custom-message + modbus-logging + modbus-payload + modbus-payload-server + synchronous-client + synchronous-client-ext + synchronous-server + performance + updating-server + callback-server + changing-framers + thread-safe-datastore + +Custom Pymodbus Code +-------------------------------------------------- + +.. toctree:: + :maxdepth: 2 + + redis-datastore + database-datastore + bcd-payload + modicon-payload + message-generator + message-parser + serial-forwarder + modbus-scraper + modbus-simulator + concurrent-client + libmodbus-client + remote-server-context + +Example Frontend Code +-------------------------------------------------- + +.. toctree:: + :maxdepth: 2 + + gtk-frontend + tk-frontend + wx-frontend + bottle-frontend + diff --git a/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt b/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt new file mode 100644 index 000000000..17ac8e2cf --- /dev/null +++ b/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt @@ -0,0 +1,6 @@ +================================================== +Libmodbus Client Facade +================================================== + +.. literalinclude:: ../../../examples/contrib/libmodbus-client.py + diff --git a/doc/sphinx/html/_sources/examples/message-generator.rst.txt b/doc/sphinx/html/_sources/examples/message-generator.rst.txt new file mode 100644 index 000000000..605554c45 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/message-generator.rst.txt @@ -0,0 +1,26 @@ +================================================== +Modbus Message Generator Example +================================================== + +This is an example of a utility that will build +examples of modbus messages in all the available +formats in the pymodbus package. + +-------------------------------------------------- +Program Source +-------------------------------------------------- + +.. literalinclude:: ../../../examples/contrib/message-generator.py + +-------------------------------------------------- +Example Request Messages +-------------------------------------------------- + +.. literalinclude:: ../../../examples/contrib/tx-messages + +-------------------------------------------------- +Example Response Messages +-------------------------------------------------- + +.. literalinclude:: ../../../examples/contrib/rx-messages + diff --git a/doc/sphinx/html/_sources/examples/message-parser.rst.txt b/doc/sphinx/html/_sources/examples/message-parser.rst.txt new file mode 100644 index 000000000..0bbaee9fc --- /dev/null +++ b/doc/sphinx/html/_sources/examples/message-parser.rst.txt @@ -0,0 +1,55 @@ +================================================== +Modbus Message Parsing Example +================================================== + +This is an example of a parser to decode raw messages +to a readable description. It will attempt to decode +a message to the request and response version of a +message if possible. Here is an example output:: + + $./message-parser.py -b -m 000112340006ff076d + ================================================================================ + Decoding Message 000112340006ff076d + ================================================================================ + ServerDecoder + -------------------------------------------------------------------------------- + name = ReadExceptionStatusRequest + check = 0x0 + unit_id = 0xff + transaction_id = 0x1 + protocol_id = 0x1234 + documentation = + This function code is used to read the contents of eight Exception Status + outputs in a remote device. The function provides a simple method for + accessing this information, because the Exception Output references are + known (no output reference is needed in the function). + + ClientDecoder + -------------------------------------------------------------------------------- + name = ReadExceptionStatusResponse + check = 0x0 + status = 0x6d + unit_id = 0xff + transaction_id = 0x1 + protocol_id = 0x1234 + documentation = + The normal response contains the status of the eight Exception Status + outputs. The outputs are packed into one data byte, with one bit + per output. The status of the lowest output reference is contained + in the least significant bit of the byte. The contents of the eight + Exception Status outputs are device specific. + +-------------------------------------------------- +Program Source +-------------------------------------------------- + +.. literalinclude:: ../../../examples/contrib/message-parser.py + +-------------------------------------------------- +Example Messages +-------------------------------------------------- + +See the documentation for the message generator +for a collection of messages that can be parsed +by this utility. + diff --git a/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt b/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt new file mode 100644 index 000000000..710e5bd4d --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modbus Logging Example +================================================== + +.. literalinclude:: ../../../examples/common/modbus-logging.py + diff --git a/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt b/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt new file mode 100644 index 000000000..9144f0f53 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modbus Payload Server Context Building Example +================================================== + +.. literalinclude:: ../../../examples/common/modbus-payload-server.py + diff --git a/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt b/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt new file mode 100644 index 000000000..79e46dfdb --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modbus Payload Building/Decoding Example +================================================== + +.. literalinclude:: ../../../examples/common/modbus-payload.py + diff --git a/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt b/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt new file mode 100644 index 000000000..9931c4a62 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modbus Scraper Example +================================================== + +.. literalinclude:: ../../../examples/contrib/modbus-scraper.py + diff --git a/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt b/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt new file mode 100644 index 000000000..5adcee5ee --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt @@ -0,0 +1,5 @@ +================================================== +Modbus Simulator Example +================================================== + +.. literalinclude:: ../../../examples/contrib/modbus-simulator.py diff --git a/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt b/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt new file mode 100644 index 000000000..997a12f50 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt @@ -0,0 +1,6 @@ +================================================== +Modicon Encoded Example +================================================== + +.. literalinclude:: ../../../examples/contrib/modicon-payload.py + diff --git a/doc/sphinx/html/_sources/examples/performance.rst.txt b/doc/sphinx/html/_sources/examples/performance.rst.txt new file mode 100644 index 000000000..93185bdea --- /dev/null +++ b/doc/sphinx/html/_sources/examples/performance.rst.txt @@ -0,0 +1,11 @@ +================================================== +Synchronous Client Performance Check +================================================== + +Below is a quick example of how to test the performance of a tcp modbus +device using the synchronous tcp client. If you do not have a device +to test with, feel free to run a pymodbus server instance or start +the reference tester in the tools directory. + +.. literalinclude:: ../../../examples/common/performance.py + diff --git a/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt b/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt new file mode 100644 index 000000000..bb5554e04 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt @@ -0,0 +1,6 @@ +================================================== +Redis Datastore Example +================================================== + +.. literalinclude:: ../../../examples/contrib/redis-datastore.py + diff --git a/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt b/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt new file mode 100644 index 000000000..2a2ac3c05 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt @@ -0,0 +1,6 @@ +================================================== +Remote Single Server Context +================================================== + +.. literalinclude:: ../../../examples/contrib/remote_server_context.py + diff --git a/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt b/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt new file mode 100644 index 000000000..87f6e0a0c --- /dev/null +++ b/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt @@ -0,0 +1,6 @@ +================================================== +Synchronous Serial Forwarder +================================================== + +.. literalinclude:: ../../../examples/contrib/serial-forwarder.py + diff --git a/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt new file mode 100644 index 000000000..5012ec8b0 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt @@ -0,0 +1,6 @@ +================================================== +Synchronous Client Extended Example +================================================== + +.. literalinclude:: ../../../examples/common/synchronous-client-ext.py + diff --git a/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt new file mode 100644 index 000000000..b90563402 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt @@ -0,0 +1,19 @@ +================================================== +Synchronous Client Example +================================================== + +It should be noted that each request will block waiting for the result. If asynchronous +behaviour is required, please use the asynchronous client implementations. +The synchronous client, works against TCP, UDP, serial ASCII, and serial RTU devices. + +The synchronous client exposes the most popular methods of the modbus protocol, +however, if you want to execute other methods against the device, +simple create a request instance and pass it to the execute method. + +Below an synchronous tcp client is demonstrated running against a +reference server. If you do not have a device to test with, feel free +to run a pymodbus server instance or start the reference tester in +the tools directory. + +.. literalinclude:: ../../../examples/common/synchronous-client.py + diff --git a/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt new file mode 100644 index 000000000..1db715d7f --- /dev/null +++ b/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt @@ -0,0 +1,6 @@ +================================================== +Synchronous Server Example +================================================== + +.. literalinclude:: ../../../examples/common/synchronous-server.py + diff --git a/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt b/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt new file mode 100644 index 000000000..7a965a3f4 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt @@ -0,0 +1,6 @@ +================================================== +Thread Safe Datastore Example +================================================== + +.. literalinclude:: ../../../examples/contrib/thread_safe_datastore.py + diff --git a/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt b/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt new file mode 100644 index 000000000..1849d0abc --- /dev/null +++ b/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt @@ -0,0 +1,17 @@ +================================================== +TK Frontend Example +================================================== + +Main Program +-------------------------------------------------- + +This is an example simulator that is written using the native tk +toolkit. Although it currently does not have a frontend for +modifying the context values, it does allow one to expose N +virtual modbus devices to a network which is useful for testing +data center monitoring tools. + +.. note:: The virtual networking code will only work on linux + +.. literalinclude:: ../../../examples/gui/tk/simulator.py + diff --git a/doc/sphinx/html/_sources/examples/updating-server.rst.txt b/doc/sphinx/html/_sources/examples/updating-server.rst.txt new file mode 100644 index 000000000..07d1baac0 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/updating-server.rst.txt @@ -0,0 +1,6 @@ +================================================== +Updating Server Example +================================================== + +.. literalinclude:: ../../../examples/common/updating-server.py + diff --git a/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt b/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt new file mode 100644 index 000000000..5d68142c0 --- /dev/null +++ b/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt @@ -0,0 +1,17 @@ +================================================== +WX Frontend Example +================================================== + +Main Program +-------------------------------------------------- + +This is an example simulator that is written using the python wx +bindings. Although it currently does not have a frontend for +modifying the context values, it does allow one to expose N +virtual modbus devices to a network which is useful for testing +data center monitoring tools. + +.. note:: The virtual networking code will only work on linux + +.. literalinclude:: ../../../examples/gui/wx/simulator.py + diff --git a/doc/sphinx/html/_sources/index.rst.txt b/doc/sphinx/html/_sources/index.rst.txt new file mode 100644 index 000000000..7017018f2 --- /dev/null +++ b/doc/sphinx/html/_sources/index.rst.txt @@ -0,0 +1,23 @@ +.. PyModbus documentation master file, created by + sphinx-quickstart on Tue Apr 14 19:11:16 2009. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PyModbus's documentation! +==================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + examples/index.rst + library/index.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/sphinx/html/_sources/library/async-client.rst.txt b/doc/sphinx/html/_sources/library/async-client.rst.txt new file mode 100644 index 000000000..c325706dc --- /dev/null +++ b/doc/sphinx/html/_sources/library/async-client.rst.txt @@ -0,0 +1,19 @@ +:mod:`client.async` --- Twisted Async Modbus Client +==================================================== + +.. module:: client.async + :synopsis: Twisted Asynchronous Modbus Client + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------ + +.. automodule:: pymodbus.client.async + +.. autoclass:: ModbusClientProtocol + :members: + +.. autoclass:: ModbusClientFactory + :members: diff --git a/doc/sphinx/html/_sources/library/async-server.rst.txt b/doc/sphinx/html/_sources/library/async-server.rst.txt new file mode 100644 index 000000000..8f2dcdb7b --- /dev/null +++ b/doc/sphinx/html/_sources/library/async-server.rst.txt @@ -0,0 +1,29 @@ +:mod:`server.async` --- Twisted Asynchronous Modbus Server +============================================================ + +.. module:: server.async + :synopsis: Twisted Asynchronous Modbus Server + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.server.async + +.. autoclass:: ModbusTcpProtocol + :members: + +.. autoclass:: ModbusUdpProtocol + :members: + +.. autoclass:: ModbusServerFactory + :members: + +.. autofunction:: StartTcpServer + +.. autofunction:: StartUdpServer + +.. autofunction:: StartSerialServer + diff --git a/doc/sphinx/html/_sources/library/bit-read-message.rst.txt b/doc/sphinx/html/_sources/library/bit-read-message.rst.txt new file mode 100644 index 000000000..9ea4b0cfa --- /dev/null +++ b/doc/sphinx/html/_sources/library/bit-read-message.rst.txt @@ -0,0 +1,32 @@ +:mod:`bit_read_message` --- Bit Read Modbus Messages +============================================================ + +.. module:: bit_read_message + :synopsis: Bit Read Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.bit_read_message + +.. autoclass:: ReadBitsRequestBase + :members: + +.. autoclass:: ReadBitsResponseBase + :members: + +.. autoclass:: ReadCoilsRequest + :members: + +.. autoclass:: ReadCoilsResponse + :members: + +.. autoclass:: ReadDiscreteInputsRequest + :members: + +.. autoclass:: ReadDiscreteInputsResponse + :members: + diff --git a/doc/sphinx/html/_sources/library/bit-write-message.rst.txt b/doc/sphinx/html/_sources/library/bit-write-message.rst.txt new file mode 100644 index 000000000..6a73f9a46 --- /dev/null +++ b/doc/sphinx/html/_sources/library/bit-write-message.rst.txt @@ -0,0 +1,26 @@ +:mod:`bit_write_message` --- Bit Write Modbus Messages +============================================================ + +.. module:: bit_write_message + :synopsis: Bit Write Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.bit_write_message + +.. autoclass:: WriteSingleCoilRequest + :members: + +.. autoclass:: WriteSingleCoilResponse + :members: + +.. autoclass:: WriteMultipleCoilsRequest + :members: + +.. autoclass:: WriteMultipleCoilsResponse + :members: + diff --git a/doc/sphinx/html/_sources/library/client-common.rst.txt b/doc/sphinx/html/_sources/library/client-common.rst.txt new file mode 100644 index 000000000..5cca7ada3 --- /dev/null +++ b/doc/sphinx/html/_sources/library/client-common.rst.txt @@ -0,0 +1,16 @@ +:mod:`client.common` --- Twisted Async Modbus Client +==================================================== + +.. module:: client.common + :synopsis: Modbus common client clode + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------ + +.. automodule:: pymodbus.client.common + +.. autoclass:: ModbusClientMixin + :members: diff --git a/doc/sphinx/html/_sources/library/constants.rst.txt b/doc/sphinx/html/_sources/library/constants.rst.txt new file mode 100644 index 000000000..a99e207c6 --- /dev/null +++ b/doc/sphinx/html/_sources/library/constants.rst.txt @@ -0,0 +1,31 @@ +:mod:`constants` --- Modbus Default Values +============================================================ + +.. module:: constants + :synopsis: Modbus Default Values + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.constants + +.. autoclass:: Defaults + :members: + +.. autoclass:: ModbusStatus + :members: + +.. autoclass:: Endian + :members: + +.. autoclass:: ModbusPlusOperation + :members: + +.. autoclass:: DeviceInformation + :members: + +.. autoclass:: MoreData + :members: diff --git a/doc/sphinx/html/_sources/library/datastore/context.rst.txt b/doc/sphinx/html/_sources/library/datastore/context.rst.txt new file mode 100644 index 000000000..16a62e2e1 --- /dev/null +++ b/doc/sphinx/html/_sources/library/datastore/context.rst.txt @@ -0,0 +1,20 @@ +:mod:`context` --- Modbus Server Contexts +============================================================ + +.. module:: context + :synopsis: Modbus Server Contexts + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.datastore.context + +.. autoclass:: ModbusSlaveContext + :members: + +.. autoclass:: ModbusServerContext + :members: + diff --git a/doc/sphinx/html/_sources/library/datastore/index.rst.txt b/doc/sphinx/html/_sources/library/datastore/index.rst.txt new file mode 100644 index 000000000..6ea14b24e --- /dev/null +++ b/doc/sphinx/html/_sources/library/datastore/index.rst.txt @@ -0,0 +1,13 @@ + +Server Datastores and Contexts +==================================== + +*The following are the API documentation strings taken +from the sourcecode* + +.. toctree:: + :maxdepth: 2 + + store.rst + context.rst + remote.rst diff --git a/doc/sphinx/html/_sources/library/datastore/remote.rst.txt b/doc/sphinx/html/_sources/library/datastore/remote.rst.txt new file mode 100644 index 000000000..551f0b17b --- /dev/null +++ b/doc/sphinx/html/_sources/library/datastore/remote.rst.txt @@ -0,0 +1,16 @@ +:mod:`remote` --- Remote Slave Context +============================================================ + +.. module:: remote + :synopsis: Remote Slave Context + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.datastore.remote + +.. autoclass:: RemoteSlaveContext + :members: diff --git a/doc/sphinx/html/_sources/library/datastore/store.rst.txt b/doc/sphinx/html/_sources/library/datastore/store.rst.txt new file mode 100644 index 000000000..1a5ff2d67 --- /dev/null +++ b/doc/sphinx/html/_sources/library/datastore/store.rst.txt @@ -0,0 +1,23 @@ +:mod:`store` --- Datastore for Modbus Server Context +============================================================ + +.. module:: store + :synopsis: Datastore for Modbus Server Context + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.datastore.store + +.. autoclass:: BaseModbusDataBlock + :members: + +.. autoclass:: ModbusSequentialDataBlock + :members: + +.. autoclass:: ModbusSparseDataBlock + :members: + diff --git a/doc/sphinx/html/_sources/library/device.rst.txt b/doc/sphinx/html/_sources/library/device.rst.txt new file mode 100644 index 000000000..59b996de4 --- /dev/null +++ b/doc/sphinx/html/_sources/library/device.rst.txt @@ -0,0 +1,28 @@ +:mod:`device` --- Modbus Device Representation +============================================================ + +.. module:: device + :synopsis: Modbus Device Representation + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.device + +.. autoclass:: ModbusAccessControl + :members: + +.. autoclass:: ModbusPlusStatistics + :members: + +.. autoclass:: ModbusDeviceIdentification + :members: + +.. autoclass:: DeviceInformationFactory + :members: + +.. autoclass:: ModbusControlBlock + :members: diff --git a/doc/sphinx/html/_sources/library/diag-message.rst.txt b/doc/sphinx/html/_sources/library/diag-message.rst.txt new file mode 100644 index 000000000..5500a1cbc --- /dev/null +++ b/doc/sphinx/html/_sources/library/diag-message.rst.txt @@ -0,0 +1,128 @@ +:mod:`diag_message` --- Diagnostic Modbus Messages +============================================================ + +.. module:: diag_message + :synopsis: Diagnostic Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.diag_message + +.. autoclass:: DiagnosticStatusRequest + :members: + +.. autoclass:: DiagnosticStatusResponse + :members: + +.. autoclass:: DiagnosticStatusSimpleRequest + :members: + +.. autoclass:: DiagnosticStatusSimpleResponse + :members: + +.. autoclass:: ReturnQueryDataRequest + :members: + +.. autoclass:: ReturnQueryDataResponse + :members: + +.. autoclass:: RestartCommunicationsOptionRequest + :members: + +.. autoclass:: RestartCommunicationsOptionResponse + :members: + +.. autoclass:: ReturnDiagnosticRegisterRequest + :members: + +.. autoclass:: ReturnDiagnosticRegisterResponse + :members: + +.. autoclass:: ChangeAsciiInputDelimiterRequest + :members: + +.. autoclass:: ChangeAsciiInputDelimiterResponse + :members: + +.. autoclass:: ForceListenOnlyModeRequest + :members: + +.. autoclass:: ForceListenOnlyModeResponse + :members: + +.. autoclass:: ClearCountersRequest + :members: + +.. autoclass:: ClearCountersResponse + :members: + +.. autoclass:: ReturnBusMessageCountRequest + :members: + +.. autoclass:: ReturnBusMessageCountResponse + :members: + +.. autoclass:: ReturnBusCommunicationErrorCountRequest + :members: + +.. autoclass:: ReturnBusCommunicationErrorCountResponse + :members: + +.. autoclass:: ReturnBusExceptionErrorCountRequest + :members: + +.. autoclass:: ReturnBusExceptionErrorCountResponse + :members: + +.. autoclass:: ReturnSlaveMessageCountRequest + :members: + +.. autoclass:: ReturnSlaveMessageCountResponse + :members: + +.. autoclass:: ReturnSlaveNoResponseCountRequest + :members: + +.. autoclass:: ReturnSlaveNoReponseCountResponse + :members: + +.. autoclass:: ReturnSlaveNAKCountRequest + :members: + +.. autoclass:: ReturnSlaveNAKCountResponse + :members: + +.. autoclass:: ReturnSlaveBusyCountRequest + :members: + +.. autoclass:: ReturnSlaveBusyCountResponse + :members: + +.. autoclass:: ReturnSlaveBusCharacterOverrunCountRequest + :members: + +.. autoclass:: ReturnSlaveBusCharacterOverrunCountResponse + :members: + +.. autoclass:: ReturnIopOverrunCountRequest + :members: + +.. autoclass:: ReturnIopOverrunCountResponse + :members: + +.. autoclass:: ClearOverrunCountRequest + :members: + +.. autoclass:: ClearOverrunCountResponse + :members: + +.. autoclass:: GetClearModbusPlusRequest + :members: + +.. autoclass:: GetClearModbusPlusResponse + :members: + diff --git a/doc/sphinx/html/_sources/library/events.rst.txt b/doc/sphinx/html/_sources/library/events.rst.txt new file mode 100644 index 000000000..5bc4d466e --- /dev/null +++ b/doc/sphinx/html/_sources/library/events.rst.txt @@ -0,0 +1,28 @@ +:mod:`events` --- Events Used in PyModbus +============================================================ + +.. module:: events + :synopsis: Events Used in PyModbus + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.events + +.. autoclass:: ModbusEvent + :members: + +.. autoclass:: RemoteReceiveEvent + :members: + +.. autoclass:: RemoteSendEvent + :members: + +.. autoclass:: EnteredListenModeEvent + :members: + +.. autoclass:: CommunicationRestartEvent + :members: diff --git a/doc/sphinx/html/_sources/library/exceptions.rst.txt b/doc/sphinx/html/_sources/library/exceptions.rst.txt new file mode 100644 index 000000000..03c05ea71 --- /dev/null +++ b/doc/sphinx/html/_sources/library/exceptions.rst.txt @@ -0,0 +1,26 @@ +:mod:`exceptions` --- Exceptions Used in PyModbus +============================================================ + +.. module:: exceptions + :synopsis: Exceptions Used in PyModbus + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.exceptions + +.. autoclass:: ModbusException + :members: + +.. autoclass:: ModbusIOException + :members: + +.. autoclass:: ParameterException + :members: + +.. autoclass:: NotImplementedException + :members: + diff --git a/doc/sphinx/html/_sources/library/factory.rst.txt b/doc/sphinx/html/_sources/library/factory.rst.txt new file mode 100644 index 000000000..5f0fcc83a --- /dev/null +++ b/doc/sphinx/html/_sources/library/factory.rst.txt @@ -0,0 +1,19 @@ +:mod:`factory` --- Request/Response Decoders +============================================================ + +.. module:: factory + :synopsis: Request/Response Decoders + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.factory + +.. autoclass:: ServerDecoder + :members: + +.. autoclass:: ClientDecoder + :members: diff --git a/doc/sphinx/html/_sources/library/file-message.rst.txt b/doc/sphinx/html/_sources/library/file-message.rst.txt new file mode 100644 index 000000000..e5d0b666d --- /dev/null +++ b/doc/sphinx/html/_sources/library/file-message.rst.txt @@ -0,0 +1,34 @@ +:mod:`file_message` --- File Modbus Messages +============================================================ + +.. module:: file_message + :synopsis: File Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.file_message + +.. autoclass:: FileRecord + :members: + +.. autoclass:: ReadFileRecordRequest + :members: + +.. autoclass:: ReadFileRecordResponse + :members: + +.. autoclass:: WriteFileRecordRequest + :members: + +.. autoclass:: WriteFileRecordResponse + :members: + +.. autoclass:: ReadFifoQueueRequest + :members: + +.. autoclass:: ReadFifoQueueResponse + :members: diff --git a/doc/sphinx/html/_sources/library/index.rst.txt b/doc/sphinx/html/_sources/library/index.rst.txt new file mode 100644 index 000000000..f21e8e4a7 --- /dev/null +++ b/doc/sphinx/html/_sources/library/index.rst.txt @@ -0,0 +1,35 @@ + +Pymodbus Library API Documentation +==================================== + +*The following are the API documentation strings taken +from the sourcecode* + +.. toctree:: + :maxdepth: 2 + + bit-read-message.rst + bit-write-message.rst + client-common.rst + sync-client.rst + async-client.rst + constants.rst + datastore/index.rst + diag-message.rst + device.rst + factory.rst + interfaces.rst + exceptions.rst + other-message.rst + mei-message.rst + file-message.rst + events.rst + payload.rst + pdu.rst + pymodbus.rst + register-read-message.rst + register-write-message.rst + sync-server.rst + async-server.rst + transaction.rst + utilities.rst diff --git a/doc/sphinx/html/_sources/library/interfaces.rst.txt b/doc/sphinx/html/_sources/library/interfaces.rst.txt new file mode 100644 index 000000000..cb10d0c62 --- /dev/null +++ b/doc/sphinx/html/_sources/library/interfaces.rst.txt @@ -0,0 +1,28 @@ +:mod:`interfaces` --- System Interfaces +============================================================ + +.. module:: interfaces + :synopsis: System Interfaces + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.interfaces + +.. autoclass:: Singleton + :members: + +.. autoclass:: IModbusDecoder + :members: + +.. autoclass:: IModbusFramer + :members: + +.. autoclass:: IModbusSlaveContext + :members: + +.. autoclass:: IPayloadBuilder + :members: diff --git a/doc/sphinx/html/_sources/library/mei-message.rst.txt b/doc/sphinx/html/_sources/library/mei-message.rst.txt new file mode 100644 index 000000000..d75809445 --- /dev/null +++ b/doc/sphinx/html/_sources/library/mei-message.rst.txt @@ -0,0 +1,19 @@ +:mod:`mei_message` --- MEI Modbus Messages +============================================================ + +.. module:: mei_message + :synopsis: MEI Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.mei_message + +.. autoclass:: ReadDeviceInformationRequest + :members: + +.. autoclass:: ReadDeviceInformationResponse + :members: diff --git a/doc/sphinx/html/_sources/library/other-message.rst.txt b/doc/sphinx/html/_sources/library/other-message.rst.txt new file mode 100644 index 000000000..3baf24888 --- /dev/null +++ b/doc/sphinx/html/_sources/library/other-message.rst.txt @@ -0,0 +1,31 @@ +:mod:`other_message` --- Other Modbus Messages +============================================================ + +.. module:: other_message + :synopsis: Other Modbus Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.other_message + +.. autoclass:: ReadExceptionStatusRequest + :members: + +.. autoclass:: ReadExceptionStatusResponse + :members: + +.. autoclass:: GetCommEventCounterRequest + :members: + +.. autoclass:: GetCommEventCounterResponse + :members: + +.. autoclass:: ReportSlaveIdRequest + :members: + +.. autoclass:: ReportSlaveIdResponse + :members: diff --git a/doc/sphinx/html/_sources/library/payload.rst.txt b/doc/sphinx/html/_sources/library/payload.rst.txt new file mode 100644 index 000000000..4083aa2ca --- /dev/null +++ b/doc/sphinx/html/_sources/library/payload.rst.txt @@ -0,0 +1,19 @@ +:mod:`payload` --- Modbus Payload Utilities +============================================================ + +.. module:: payload + :synopsis: Modbus Payload Utilities + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.payload + +.. autoclass:: BinaryPayloadBuilder + :members: + +.. autoclass:: BinaryPayloadDecoder + :members: diff --git a/doc/sphinx/html/_sources/library/pdu.rst.txt b/doc/sphinx/html/_sources/library/pdu.rst.txt new file mode 100644 index 000000000..46b8fd456 --- /dev/null +++ b/doc/sphinx/html/_sources/library/pdu.rst.txt @@ -0,0 +1,32 @@ +:mod:`pdu` --- Base Structures +============================================================ + +.. module:: pdu + :synopsis: Base Structures + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.pdu + +.. autoclass:: ModbusPDU + :members: + +.. autoclass:: ModbusRequest + :members: + +.. autoclass:: ModbusResponse + :members: + +.. autoclass:: ModbusExceptions + :members: + +.. autoclass:: ExceptionResponse + :members: + +.. autoclass:: IllegalFunctionRequest + :members: + diff --git a/doc/sphinx/html/_sources/library/pymodbus.rst.txt b/doc/sphinx/html/_sources/library/pymodbus.rst.txt new file mode 100644 index 000000000..54719825d --- /dev/null +++ b/doc/sphinx/html/_sources/library/pymodbus.rst.txt @@ -0,0 +1,7 @@ +:mod:`pymodbus` --- Pymodbus Library +============================================================ + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +.. automodule:: pymodbus diff --git a/doc/sphinx/html/_sources/library/register-read-message.rst.txt b/doc/sphinx/html/_sources/library/register-read-message.rst.txt new file mode 100644 index 000000000..aeb4c3402 --- /dev/null +++ b/doc/sphinx/html/_sources/library/register-read-message.rst.txt @@ -0,0 +1,38 @@ +:mod:`register_read_message` --- Register Read Messages +============================================================ + +.. module:: register_read_message + :synopsis: Register Read Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.register_read_message + +.. autoclass:: ReadRegistersRequestBase + :members: + +.. autoclass:: ReadRegistersResponseBase + :members: + +.. autoclass:: ReadHoldingRegistersRequest + :members: + +.. autoclass:: ReadHoldingRegistersResponse + :members: + +.. autoclass:: ReadInputRegistersRequest + :members: + +.. autoclass:: ReadInputRegistersResponse + :members: + +.. autoclass:: ReadWriteMultipleRegistersRequest + :members: + +.. autoclass:: ReadWriteMultipleRegistersResponse + :members: + diff --git a/doc/sphinx/html/_sources/library/register-write-message.rst.txt b/doc/sphinx/html/_sources/library/register-write-message.rst.txt new file mode 100644 index 000000000..71a917646 --- /dev/null +++ b/doc/sphinx/html/_sources/library/register-write-message.rst.txt @@ -0,0 +1,26 @@ +:mod:`register_write_message` --- Register Write Messages +============================================================ + +.. module:: register_write_message + :synopsis: Register Write Messages + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.register_write_message + +.. autoclass:: WriteSingleRegisterRequest + :members: + +.. autoclass:: WriteSingleRegisterResponse + :members: + +.. autoclass:: WriteMultipleRegistersRequest + :members: + +.. autoclass:: WriteMultipleRegistersResponse + :members: + diff --git a/doc/sphinx/html/_sources/library/sync-client.rst.txt b/doc/sphinx/html/_sources/library/sync-client.rst.txt new file mode 100644 index 000000000..af3059b20 --- /dev/null +++ b/doc/sphinx/html/_sources/library/sync-client.rst.txt @@ -0,0 +1,29 @@ +:mod:`client.sync` --- Twisted Synchronous Modbus Client +========================================================= + +.. module:: client.sync + :synopsis: Twisted Synchronous Modbus Client + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------ + +.. automodule:: pymodbus.client.sync + +.. autoclass:: ModbusTransactionManager + :members: + +.. autoclass:: BaseModbusClient + :members: + +.. autoclass:: ModbusTcpClient + :members: + +.. autoclass:: ModbusUdpClient + :members: + +.. autoclass:: ModbusSerialClient + :members: + diff --git a/doc/sphinx/html/_sources/library/sync-server.rst.txt b/doc/sphinx/html/_sources/library/sync-server.rst.txt new file mode 100644 index 000000000..3dcf9e04d --- /dev/null +++ b/doc/sphinx/html/_sources/library/sync-server.rst.txt @@ -0,0 +1,40 @@ +:mod:`server.sync` --- Twisted Synchronous Modbus Server +============================================================ + +.. module:: server.sync + :synopsis: Twisted Synchronous Modbus Server + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.server.sync + +.. autoclass:: ModbusBaseRequestHandler + :members: + +.. autoclass:: ModbusSingleRequestHandler + :members: + +.. autoclass:: ModbusConnectedRequestHandler + :members: + +.. autoclass:: ModbusDisconnectedRequestHandler + :members: + +.. autoclass:: ModbusTcpServer + :members: + +.. autoclass:: ModbusUdpServer + :members: + +.. autoclass:: ModbusSerialServer + :members: + +.. autofunction:: StartTcpServer + +.. autofunction:: StartUdpServer + +.. autofunction:: StartSerialServer diff --git a/doc/sphinx/html/_sources/library/transaction.rst.txt b/doc/sphinx/html/_sources/library/transaction.rst.txt new file mode 100644 index 000000000..b6ee89a8a --- /dev/null +++ b/doc/sphinx/html/_sources/library/transaction.rst.txt @@ -0,0 +1,31 @@ +:mod:`transaction` --- Transaction Controllers for Pymodbus +============================================================ + +.. module:: transaction + :synopsis: Transaction controllers for pymodbus + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.transaction + +.. autoclass:: DictTransactionManager + :members: + +.. autoclass:: FifoTransactionManager + :members: + +.. autoclass:: ModbusSocketFramer + :members: + +.. autoclass:: ModbusRtuFramer + :members: + +.. autoclass:: ModbusAsciiFramer + :members: + +.. autoclass:: ModbusBinaryFramer + :members: diff --git a/doc/sphinx/html/_sources/library/utilities.rst.txt b/doc/sphinx/html/_sources/library/utilities.rst.txt new file mode 100644 index 000000000..d8e78527e --- /dev/null +++ b/doc/sphinx/html/_sources/library/utilities.rst.txt @@ -0,0 +1,33 @@ +:mod:`utilities` --- Extra Modbus Helpers +========================================== + +.. module:: utilities + :synopsis: Extra Modbus Helpers + +.. moduleauthor:: Galen Collins +.. sectionauthor:: Galen Collins + +API Documentation +------------------- + +.. automodule:: pymodbus.utilities + +.. autofunction:: default + +.. autofunction:: dict_property + +.. autofunction:: pack_bitstring + +.. autofunction:: unpack_bitstring + +.. autofunction:: __generate_crc16_table + +.. autofunction:: computeCRC + +.. autofunction:: checkCRC + +.. autofunction:: computeLRC + +.. autofunction:: checkLRC + +.. autofunction:: rtuFrameSize diff --git a/doc/sphinx/html/_static/README b/doc/sphinx/html/_static/README new file mode 100644 index 000000000..06016c7ce --- /dev/null +++ b/doc/sphinx/html/_static/README @@ -0,0 +1 @@ +include any html static content here diff --git a/doc/sphinx/html/_static/ajax-loader.gif b/doc/sphinx/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/doc/sphinx/html/_static/basic.css b/doc/sphinx/html/_static/basic.css new file mode 100644 index 000000000..dc88b5a2d --- /dev/null +++ b/doc/sphinx/html/_static/basic.css @@ -0,0 +1,632 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2017 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 input[type="text"] { + width: 170px; +} + +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 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; +} + +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 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; +} + +/* -- 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; +} + +/* -- 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; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #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; +} + +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/doc/sphinx/html/_static/classic.css b/doc/sphinx/html/_static/classic.css new file mode 100644 index 000000000..22fa0bde7 --- /dev/null +++ b/doc/sphinx/html/_static/classic.css @@ -0,0 +1,261 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/doc/sphinx/html/_static/comment-bright.png b/doc/sphinx/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..15e27edb12ac25701ac0ac21b97b52bb4e45415e GIT binary patch literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ literal 0 HcmV?d00001 diff --git a/doc/sphinx/html/_static/default.css b/doc/sphinx/html/_static/default.css new file mode 100644 index 000000000..81b936363 --- /dev/null +++ b/doc/sphinx/html/_static/default.css @@ -0,0 +1 @@ +@import url("classic.css"); diff --git a/doc/sphinx/html/_static/doctools.js b/doc/sphinx/html/_static/doctools.js new file mode 100644 index 000000000..565497723 --- /dev/null +++ b/doc/sphinx/html/_static/doctools.js @@ -0,0 +1,287 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2017 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) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var 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); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/* + * 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(); + + }, + + /** + * 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) + 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(); +}); \ No newline at end of file diff --git a/doc/sphinx/html/_static/down-pressed.png b/doc/sphinx/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5756c8cad8854722893dc70b9eb4bb0400343a39 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl literal 0 HcmV?d00001 diff --git a/doc/sphinx/html/_static/down.png b/doc/sphinx/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3bdad2ceffae91cee61b32f3295f9bbe646e48 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* literal 0 HcmV?d00001 diff --git a/doc/sphinx/html/_static/file.png b/doc/sphinx/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/doc/sphinx/html/_static/jquery-3.1.0.js b/doc/sphinx/html/_static/jquery-3.1.0.js new file mode 100644 index 000000000..f2fc27478 --- /dev/null +++ b/doc/sphinx/html/_static/jquery-3.1.0.js @@ -0,0 +1,10074 @@ +/*eslint-disable no-unused-vars*/ +/*! + * jQuery JavaScript Library v3.1.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2016-07-07T21:44Z + */ +( 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 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.1.0", + + // 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 num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // 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 = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.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"; + }, + + isArray: Array.isArray, + + 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 ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + 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.0 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-01-04 + */ +(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)|^-$|[^\x80-\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; + }, + { 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: + // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) + // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Check form elements and option elements for explicit disabling + return "label" in elem && elem.disabled === disabled || + "form" in elem && elem.disabled === disabled || + + // Check non-disabled form elements for fieldset[disabled] ancestors + "form" in elem && elem.disabled === false && ( + // Support: IE6-11+ + // Ancestry is covered for us + elem.isDisabled === disabled || + + // Otherwise, assume any non-

wS%ZJZUT9_SO|tQu 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 Ntr|$Ejq>=&e*i=kD#HK( literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/pdu.doctree b/doc/sphinx/doctrees/library/pdu.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d117353cd3128a7d43059c38a32bdfa6c30ce8ed GIT binary patch literal 58850 zcmeHw4U`;Lb*5}-G^5e~pKaNe)y9%Nl07p51D3@qU@RNUN`#J)S!Y?N>FKVS>ZhLW zc6YTj!(d1-;4u_APH0RL5|iL0_>d;BU~eEmc9R2a64>}83tnJZhj?X^}?g0Yq z3H#mqe(JsM>Y1w6sArfHAFHR{t5@&mzWejN`)fpTsdm-jcr_4P`lmiL=5g~nK| z9-#S&T>fm$o8;;T^QBz9E}L3gEO6dXp;6WCH^L3I+y3$ePz*58N;zAg+8=C&gF$YJYHIqIgj=e)THSLV8ZLPGN-al^G*5-=(I@Hw zo*SxrK~OADfmquO^(JeTa^RHJ2s4rUb{{9#OLW4f9xqC>TE zu0%EM&X+2=vsrICS1e_7g+dL~K_BPCEw#yf7Gv{j=pS-Ug_|g6A_r?PIr^1br#@SM_d={m*W(&o7ZUTch)3BLGZ#V?xq%KC}%xH3+KYxC#IveCBAUBisi&K6H|G?zyN|iDu zeb~>HOu>P0ORf=Avc*ESN@6wxCMZIZHiNf{p}~!!Jgk_vZZ^ND0Z4WI*e99GWFpJKLy&NL$Y5YGqOb z=z*7;Mq^jIEZeRhwow=A=%^3!mWa~f=Ac3%s(Tg=Kws2mo8d-iL+BYfNFrC8{(v;F z;5EZdm|SSYvQ}>cEW;k7y`PK?j6|d4jiP8X+=<^& zDm-cx_WaHFHyi#=Ot-c_{;+?Ezt-R5m;Dkd@z?mp*dFL+R1M)ZN735R*Q1r!bH83m z{d!H*FMrO|T;!U=t~y&UY`N)x&sdfkrm8VF=cDf5cFPkmRiL4Kx(>4 z%+P#<2n18+O%^Ip&`^JuRxz8D0Xl=_@i>u#dJSHiJ<1BHd5USe5v3s6rDDEFN|Njp z#0I=znN}t(jU7}Ahodn!d3<~PM`&y`eWfB8H&=>AA@kRrfy^OOcH?bLh6Qp0U^fXX z_)jz@a>#kVGvPM5N5XYXARiX5Iy*|_@EU&0e&M>(Vkx96(G48aF7G*S#LDcGsoQJ86r z=AWM#b)SiZ!D?Sg!GkgF+EYT@u>H2vCo;#KZdesD(_<=PN||}^zky+Xg{J@MlN)jQ zMUec{cFPM9+W$P1sx?N7)UhP!pm{j$BG0jN#ahtFm0;WJ262v7XKyB`i3~EhH;=t! z9HtdI1}c;=qAAEY6aoesL*al0GL^}U-9KPO)-!5`nOkYVYarUt`%|@C)o7HOr$Mn`u>-5Q!~ zluEoL3O863Qifxv$r?Fy=qxPPRQ(`v;rYHwpgnagi{gMqrmak-Tp0*e>eNIqV7+7- z3`V?^DwFjdQT0Oq=>ieQ?($pWC<-vsf=9#+oB*3_l3f5kptWV9_BY#eHP+URyP|Hi zm2-P@cWiGqaBmWKMchoSIb^smYTsfCx9xuu+x8A_oAlze2V7Aqg6$H~V@UH?8!4uA zSF}8sx>MJ?N7Qv?9}J`R++j7;uv(%RJHU07a%t9WI$Q@ZhE@GKS|796*&riE$RE<( zc!y;(9qhL|D`na>QvfW44;fqzohy3hdG*YY&_jC*B6e{$8o%NH885vd%paj-j za{d8_qMk7Vby$YO36qS=NYmQl{xMV~we9z;nTQ)6;ihYOsUY$l()h3 zhZkIAtHld&Lwo~2kyy-GO-7blT#rIlQ{oUkNlI1Rh@UvC{4DZwVhq2oNtXF9qNlDf z#Ofe~vdvrC3FLH7TS)PhJGE*f>OkO?Z8M!5(`U7F1l;nfO?le3we zM%lv}WdmOqYh#(ri6E2Dl`|8l0B#<32cnW(9goyGCzG!<$iqrDD(a^ZxxRM6%z@Z? zDGTo){>W(74z`CDvK+nwOAjda+tFlokJ)W}_uuZOA!{)SV_pq?W|(T__Jhw*^TB@|rFJ zsp?oBVSIpyv{b@4h05ZDQRcHSZjXe~j9UrfpviDVD6JWNGmXfp!4g8#hG7#Hz+W(2 zLDuw~lRC?(J_z7_S3s$08PvwJhRp;o6ZoDsnIwsn#9k3Lj9@NlD_|^hqC8BwXKp{O z99cJIih;4hgq5i#@~w^F8Vhx4o*~=7&|{gqD(A6dRl8}JN>WAGyeZ~N8RU@=*PYtX zgL>7=lO;dz7xTXC19hzG)lk7ScSSkUpiZX9;TDW#&Y)h24i3*8K8yij->D8rQ0EpW zYL#3epR1!sa;J271iPq}%;A~I$%9?A$iI+mA(9y$7w;#TXo>e4#@>q5FPaoFy=3#= zRpCh9_wr{GEjO<2q6oQ$jNDZn{DPo|I-4EQYoJEaIdJ z8K2hqCB$bGX5j%qAt@AvvEf&7#XMqNK^B&}ozhZoCH3#bd2C;SYT^un%x8nJBSKXX^_4Zay7Qj9p}OMC!$?B6Q#ce2 zc22x5qPArvq9R6+*hJiq(q=RDG$(`)g}u0^*xJ5>ZL(U`+l3-XT~D&@LDgj}Sz zR<}{LF(@8EHu($L_pV|AEFRT+|4XnfC>~Qy*`a0PSCN@wKkz<`jJ80cE~@=N@q|0R zxV;3?LYXw1f4^ZU`YvgnZs zVuik5KR+kFNtEsY{knkRRaWNTvRU(MoJgq5@wn5J*5PuyUsbg_RO|CZ(7vhGE7nQ- z+7d(N>YqEONokO0OJhHfj9+e_{m#PJ^ z@wzvOgTeq8az%Pw2%^bV?h&uiokDEfJ@TfZ1#5tNQ9!Qvi7a<>Dr$P7QfP~tih~an zXLHqUyhUK|!Fw}#ugY&3_k@E=9IkvVkL67htIAwX}kFA%@OoROE%@2o+!51vQ)3u+7u+PD_HcEBX-?9b z@&-9CIfu-NOYlTHd`!wL7G&gV97c(UjQ6WfKYfx!yu4wN zf+G`+NgTSsc=KJ$*AhXTB>cbCM!dr@ONp7WMxNCg;I}hF{9MjPCTjP zgx~FWA19J-J?!o>7^fT7K17%DZh!uLOn(w?O01U?+(w7A;MmmSz+;{3cJ?n+XItX4 zG2LDr0Qm`wtbYLcdxoNaYp%ZDNn53*ALTn~0J0?@=>YQH+qHI=+Yxo>c7n*c4BmmI z4gGLM>J)>O7wNy@Yq4uR=DQ^};ZGDlvX)cgCj=++Bs=h@J5C-op)EykI67tnknMi$N!2t;m?@{qw zT~95zG6sgLhmwG9>Q}nAAN5HBDl$R7`S>JAmKtmOySl#e_&Dl|1KKj5f%ayHKsx*& zyxhrl!)E4|14f(4=n*vQlLY{mKS5OPfXljoVRshWKU7T2K>5R*5GRts^tM9;+=i1L zHt?r0?I(P>^l2KVGg=Fkw@te{=x1XZO^C*$H~ihE)8cWf9tV*}`EHm0L3Oz${zpvb zR|h8N3GLfH_U=Im1zTdkT>Yq%wn|BVfbXQia*c!aWg0mTY94+yxin|0jE+O`DEhIyZEEDSv20L>$;mkQ&*=w4Bxtp7QyNl>vTK9 zRgx^7VUCY*eKpNU{%lW;y++iFe!hahs_(IzpqmiJtN1hh|q(vd10Y)hmIIZ zYHzMzz}{HZb()-*Sl6Xf_FpAhMao_Wh+T-He+E^?DSDaDihhr?@Z;dNI0|I23W=Qxp6@ozA+q)i2@ z<+PgLuE<%%SU22WuN~5$`v)=oUmd#tZ)qy~wv4&aQ1mKuwOw8DqF(ZbQhWbJGD?bY zT#G%l?oSquJI3!V;`K+o^hgKQ<8TCd{3xGOTF6x78aNA+RjFU$FvvQml%L%;Ss4?1kAdhgA0mxBfCw8xU z3zi0Rw->A%W|~~OWrxAsyu4eFO|@ayA|S4;hkVXe)378s<(-zKPrOSo zC+@}*$^fMf=(1vTxEhCB;$w84P@R_B1-~Y{n~YP!-M2xdXe4IT3T8T85cel(#A@Kt zc0rfQ&7=r^tR+5W20-yQ|4yY^LJkG$mg92dJSgQW<=)Z6Dj}hrN=R3eOr+iqxLzYD zrE9xx2wWA5OyyHa;OG+V2z;F;AuSYLU`ODuP+uGlmHCWAx40xSTLS8E#Cw#PavcnB zTpqxw=c65ECXA%fK7X+J-xHx_HAkWt8ePD!H>+8B6g-LEw8qMTfF#2*=~6}@wA@Sz3F;+R`$rs?VT6WMtd2Y6}(`L@@nSNb3 zVGO2tlm_Y4U~BQVrVRJ6?fPXrDkHq;+~9|u)EhaK#`76XsLbhZx#P322PoW_H<59$paM^%$?9^|)) zx@M&9Vz+82Ej~&U)Dlk`@(v*Nev=~7OJXZU*@Fn*lEwE|vXc~Xj?YyfEHUob?^qeW zaUmIQt95yV_|J)aOC`kr5tYRWvCL;7zNSrxJBXm9cx%Uvx$teviF~c?Ko^xWi*C~3E01&x-bXbwSS~*WeLWG;*I#IfL+6`p4vodDMpKI78$S+ zcka~&R1>GMWIk&w6Q3u+t)&N)s=BsarKyQ>m+dQ4dG!_;usP9F>skdznb>iXD*}>JIIx zu6O^YT--@m(Q};`wKF2_GVH%07=E!2s*N>pAQQS{(qIc)3)o@bh>t|xxPw0G=6DF)iEko5g z&qhWWZGR!A-PNJ~uO;<^u2D-$;Z>Yi`&sbd5N^7FEVs z9GP#gEn+C3))va=*->DG4$R{Cvt?OVbo8hF^!22sNqiKqR03VSjL6?%mKJ)i{+MQA z!cB)ck+O-UXE@0$_&BEO=EhgNRTPMF{>9m)24WsICcH?B8+sz5p z&6cmBM0J1%mLKGZ|X_nmDYRZ#Pt4- zee#2bF8nAe<_RZysrxJTe{6`wc{Spe_zGWjiEuMFucipMuAMb}6E0j1#FaHtT-!6I3zFcJ_YsxH(JGSN z9HpQV61u2_guOD6dSQRi7-Hj0?iyz0ej%^p!9FhSH*bP;ro~zdEbZ5#zBr&I^BHJu zj~TCmSTFCmHKHSdvr?gYdMUu^W2Y)*Xj%O|Zw6s+?(fc2M~{1jU*;?DfI@p|RyrV9 zd|1{#lr^4#9h~UhGhj8G)H5&|(|$tFz?C#iXS5dZi(wO^92f(>ET-Xv81SYvTt(Q_ zqKn3gBS}vn-Rv|*0jc%K+tYT_9pOD{ge`FwUnOmEXN;7zwHsT+ZTleSb24TWajj~IeQ*66n(q7dZW5xdnjqE2tCMm(tu=38q$H}1Kq;a48!Wz z*jI=aH&8fX&kbjbr$AM}kd`Jp!`>%2mCC#GqOLpF9hN6@?cCsOUUw9<_DvIbcVws2 zd3WMBj-Mf#qy-y-WT&fR=X1Cjhc{$CzE+A3Q;>!Vfvff`{;d`Av1fH}91C)HjwQswaI5OIPS!vqMnCKM4Fsv?K zhY5h0evO_7Hq&==>H=QH?5B5%r#+!}Dlo&OL7$bw?8Q5^CfqpDD3!b*)kkOchYg?~D zms;+zwws2_SaJW3qJ2xekFUD;$;{1h@{^?*k!dbW{V140wo9I~Ur`<1iEa-(h^dOT zXD#tAn#(=nF)l9Ni$BT;CY{7vJv}w-%+a%`kHqiT{grX5bO>dyv$w@OsdKsYDM8nZx>nb!{R09mqRc#vE8=8Kb`**VjeNnk``arCr2)4@8e!#K?SJ#9Yxq zrZGKwwSn`_d()IIm;%S2M$`` zSkfZkkfi%Y2E~3%1FXr_YBuCC%{w`@Qh|dVuLbPD6YXFJyMP%fYnx+cm^A1Y%VAzD z_;9WMwjlWqBxq0{NvUM?-1YWV6r;5)e@EPBP=8Jh7oU>jt1ey+b8}Dko*Fua3lsuP zWnF|;PMXFgohk1|mB%Xs$z_g!_l{s*n59oMX0siE^BtBqf-vsMtsMoi^Tt&s3E&b- zx3BsLXtcx_=FO-w4#UWN#xQ#p7`_5AS9L8i!m(NpFSk>|%vX;PX3$hHCw`S?p##I1 z5=I>tEzVLJ)(;owhW7k$wqP)#`v3j}b-t=9l=Qnv$0Iw7L42x?=4kX{!{@ zLwqL@auD7+E>2-KLzD{HfX>$^l+1%<&@LrwD3vB1mHXicZGt z<#99Gu$QO70aq#lwZwLFCCNmP;U6`Bkkdo5hae9$RIeGNFDk;b^=?WQ@PTe z>eOQWfswB9-|h!T;-5}}A(rU&3 z$nQRX?jyd3OA-G4Gc+F(NgRnnh2z7&U#$dyEz~PH(R=u})o{}A@B3rgPZnh+?xtbR z39C^nzN{OA7~R2|@@!1&31h%7*L&;g%>vCz@bKGR((tMe;ofgigK3EwzDnwmibA-O zg?2sK){atvig{KCbY$M@8+81Hq3Dz5>Tz{t38o_SEqo^pbhJby9ds-n_a=*FdSlGYO+&{K^)eQb-XPUO^sPh!6*=?&wk4 z7+XmS*Z@wyUnFQ6)fD!xO(2}V(2T}#_;Z{>c-7_-LaS=IQg)(L$)AlvtSF=>+%Pj; zI$DQ^$!mr~yr!s~^JLU2Mf<4Fb1F;_`lFdb1x!?~;M~dSYRQ|X6DWzLv<{Uo^c^}> zsU12rJc`39Wm&uro2g^5;-N5(yv&vGwI7^!$*;mzYn8l*^9bx}h>80AY3X#GFuM2Os8 zH#vbg@ue-2CD_1|-Cv5A3I?|K0A3k;bbYDdN1${ZewF!*U-vCa1O;S|EK+bmM7uI& zL7&^(+kthvX}&t#WZhmTxE!TT{LU~Z68g!)g#ez_i9Q0naW$BhI3P!o@Xdj=0Pk2^ zI|_Fw@~sYlw*zDBpKs7J6usA6om5v0@FZ;&p?}PpIt{?H_%R*8+i%D2=Q8oiX2qIS z1JaTW!`MUd5Y2u|%;_m$=u_j=Psko5&$#0Z?7j#2>t>iV=y%IuUMzp$VU6jWplqF) zIqzk1H7pas~`Ztf!&=RzYe)rX4~ z#RSND$6JDZA$-XQX(U(PD~pfC%qC!TW&!eGg`;PT$NxVlr1OHIP1EER`~~Mj8H! zTFuJ`rCGv8D^P+BGD z9E_3q3}dcYj0OtFXxILo?(Vdv6^<`02i{D;0a@XSz%phQB??LHZyGce%!&U@bJKxl zObH_$ys&u2X8S+kL{d02sK^L=Vz-$V(L~iaXD69#x4+*~{cVZ=9@F#HfouL8BkLco z*}79B#UC5mez%jhO8@-<-$~=>vDh&ku6dyj0xM^LVJO-pTG6WSf3)lxG8N zdKi*ne=&-Qf}uK~=1WGQU(Klt05>E3Jh_2+AtAcC(~OfweN2w?VxgNcrOWgi`S}LG zGIsoQHqKArZM$jg-{q#TZ`fN*x>0Jb>&Il9$!6U=r6|x6_w!X31Y~YrM^2x`dTyEs z6BP&PW&MPa&X^9#>7cw9%ZW++h3y^=r!_Hy+R!*0WbT@gG4UQ&eU%^9ev|Cw#bO^0 z_m>A8BU-guDcAMO42DxMc?*;>eP5^$sQtK^f%ljzIkspnl%|%N!BN`|hE)j}njsSu zT!*WZ8~v7Fm6w;|axJ!_!fo~0>4{1yJ6Wj&*cIn3)^KyK5mcO6sdFc6XFnd@jm*YxBmsb3oQur34$YH8^XcF4HOgh zC2aAp4|26ByjS|}W|v*yaG+SnVLr`yHlSb1Ss>N_zX}yS1=8`(HmgvMD5N+&LE%7R zE%lO43l#Ki7C|2#5s$CO&xh%UJ_yPm(-d!ChpYF{51pvbXTS^cxCwHxh-azS-=rV< z;I^QzC<}TSQqbFb;uUN0bDDlWLIn6D`uRTntf#zvbTvjl^c^rk->ed}4=ZTLMbOs_ z1$~20(2EIzBDBR9=&`TS&+$S0oWYMjBc8@E6H#f#q0(>%l@L@)?BLJ(Rq+fp@Em>` zR4m+XGXTCaJ4rk5;pTi%#%s%*2a%(h#N-SW3wU!RR|}daFA0YbhFhs2cmw>hqu!XP z2gRU4AIHejdEvx9;qEs6(+{r+H))nDA?^niY|w3SUr_a=sbr9@9DZb`WM1SS=0*Nt zUgRIK@DFo0|1kH^kKgcT8{w{YlI!{1 zMqhFzXHr&*BNKW9(Uu~sB59vzDW7KvpJ(ZwXUU#tsh$@^z8L%g;Q^&OFP_y#JS{m>BacDDy0^^DHX!EKc(*Eb}bV^DHj& be&bXl+{mYg!_4EeEW|^agK21uiLw6=y0bdj literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/pymodbus.doctree b/doc/sphinx/doctrees/library/pymodbus.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5270c57d0ea16fdae32472d60eea736b86846e3d GIT binary patch literal 4622 zcmc&&&5s;M72oggo%Pylq!qT*LVT>H%#0yKL@S6Oj!4kL$VwbIS)JJxtg;u0xBIdTGyoDesDuli$VHioQ_P%N$0U0tuNpoNrYru=nz=jY|4^2ly6V^kaz2H)v@HDf6r zAC`7a%R+^`v?u*{HCMW?S$4`M{Wt0}bbk~Z`V&Ra&nKyjfm(6feir*&lDdz9qVDjw663m$B|pxh>E;1qOhBaT{MO)l=iw&EYm}&QXgh&HmYRz zbrEP28+a=-Kcdqgm3G~*5uH?uMcc`l(tJ*6E8?M4j6}+TU4uN zhi_cLKCBGv4y^10MO>OcJgI=cYZl zjWF5T$$36+eWyaV0lT!T?>_i$_f@FD@dTAWjBz9}c$sJCIAb$nV7Fmuj+f6@G2jVz zG4LKjn<3ds%KCzo4o^epqecaVNG+B|>0XSK-`+OW5V8=|M z{e++Mq&!&#q~ly7s0i5rTTA0bh4Fd9(Cju^K=&(t4EX)@R` zh27UVWMS5h;<<#KwaO)XO;0kz#=eM0BEcU>zLLlcLEjQAX*aIg4l9iG zj7-`Ex8iIF7CCCcv%L{FhK~&;36vTbyE&B-2k?Uh2wG%Bd9qxtuNndz~WGq5^IyLx^mI zB2G|EG9;8(u$NX+Cn%ZN$Hu*f=reoh7e&Im z&7RU8HjnLEw~^yw_hDIx8;F0?mBf}<6wBgJWFo8pJ2au48_OqHM-t& zhTgBcm-qduWtHNC_WanLZ}+OE)bLD;vO3&kA*Rf0Xbts4Vg!IB; zM1VdLN6IIJ8#){xMiO-!RdFdtkZA$%BNK>twP__eK(EKHSd{~Z_cpd7>ytQ)sen=s zLrS5#UhcgPb;1HD+PzB{RPG*%C*&#xIf+4UmQ0j@NGqE^h)h|jnMpU6ei>28@ z{JsbnR(?CjjoCmP*%b$xKy%C|U4n=g;+gm*;`uuWqlh4-KtHVgqzJ@Qd-KI{YSsUz z4b=f$JU>~&V~(>P+tnB~Z#;F*F&ON1EC$L%P`geUM`e-7x~7rOh@IVU!r>iN;k;9R zlF8y=U@EFR%8CzcHa|i2&SPZ?mY_Z9b~*y3)C}S?!D4ScR+%m3ecF-ZtVLg zIVk@=y2~-5O@%HSd2-n18|EFC8h>!{eC}W**JU;H&4tAtH7*@{a0w%vmn(_#BNH!1 z`EzZuDk5$6+OIS+6gr4>8`6j1Cfp zX*)<{cvcNKSMo|6%vkqNXWief5W!#Fller^B;p-~cf7CNz5CTJ{(HrHr}v}YcY61F z-kWLg)=S=-T%|0V^tL{A|LaolG-jUesh;e;i)mxm2H?ldsD=-)1}3Qg^Kdj$J_;FN)GBd zPwnm;qEq|9k7uVhoIHBXg!D>CwU{w(UCvo*hJkCj#8@N~a2?x|gT zZK{@DTEnTWtbyYHa%>;eWWNeczwkCLAh>}=UV&buT!K=PzW&Y|9$3XO(7q@;uOik) z`1CFufUQS0NY78UDhp@2Ve`05O&7y_8px!*0JuBU?(A6TRytv!sLwao(Sdb0cNzmH zA{S#+u(f)8nV-mJ;6@MDXdUHa>a}9*I!oOw#UHD>dipIgpGYumU>~8H&{w-ZYZYBo zDqArHxmH!JJi;8^4zz9$RyJ^(m=3qqeFm3wnu}+DLa2U#!2X+;Kxu>*>`sG&n^kbb zYIHeUHlVOQWSyR>9~X{90hm4%9~JiC^3jbS*D#>OxS|=q!qFYLNoUYZ>3*jX#Xx*G TDC~B7TXs%tHVBYN5%m5Ik9hW> literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/register-read-message.doctree b/doc/sphinx/doctrees/library/register-read-message.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ced090eb6fbce7ce38bf85011f20f430838c71a GIT binary patch literal 93314 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 HQltL|PE`+K literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/sync-client.doctree b/doc/sphinx/doctrees/library/sync-client.doctree new file mode 100644 index 0000000000000000000000000000000000000000..619c40b7577631bc254ef6fc1d7665e60368eb7e GIT binary patch literal 89157 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 O)FY-xAmPoa$^Q>f*U5+g literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/sync-server.doctree b/doc/sphinx/doctrees/library/sync-server.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ac92e0b60a6332e47455037ad044154acb9e3bd9 GIT binary patch literal 102442 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/doctrees/library/utilities.doctree b/doc/sphinx/doctrees/library/utilities.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9a7bf73d2b3241425c293037383042453238426e GIT binary patch literal 37326 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 + + + + + + + Overview: module code — pymodbus 1.3.0.rc1 documentation + + + + + + + + + + + + +