From eed3f6e151eb9f9f921c5e56e9d6145f1fccbd3a Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Fri, 19 Jun 2020 18:30:22 +1000 Subject: [PATCH] Empty sphinx project following our template --- .gitignore | 172 +++++++++++++++- docs/Makefile | 20 ++ docs/make.bat | 35 ++++ docs/source/_static/custom.css | 63 ++++++ docs/source/_templates/components.rst | 47 +++++ docs/source/conf.py | 223 +++++++++++++++++++++ docs/source/img/blacs_32nx32n.svg | 178 +++++++++++++++++ docs/source/img/labscript_32nx32n.svg | 186 +++++++++++++++++ docs/source/img/lyse.ico | Bin 0 -> 102420 bytes docs/source/img/lyse_32nx32n.svg | 256 ++++++++++++++++++++++++ docs/source/img/lyse_64x64.svg | 55 +++++ docs/source/img/runmanager_32nx32n.svg | 267 +++++++++++++++++++++++++ docs/source/img/runviewer_32nx32n.svg | 223 +++++++++++++++++++++ docs/source/index.rst | 34 ++++ readthedocs.yaml | 27 +++ setup.cfg | 8 +- 16 files changed, 1785 insertions(+), 9 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/_static/custom.css create mode 100644 docs/source/_templates/components.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/img/blacs_32nx32n.svg create mode 100644 docs/source/img/labscript_32nx32n.svg create mode 100644 docs/source/img/lyse.ico create mode 100644 docs/source/img/lyse_32nx32n.svg create mode 100644 docs/source/img/lyse_64x64.svg create mode 100644 docs/source/img/runmanager_32nx32n.svg create mode 100644 docs/source/img/runviewer_32nx32n.svg create mode 100644 docs/source/index.rst create mode 100644 readthedocs.yaml diff --git a/.gitignore b/.gitignore index 45943cc..2bb3882 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,167 @@ -*.aux +# This gitignore file consists of 2 parts: +# * The standard Python .gitignore rules from GitHub +# * custom ignore rules for the labscript suite. +# +# These should be kept separate so that the generic rules can be updated with a +# copy/paste without having to worry about whether we are removing custom rules + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# +# Custom labscript suite .gitignore rules start below +# + +# Editors +.vscode/ + +# conda build results +conda_build/ +conda_packages/ + +# LaTeX build results *.out -*.pyg *.log +*.aux *.toc -*.pyc -dist -*.egg-info -*.eggs -conda_build -conda_packages \ No newline at end of file + +# Sphinx documentation +docs/html/ +docs/source/_build/ +docs/source/components.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css new file mode 100644 index 0000000..d766bfa --- /dev/null +++ b/docs/source/_static/custom.css @@ -0,0 +1,63 @@ +/* Add space between collapsible details HTML tags */ +details { + margin-bottom: 1em; +} + +/* Darker pygment highlighing of console input/output */ +.highlight .go { + color: #404040; +} + +/* White captions in sidebar */ +.wy-nav-side p.caption { + color: #f5f5f5; +} + +/* labscript blue, alpha = 83% */ +.wy-side-nav-search { + background: #2946bbd3; +} + +.wy-nav-top { + background: #2946bbd3; +} + +/* labscript green, alpha = 75% */ +.rst-content .note .admonition-title { + background: #00804fbf; +} + +/* labscript green, alpha = 25% */ +.rst-content .note { + background: #00804f3f; +} + +/* labscript red, alpha = 75% */ +.rst-content .warning .admonition-title { + background: #bc294cbf +} + +/* labscript red, alpha = 25% */ +.rst-content .warning { + background: #bc294c3b; +} + +/* Elevation +* +* Style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: +* +* https://github.com/material-components/material-components-web +* https://material-components-web.appspot.com/elevation.html +*/ + +.rst-content img.screenshot { + border: none; + /* MD Elevation 8 */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), + 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); + margin-bottom: 24px; +} + +img.labscript-suite-icon { + min-width: 32px; +} \ No newline at end of file diff --git a/docs/source/_templates/components.rst b/docs/source/_templates/components.rst new file mode 100644 index 0000000..f966939 --- /dev/null +++ b/docs/source/_templates/components.rst @@ -0,0 +1,47 @@ +{% if current_project != 'the labscript suite' %} +.. toctree:: + :maxdepth: 2 + :hidden: + + the labscript suite <{{intersphinx_mapping['labscript-suite'][0]}}> + +{% endif %} +*labscript suite* components +============================ + +The *labscript suite* is modular by design, and is comprised of: + +.. list-table:: Python libraries + :widths: 10 90 + :header-rows: 0 + + {% for prog, item in programs.items() if item.type == 'lib' %} + * - .. image:: {{img_path}}/{{item.icon}} + :target: {{intersphinx_mapping['%s' | format(prog)][0]}} + :class: labscript-suite-icon + - |{{prog}}|_ --- {{item.desc}} + {% endfor %} + +.. list-table:: Graphical applications + :widths: 10 90 + :header-rows: 0 + + {% for prog, item in programs.items() if item.type == 'gui' %} + * - .. image:: {{img_path}}/{{item.icon}} + :target: {{intersphinx_mapping['%s' | format(prog)][0]}} + :class: labscript-suite-icon + - |{{prog}}|_ --- {{item.desc}} + {% endfor %} + +.. toctree:: + :maxdepth: 2 + :hidden: + + {% for prog in programs|sort if prog != current_project %} + {{prog}} <{{intersphinx_mapping['%s' | format(prog)][0]}}> + {% endfor %} + +{% for prog in programs %} +.. |{{prog}}| replace:: **{{prog}}** +.. _{{prog}}: {{intersphinx_mapping['%s' | format(prog)][0]}} +{% endfor %} \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..5fe20e6 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,223 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# 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. +# +import os +from pathlib import Path +from m2r import MdInclude +from recommonmark.transform import AutoStructify +from jinja2 import FileSystemLoader, Environment + +# -- Project information (unique to each project) ------------------------------------- + +project = "lyse" +copyright = "2020, labscript suite" +author = "labscript suite contributors" + +# The full version, including alpha/beta/rc tags +from lyse import __version__ as version # noqa: E402 + +release = version + +# HTML icons +img_path = 'img' +html_logo = img_path + "/lyse_64x64.svg" +html_favicon = img_path + "/lyse.ico" + +# -- General configuration (should be identical across all projects) ------------------ + +# 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.autosectionlabel", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinx_rtd_theme", + "recommonmark", +] + +autodoc_typehints = 'description' + +# Prefix each autosectionlabel with the name of the document it is in and a colon +autosectionlabel_prefix_document = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# The suffix(es) of source filenames. +source_suffix = ['.rst', '.md'] + +# The master toctree document. +master_doc = 'index' + +# intersphinx allows us to link directly to other repos sphinxdocs. +# https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html +intersphinx_mapping = { + 'python': ('https://docs.python.org/3/', None), + 'numpy': ('https://numpy.org/doc/stable/', None), + 'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None), + 'pandas': ('https://pandas.pydata.org/pandas-docs/stable/', None), + 'qtutils': ('https://qtutils.readthedocs.io/en/stable/', None), + 'pyqtgraph': ( + 'https://pyqtgraph.readthedocs.io/en/latest/', + None, + ), # change to stable once v0.11 is published + 'matplotlib': ('https://matplotlib.org/', None), + 'h5py': ('http://docs.h5py.org/en/stable/', None), + 'pydaqmx': ('https://pythonhosted.org/PyDAQmx/', None), + 'qt': ( + '', + 'pyqt5-modified-objects.inv', + ) # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py + # under MIT License + # TODO + # desktop-app + # spinapi/pynivision/etc +} + +# list of all labscript suite components that have docs +labscript_suite_programs = { + 'labscript': { + 'desc': 'Expressive composition of hardware-timed experiments', + 'icon': 'labscript_32nx32n.svg', + 'type': 'lib', + }, + 'labscript-devices': { + 'desc': 'Plugin architecture for controlling experiment hardware', + 'icon': 'labscript_32nx32n.svg', + 'type': 'lib', + }, + 'labscript-utils': { + 'desc': 'Shared modules used by the *labscript suite*', + 'icon': 'labscript_32nx32n.svg', + 'type': 'lib', + }, + 'runmanager': { + 'desc': 'Graphical and remote interface to parameterized experiments', + 'icon': 'runmanager_32nx32n.svg', + 'type': 'gui', + }, + 'blacs': { + 'desc': 'Graphical interface to scientific instruments and experiment supervision', + 'icon': 'blacs_32nx32n.svg', + 'type': 'gui', + }, + 'lyse': { + 'desc': 'Online analysis of live experiment data', + 'icon': 'lyse_32nx32n.svg', + 'type': 'gui', + }, + 'runviewer': { + 'desc': 'Visualize hardware-timed experiment instructions', + 'icon': 'runviewer_32nx32n.svg', + 'type': 'gui', + }, +} + +# whether to use stable or latest version +labscript_suite_doc_version = os.environ.get('READTHEDOCS_VERSION', 'latest') +if labscript_suite_doc_version not in ['stable', 'latest']: + labscript_suite_doc_version = 'stable' + +# add intersphinx references for each component +for ls_prog in labscript_suite_programs: + intersphinx_mapping[ls_prog] = ( + 'https://docs.labscriptsuite.org/projects/{}/en/{}/'.format( + ls_prog, labscript_suite_doc_version + ), + None, + ) + +# add intersphinx reference for the metapackage +if project != "the labscript suite": + intersphinx_mapping['labscript-suite'] = ( + 'https://docs.labscriptsuite.org/en/{}/'.format(labscript_suite_doc_version), + None, + ) + +# Make `some code` equivalent to :code:`some code` +default_role = 'code' + +# hide todo notes if on readthedocs and not building the latest +if os.environ.get('READTHEDOCS') and ( + os.environ.get('READTHEDOCS_VERSION') != 'latest' + or ( + os.environ.get('READTHEDOCS_PROJECT') == project + or os.environ.get('READTHEDOCS_PROJECT') == 'labscriptsuite' + ) +): + todo_include_todos = False +else: + todo_include_todos = True + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" +html_title = "labscript suite | {project}".format( + project=project + if project != "labscript-suite" + else "experiment control and automation" +) +html_short_title = "labscript suite" + +# 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'] + +# Customize the html_theme +html_theme_options = {'navigation_depth': 3} + +# Use m2r only for mdinclude and recommonmark for everything else +# https://github.com/readthedocs/recommonmark/issues/191#issuecomment-622369992 +def setup(app): + config = { + # 'url_resolver': lambda url: github_doc_root + url, + 'auto_toc_tree_section': 'Contents', + 'enable_eval_rst': True, + } + app.add_config_value('recommonmark_config', config, True) + app.add_transform(AutoStructify) + + # from m2r to make `mdinclude` work + app.add_config_value('no_underscore_emphasis', False, 'env') + app.add_config_value('m2r_parse_relative_links', False, 'env') + app.add_config_value('m2r_anonymous_references', False, 'env') + app.add_config_value('m2r_disable_inline_math', False, 'env') + app.add_directive('mdinclude', MdInclude) + app.add_stylesheet('custom.css') + + # generate the components.rst file dynamically so it points to stable/latest + # of subprojects correctly + loader = FileSystemLoader(Path(__file__).resolve().parent / templates_path[0]) + env = Environment(loader=loader) + template = env.get_template('components.rst') + with open(Path(__file__).resolve().parent / 'components.rst', 'w') as f: + f.write( + template.render( + intersphinx_mapping=intersphinx_mapping, + programs=labscript_suite_programs, + current_project=project, + img_path=img_path + ) + ) diff --git a/docs/source/img/blacs_32nx32n.svg b/docs/source/img/blacs_32nx32n.svg new file mode 100644 index 0000000..d6a2b0e --- /dev/null +++ b/docs/source/img/blacs_32nx32n.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/docs/source/img/labscript_32nx32n.svg b/docs/source/img/labscript_32nx32n.svg new file mode 100644 index 0000000..97272af --- /dev/null +++ b/docs/source/img/labscript_32nx32n.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/docs/source/img/lyse.ico b/docs/source/img/lyse.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea37a74a3652c797e3caedc4659c91243fd37b41 GIT binary patch literal 102420 zcmeHQ2Rv5a|Gy8CSz1a;lvLVjXc$RWNm7)AQW^?L5rv|pfs}SpQu&tABr=kbhQ0SJ zviElW_dL3O*Y$|!@o4?Kuh)6b{LJ^c=iYnnIrl*j62gpFSs`f5k4$GFA-V{HaB+3! z_b?%dJzB=i-I?cNL68Ox6566OFFqYXn8%=${GItnD4nzz36YfS%ukm>kTOLQf;K~} z(0~dd%YjLl8nzrEht52GemM|i7Aq5jBO3z}jfQWm3`jE?cc20M3v}^8$9JEWqW+AA zzD9j6Ods@UQ$QfQ*a`P*ha(FATs3(1*~M(5L(N?g7geFC_c=M_53t*bzjoAJF#M z1ijaA=uH+UGb2z~Ee!%*zy62u05GQI9Pxei3dl>Z0uX~<@aaIYJJ%<`KWMfOCLbT4SPy`Y1?MCf4Ki-|c0S7guBnPGY{D0X0dCxGg4-oJN5L*;j?+Gc)6QbC6o708Y zkBG3afB63)*ZkhjPx!1x;n^@6KL()h52h2(efWIe8_$2`f7V#Ad810VaUEife`oZ4 zUcaji=Mct!bGLu^d5=Fw;XEBDGgBA75P$r<5PDx&k3aw6oGzaJ|9d($D<1fST?gl$ z>;i{wOMz_;Q-G2!7mzu@2&Ao$0fnFCTR2yY#~8)D4qgM$_XP9s{-dFA>4rVr#7u{}&N1KmDA?u!r$r+lS}xa{Cq${}%K&K=vflFFEhAK7hw(u+w3op+x-K@#j8F!}SDtpWcIHqpdyr z06G>V9oPi&-iP+P-~O)S|9>GD2lc)l!?&+^urbH;PfJT9;@>0R)xIDfWZZTD37ePq z=m!Z~R)CD_cAyAt)775J`4Vi5$6{Lf&_ee-;tpM&-TT6}KlQZeKM)$?`A*CedFMrh zfF!*QJ^BE=FGx1t2J&M*($ohq+_9J_cd+s?sS&^QdQa>VgJoxLe2I7y^OWccbFxAD zWorQM0kG!+EKb-e0W$A7gQCI$s`>$jI~G%tOYgG$!aVdofA%lE-v5dCV>sjlz66Oo z6?*gm*cVcc?FI!&@%`=t817h%$r#M|rth)e3VYZW2Gd?jyou*KF;9sGUk2v_((H~< z>;nm!t3cLc*M8ZA;f}?48H16A^LmP>IR4>}o9iKB5A*%?ea@>VAVGUI#eR@_$_Nyu zr~Z%^hC3GbS1zsX;JX{**!w%=X|;z|I!c)1%c$X7kQfJ2%y&`j1MoVL8}O{xK7iql z#ni~9wk>>@^RwpjsqItL+A`4gc&sUbbIB1@YlL1^v93+cuXl_jxWQvrC0ihdRV`)$NB&q2k0SR-JX9y z_``cWdg$@H@W5kDDNS!Z{k+ns#vbbf^tc~@>vXAoCdaq`kQn?Ae=44}iT%f1CyHkL zEp$H&*!Kfnqn(wTK42Y)KKYe-O6NSjjGnp`78U`O`9U<}ud*O$z`n5t!m z7anU$X?p4i@8hwtoYpuajk@>BMEz;O98W{!_owG6VU91Or+sP31IIu1f-NZeK4(OW zZg?zdNz)?pcc#H(O({)J-3L1UZx}SN(vltwfBZ_Gc&sU<2Sc~?lzgy5I<((?0JeoRP#3rd5$;9A*j&+^C5l0yk|eA$;TU%<}@MEq%yng1ygBpGg| zI2I)9tAhNG;RAa22m1jndi~Bcc&sU&%<*N##l_%f1S0+em01uGjIJ|Q?lBhN$8uWI1J&zyqsL=SDP2-h0)9py z;!h8m#d+wO!;6;P`T#AM<7w!j*YCuG66W}_Z{NOwpAm@o(^F^#QBeWt8G@eY01dIX z{eJg@^$SP?X$Ptc9!px%1C@`_|7t&Adf>69l&-9-1oRBs#Hq&~>jRK>pt{h4Ii6;q z@-g~f?FUQ`N|@uzs;a60J;Oll9;hyOENMv(R6a)ktNnoKfybIsy1Kd=&@+U*%mdrR z`~U9$f9HNEfV2bEg%-^5Gy|27(f?{cV0uu(9A8#jTMPcCfX9-SbfMQhP+L(N=8NXW2Jq$4jb6WpU*vWPz&2R> z{>B*YSlnMaTH8^=9ADPj+6w-rfX9-SG|?9|DRCfGe^a+LCfL0}y6JXMpPx;Y|1jLK zm?)3lc|6vX(rs;R;BN}FV2-Du$s)C!*g$E%v$#+FD!s z`}nrBSGphR)1Nv#)|Ap69Ub6r3bbI3r|HWVt+h2E-^q$%A4t+(4a)qzyZN)aq8V81 zis^wncK&0rrEUzUu59i`+m|l=si%ZFz6|_j2OdjW(*1QuRb(JY+R?e@5I+vUbe_FA zXsf9LHI*%3w|qpO*kgTQw?YJ{scPx33jJz_$C^^QUrhd>Mzmm#r=iBwmeOL7eR4m= zu^<_pGdikD{kO2-I6%*X66W|addm78c;T_6B~7&r==HNaz^BKY(SPW-EU@#M+W1pw z8P#g^Mu5kfQo1*~Kee0|%<(j|+TB!$?nOYK2eE6x;U$-8#{aZ_JgsW+V zx6QUnkmr^=(Dgdh97Mc{d1`q532mvtno`@rwh_Y}iz&&gP51~>_O9=FJwVqMWFFH6 z&0h;Bkx?uo;!Vs`B>IC3DPc-Y*?G2fT`Kdqh;rqq-T zw!IkcSll0ZtySe9*X}UIK9Iai0aSl@+bbI)-o$*bgukeQ8mtDR?O>aY;f}@B$g6n! z3M6VuQS1lgHHUSzJ=hWPCgyt({NjSaz?2%EgKa*BI~G$bueqcMWLfN?*auSdltEq6 z=WZ;CcoXy88vh0vYOorNwu9{g40kN1MIL+xgzJnb&lxT2HfKb{o0z9X{$SD!2By^T z98B9FZwz-V9*DfgJoKBVhqqB23(}3$K|@a3ANT&38mtDR?LhFr)57<^niB7N;Emzl zTMTI+ZGVp+&KaTqmq9$=iTVD@`C07-15;{v(#uXQN$Ro3`UIq<_NY&b2dM`(_81F@ zcoXx~${FnT)L=CjZRus-&&D6>4d;vsoUOa{0V3YSJiY9t7oWkvlp3D&vg2os|CIEt zjtU0JJ3Hr$hLqz<)q1eab@s|=?F+eHwC8q|f!DvfgYkn;^ z$>qz4_(!ubGF-;vKbC9QuT_#DeK0Vkh9^OtKRU}joU z*hvjmgVFZ4al`->iH(l#hCRd?#eNQg9_TYbJ-!d9D6So#H2RSb2By^Tq@N|fmXq=t zg>LwxnAbt<;lavC^2X!O$;?Fl-usP>d>D!;9%B^q$DQaS2q%I}$JfF1 zuI<|N6913SFZO_rmS#8XA-*W)LKyxqM$6*xeSn>b0pw<9|6A zdv@yd#GaAlPYL_)Wy8?>!bV~rus?T}Ru%ry{UQ&Xw>#4Vdx$NHGsh3`N6@iBk%&J# zBMJQL1HTAJ8pJ~EA!bAzQEb=z2z#uKm5ITz2Q7Nf`0rXk0~kMI1@pQ~o^{{A5h~BM#o@Q@q!M*fTQx*B{J@ZF=hi@Oc8x55Reaf5)%&0K@=3 z-&1(TBai>IVvqHO-mV33Y=Co0aIQEmX5inY__bdA^Q6Q1{0(c@0614mX`DvOI;b7< zG0cfEyeFjeT!5Dg-y5zH7XxM{M*v(y0>`6&4A9Fpym91013wx_87~5GG89;vm zY>U!-KzVRL+Hs>sw)wt#1&WG_`W0Ticmc+Z9MJ}Oun%GC@bmEkS}Wg@_t3)_)j=MZ&WY%Mb>;?j{tpjU4`WB4{atj@-@gx!ug7eKv~M-Hk>$sP zC3neJJl!cb__KFc86|pHwp}WOOs~D*3CQt(N^Va{X7BW!_HUO60ExR5LFy@^F5NL2 zqK`2B%gV|?a@-fPd>EG&=7UW1zbi5MupSF=?>Uyn=&}DMhjmyQ#u$Ch`JUyN^aDEJ zIKz#GS!lq<8ONa%#~JckG*s6@?7ZzuPfGQWmdpcP*9H}b^HwaVJu)j-wg5dj4ai;=#%%_!aad9!g z0`xDI&JXb;`yJ00tNT%m>04P@39tb9Vrdvxd@bt24D!dM*|W z-9>FpU00j!tKN~{3Bht0@cL$-GX=G!CEeAYf2^hO+<_i z^2O3H#`t36Z*MW4FKj~|-}kL2|G)3;(@EsM>2f}!i=0-zkU@Jx9Vobd2EaZE^;Mo5 z)b$@w1L2D)ckOU!=eeYI2ej4Ikc;WT7czqSV%PE?T|Z%4yif6ISVue{Uw9C&tCZe9 z<9XrJc%JY-wKT;$zsmz-n2-PPo_xLKU|}v&Qc$4oiq3sw?EBG)#=L7PzTfa`0lWjcu z$^zk(my_NA?+RdGVMZejqer^voc0iT>6IHz)627VTd9Pn53K@gKj=S83;L+~ZNrc& z*{e57a!GT!&vYHFJfi;Ij=Zz&>0W2p&Yrn&j*TJy+{E?&jV@tWv-OqF1yA`Smu?-E z;19A2kYATB|175RlKz*Sy2EzgSsQ(H!Mj{vsnS*M{?}I-U*uO`>C<9$hQXEj8XMO> ztNHF*=eCc$1oB|5`_?TJEyqi;YIyQaW6dO;Ft#dj z*5?x7+etEXI`mZe**wKF+gAoIIA_?yc3{ zhYxd73rJRv>uLoB9+>9yh^ZY6laZaWXwi_*HPC0 zRmNjk4yqqLy0oU2{a{7rmeJhX!aP(SJ~gQnpRoMMgs(BX@A?!^7L>1%RFpD2{o3hs zozJw4$|!`3(JNz^&x1KjPLradqKe}JXIAiuuvs&6R_)YcRSx?vN$;s?wOZ<{1Jj-z zG7_*cEXWF*FZX~CIlCfm@$ex?yQJY$4(+>M6DIQVTIanxogY57j2|jNSwBoMd&dpo3!-OHCzT#D6I}&m@0eLgU{6oyRbYI2DH?I%Hy04k$ zdvm3nYuf8WOZZF;$2YVetlF^n=`1P4l*y??%p^Tm70KO~rRNl;`~E*iQdYp>w~_4P z(zRdaSZ?JP+ym_#HBIsDtMcW$B1zHVdQM4oFCHHbn1J{xfTx1ZLO#(JNTod!wHN@Zl18Pu$04{z=LI}2Om1*X|$<5yTNx=#o-MPlA?IXqDq7#P=^a;`{1q8nYHuh z&lfc_og}2>Km1cvYpGM%gF`PX0FF58t z-&taGKFEB9;7t+M)l!l>e3!PKiA_VehIoBsz80;#@`B6-&QjHTCY3iYuh?zF-C$8K6#%y#pC2L$BIFA>TPyJ!-PZo^Mo-8B~nlIB2{1PJA6C->p4f)L&dQp zj4RSd30+FFi_ae?sKPGmJ|UYCMPYd~hs6aM>xmhQ6LP18tx(= zrQYyMqOyC;5P_Gf1wykg=7}CoWr!MQyDypNNyAJ;twj9b!lsw%vyYUgJ~0NY9!VCh z_0x9iv+eU!@OAYc`yV@EChxO+LSVtnxiM0=mmR)bAtCTmT}p~U(_-(HcScUyCJarH zHCsRvTgavsCBYNs<$*kk?X1;v>&Gu#rTgV*z%J2u)0{q=COI^rFAdcVk1w?v|8?|v zlKByXRRKp1T&@riD4c8FP`2vfoRsD2O0H~9^Czh77dJ{$L%fm$S(aN*Ld=XS6|7yj zBogkfT5epLo~As1wwkTDWzi%rv=<&9W)(Jm_-+o_;pOhm$5^UYORKdOcoozxspAFN=fC}Sl5u->p$wNEX z5RGk%qBQqLjMEisJRjda*+w+aeJm(9zW5 zgfvw8e&B-g3|~e8!7Ah8*zA?8Bf?30%E#=DzyCD8o!`cff41jEx5?v&&2tVMS$*)J zLZdZT{>dgk(*SP~uQ)@=R8HhFNlq^J^?L2M(;k=4<^J$m)&0ne07($nEPP5i8HxsdboBN1Gz#`mKh@Izouw>q=<35|Ny-~j^yw*0gqTI0| zb#pQA^w#%p{63vs!o9QL>g}lr5?!91ZEYxoaE+8Zzx$bwd0~Oil`F0H#kZbfJ(^>% zDlVF_xUPQd*&!zmn18HtY5uCbdB5}F3GPi7U7hB)vb%70%-pi(<3*TE(Oa;_wA^jh zijEeZG_-SmM&t}^5Nj5lu+F)?+JEH{t;*v&FWfucyjPZ06HI5{ zHD>Xa$gIRgBbC;zU70A=S~MNu%C|kc#uHk(KW&?Esi?K)DccCa9fmIB9)3_k_`_oM z=V+Z)lUU&pdamY9smZV6dH$rpY19kTio5=D1`kXEIHAn>^2o=d`PWDDu_5{+p9iVEuxOCda#tc<6qpvwHutlbL%ZzEofF6M zx<@25KD=k%YUuFF78NA^Z2QO6ZH<@qk5hDdQlMWk-fr47cm7aU)D#iunq6bp%$Zuh zzkQqT2Bm9k36+X6!FQB3^>|Uh-xQ;r%~WUQ;XEIJnZ`+FJw9~)uKSgp1|+iWid>ghEOKc5k+REcB5k?9>KInD8P7?#ALC&n zuw-GBe)AQ@I<%*3OswCIg0M#m8Cho()IK8E!7Q}st);u5%CL%d$iRYd_xg<*DA9S#Jpfx9^*N=jM&G zx}47P-wt}rRaj!hWf0ZeAnP!^|;GtH7o+QbN z$-Smvw_%z4QB9top@rPH&IuP>?iCrpFZFiy$4! zPpCB9In#Jny1QJ)x6JredC#XzLYvGR<}xoo{Pow1*HyOYTtDx#P$Myd-(Mly>rF*` z(i*9a50e#KCZ`n(@mHIx-V6yvPri(VB+A^hXseQDAZH_)+;dKY4CWen&|OCzZ+)uC;LRE_ByWbeo{s6q2)Xf@TRl_?x!I7gxvZpF+qA5zm0ZGH z9xASz6gke&JZE#AW|f~(#rxXzv%SoVM$Fr!J#4D~P|3D+`awhH#(WIRo>CLPPiJzH zshNVX*^A*rk%cbx{PruBN1D$#dH!xVyUO-G>5_ROUzVW)yxU&5F?k=qe5!`+Xodkc zrtfS52L9I<-d{2+d{_1so@?_L-kwjgv)13xa`|=mc7*G)wqjXTV!g7)zVK4^XHR$e zeo|agFT6r@8OgdeY-7e9{{rS!6ZeL=%(Xx~;zcBqitef}wCoTN9OgeGH*)A_zwEwSb#GJh!Q1M*Ri7@8PPBU&T%sHAn9X7k$0EBs=-jg@Jo+yez1gMn!t|)R zq*AN5vjqnj^=r)q~)7bOuH%MHoC#=v9n>lG`-Z8H?dyk%5I1wGjPPWXb zY0T0Qw!eS(xTEO(C1*`0NoPOEaSSwe%hK5(lX-SoyBYs8oyS(kqAOWY6Sfv=PU1cn z5?a*UwC}*(gqV7gr2CF>OXqQqsyJ&a^EoqM4i8t->qYmL`5qaE-1zh+rznV-0hR5t z^mx$7xzS<{mv+zGHSy{#*YHn6H^lny&E4x z6L+(yl+lC&m88`3QAw5AQp3{#0b{3WvZ$9U=D5Y4h;LtGe z4PQOvtFykFY!)k2yI4P57-@Jr-c#Vjd0m8*m=kZrS{o$%wn0MJS^q;$Tl29Ik$afA_!}mAh6R9` ztCj5(OCC7#ONk&7l?J<;;qK$ViIP}DHw=&PV+gD*@FIOHbmpU~T z?JV6XL7P=bddTM{y^Q)1`_ZODYt9M2@%0;RyY544q66DQ>2>*hH%QYna}Ko5tbXfc zG)}SRTY2_krc1UwKHHxv-E1BHvb=?5@j}M+a`M-0hF`s+lk!%0OXR5%(F&gXvN;uZ z6--Vrp?4+IV{-y!AJ3~SH5z^O!{eEO9?ZipEZ|@K!SYpl!_^~PDX|mle3?)Vgyg1k89`+|=yS1_+t@F}KeSJrypjh|SbRV>`c^pCri!l#Hk?BO>x#!oXUBim zPx~CKw&U$Hwrews#KxB<%baVq<<*W&cqm@&>B^3*{%8?$s`=vz{~Zq=J>zfv9J76< zr{t$?$2+Rc4qmruUNh6D)$z@JzCio!`LXjdW9LhkB*^UZaAiZL-h5?#tO_WyXj}{C z`0tF*V_k;j9go6fbH*vF3shEX-qc0!-gitc;g(Qd7t3VzAz{n=qb5&HQa*4qEUla+ zBd0EW|MJGGm&_tK61RtNE}M6wdeo^Qs}ZintZClI*_2D#b7Id4v#$$m#uxN6oE z4!J2*pJ>{o&*)Sz!^5`8)|CYb=e0Q8tRFmc^OvKESC34Qc;Kc|1nVAK4M#$S?ixm! zh4DyCO*c9-E4+%7)?9N+ioo;~PPVv6I8JaMdyQR)){GwfO#~))w?B zq}sZk1s$C8A2Ns|mk%7im0dd9Q(@R9UL^nCQa-+k_E#=2cGNlXkF8SM6W$>)=5fIG z@Dj^5&#k<(ADo}ZzgE_zB@7HPM!1~0H$ST#{aC_Fc+&VNHg>fsp&|2+ZXW0VK+jox zwvFg)S4PQA`Xrl^rC&q@xc0t2lel<>>7I?_?oBD?mSCMlnurLxy%C&XFz$$$VeKPB zg>M2RJMm|kiEhVPI4wr{Ff2o=<`t<$>@vF@ugD*^3vK^`^`O3Ydcm*=o)>mc6t?7&_?Ysqd;>d3h6$v-prOPSPZ#uKdQTn-eN)%@##f$GR`syo)ROqP|jk< zt+GIdH&er1%XHpPiY}KuwYvHI+Whgr?`+n_T_c)mBso+Chn=<>`>^P|K*`g95%Kd@ zm&^gPXA3LGwOmM6IA(4X5dZLm-}GF@5W7RFD>`&plMUwUXl*p#ui&4we5KWV!L_g1 zFCO<7&MJDm@cjD42omx}A~~TT1R3K)3eg?4x!H|X3Y`@@D#{8vZXUfBFM=SVTd&wU4AbA}&l5I;)T|fsNrN{VJe$CCJ;~sW?_7T| zBV&2Lf;J<;o6oZToB3kzaY2ds(cTZ*)%HzrW*SrA!+NxJq-pxrU~ft9MAbcGwrZ8A zNbS_lH4Bh<6!T%lU1MG##8ma}h=};sUDCUp3l1aKxb|qh8M>tKfXv!Wcc1t#jH*5} zNdy^j+`r{BXYh^8mhxE>ri;26i>#M;Gfb89j-BbY`|*kbmhv7MVHKq$5yt6$)AIu7 zel%>lUz<_R7U8JuEz+_!ctrh^hsyp(ho4Q+e`>zA&QEAUT)p6wh^ikGof#;{J4$43wiuT@(xEGE5VySZC_RyXB{yZNH zWBA2dj;L7#B3i{xiJ#_HFlromHEX!9=P^>k^2`%ao~^6i?VToQS>!8X)gJlZy!Ou{ z)2xFJkK)X}Gh&k-D#%99*kTboVx@3%hE8IZ08)>8QflOC=t52uPKYe^_hZp z^|C38_b>XG{#C_|S*9+fpyB3W7T2_ZNR9)U6SqDeHZ$wIrKrjc+iAWQXU85nb}IXD zhO4Xs`-}6Q4*sV_rBB<$l}T>57=x_4^)f#zyy$(@)vFsfNXVbs+i2rvv7tQhn*M=U zQcPRJ(zU8bMTE3Ge6BrhNnH0t{H03C1C6PA@n02|tW>rbf$SgY)3$udmE#7d1$C}h ze!Qt~|7O$h!{rlOkvX31vA&wigL$>Xf@km{@Oo`>aLBsdQ33BJ5}sY5H~#aj(aiF;_F$hTjFOU2^WV`C9HtE!_&YMc2~aZOFq zr7hW4G_%t8%s+aKl()Uk!yv}$^u)O73r0LtFml#sV@1T-k*T}T@&Cxg`}g?_Hq5v8 zIAHKDc(LUZV--21N*+lyf5BE8G)MNJ#~Y>gx(DM|Ec{@VIz9NaTFshwH#8jP+PB%X zH$S|r&sKd%lM|77j^5wM91B*=c2ZX7d{<@RuYNPJU{3Tn&GPx&zMf_zr(64lHoNeU3D&Q-rX<=4iwr?%3j-=6T^$zVE#RK`gJERkMtCC!9qAFJF@C`?}XZq}P z8}Zok$ZU_@iHKNR+t)@?K}qyGpOP}o(bqph@hW_r$XBB|?lpI!oUVSj>Es&vVm|Zz zq)jX4&Uh4d`m|2;g-i2}6zpe-RU_3X@$npVLKg3zzddgJlqU-!I&$R2&}&Ij{MF+I zey{a;*Xm~tuig7ud;_O1qogK!D`>gp#1tOxEs?8b4OfW9TOFA_-6JyNPRW7^!CInr zVn?SzJw^17XJn&p@2HotD|?&cd4c=+Zt1w(#u1BD^4f1cIh`L)aX!>UIOW3-CfW25N} zT7gNMvYkWF{Ch8?vI_zie?}((!=%kRxGj^K+23pVjVv;^mt5fQtC$og-k5RxcIm3^ z#fB5}r*WKEyy$Jg@#+WM^AA_c2g}aWZQuIHsjz*RHPfA%8YA0Xq7$A3TynA8yYztD z7VVBDV@yk*8*Q=Hdc57wMIrlrL`J=jiCMLG)8sD}TkKEnIO@`(_|2ob zDvMb#(tNJRG|M~%xgr_wKug8@MpJ6WdP#qH(wb!{GKtqId5pSOM52p?w7X(cyiixAlQXgkFBq}7AdyzPo?@)ekytc_=*oXg$??}!Q zo+WIwUTX7FB*3KRRi(G%qNY-z|EkkCnFR-}`Km{qZhE6> z@MtWb!zSODu;BFJcW+v+6f8*OX&rJ+^xe{HS@X6FKbN@R_f&2{f51zP!yk zXaABfv)}s9wGxznl;iWdU8``x;w$fj+O;b$%=#jAO(903-q(KiOVidUx$$i)g@pw< z<{sg-ez{8b?(y3T-EXea@F@wHGyzP=5wgg&nlXy&h{zs=8uY76#&1&%c8-`ANj0m(;7yj^RP;ERh2?g$-)TkeZs&7*IE1vLGP`}4f{#v!7LV1fbDU0L>4_U(Og9&a z$kLTLHX&=mf1aW`#aq2+wlTJ!L2o= zf~@OFR*s3&-ln=W44XIpLUBT?kbA34o22!bW#dwPMhU(6b}m9$exCY&j+>OnIkG#h zt2DHYSFG~;s%1K4=&^<6P{z$)kS;<@5ZwtrvXw_9Nia`hFX#Fksu3GQPZm2X+AOnv=+)=bG$;T)Gd z*}}gVUEca>CAb!s(omN6bx)PG$kQ)1TY~fREOw6f3$M7L?74ND?FC-d8CkMYa-8}l zmdl4tI#M-dk$l$Z>0%^}mx7z+nXM+6M^0Q}JUY@L!QaTH$?g341W}{HYi>Kzt`3zj z{Cvae7W+`GGfa1mecR&RD$n8(5zOa8%FC6R^)-HzPFuQ`#h$nIyO4crt93Xw2RCfJ z|Il}Xf3S^X@B~pq7Dj#EZ~Vv^VYvr}8c&%*UX~o&bZh(5z_T`p&^ojAB^@KByyk7s zXSA1S=h zPDFyQHswW&HAzDanHRv`^zeb8&evh-$FFd?8wYpj-V(c6@@VrIL7f#=@p@Y8lT49> z%Sf53d8N9#>gmi(jm&so-}tX59M!)*wG^{Eka1+$tjO2b1O!XxCIzb2nq`Ihv#&ig z*J`@CfkjoU^1{7Nr*%Kyn0{QG#bZ&>w%5!CLG@mvriSxu7rF4LWYbXgkW(**Ty4-a zYf=-5UV6o%eX0N9(*Np?3J4Y-$auv#MdpIF;8F!QZibNt!#9?Bd)QcS5)*DXWWUsY zyrBF@8T;2`WgV7%lA3Jemsc32GVXZH@pT*)Rw4~|1K$o8y+zWnn3kn%wa8@Stc44i zN|T>R)_zfR7FV)ix~&swuaoO~cizpJw`W)|IX!iElZy5%oqFAWo4V9{@#n8cw(Czk z@43}-Q;WukksFVcrJm|wJT1Dk30=SN^r1*)X<4X6xMS)z`^6)NAdi#I#+fLEd|OoN zyh6){>4Jfp*ISPd9EE7acY^O4q4?64Ub8qM%PX-Yd7Yz%XRCwY(}z1Zy|=QTm{H)lq{BMm z!rlu>szC&cgPpf58O|@zNyaMnwz9{ z=OGWt!x=qeZ6CVaKK0Jlf#eu)-=7OH-yF>u{LOUF++v@O+<0H)(B2H!;zx2E6H+HR zC|TO*b33_SadC0*?N~mvH2HwBpP9jD8`hDN*f#Dr_7%I6$sx|H(RfpY$9mD?)AJMU z99G#5E1zdvtX&u2K3w#n7>j(alOXHOpjOgM)hD5M#9AG%YVn)ju)HwEa%!_^{jHo4 zN^m`zT1oaLCO#+N?0TaypF{cLMY**K(giP0%PARL@b{Q;=E8-QMn-J;1v+-FWvuhM4RK}N%77%^c>hyWx=S$^{ zrih>5li7YRCTJU9b>M2;W+lkXC=@BtaW!g9ZRy!|$F+N{OqsaWwHuw_su|85?Y^6z zXH?+)CX)AO#A`>caF&$3&t1PAGZ#q7U3hZKuE^=L@g&4;$;_J7h~L_nO)Y6oTm_^D zhg-8)SjD*`!qn08O?FXf<5BCmj3K-Bp({HC<@e9B+BxLgw6L6=hvpogv*mLP$*1Mn zj;RbGVUd@P@f9$0fU7R3RPU%gJ+OG^7B z+)cob21ztvy9wYnCJMWj&=%x_gN=#NlVb>D13R5|W#e~tL!KPWObw`v$EdV!Us!}I zDbcSpHH}AiKiQnH0`c+j-Bzz-tH%ct$HvA2$Q#OlvT$F57>4GXWmZb`xkF(f^6|8* z#l_m84$u#%KfHKHk7~o$|BUo_bk`WfV$@KkCi?@rH2WLwP`K-F1NK}I0rJ+&Jyt9C zW(&ju_B9UlD~wUQ*Mqb(hr4zaKpJd^7F^Lx+|_~cOw9NUbS};6AyfJXyF4)3&*(pR zVEwZwFBfE7wb~)1|R1Yk z3M8a|>d}s9Gd@qWA76J!$&b8B9^!v^YeWyea)iD{t!yZ(H~EFQ9WPM6(oBDl_p!SU z_&(N`pYe9#)4j=uZA`V^ciC^EjP4rRAqz6^IfJ6YPAmpneol4)SqG>GOy?)WfRv*; zAjMo46ePuU!+xOl_qGG)hFv^>p{xGu7m)qv7TFg>`@7oUb^!HNhWQ`c#Yv2Bol68T z5X-;Df9_#Fu}y#SnEa}$DnJa{=x!m{_h5i&Vm;A*V*PXXtS)-U1LlcsF!^H-l)Xye%l*rswW$##eC*sM3u8)rG5Ni2VfjG?Q9jnRwW~+EcAR)NtzqSsh zd}w59EV>~FmH+;VC;8un%L9D6Y=?=#mJek>`S57W&juMsv_Oun5okqspu>Y2`NaN4 z%##^X_`&4Es*bi+Q2gI5ki2^>sQwr_sPf-cYU`c1VI?BI=2?0#Xs+`LS=@a zvf(_1BpR&H&^1qi7T8Yg3}|tm2b@2EUvWmqvv25^;NVx_{)8{+hpwwtt1 zV{r}8J|u$Lnv9L(e?eS;`e6mm#9ou=mz&Svah@_^JkZ^)4Ia3;0XWx#f6n?H(@;mK zE7Te4j>8UqmD;vf!_f-#i|B60L;KNjQ4~8j;JNa*+Kt%-ZN%*DyuNq-+sc#)yuaLbIM;YD;50Bo=RCJL3R0Z+ zmd4FN!!%|WH8FNwfcFQeFW^^$f!zvWkn`d{n)p#8n^N15aYz$b4`E#BUKJ_k|?%D@(cWdVZ-4wx`v8_-&RZKWZ1WE$>q#NIJNM z?1O|YE6DHhit_Wio!_+Df67B+z_?>R=)�-u=zvvB&y<58ChVFB3K|@9YZ(n?e4k z|BZ39*blF9w2bqZy~MbO&i(X5zwF2QLU<7Q{V91|P#5odUq*}l_X1A!iM{H%@xUkS zI>^jP?bhFDwUrVbHTFY#?ENkD!OOL(z)<`_*ZF^FO9TiD%<7k}@ZN@qAwIv&VG78| z`QH~_Dd|p+GHUI|WcoS3MCbiGzYK@r4`ZcSfgtE*MxQ>|YA^6Z`=5p1?vn?m%RpjU z?ccvXybE`{{V=_MeORBm6W_1nv4`o*+_XM<48(4XmKOW-^NYIP{Sa-3dH7xow!vgj zii!3T^OR@?qik^O4*9ri~W!f9P21y56cV|-|D zyJsTWOUzT!buh|kwf|FOHrOyPsD}@f=LLdyk0U_xLG{jiCiI>Gu6-ijGZF12<_E)8 zN<3+`AM%1e!1n{A%@H6xD6{jtFUSWOw;jO$?wQm;K5mT<(OzPnlCFbMHW2$UeX#QY z%j4s`@L-UHuA3mJ+JM>L8(k6lE;jwLHThW*`XTv<_7AW9 z&=L7hQg^FG$+8hTIp3coXw|@uF8f(f-oXQb29M?C%d<3A*kw z{q+C-F@R_{mhTTQdbA!LmRXgvW(fQZH2iHIY`t|)E>4n+-B>xMLsfJHNJ0NK z37!v$TB|_mYcGoWVfJHm{f&wCcc7o({}}T z?6DZmLB_qWpv0m_*`H)TRKB&cjJ(De`e4t3yIr_rwqvo8YWIJ7>S6fzf+kV)W9fD1Iq)~z4`IcRdzjr=4D0%H z{Hgdu+w!yOfXe*Nf9AsMhVlBDz97oc4Ro~k{pT@%vi+D3@crPB+%xb>aTEC(k!iLQ zG=0hYVK?~G?Z=G6@Q3-@_z&cLQt%p)s38eTUwWXMLnx1hf1~}-2W|DW`+r0uIg88g)>v@mS(L;y6c;rRBBilc6 z2m_4C>tBQ3bnfTui?*+N%nn-PzWCFl-XHx(R*3)i^{?dh&qfCN^kCiR{C;14p^FlI zFgdti59|Nv9b~sjtG<6y2G&Yw(!@^u(Y<~6{SWWnz8x6jKY$wA zh>d-4{{w;^=y{M1%ck;8`~xf)n2ONG@8>>w{|niE)DM_XHYu+kn1J7y8rt^VPW12B zkVVjT>_GRwo&B4AuyMT-W;^NMUK!< e3j8~MD-T$8YSV>JNN1igw=*7!;fmpm;r@T(ofdrn literal 0 HcmV?d00001 diff --git a/docs/source/img/lyse_32nx32n.svg b/docs/source/img/lyse_32nx32n.svg new file mode 100644 index 0000000..1ddcdcc --- /dev/null +++ b/docs/source/img/lyse_32nx32n.svg @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/img/lyse_64x64.svg b/docs/source/img/lyse_64x64.svg new file mode 100644 index 0000000..84acda2 --- /dev/null +++ b/docs/source/img/lyse_64x64.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/img/runmanager_32nx32n.svg b/docs/source/img/runmanager_32nx32n.svg new file mode 100644 index 0000000..d9df689 --- /dev/null +++ b/docs/source/img/runmanager_32nx32n.svg @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/img/runviewer_32nx32n.svg b/docs/source/img/runviewer_32nx32n.svg new file mode 100644 index 0000000..ee5aa68 --- /dev/null +++ b/docs/source/img/runviewer_32nx32n.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..ed22646 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,34 @@ +.. lyse documentation master file, created by + sphinx-quickstart on Thu Jun 18 17:05:42 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +lyse +==== + +.. toctree:: + :maxdepth: 2 + :hidden: + :caption: DOCUMENTATION + + + +.. toctree:: + :maxdepth: 2 + :hidden: + :caption: FURTHER DOCUMENTATION + + components + +.. toctree:: + :maxdepth: 2 + :hidden: + :caption: LINKS + + Home Page + Source Code + PyPI + Anaconda Cloud + BitBucket Archive + +.. todolist:: diff --git a/readthedocs.yaml b/readthedocs.yaml new file mode 100644 index 0000000..35084d6 --- /dev/null +++ b/readthedocs.yaml @@ -0,0 +1,27 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + builder: dirhtml + configuration: docs/source/conf.py + fail_on_warning: false + +# Optionally build your docs in additional formats such as PDF +formats: + - pdf + - epub + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - method: pip + path: . + extra_requirements: + - docs + system_packages: true + \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index d69b75e..2028cf5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,7 @@ install_requires = desktop-app>=0.1.2 h5py importlib_metadata - labscript_utils>=2.14.0 + labscript_utils>=3.0.0rc1 matplotlib numpy pandas>=0.21 @@ -46,3 +46,9 @@ gui_scripts = [options.extras_require] pyqt = PyQt5 +docs = + PyQt5 + Sphinx==3.0.1 + sphinx-rtd-theme==0.4.3 + recommonmark==0.6.0 + m2r==0.2.1