From d9967b3c2265153d280423f08ba07264a6fbfb64 Mon Sep 17 00:00:00 2001 From: Connor Date: Tue, 16 Mar 2021 13:58:19 -0600 Subject: [PATCH 01/20] Render TDMS Metadata --- mfr/extensions/tdms/__init__.py | 1 + mfr/extensions/tdms/render.py | 59 +++++++++++++++++++++++ mfr/extensions/tdms/static/css/tdms.css | 11 +++++ mfr/extensions/tdms/templates/viewer.mako | 14 ++++++ requirements.txt | 5 +- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 mfr/extensions/tdms/__init__.py create mode 100644 mfr/extensions/tdms/render.py create mode 100644 mfr/extensions/tdms/static/css/tdms.css create mode 100644 mfr/extensions/tdms/templates/viewer.mako diff --git a/mfr/extensions/tdms/__init__.py b/mfr/extensions/tdms/__init__.py new file mode 100644 index 00000000..751fcda4 --- /dev/null +++ b/mfr/extensions/tdms/__init__.py @@ -0,0 +1 @@ +from .render import TdmsRenderer # noqa diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py new file mode 100644 index 00000000..b3084be3 --- /dev/null +++ b/mfr/extensions/tdms/render.py @@ -0,0 +1,59 @@ +import os + +import nptdms +from nptdms import TdmsFile +from mako.lookup import TemplateLookup + +from mfr.core import extension + +# class EscapeHtml(Extension): +# def extendMarkdown(self, md, md_globals): +# del md.preprocessors['html_block'] +# del md.inlinePatterns['html'] + + +class TdmsRenderer(extension.BaseRenderer): + + TEMPLATE = TemplateLookup( + directories=[ + os.path.join(os.path.dirname(__file__), 'templates') + ]).get_template('viewer.mako') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.metrics.add('nptdms_version', nptdms.version.__version__) + + def render(self): + """Render a tdms file to html.""" + + tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) + + body = "
" + + return self.TEMPLATE.render(base=self.assets_url, body=body) + + @property + def file_required(self): + return True + + @property + def cache_result(self): + return True diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css new file mode 100644 index 00000000..9b586b31 --- /dev/null +++ b/mfr/extensions/tdms/static/css/tdms.css @@ -0,0 +1,11 @@ +.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; + background: red; border:solid #000; border-width: 0 10px 10px 0; } + +.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; + background: blue; border:solid #000; border-width: 0 0 10px 0; } + +.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; + background: yellow; border:solid #000; border-width: 0 10px 0 0; } + +.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; + background: green; } diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako new file mode 100644 index 00000000..53619e69 --- /dev/null +++ b/mfr/extensions/tdms/templates/viewer.mako @@ -0,0 +1,14 @@ + + + + + +
+ ${body} +
+
+
+
+ + + diff --git a/requirements.txt b/requirements.txt index 77aeb03e..5653f642 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ jinja2==2.10.1 mistune==0.8.1 # Pdf -reportlab==3.4.0 +reportlab==3.5.56 # Pptx # python-pptx==0.5.7 @@ -53,5 +53,8 @@ scipy==0.19.1 # Md markdown==2.6.2 +# TDMS +npTDMS==1.1.0 + # Issue: certifi-2015.9.6.1 and 2015.9.6.2 fail verification (https://github.com/certifi/python-certifi/issues/26) certifi==2015.4.28 From 5fd18045812b650816b3ef3589b28398f37271d7 Mon Sep 17 00:00:00 2001 From: cbbcbail Date: Tue, 8 Jun 2021 13:40:12 -0600 Subject: [PATCH 02/20] Adds full support for tdms rendering Updates to render.py, tdms.css, tdms.js viewer.mako that render tdms files in HTML as well as light testing in test_renderer.py --- AUTHORS.rst | 1 + mfr/extensions/tdms/render.py | 121 ++++++++++++---- mfr/extensions/tdms/static/css/tdms.css | 160 ++++++++++++++++++++-- mfr/extensions/tdms/static/js/tdms.js | 33 +++++ mfr/extensions/tdms/templates/viewer.mako | 52 +++++-- setup.py | 3 + supportedextensions.md | 3 + tests/extensions/tdms/__init__.py | 0 tests/extensions/tdms/files/invalid.tdms | Bin 0 -> 78396 bytes tests/extensions/tdms/files/test6.tdms | Bin 0 -> 46962 bytes tests/extensions/tdms/test_renderer.py | 65 +++++++++ 11 files changed, 399 insertions(+), 39 deletions(-) create mode 100644 mfr/extensions/tdms/static/js/tdms.js create mode 100644 tests/extensions/tdms/__init__.py create mode 100644 tests/extensions/tdms/files/invalid.tdms create mode 100644 tests/extensions/tdms/files/test6.tdms create mode 100644 tests/extensions/tdms/test_renderer.py diff --git a/AUTHORS.rst b/AUTHORS.rst index a1565ccb..d2f37d82 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -34,3 +34,4 @@ Contributors - Longze Chen `@cslzchen `_ - Jonathon Love `@jonathon-love `_ - Josh Bird `@birdbrained `_ +- Connor Bailey `@cbbcbail `_ diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py index b3084be3..6330d804 100644 --- a/mfr/extensions/tdms/render.py +++ b/mfr/extensions/tdms/render.py @@ -1,16 +1,16 @@ import os +import base64 +from io import BytesIO import nptdms -from nptdms import TdmsFile +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import datetime from mako.lookup import TemplateLookup from mfr.core import extension - -# class EscapeHtml(Extension): -# def extendMarkdown(self, md, md_globals): -# del md.preprocessors['html_block'] -# del md.inlinePatterns['html'] - +from mfr.core import utils class TdmsRenderer(extension.BaseRenderer): @@ -25,30 +25,105 @@ def __init__(self, *args, **kwargs): def render(self): """Render a tdms file to html.""" + maxTableLength = 100 # maximum rows to include in data table + minDigitLength = 4 # minumum digits before scientific notation is used + formatString = "{:." + str(minDigitLength) + "g}" + + fig, ax = plt.subplots() # create matplotlib figure object + ax.grid(True, alpha=0.1) # specify matplotlib grid properties - tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) + # empty data structures to be filled with file data in loops + channelNames = [] + lineCollections = [] + properties = "" + data = pd.DataFrame() - body = "
    " - for property, value in tdms_file.properties.items(): - body += "
  • File = " + str(value) + "
  • \n\n" - body += "
    " + tdms_file = nptdms.TdmsFile.open(self.file_path, raw_timestamps=True) + fileMetadata = TdmsRenderer.formatMetadata(tdms_file.properties.items()) + + # Parse group data and metadata and generate html for group in tdms_file.groups(): - body += "
  • Channel group = " + group.name + "
  • \n" - body += "
      " + groupClass = group.name.replace(" ", "") + buttonId = groupClass + "Button" + showHide = "showHide(\'" + groupClass + "\', \'" + buttonId + "\')" + rowTag = "" + buttonTag = "+" + properties += rowTag + "Group " + group.name + "" + properties += buttonTag + "" + + # Parse channel data and metadata and generate html for channel in group.channels(): - body += "
    • Channel = " + channel.name + "
    • \n" - body += "
        " - # Access dictionary of properties: + channelClass = channel.name.replace(" ", "") + buttonId = channel.name.replace(" ", "") + "Button" + showHide = "showHide(\'" + channelClass + "\', \'" + buttonId + "\')" + rowTag = "" + buttonTag = "+" + properties += rowTag + "Channel " + channel.name + "" + buttonTag + "" + channelLength = len(channel) + + # Parse dictionary of properties: for property, value in channel.properties.items(): - body += "
      • " + property + " = " + str(value) + "
      • \n\n" + rowTag = "" + leftCol = rowTag + "" + property + "" + if utils.isfloat(value): # reformat float values + value = formatString.format(float(value)) + rightCol = "" + str(value) + "" + properties += leftCol + rightCol # Access numpy array of data for channel: - # body = body + str(channel[:]) + "" - body += "
      " - body += "
    " - body += "
" + if (channelLength > 1): # Only access channels with datasets > 1 + # Plotting on a time axis + if (channel.properties['wf_start_time'] and channel.properties['wf_increment']): + start = channel.properties['wf_start_time'].as_datetime() + start = (start - datetime.datetime(1904, 1, 1)).total_seconds() + increment = channel.properties['wf_increment'] + stop = start + increment * channelLength + timeAxis = np.linspace(start, stop, channelLength) + line = ax.plot(timeAxis, channel, linewidth=2, label=channel.name) + plt.xticks(rotation=45) + plt.xlabel("Time (s)") + else: + line = ax.plot(channel, linewidth=2, label=channel.name) + + lineCollections.append(line) + channelNames.append(channel.name) + data[channel.name] = channel[:maxTableLength] + + ax.legend(channelNames, bbox_to_anchor=(1, 1)) + plotFile = BytesIO() # create byte sream object + fig.savefig(plotFile, format='png', bbox_inches='tight') # export plot to png in byte stream + encoded = base64.b64encode(plotFile.getvalue()).decode('utf-8') # encode base 64 byte stream data + plot = '\'data:image/png;base64,{}\''.format(encoded) # format encoded data as string + table = data.to_html() # export pandas DataFrame to HTML + + return self.TEMPLATE.render(base=self.assets_url, fileMetadata=fileMetadata, properties=properties, plot=plot, table=table) + + def formatMetadata(items): + # Parse property value pairs in file level metadata and generate html + + minDigitLength = 4 # minumum digits before scientific notation is used + formatString = "{:." + str(minDigitLength) + "G}" + fileMetadata = "" + + for property, value in items: + value = str(value) + if value.find("\n") > 1: + value = value.split("\n") + fileMetadata += "
  • " + value[0] + "
  • " + fileMetadata += "
      " + for v in value[1:]: + v = v.replace("\\n", " ").replace("\"", "").split("=") + v[0] = "".join(v[0].split(".")[1:]) + v[1] = v[1].strip() + if utils.isfloat(v[1]): # reformat float values + v[1] = formatString.format(float(v[1])) + fileMetadata += "
    • " + "= ".join(v) + "
    • " + fileMetadata += "
    " + else: + fileMetadata += "
  • " + str(property) + ": " + value + "
  • " + fileMetadata += "" - return self.TEMPLATE.render(base=self.assets_url, body=body) + return fileMetadata @property def file_required(self): diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css index 9b586b31..9e840ee1 100644 --- a/mfr/extensions/tdms/static/css/tdms.css +++ b/mfr/extensions/tdms/static/css/tdms.css @@ -1,11 +1,155 @@ -.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; - background: red; border:solid #000; border-width: 0 10px 10px 0; } +/* ---- Quadrant Grid Layout ------------------------------------------------ */ +#topLeft { + max-height: 50%; +} -.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; - background: blue; border:solid #000; border-width: 0 0 10px 0; } +#bottomLeft { + border-top: solid #000 0.5px; +} -.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; - background: yellow; border:solid #000; border-width: 0 10px 0 0; } +#topRight { + height: 50%; + overflow: hidden; + background-color: white; +} -.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; - background: green; } +#bottomRight { + height: 50%; + border-top: solid #000 0.5px; +} + +.quadrant { + display: flex; + flex-direction: column; + flex-shrink: 0; + width: 100%; + overflow: auto; + margin: 0; + padding: 0; +} + +.row { + display: flex; + flex-direction: row; +} + +.column { + display: flex; + flex-direction: column; + width: 50%; + height: 100%; + overflow: hidden; + border: solid #000 0.5px; + background-color: #F5F5F5; +} + +/* ---- Fixed Title Bar above Scrolling Content ------------------------------*/ + +.titleBar { + margin: 0; + padding: 0 1.5vw 0 1.5vw; + background-color: #FFFFFF; + border-bottom: solid #000 0.5px; +} + +.miniTitleBar { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-shrink: 0; + align-items: center; + border-bottom: solid #000 0.5px; + margin: 0; + padding: 0 6vw 0 1.5vw; + height: 6vh; + cursor: pointer; + position: sticky; +} + +.belowTitle { + overflow-y: auto; + visibility: visible; +} + +/* ---- Tables -------------------------------------------------------------- */ + +table { + width: 100%; +} + +table, th, td { + border-left: 0.5px solid black; + border-bottom: 0.5px solid black; + border-collapse: collapse; + padding: 6px 0 6px 8px; + margin: 0; +} + +tr:nth-child(even) { + background: #FFFFFF; +} + +tr:nth-child(odd) { + background: #F5F5F5; +} + +th { + text-align: center; + background-color: #EBEBEB; +} + +.group { + background: #EBEBEB !important; + display: table-row; + cursor: pointer; + font-weight: bold; +} + +.channel { + background: #FFFFFF !important; + display: none; + cursor: pointer; +} + +.channel > td { + padding-left: 5%; +} + +.property { + background: #F5F5F5 !important; + display: none; + cursor: pointer; +} + +.property > td:nth-child(odd) { + padding-left: 10%; +} + +#propertyTable td { + width: 50%; +} + +/* ---- Miscellaneous ------------------------------------------------------- */ + +body { + height: 800px; +} + +#plot { + height: auto; + width: 100%; +} + +.button { + text-align: center; + font-weight: bold; + font-size: 18pt; + border-left: none; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/mfr/extensions/tdms/static/js/tdms.js b/mfr/extensions/tdms/static/js/tdms.js new file mode 100644 index 00000000..848180cc --- /dev/null +++ b/mfr/extensions/tdms/static/js/tdms.js @@ -0,0 +1,33 @@ +// Shows or hides content and changes button text accordingly +function showHide(contentClass, buttonId) { + var contents = document.getElementsByClassName(contentClass); + var button = document.getElementById(buttonId); + + if (button.textContent == "+") { // Show if hidden + for (var i = 0; i < contents.length; i++) { + element = contents[i] + if (element.nodeName == "TR") { + element.style.display = "table-row"; + } + else { + element.style.display = "block"; + } + } + button.textContent = "-"; + } + else { // Hide if showing + for (var i = 0; i < contents.length; i++) { + contents[i].style.display = "none"; + for (var j = 0; j < contents[i].children.length; j++) { + if (contents[i].children[j].classList.contains("button")) { + contents[i].children[j].textContent = "+"; + } + } + } + var children = document.getElementsByClassName(contentClass + "Child"); + for (var i = 0; i < children.length; i++) { + children[i].style.display = "none"; + } + button.textContent = "+"; + } +}; diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako index 53619e69..c4f67147 100644 --- a/mfr/extensions/tdms/templates/viewer.mako +++ b/mfr/extensions/tdms/templates/viewer.mako @@ -1,14 +1,50 @@ - + - -
    - ${body} +
    +
    +
    +

    File Contents

    +
    +
    +
    +
    File Metadata
    +

    -

    +
    +
    +
    +
      + ${fileMetadata} +
    +
    +
    +
    + + ${properties} +
    +
    +
    -
    -
    -
    - +
    +
    +
    +

    Data Plot

    +
    + +
    +
    +
    +

    Data Table

    +
    +
    + ${table} +
    +
    +
    +
    + + diff --git a/setup.py b/setup.py index ecfe3aeb..248000ee 100755 --- a/setup.py +++ b/setup.py @@ -662,6 +662,9 @@ def parse_requirements(requirements): #'.todo.txt = mfr.extensions.codepygments:CodePygmentsRenderer', #'.vimrc' = mfr.extensions.codepygments:CodePygmentsRenderer', + #tdms + '.tdms = mfr.extensions.tdms:TdmsRenderer', + # docx # '.docx = mfr.extensions.docx:DocxRenderer', diff --git a/supportedextensions.md b/supportedextensions.md index 9c6ae199..36fd0080 100644 --- a/supportedextensions.md +++ b/supportedextensions.md @@ -53,6 +53,9 @@ Some file types may not be in the correct list. Please search for the file type ## PDB * .pdb +## Data +* .tdms + ## PDF * .pdf diff --git a/tests/extensions/tdms/__init__.py b/tests/extensions/tdms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/extensions/tdms/files/invalid.tdms b/tests/extensions/tdms/files/invalid.tdms new file mode 100644 index 0000000000000000000000000000000000000000..c59f175ed65dbda596d01a7705b15f9bf8ce6597 GIT binary patch literal 78396 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

    R|01!swXJq#X=} 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 literal 0 HcmV?d00001 diff --git a/tests/extensions/tdms/files/test6.tdms b/tests/extensions/tdms/files/test6.tdms new file mode 100644 index 0000000000000000000000000000000000000000..38addcaecef77176e75dd57e2c775475d27eaf11 GIT binary patch literal 46962 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

    8v5@ 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 H{O|q`JVg&O literal 0 HcmV?d00001 diff --git a/tests/extensions/tdms/test_renderer.py b/tests/extensions/tdms/test_renderer.py new file mode 100644 index 00000000..2ed761bb --- /dev/null +++ b/tests/extensions/tdms/test_renderer.py @@ -0,0 +1,65 @@ +import os +import pytest + +from bs4 import BeautifulSoup + +from mfr.core.provider import ProviderMetadata +from mfr.extensions.tdms import TdmsRenderer + + +@pytest.fixture +def metadata(): + return ProviderMetadata('test8', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') + + +@pytest.fixture +def test_tdms_file_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'test6.tdms') + + +@pytest.fixture +def invalid_tdms_file_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'invalid.tdms') + +@pytest.fixture +def url(): + return 'http://osf.io/file/test6.tdms' + + +@pytest.fixture +def assets_url(): + return 'http://mfr.osf.io/assets' + + +@pytest.fixture +def export_url(): + return 'http://mfr.osf.io/export?url=' + url() + + +@pytest.fixture +def renderer(metadata, test_tdms_file_path, url, assets_url, export_url): + return TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) + + +class TestTdmsRenderer: + + def test_render_tdms_file_required(self, renderer): + assert renderer.file_required is True + + def test_render_tdms_cache_result(self, renderer): + assert renderer.cache_result is True + + def test_render_tdms(self, test_tdms_file_path, assets_url, export_url): + metadata = ProviderMetadata('test6', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') + renderer = TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) + body = renderer.render() + name = "sp0006_042419" + startTime = "wf_start_time: 2019-04-24T18:17:11.234133" + startFrequency = "4E+05" + endFrequency = "5E+05" + plot = """data:image/png;base64,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ICBJllYXTJgwQXfccYfmzZunl19+WaNGjTptD05pURi+7777NHz4cGVkZGjXrl2aPXu2IiMjdeuttyo+Pl7jx49Xfn6+OnfuLLfbrXvuuUc5OTm67LLLJEnDhg1T3759dccdd2ju3LkqKyvTQw89pMmTJ5sh9K677tKCBQs0ffp0jRs3Th988IGWLFmiZcuWmfPIz8/X6NGjNWjQIA0ePFjz58/XoUOHNHbsWEmyNBcAAHBihmHou8oaleyo1Lod+7Vue6W2lB9Qc8txnVERykxL0KCMRGVnJGpgeqISO8ac+IBzyPmdGl8Ma8vvO3DgQP3f//2fevTooaioxnHvP/7jPxQdHa1PP/1U6enpkqTKykp98803IVdozz//fO3evdt8/a9//UuHDx8OeZ/Fixera9eucrvdJzXX/v37KxAIaNWqVY2aKARdd9116tixo1588UUtX75cH3300Um9V1NaFIa/++473Xrrrdq3b5/OP/98/fjHP9aaNWvM5D9v3jxFRERo5MiR8vl8ys3N1QsvvGAeHxkZqXfeeUeTJk1STk6OOnbsqNGjR+uxxx4zx/Ts2VPLli3TtGnT9Nxzz6l79+5auHCheWekJI0aNUp79uxRQUGBysrKlJWVpeXLl4fcVBduLgAA4Bj/kYA27arWuu379dm2fdrwnUcVYZYNdO3k1KAeicrO6KzsjET1TXErJqptPty2JUsV2oLJkyfr97//vW699VZNnz5dnTt31rfffqs33nhDCxcuVFxcnMaPH6/7779fXbp0UdeuXTVr1ixFRIR+/376059qwYIFysnJUV1dnWbMmBFylff222/XU089peuvv16PPfaYunfvrh07dugvf/mLpk+fbmkNco8ePTR69GiNGzfOvIFux44dqqio0M033yypPkOOGTNGM2fO1IUXXtjs3/S3VIvC8BtvvNHsfpfLpeeff17PP//8CcdkZGQ0WgZxvCuuuEKff/55s2OmTJliLos42bkAAGBX+w/5tX5HpdbtqNT6HZXa+F2VfEcCJxwf4ZB6J7vNq77ZGYnqnhjLkpNzVGpqqlavXq0ZM2Zo2LBh8vl8ysjI0DXXXGMG3qeeespcTtGpUyf98pe/VHV1dch5nnnmGY0dO1Y/+clPlJqaqueee04lJSXm/g4dOuijjz7SjBkzdOONN+rAgQPq1q2brrrqqhZdKX7xxRf14IMP6u6779a+ffuUnp6uBx98MGTM+PHj9atf/cpcCXC6OAw79h+xyOPxKD4+XtXV1SHfUMMw5PV65XK5+BA4AWpkDXUKjxpZQ53Cs3ONDMPQ1j0H65c8bK+/2e3few41e0ycM0qXpieY630z0+LVyXX6Oj6cSSf6+S3V39i1bds29ezZM+TmeNS74oorlJWVpfnz57f2VBr5+OOPddVVV2nnzp2NWuweryXf51O6gQ4AAJx7avx1+ud3VeZV35LSSlUdrm32mLTOsfU3uaUnqH9KR12S1kVRkW1zyQPaF5/Ppz179uiRRx7RTTfdFDYItxRhGACANq7c462/4ns0+G76vrrZ3r7RkQ71S40PWfLQ1V1/9Sx4BT0ywl5Xz3Hu+vOf/6zx48crKytLr7766mk/P2EYAIA2pC5gaHOZx2xvtm57pb6var63b2KH6KOht/5GtwFnoLcv2oeVK1e29hQaGTNmjMaMGXPGzk8YBgDgHBbs7Rtc8mClt2+vrnHKTk9Udo/6q74XnHfme/sCbRVhGACAc4RhGNq5v0YlpfvNZQ/hevu6oiOU2f3ojW49EnVpWtvp7QucCwjDAAC0Ev+RgL7cVV3f4uxol4dwjwROcjvNp7kNykjUxW24ty9wLiAMAwBwluw/5DfX+pbs2K9/flcdtrdvn2T30Qdb1H91S6C3L3A6EYYBADgDAgFD/97boLfvjkr9e6+13r6Djt7olpWeoDgnP6qBM4k/YQAAnAY1/jpt/K7KvPK73kJv3/TOHcwrvtkZibooqRMtzYCzjDAMAMBJKKv21l/13bFf63dUatMuT9jevpd0i1d2ev2NbgPTj/X2BU4Xh8OhN998UyNGjDir79ujRw9NnTpVU6dOPavvezoQhgEACONIXUCbyw5ofemxJQ/hevt27hijgemJZpeH/t3o7YtTs2fPHhUUFGjZsmUqLy9XYmKiMjMzVVBQoB/96EeSpN27dysxMbGVZ9rYqFGjtG3bNhUXFysysv7PQW1trS677DL16dNHr732WqvNjTAMAMBxPEd7+wZvdNtQWmWpt++gjESzy0NPevviNBs5cqT8fr9eeeUVXXDBBSovL1dRUZH27dtnjklOTm7FGZ7YCy+8oH79+unJJ5/UrFmzJEmPP/64du/erb///e+tOjfCMADA1oK9fdft2G+u97Xa2zfY5WFgeqISOtDbF2dOVVWVPv74Y61cuVKXX365JCkjI0ODBw8OGXf8MolPPvlEd999tzZv3qxLLrlEDz30kG644QZ9/vnnysrK0sqVK3XllVfq73//u2bMmKGvvvpKWVlZevnll9W7d29J0tatW5Wfn681a9bo0KFDuvjii1VYWKihQ4dann+XLl30u9/9TjfddJOGDx8uv9+vwsJC/fWvf231K9mEYQCArfiO1Omr3QdUcnS5Q0t6+wZvdOub6lZ0JL19cfbExcUpLi5Ob731li677DI5nc6wx3g8Hg0fPlzXXXedXn/9de3YseOEa3pnzZqlZ555Rueff77uuusujRs3TqtXr5YkHTx4UNddd53mzJkjp9OpV199VcOHD9eWLVuUnp5u+b/hv/7rv3TLLbfozjvvVG1trUaPHq3rrrvO8vFnCmEYANCuBXv7rtu+X+u279MXuw7IH6a378Up7pAuD/T2RWuLiorSokWLNHHiRL300ksaOHCgLr/8ct1yyy0aMGBAk8e8/vrrcjgc+v3vfy+Xy6W+ffvq+++/18SJExuNnTNnjnnF+YEHHlBeXp68Xq9cLpcyMzOVmZlpjn388cf15ptv6m9/+5umTJnSov+O+fPnq1u3bnK73Xr22WdbdOyZQhgGALQbgYChrXuO9vbdUan1Fnr7dnJG6dKMRLPLQ2YavX1t6X8ulw5WnP33jesq/fcqS0NHjhypvLw8ffzxx1qzZo3ee+89zZ07VwsXLtSYMWMajd+yZYsGDBggl+tY15Ljl1UENQzUKSkpkqSKigqlp6fr4MGDeuSRR7Rs2TLt3r1bR44cUU1NjUpLS1vwH1rvz3/+sxwOh/bu3avNmzefcD5nE3/aAQBtVo2/Tht2Vh3t8rBf60urVF0TvreveaNbj0Rd2JXevlB9ED6wq7VnEZbL5dLVV1+tq6++Wg8//LAmTJig2bNnNxmGWyI6Otr89+DfggQC9X+Dct9992nFihV6+umn1atXL8XGxurnP/+5/H5/i97j3//+t6ZPn64XX3xRH374ocaMGaPPP//c0pKPM4kwDABoM8qqvSE3un1lsbfvoKM3ufVLjlXaefEseUBjcV3b5Pv27dtXb731VpP7evfurT/96U/y+Xxm4Pzss89a/B6rV6/WmDFjdMMNN0iqX0O8ffv2Fp0jEAhozJgxuuqqq3TnnXfq+uuv1yWXXKKCggL9+te/bvGcTifCMADgnBTs7RsMvi3p7Rvs8tCwt69hGPJ6vWdj6miLLC5VaC379u3TTTfdpHHjxmnAgAHq1KmT1q1bp7lz5+r6669v8pjbbrtNs2bN0i9+8Qs98MADKi0t1dNPPy1JLfqF8MILL9Rf/vIXDR8+XA6HQw8//LB51diq5557Tps2bdKmTZskSfHx8Vq4cKF+9rOfaeTIka26XIIwDAA4J5i9fbfvV0lppaXevhd2jQu50Y3evmiv4uLiNGTIEM2bN09bt25VbW2t0tLSNHHiRD344INNHuN2u/X2229r0qRJysrKUv/+/VVQUKDbbrstZB1xOM8++6zGjRunH/7whzrvvPM0Y8YMeTwey8d/8803mjVrlhYuXBjSBzk3N1djx45t9eUSDsNorpOivXk8HsXHx6u6ulput9vcHry64HK5+NA9AWpkDXUKjxpZ09bqZBiGSvcfDrnRzUpv36y0hPonumV01qXpCS3q7dvWatRa2kOdTvTzW5K8Xq+2bdumnj17tigQthevvfaaxo4dq+rqasXGxrb2dM6YlnyfuTIMADjjfEfq9OX3Hq3fUXl0zW+V9h5svrdvstul7B7HujxcnEJvX6ClXn31VV1wwQXq1q2bNm7cqBkzZujmm29u10G4pQjDAIDTbt9Bn/lAi5Ltlfrn99Vhe/v2TXUrOz3Y5aGzUuPb7pVJ4FxRVlamgoIClZWVKSUlRTfddJPmzJnT2tM6pxCGAQCnJNjbd12DG922WeztO+joWt+stAR1pLcvcNpNnz5d06dPb+1pnNP45AEAtMhh/xFt3FmtkqMtzqz09s3o0sG8yW1QRmdd2DVOEfT2BXAOIAwDAJq1u7rm6OOMK7W+NHxv35jICF3Sza1BPTprYHp9AD6/U+s21QeAEyEMAwBMDXv7Brs8hOvt26VjTP0636NXfi9p0NsXAM51hGEAsDGPt1brj4bedTsqtWFnlQ6H6e17UVKwt29nZWckqkeXDtzoBqDNIgwDgE0Ee/uu236sy8M3Fc339o2NjjR7+2b3SNTAtETFd4g+e5MGgDOMMAwA7VSwt2/wRjcrvX1T4l0hN7r1SelEb18A7RphGADaif2H/Pry39Vaf7S9WbjevpERDl2c0kmDMjqba35TE2jED7RlDodDb775pkaMGHFW37dHjx6aOnWqpk6delbf93QgDANAGxQIGPp2z0Gzy0PJjv3avu9ws8d0ckVpYPqxG90y6e0LtCl79uxRQUGBli1bpvLyciUmJiozM1MFBQX60Y9+JEnavXu3EhMTW3mmocaPH6+1a9eqpKREMTHHHqH+7rvvasSIEVqzZo0GDhzYavPjUxAA2oDD/iPasLPKvNFt/Y5KebxHmj2mR5cOR6/41t/oRm9foG0bOXKk/H6/XnnlFV1wwQUqLy9XUVGR9u3bZ45JTk5uxRk2bd68eRowYIBmz56twsJCSVJVVZUmTpyohx9+uFWDsEQYBoBz0u7qmqNXfOu/vtrtUV2Y3r79UjtpUI/OZn9fevsC7UdVVZU+/vhjrVy5UpdffrkkKSMjQ4MHDw4Zd/wyiU8++UR33323Nm/erEsuuUQPPfSQbrjhBn3++efKysrSypUrdeWVV+rvf/+7ZsyYoa+++kpZWVl6+eWX1bt3b0nS1q1blZ+frzVr1ujQoUO6+OKLVVhYqKFDh1qau9vt1ssvv6zc3FyNGDFCQ4YM0dSpU9WtWzfNnDnzNFbp5BCGAaCVBXv7rtu+XyWlVSrZvl+7qr3NHtOlY8yxG916JKpfiltGXa1cLhdtzoB2KC4uTnFxcXrrrbd02WWXyekM/8uux+PR8OHDdd111+n111/Xjh07Trimd9asWXrmmWd0/vnn66677tK4ceO0evVqSdLBgwd13XXXac6cOXI6nXr11Vc1fPhwbdmyRenp6Zbmf+WVV+ruu+/W6NGj9fjjj2vJkiVav369oqJaP4q2/gwAwGaqa2r1eemxq77We/t2PtrlIVEZx/X2NQxD3rrmH4kM4MRGvTNKe2v2nvX3PS/2PC3+2eKw46KiorRo0SJNnDhRL730kgYOHKjLL79ct9xyiwYMGNDkMa+//rocDod+//vfy+VyqW/fvvr+++81ceLERmPnzJljXnF+4IEHlJeXJ6/XK5fLpczMTGVmZppjH3/8cb355pv629/+pilTplj+by0sLNTy5ct1yy236JlnnlGfPn0sH3smEYYB4AwyDEM79h0OeaKb1d6+g3okamAGvX2Bs2FvzV5VHK5o7Wk0a+TIkcrLy9PHH3+sNWvW6L333tPcuXO1cOFCjRkzptH4LVu2aMCAAXK5XOa245dVBDUM1CkpKZKkiooKpaen6+DBg3rkkUe0bNky7d69W0eOHFFNTY1KS0tbNP/Y2Fjdd999mjZtmu69994WHXsmEYYB2FIgYMhfF1BtXUD+IwHV1hn1/350W+2R+v31+459+esM1R4JmGMbHmsef8SQv65OFR6f1pdWau9Bf7NzSY13NXiccWddnNJJUfT2Bc6q82LPaxPv63K5dPXVV+vqq6/Www8/rAkTJmj27NlNhuGWiI4+9gt38G+dAoH61oz33XefVqxYoaefflq9evVSbGysfv7zn8vvb/6zrSlRUVGKjIw8p5ZzEYYBnFVl1V7trq5pOoAeDZK+ukBI4Kzx+mU4IlRb1zDAGo1Cqv9I3bFzmiH22Otj72M0ezPamRQZ4VDfFLe53jeb3r7AOcHKUoVzUd++ffXWW281ua93797605/+JJ/PZ64x/uyzz1r8HqtXr9aYMWN0ww03SKpfQ7x9+/aTnvO5hjAM4IyprQvo690ec23s+h2VYW8Ma2/crigNzEhUdnr944wzu9PbF0DL7du3TzfddJPGjRunAQMGqFOnTlq3bp3mzp2r66+/vsljbrvtNs2aNUu/+MUv9MADD6i0tFRPP/20JLXoyuyFF16ov/zlLxo+fLgcDocefvhh86pxe8AnMoDTpvKQX5/vPHZj2Mad1aqpbf7GsDMhwiHFREUoOjJCMZH1/4yOcpivg/uiIx3HjQnudxzdHzzH0XFRDceFjnE2POfR83R0Rimjcwd6+wI4ZXFxcRoyZIjmzZunrVu3qra2VmlpaZo4caIefPDBJo9xu916++23NWnSJGVlZal///4qKCjQbbfdFrKOOJxnn31W48aN0w9/+EOdd955mjFjhjwez+n6T2t1DsNo7jYOe/N4PIqPj1d1dbXcbre53TAM8w7Lc2nNy7mEGlnTlusUCBj6996DZvAt2VGprXsONXtMh5j6G8MuSurUIDwGQ6ajQUg9+vroPxU4oo6xruP2Nx1AoyMjFGnD8NmW/186W6iRNe2hTif6+S1JXq9X27ZtU8+ePVsUCNuL1157TWPHjlV1dbViY9vvEq2WfJ+5MgzAkoZPQCvZUan1pVWqrmm+lVf3xFhzXezA9ET1SW75jWHt4QczALSWV199VRdccIG6deumjRs3asaMGbr55pvbdRBuKcIwgEYMw9D3VTXmOt+S0kp9vftAszedRUc61C81/mhHhPqWYElu+111AYBzSVlZmQoKClRWVqaUlBTddNNNmjNnTmtP65xCGAYg/5GAvtrt0brt+7X+6MMgyj2+Zo/p0jGm/sawo1/9u8XLFR15lmYMALBi+vTpmj59emtP45xGGAbaEcMwQnvemu3EDLPVWLA3btXhWnPZw8bvquQ7cuI7gx0OqXdSp2NdEZp4AhoAAG0RYRhogbqAcdzDFo49YCHY99Z/tEfuiUJoSFA9ElCNr1YBOVR79Ny+YP/dBn1xG56j9kjDcaEPjfDXnZ5WN3HOKF2anqCBR4NvVnqC3C6egAYAaH8Iw7C9Gn+dNn5XpZIdlfq8tFLb9x0OCa2+I2dNR3gAACAASURBVK3/oIYzLb1zB3Od76CMRF2U1MmWHRkA2AfNtNq3lnx/CcOwleCNYetLj3VF+Hq3R0faSMiNightPxZzXDuymGB7sShHSO9cZ4NeuzGRkYqOcsgVFamLU9wamJGgrp240Q2APQQfO3z48GE6KrRjhw8flhT6mOkTIQyjXfMdqdOmXZ4G7cDC3xjmio5Qh5iokL63xz+oISYqsvGDGMy+t6HbYxocEzxnMKhGRTrkaNBD98TvF6HoiAge3gAApygyMlIJCQmqqKiQJHXowP0P7YlhGDp8+LAqKiqUkJCgyMjwN3YThtGuVHi8ZjeE9aVV+uK76mbX0Toc0oVd48w+uAMzEnXBeR3P2gcjPXQB4OxLTk6WJDMQo/1JSEgwv8/hEIbRZh2pC2hz2QHzim/Jjkp9V1nT7DENbwwbmJGorLQExcdyYxgA2InD4VBKSoq6du2q2trmHx6Etic6OtrSFeEgwjDajMpDfq0vPRZ8N+6sVk1tXbPH9Dyv49Hgm6DsjERd2JUbwwAA9SIjI1sUmtA+EYbRpEDAUG3gWIuv0NZgoS3Egq+Pb/V12OuTIiKPay92rAdu/TijwXmOtRIz3+NoezGvv067qr3NztkVHaHM7glmL9xL0xPUJc55lioGAADaIsJwG1VdU//AhK93e1Tjr2sQMI3j+twGzP63ZgBtEE5rzbGhD2poC90VuiXEHg2+CcrO6Kw+KZ0UHRnR2tMCAABtyCmF4SeffFIzZ87Uvffeq/nz50uSvF6vfvnLX+qNN96Qz+dTbm6uXnjhBSUlJZnHlZaWatKkSfrwww8VFxen0aNHq7CwUFFRx6azcuVK5efna9OmTUpLS9NDDz2kMWPGhLz/888/r6eeekplZWXKzMzUb3/7Ww0ePNjcb2UubYFhGPr33kNa32Bt7L8qDqq9t0iMjHCYnRmcURFK69xB2UfX+g5MT1RyPO3AAADAqTnpMPzZZ5/pf/7nfzRgwICQ7dOmTdOyZcu0dOlSxcfHa8qUKbrxxhu1evVqSVJdXZ3y8vKUnJysTz75RLt379add96p6Oho/epXv5Ikbdu2TXl5ebrrrrv02muvqaioSBMmTFBKSopyc3MlSYsXL1Z+fr5eeuklDRkyRPPnz1dubq62bNmirl27WprLueqw/4g27qyuXx97NABXHj69C/yPtfdyHNcCrL4XbWirsAbtwproV2tuO+58ChxRR5czpPXY8b1wQ855XM9c1vYCAIAzzWGcxCNYDh48qIEDB+qFF17QE088oaysLM2fP1/V1dU6//zz9frrr+vnP/+5JGnz5s26+OKLVVxcrMsuu0zvvfeefvazn2nXrl3mFdqXXnpJM2bM0J49exQTE6MZM2Zo2bJl+vLLL833vOWWW1RVVaXly5dLkoYMGaIf/OAHWrBggSQpEAgoLS1N99xzjx544AFLcwnH4/EoPj5e1dXVcrvd5vbT2Q4r+BCIkh3B4Fulr3Z7mn3SWWSEQ31T3BqYnqCs9AQldog5ri9thGIaBNqQABrpUGSE44y38aJlmDXUKTxqZA11Co8aWdMe6nSin99AU07qyvDkyZOVl5enoUOH6oknnjC3l5SUqLa2VkOHDjW39enTR+np6WYALS4uVv/+/UOWKuTm5mrSpEnatGmTLr30UhUXF4ecIzhm6tSpkiS/36+SkhLNnDnT3B8REaGhQ4equLjY8lxay6Zd1Sreuk8lRx8EUXGg+YdAJHSIDlkekJkWrw4xLPcGAAA4VS1OVG+88YbWr1+vzz77rNG+srIyxcTEKCEhIWR7UlKSysrKzDHHr9kNvg43xuPxqKamRpWVlaqrq2tyzObNmy3P5Xg+n08+37Fg6vF4JNX/ltzwAnrw9ck+1/yP/9im/1v/fZP7gg+BGJieePRBEAnq2cRDIM71Z6qfao3sgjqFR42soU7hUSNr2kOd2vLccfa1KAzv3LlT9957r1asWCGXq/3dvFRYWKhHH3200Xav16uYmJiQbT6f76T/+mhAapz+b339v3eMiVRmd7eyusfr0rR4DejultsV+hCIhgG9LTmVGtkJdQqPGllDncKjRta09Tp5vc234gQaalEYLikpUUVFhQYOHGhuq6ur00cffaQFCxbo/fffl9/vV1VVVcgV2fLycvOReMnJyVq7dm3IecvLy819wX8GtzUc43a7FRsbazbJbmpMw3OEm8vxZs6cqfz8fPO1x+NRWlqaXC5XSPgP/sbsdDpP6sPip31TFRkVpYHpibooqX0+BOJUa2QX1Ck8amQNdQqPGlnTHurk9/tbewpoQ1oUhq+66ip98cUXIdvGjh2rPn36aMaMGUpLS1N0dLSKioo0cuRISdKWLVtUWlqqnJwcSVJOTo7mzJmjiooKs+vDihUr5Ha71bdvX3PMu+++G/I+K1asMM8RExOj7OxsFRUVacSIEZLqb6ArKirSlClTJEnZ2dlh53I8p9Mpp7PxQxocjsY3nAW3ncwHRVrnDvp/l/Vo8XFtzanUyE6oU3jUyBrqFB41sqat16mtzhuto0VhuFOnTrrkkktCtnXs2FFdunQxt48fP175+fnq3Lmz3G637rnnHuXk5Jg3rA0bNkx9+/bVHXfcoblz56qsrEwPPfSQJk+ebAbRu+66SwsWLND06dM1btw4ffDBB1qyZImWLVtmvm9+fr5Gjx6tQYMGafDgwZo/f74OHTqksWPHSpLi4+PDzgUAAAD2dtpbEsybN08REREaOXJkyIMugiIjI/XOO+9o0qRJysnJUceOHTV69Gg99thj5piePXtq2bJlmjZtmp577jl1795dCxcuNHsMS9KoUaO0Z88eFRQUqKysTFlZWVq+fHnITXXh5gIAAAB7O6k+w3ZxNvoMt1fUyBrqFB41soY6hUeNrGkPdaLPMFoiorUnAAAAALQWwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALCtFoXhF198UQMGDJDb7Zbb7VZOTo7ee+89c7/X69XkyZPVpUsXxcXFaeTIkSovLw85R2lpqfLy8tShQwd17dpV999/v44cORIyZuXKlRo4cKCcTqd69eqlRYsWNZrL888/rx49esjlcmnIkCFau3ZtyH4rcwEAAIC9tSgMd+/eXU8++aRKSkq0bt06/fSnP9X111+vTZs2SZKmTZumt99+W0uXLtWqVau0a9cu3XjjjebxdXV1ysvLk9/v1yeffKJXXnlFixYtUkFBgTlm27ZtysvL05VXXqkNGzZo6tSpmjBhgt5//31zzOLFi5Wfn6/Zs2dr/fr1yszMVG5urioqKswx4eYCAAAAyDhFiYmJxsKFC42qqiojOjraWLp0qbnv66+/NiQZxcXFhmEYxrvvvmtEREQYZWVl5pgXX3zRcLvdhs/nMwzDMKZPn27069cv5D1GjRpl5Obmmq8HDx5sTJ482XxdV1dnpKamGoWFhYZhGJbmYkV1dbUhyaiurg7ZHggEjMOHDxuBQMDyueyGGllDncKjRtZQp/CokTXtoU4n+vkNNCXqZEN0XV2dli5dqkOHDiknJ0clJSWqra3V0KFDzTF9+vRRenq6iouLddlll6m4uFj9+/dXUlKSOSY3N1eTJk3Spk2bdOmll6q4uDjkHMExU6dOlST5/X6VlJRo5syZ5v6IiAgNHTpUxcXFkmRpLk3x+Xzy+Xzma4/HI0kyDEOGYZjbg68bbkMoamQNdQqPGllDncKjRta0hzq15bnj7GtxGP7iiy+Uk5Mjr9eruLg4vfnmm+rbt682bNigmJgYJSQkhIxPSkpSWVmZJKmsrCwkCAf3B/c1N8bj8aimpkaVlZWqq6trcszmzZvNc4SbS1MKCwv16KOPNtru9XoVExMTss3n88nhcJzwXKBGVlGn8KiRNdQpPGpkTVuvk9frbe0poA1pcRju3bu3NmzYoOrqav3v//6vRo8erVWrVp2JuZ11M2fOVH5+vvna4/EoLS1NLpdLLpfL3B78jdnpdLbpD4sziRpZQ53Co0bWUKfwqJE17aFOfr+/taeANqTFYTgmJka9evWSJGVnZ+uzzz7Tc889p1GjRsnv96uqqirkimx5ebmSk5MlScnJyY26PgQ7PDQcc3zXh/LycrndbsXGxioyMlKRkZFNjml4jnBzaYrT6ZTT6Wy03eFwNPpACG5rqx8UZwM1soY6hUeNrKFO4VEja9p6ndrqvNE6TrnPcCAQkM/nU3Z2tqKjo1VUVGTu27Jli0pLS5WTkyNJysnJ0RdffBHS9WHFihVyu93q27evOabhOYJjgueIiYlRdnZ2yJhAIKCioiJzjJW5AAAAAC26Mjxz5kxde+21Sk9P14EDB/T6669r5cqVev/99xUfH6/x48crPz9fnTt3ltvt1j333KOcnBzzhrVhw4apb9++uuOOOzR37lyVlZXpoYce0uTJk80rsnfddZcWLFig6dOna9y4cfrggw+0ZMkSLVu2zJxHfn6+Ro8erUGDBmnw4MGaP3++Dh06pLFjx0qSpbkAAAAALQrDFRUVuvPOO7V7927Fx8drwIABev/993X11VdLkubNm6eIiAiNHDlSPp9Pubm5euGFF8zjIyMj9c4772jSpEnKyclRx44dNXr0aD322GPmmJ49e2rZsmWaNm2annvuOXXv3l0LFy5Ubm6uOWbUqFHas2ePCgoKVFZWpqysLC1fvjzkprpwcwEAAAAcBv1HTsjj8Sg+Pl7V1dVyu93mdsMw5PV65XK5WJd0AtTIGuoUHjWyhjqFR42saQ91OtHPb6App7xmGAAAAGirCMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANtqURguLCzUD37wA3Xq1Eldu3bViBEjtGXLlpAxXq9XkydPVpcuXRQXF6eRI0eqvLw8ZExpaany8vLUoUMHde3aVffff7+OHDkSMmblypUaOHCgnE6nevXqpUWLFjWaz/PPP68ePXrI5XJpyJAhWrt2bYvnAgAAAPtqURhetWqVJk+erDVr1mjFihWqra3VsGHDdOjQIXPMtGnT9Pbbb2vp0qVatWqVdu3apRtvvNHcX1dXp7y8PPn9fn3yySd65ZVXtGjRIhUUFJhjtm3bpry8PF155ZXasGGDpk6dqgkTJuj99983xyxevFj5+fmaPXu21q9fr8zMTOXm5qqiosLyXAAAAGBzximoqKgwJBmrVq0yDMMwqqqqjOjoaGPp0qXmmK+//tqQZBQXFxuGYRjvvvuuERERYZSVlZljXnzxRcPtdhs+n88wDMOYPn260a9fv5D3GjVqlJGbm2u+Hjx4sDF58mTzdV1dnZGammoUFhZanks41dXVhiSjuro6ZHsgEDAOHz5sBAIBS+exI2pkDXUKjxpZQ53Co0bWtIc6nejnN9CUqFMJ0tXV1ZKkzp07S5JKSkpUW1uroUOHmmP69Omj9PR0FRcX67LLLlNxcbH69++vpKQkc0xubq4mTZqkTZs26dJLL1VxcXHIOYJjpk6dKkny+/0qKSnRzJkzzf0REREaOnSoiouLLc/leD6fTz6fz3zt8XgkSYZhyDAMc3vwdcNtCEWNrKFO4VEja6hTeNTImvZQp7Y8d5x9Jx2GA4GApk6dqh/96Ee65JJLJEllZWWKiYlRQkJCyNikpCSVlZWZYxoG4eD+4L7mxng8HtXU1KiyslJ1dXVNjtm8ebPluRyvsLBQjz76aKPtXq9XMTExIdt8Pp8cDkeT50E9amQNdQqPGllDncKjRta09Tp5vd7WngLakJMOw5MnT9aXX36pf/zjH6dzPq1q5syZys/PN197PB6lpaXJ5XLJ5XKZ24O/MTudzjb9YXEmUSNrqFN41Mga6hQeNbKmPdTJ7/e39hTQhpxUGJ4yZYreeecdffTRR+revbu5PTk5WX6/X1VVVSFXZMvLy5WcnGyOOb7rQ7DDQ8Mxx3d9KC8vl9vtVmxsrCIjIxUZGdnkmIbnCDeX4zmdTjmdzkbbHQ5How+E4La2+kFxNlAja6hTeNTIGuoUHjWypq3Xqa3OG62jRd0kDMPQlClT9Oabb+qDDz5Qz549Q/ZnZ2crOjpaRUVF5rYtW7aotLRUOTk5kqScnBx98cUXIV0fVqxYIbfbrb59+5pjGp4jOCZ4jpiYGGVnZ4eMCQQCKioqMsdYmQsAAADsrUVXhidPnqzXX39df/3rX9WpUydz7W18fLxiY2MVHx+v8ePHKz8/X507d5bb7dY999yjnJwc84a1YcOGqW/fvrrjjjs0d+5clZWV6aGHHtLkyZPNq7J33XWXFixYoOnTp2vcuHH64IMPtGTJEi1btsycS35+vkaPHq1BgwZp8ODBmj9/vg4dOqSxY8eacwo3FwAAANhcS1pPSGry6+WXXzbH1NTUGHfffbeRmJhodOjQwbjhhhuM3bt3h5xn+/btxrXXXmvExsYa5513nvHLX/7SqK2tDRnz4YcfGllZWUZMTIxxwQUXhLxH0G9/+1sjPT3diImJMQYPHmysWbMmZL+VuTSH1monjxpZQ53Co0bWUKfwqJE17aFOtFZDSzgMg/4jJ+LxeBQfH6/q6mq53W5zu2EY8nq9crlcrEs6AWpkDXUKjxpZQ53Co0bWtIc6nejnN9CUFq0ZBgAAANoTwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLZaHIY/+ugjDR8+XKmpqXI4HHrrrbdC9huGoYKCAqWkpCg2NlZDhw7Vv/71r5Ax+/fv1+233y63262EhASNHz9eBw8eDBnzz3/+Uz/5yU/kcrmUlpamuXPnNprL0qVL1adPH7lcLvXv31/vvvtui+cCAAAA+2pxGD506JAyMzP1/PPPN7l/7ty5+s1vfqOXXnpJn376qTp27Kjc3Fx5vV5zzO23365NmzZpxYoVeuedd/TRRx/pF7/4hbnf4/Fo2LBhysjIUElJiZ566ik98sgj+t3vfmeO+eSTT3Trrbdq/Pjx+vzzzzVixAiNGDFCX375ZYvmAgAAABszToEk48033zRfBwIBIzk52XjqqafMbVVVVYbT6TT+/Oc/G4ZhGF999ZUhyfjss8/MMe+9957hcDiM77//3jAMw3jhhReMxMREw+fzmWNmzJhh9O7d23x98803G3l5eSHzGTJkiPHf//3flucSTnV1tSHJqK6uDtkeCASMw4cPG4FAwNJ57IgaWUOdwqNG1lCn8KiRNe2hTif6+Q005bSuGd62bZvKyso0dOhQc1t8fLyGDBmi4uJiSVJxcbESEhI0aNAgc8zQoUMVERGhTz/91Bzzn//5n4qJiTHH5ObmasuWLaqsrDTHNHyf4Jjg+1iZCwAAAOwt6nSerKysTJKUlJQUsj0pKcncV1ZWpq5du4ZOIipKnTt3DhnTs2fPRucI7ktMTFRZWVnY9wk3l+P5fD75fD7ztcfjkVS/9tgwDHN78HXDbQhFjayhTuFRI2uoU3jUyJr2UKe2PHecfac1DLd1hYWFevTRRxtt93q9IVeppfrg7HA4ztbU2iRqZA11Co8aWUOdwqNG1rT1OnFvEFritIbh5ORkSVJ5eblSUlLM7eXl5crKyjLHVFRUhBx35MgR7d+/3zw+OTlZ5eXlIWOCr8ONabg/3FyON3PmTOXn55uvPR6P0tLS5HK55HK5zO3B35idTmeb/rA4k6iRNdQpPGpkDXUKjxpZ0x7q5Pf7W3sKaENOaxju2bOnkpOTVVRUZAZOj8ejTz/9VJMmTZIk5eTkqKqqSiUlJcrOzpYkffDBBwoEAhoyZIg5ZtasWaqtrVV0dLQkacWKFerdu7cSExPNMUVFRZo6dar5/itWrFBOTo7luRzP6XTK6XQ22u5wOBp9IAS3tdUPirOBGllDncKjRtZQp/CokTVtvU5tdd5oHS2+ge7gwYPasGGDNmzYIKn+RrUNGzaotLRUDodDU6dO1RNPPKG//e1v+uKLL3TnnXcqNTVVI0aMkCRdfPHFuuaaazRx4kStXbtWq1ev1pQpU3TLLbcoNTVVknTbbbcpJiZG48eP16ZNm7R48WI999xzIVdt7733Xi1fvlzPPPOMNm/erEceeUTr1q3TlClTJMnSXAAAAGBzLW0/8eGHHxqSGn2NHj3aMIz6liwPP/ywkZSUZDidTuOqq64ytmzZEnKOffv2GbfeeqsRFxdnuN1uY+zYscaBAwdCxmzcuNH48Y9/bDidTqNbt27Gk08+2WguS5YsMS666CIjJibG6Nevn7Fs2bKQ/Vbm0hxaq508amQNdQqPGllDncKjRta0hzrRWg0t4TAMbrk8EY/Ho/j4eFVXV8vtdpvbDcOQ1+uVy+Xir2JOgBpZQ53Co0bWUKfwqJE17aFOJ/r5DTTltPYZBgAAANoSwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLZsEYaff/559ejRQy6XS0OGDNHatWtbe0oAAAA4B7T7MLx48WLl5+dr9uzZWr9+vTIzM5Wbm6uKiorWnhoAAABaWbsPw88++6wmTpyosWPHqm/fvnrppZfUoUMH/fGPf2ztqQEAAKCVRbX2BM4kv9+vkpISzZw509wWERGhoUOHqri4uNXm9fd/FOrvO/6/Vnv/s8UwAnI42v3vW6eMOoVHjayhTuFRI2vOdp3uueLX6tZt8Fl7P6Chdh2G9+7dq7q6OiUlJYVsT0pK0ubNmxuN9/l88vl85muPxyNJMgxDhmGY24OvG25riW/2fqFlR/ae1LEAALQ3dx7YpdST/JnalJP9+Qx7atdhuKUKCwv16KOPNtru9XoVExMTss3n88nhcJzU+wQCgZM6DgCA9qi2tlZer/e0ne90ngvtX7sOw+edd54iIyNVXl4esr28vFzJycmNxs+cOVP5+fnma4/Ho7S0NLlcLrlcLnN78Kqw0+k8qUD8/376pP7L832Lj2tLDMOQ3+9XTEzMSf/SYAfUKTxqZA11Co8aWdMadUrq2l8xTlf4gRb5/f7Tdi60f+06DMfExCg7O1tFRUUaMWKEpPqrskVFRZoyZUqj8U6nU06ns9F2h8PR6AMhuO1kPigSEnooIaFHi49rSwzDkNfrlcvl4odOM6hTeNTIGuoUHjWypj3Uqa3OG62jXYdhjSZFTAAAF7dJREFUScrPz9fo0aM1aNAgDR48WPPnz9ehQ4c0duzY1p4aAAAAWlm7D8OjRo3Snj17VFBQoLKyMmVlZWn58uWNbqoDAACA/bT7MCxJU6ZMaXJZBAAAAOyNZosAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbMsWj2M+WYZhSJI8Hk+j7V6vV36/Xw6HozWmds6jRtZQp/CokTXUKTxqZE17qFPw53bw5zjQHMJwMw4cOCBJSktLa+WZAACAljpw4IDi4+Nbexo4xzkMfm06oUAgoF27dqlTp04hvx17PB6lpaVp586dcrvdrTjDcxc1soY6hUeNrKFO4VEja9pDnQzD0IEDB5SamqqICFaEonlcGW5GRESEunfvfsL9bre7zX5QnC3UyBrqFB41soY6hUeNrGnrdeKKMKzi1yUAAADYFmEYAAAAthX5yCOPPNLak2iLIiMjdcUVVygqipUmJ0KNrKFO4VEja6hTeNTIGuoEO+EGOgAAANgWyyQAAADw/7d351FRnecfwL8zw8i+b7IJuESRgCCKQQi7BlwiLlHwSIOnxmhLBSNw1FJA3KJZRD2pxqWiuNC6Yq0JmqKpOxAEMxAHg2KNYBARlX2Z5/eH5f4cAUUTHdp5PufMOfDcd9557nvunXnmvXfuVVtcDDPGGGOMMbXFxTBjjDHGGFNbXAwzxhhjjDG1xcUweyX4d5nsl6qsrERJSYmq0+jV2tvbAfD+9jwNDQ1oaWlRdRq92k8//YTLly+rOg3GVIKL4R7q+NBh3auvr8ejR4/w8OFDpdtXs/9XU1ODq1ev4tq1a/zh/Ay3b9+Gi4sLEhMTkZ+fr+p0eqXCwkKEhYWhoaGB97dnkMlkmD59Oi5evIjm5mZVp9MrFRcXY/To0di9ezcAQKFQqDgjxl4vLoZ7oLS0FGlpaaisrFR1Kr1WSUkJpkyZAj8/Pzg5OWHPnj0AeMbqSTKZDMHBwZg+fTpcXFywdu1a/pLVjWvXruHBgwd48OABNm7ciIKCAmEZb1NAUVERRo8eDWdnZ+jo6AhxHhtlxcXFePvtt2FrawtHR0doamqqOqVep6ioCJ6entDQ0MDevXtRVVUFsZhLA6ZeeIt/jh9//BFeXl6Ij4/Hxo0bUV1dreqUep2SkhL4+vrC2dkZcXFxCA8Px+zZs1FYWMgzVv9RUlICf39/BAUFITMzEytXrkRSUhIqKipUnVqv5OrqinHjxmHGjBmQyWT4/PPPUVxcDIALvitXrsDb2xvR0dH4+OOPhXhLSwvvb0+or6/HRx99hIiICGzevBl2dna4evUqCgsL8e9//1vV6fUKRUVF8PLyQmxsLHJzc2FqaoqtW7eCiNR+P2PqhW+68Qz19fVYsGABFAoFRo4ciejoaMTFxSEhIQFmZmaqTq9XqKmpQUREBIYMGYL169cL8YCAALi4uGDDhg0gIrX+kK6ursbUqVPh7u6OtLQ0AI8LunHjxiEpKQna2towNTWFnZ2dijPtHdrb21FTUwMfHx/k5OQgNzcXq1evhpubG4qLi2FlZYUDBw6oOk2VuHPnDtzd3TFs2DB8/fXXaG9vR1xcHK5du4aysjJ8+OGHCAkJwZAhQ1Sdqso1NzcjODgYGzZsgKurK8aPHy+cpuTs7Iw5c+bgt7/9rarTVJkrV67A09MTixYtwsqVK6FQKDBjxgzcvHkTubm5AKD2791MffB9Fp9BLBbDw8MDpqammDFjBszMzBAeHg4AXBD/R2trK2prazFt2jQAj881E4vFcHR0RE1NDQCo/ZupSCRCSEiIMEYAsGLFCmRnZ+POnTuorq6Gs7MzEhMT4ePjo8JMewexWAxzc3OMHDkSMpkMkydPhqamJt5//300Nzfjgw8+UHWKKuXl5YVbt24hKysLmzdvRmtrK9zc3ODg4IANGzZAJpMhKSkJ/fr1U3WqKlVbWwu5XI7q6mrEx8cDALZt24aKigrk5OQgMTERhoaGSvulOmlubkZCQgJSU1OF9+0VK1Zg1KhR2LRpE+bPn6/2791MfUhSUlJSVJ1EbyWVSjF06FC4u7sDAJydnTFkyBAsWrQICoUCHh4e0NHRgUKhQHl5OYyNjVWc8eunp6cHf39/YYza2togkUiQn5+Phw8fYvLkyULburo69OnTR1WpqoyOjg7c3NxgZWUFAMjMzMQf/vAHZGZmYtmyZXj77beRlZUFDQ0N+Pv7qzbZXqDjAzgrKwv37t1DcHAw1qxZg5KSEtjY2EChUMDKygo2NjYqzvT109PTg6+vL4qKipCamgo7OztkZmYiLCwM48aNg7m5OT799FP4+vpi0KBBqk5XpXR1dXH58mXcunUL169fR0xMDLy9vTFw4EA4OTnhxo0buH37NkJDQyESidSu8LOxsUFAQACAx/scEUEqlaKoqAi3bt3ClClT1HJcmHrimeHn0NXVBfD40K1YLMaMGTNARJg5cyZEIhFiY2Px6aef4ubNm8jIyFD6MYu66PjQVSgUkEqlAB4fXquqqhLarF69GpqamliwYAE0NNRvs9PX1xf+9vLyQn5+PoYPHw4A8PX1hYWFBb777jtVpderdByaDQwMxI0bN/C73/0Ox48fx3fffYfCwkLEx8ejT58+cHV1hZaWlqrTfe2srKywevVq2NjYIDg4GKampsKYzZw5E8nJyTh16hRCQ0NVnapKiUQiLFq0CP7+/mhoaMDcuXOFZba2trC0tEReXh7EYjEXfHg8XoaGhoiMjMS0adOwYMECeHt7qzotxl4L9atKXpJEIgERQaFQIDw8HCKRCJGRkTh69CjKysqQl5enloXwk8RisdI5Zh2/SE5KSsKKFStw+fJltSyEn2Zvbw97e3sAj79AtLS0QE9PD66urirOrHfo2H4cHR0xe/ZsWFpa4tixY3B0dISjoyNEIhGGDRumloVwB2trayxevFgYg46ZvZqaGpibm8PNzU3FGfYOI0aMwFdffQU/Pz9s2bIF/fv3h7OzM4DHp3i98cYbaGtrE77EM2DChAkYM2YMNm3ahOHDh0NbW1vVKTH2yvEP6F5Qx3CJRCIEBQWhsLAQp0+fhouLi4oz6x06zj1LSUlBZWUlBg0ahMTERJw/f16YCWXKkpKSsHPnTnzzzTdqf2j7Sa2trcjIyMCIESPg6urKP+bpgeTkZOzbtw8nT54UvnAx4F//+hciIiJga2sLFxcXtLS04OjRozh79izefPNNVafX63z88cdYvXo15HI5+vbtq+p0GHvleJruBYlEIrS3tyM+Ph6nTp1CYWEhF8JP6JgNlkql2Lp1KwwMDHD27FkuhLuwf/9+fPvtt8jMzMTJkye5EH6KVCpFVFSUsE1xIdy9zMxMnDp1Cvv378c///lPLoSf4uvri5ycHOzevRsXL17EoEGDuBDuQscXzg8//BAHDhxAU1OTqlNi7LXgmeGX0N7ejvT0dHh4ePDhyG7k5+fD09MTMpkMQ4cOVXU6vVJxcTFSU1ORkpICJycnVafD/otduXIFS5cuxZo1a4TTAFjXOu6uxjeW6B4RoaGhQfjNDGP/67gYfkl8yPb56uvr+c30OVpbW/l8RfaraGlpUcurtTDG2C/FxTBjjDHGGFNbfJyIMcYYY4ypLS6GGWOMMcaY2uJimDHGGGOMqS0uhhljjDHGmNriYpgxxhhjjKktLoYZY4wxxpja4mKYMcYY+xW8++676NevH7S0tGBlZYXIyEhUVFQ893kXLlxAYGAgdHV1YWBgAF9fXzQ2Nr5Qv9nZ2Xjrrbegr68Pc3NzTJ06FeXl5UptvvjiCzg5OUFbWxuDBw/Grl27lJb7+/tDJBJ1eowfP77LvOfNmweRSIS0tLROy/7xj39g1KhR0NbWhrGxMcLCwoRl9+7dQ0hICKytraGpqQk7OztER0fj4cOHzx2rJ5WVlWHy5MkwNzeHgYEBpk+fjp9//vmF+mAM4GKYMfZfJioqSumD9XWLjIzEqlWretQ2PDwcn3322SvOiL1O/v7+SE9P73JZQEAA/va3v0Eul+PgwYMoKyvDtGnTntnfhQsXEBISgrFjxyI3Nxd5eXmIjo5WukPe8/q9ceMGJk2ahMDAQBQWFiI7OxvV1dWYMmWK0GbTpk1YsmQJUlJSUFxcjGXLluH3v/89/v73vwttDh06hMrKSuEhk8kgkUjw3nvvdcr78OHDuHjxIqytrTstO3jwICIjIzF79mwUFRXh3LlzmDlzprBcLBZj0qRJOHr0KEpLS5Geno5vvvkG8+bNe+ZYPam+vh5jx46FSCRCTk4Ozp07h5aWFkycOFG4yyBjPUaMMdZLAHjmIzk5mWpra+n+/fsqya+wsJBMTEzo0aNHPWr//fffk7GxMdXW1r7izNjr4ufnRzt27OhR26ysLBKJRNTS0tJtm1GjRlFiYuIL5fB0v/v37ycNDQ1qb28X2hw9elSpjZeXF8XFxSn189FHH5G3t3e3r7Nu3TrS19enuro6pfhPP/1ENjY2JJPJyN7entatWycsa21tJRsbG9q2bdsLrdP69evJ1tZWKXbkyBFyd3cnTU1NcnR0pJSUFGptbSUiouzsbBKLxfTgwQOhfW1tLYlEIjp58uQLvTZjPDPMGOs1npyVSktLg4GBgVIsLi4OhoaGMDIyUkl+GzduxHvvvQc9Pb0etX/zzTcxYMAA7N69+xVnxnqbmpoa7NmzB6NHj+72lutVVVW4dOkSLCwsMHr0aFhaWsLPzw9nz559oX49PDwgFouxY8cOtLe348GDB8jIyEBwcLDQprm5GVpaWkp9aWtrIzc3F62trV2+1vbt2xEeHg5dXV0hplAoEBkZifj4eDg7O3d6TkFBAW7fvg2xWAx3d3dYWVkhNDQUMpms23WqqKjAoUOH4OfnJ8TOnDmD3/zmN4iJiUFJSQm+/PJLpKenY+XKlcL6iEQiaGpqCs/R0tKCWCx+5vgx1iVVV+OMMdaVHTt2kKGhYaf4+++/T5MmTRL+9/Pzo+joaIqJiSEjIyOysLCgLVu2UF1dHUVFRZGenh4NGDCAjh8/rtTP999/TyEhIaSrq0sWFhY0a9Ysunv3brf5tLW1kaGhIR07dkwp/sUXX9DAgQNJU1OTLCwsaOrUqUrLly1bRj4+Pi8zBKwXet7McEJCAuno6BAAeuutt6i6urrbthcuXCAAZGJiQn/5y1+ooKCAYmNjqU+fPlRaWvpC/Z4+fZosLCxIIpEQAPLy8lI6grJkyRLq27cv5efnk0KhoLy8PLK0tCQAVFFR0Sm3S5cuEQC6dOmSUnzVqlU0ZswYUigURESdZob37dtHAKhfv3504MABys/Pp4iICDI1NaV79+4p9RUeHk7a2toEgCZOnEiNjY3CsqCgIFq1apVS+4yMDLKysiIioqqqKjIwMKCYmBiqr6+nuro6io6OJgA0d+7cbsecsa5wMcwY65VepBjW19en5cuXU2lpKS1fvpwkEgmFhobSli1bqLS0lObPn0+mpqZUX19PRET3798nc3NzWrJkCf3www9UUFBAY8aMoYCAgG7zKSgoIAB0584dIZaXl0cSiYT27t1L5eXlVFBQQOvXr1d63ldffUV9+vShpqamXzokTAVWrlxJurq6wkMsFpOmpqZS7ObNm0L7u3fvklwupxMnTpC3tzeNGzdOKByfdu7cOQJAS5YsUYq7uLjQ4sWLlWLP6reyspIGDRpE8fHxVFBQQN9++y35+flRUFCQ0KahoYFmz55NGhoaJJFIyNramhISEjpt0x3mzp1LLi4uSrH8/HyytLSk27dvC7Gni+E9e/YQAPryyy+FWFNTE5mZmdHmzZuV+qusrKQffviBsrKyaOjQoTR//nxhmZmZGWlpaSmNs5aWFgEQ9uPs7Gzq378/iUQikkgkNGvWLBo+fDjNmzevy/FmrDtcDDPGeqUXKYafnHlta2sjXV1dioyMFGKVlZUEgC5cuEBERMuXL6exY8cq9Xvr1i0CQHK5vMt8Dh8+TBKJRKmwOXjwIBkYGNDDhw+7XY+ioiICQOXl5c9ZY9Yb3bt3j65duyY8PD09ac2aNUqxjvNYn9axTZ0/f77L5devXycAlJGRoRSfPn06zZw5s9ucnu43MTGRRowY0WWbjm2+Q0tLC926dYva2troz3/+M+nr6yuda0xEVFdXRwYGBpSWlqYUX7dunVB4djwAkFgsJnt7eyIiysnJIQB05swZped6enrS0qVLu12nM2fOKM1Sa2lpdRrnjsfT+d69e1eYBbe0tKS1a9d2+zqMdUXj9Z2QwRhjr4arq6vwt0QigampKVxcXISYpaUlgMfnaAJAUVERTp061eW5v2VlZXjjjTc6xRsbG6GpqQmRSCTExowZA3t7e/Tv3x8hISEICQnB5MmToaOjI7TR1tYGADQ0NPzCtWSqYGJiAhMTE+F/bW1tWFhYYODAgc99bsdVDZqbm7tc7uDgAGtra8jlcqV4aWkpQkNDe9xvQ0OD0tUngMf7wZNtO0ilUtja2gIAMjMzMWHChE7P3b9/P5qbmzFr1iyleGRkJIKDg5Vi77zzjnDlCODx+cuampqQy+Xw8fEBALS2tqK8vBz29vY9Xqfhw4dDLpf3aJzNzMwAADk5OaiqqsK777773Ocw9iQuhhlj//We/oGSSCRSinUUsB0fuHV1dZg4cSLWrFnTqS8rK6suX8PMzAwNDQ1oaWlBnz59AAD6+vooKCjA6dOnceLECSQlJSElJQV5eXnCj/xqamoAAObm5r9wLVlvdunSJeTl5cHHxwfGxsYoKyvDn/70JwwYMABeXl4AgNu3byMoKAi7du2Cp6cnRCIR4uPjkZycjGHDhsHNzQ07d+7E1atXceDAgR73O378eKxbtw6pqamIiIjAo0ePsHTpUtjb28Pd3R3A4wI7NzcXo0aNwv379/H5559DJpNh586dndZl+/btCAsLg6mpqVLc1NS0U0wqlaJv374YPHgwAMDAwADz5s1DcnIy7OzsYG9vj08++QQAhEu0HT9+HD///DNGjhwJPT09FBcXIz4+Ht7e3nBwcAAAJCUlYcKECejXrx+mTZsGsViMoqIiyGQyrFixAgCwY8cOODk5wdzcHBcuXEBMTAwWLlwo5MJYT3ExzBhTO8OHD8fBgwfh4OAADY2evQ26ubkBAEpKSoS/AUBDQwPBwcEIDg5GcnIyjIyMkJOTI1zjVSaTwdbWVpi9Yv+bdHR0cOjQISQnJ6O+vh5WVlYICQlBYmKicMWD1tZWyOVypaMEsbGxaGpqwsKFC1FTU4Nhw4bh5MmTGDBgQI/7DQwMxN69e7F27VqsXbsWOjo68PLywtdffy0cmWhvb8dnn30GuVwOqVSKgIAAnD9/Xig+O8jlcpw9exYnTpx46bH45JNPoKGhgcjISDQ2NmLUqFHIycmBsbExgMez61u3bsXChQvR3NwMOzs7TJkyBYsXLxb6eOedd3Ds2DGkpqZizZo1kEqlGDJkCObMmaOU65IlS1BTUwMHBwf88Y9/xMKFC186b6a+REREqk6CMcaelp6ejtjYWNTW1irFo6KiUFtbiyNHjgB4fBMENzc3pbtgOTg4IDY2FrGxsUJMJBLh8OHDCAsLQ0VFBdzc3ODn54eEhASYmJjgxx9/RGZmJrZt2yYcYn6ah4cHZs+ejejoaADAsWPHcP36dfj6+sLY2BjHjx9HdHQ0rly5Ilx2KioqChKJBNu3b/9Vx4cxxtivg68zzBhTO9bW1jh37hza29sxduxYuLi4IDY2FkZGRp3On3zSnDlzsGfPHuF/IyMjHDp0CIGBgXBycsLmzZuxb98+oRBuamrCkSNH8MEHH7zydWKMMfZyeGaYMcZ6qLGxEYMHD8Zf//pX4XzNZ9m0aRMOHz78iw45M8YYe7V4ZpgxxnpIW1sbu3btQnV1dY/aS6VSbNy48RVnxRhj7JfgmWHGGGOMMaa2eGaYMcYYY4ypLS6GGWOMMcaY2uJimDHGGGOMqS0uhhljjDHGmNriYpgxxhhjjKktLoYZY4wxxpja4mKYMcYYY4ypLS6GGWOMMcaY2uJimDHGGGOMqa3/A1twFkxC3N8tAAAAAElFTkSuQmCC""" + + assert plot in body + assert startTime in body + assert startFrequency in body + assert endFrequency in body From 4122b24d6b4c8355d1a3b674a34e8f754b7b4b87 Mon Sep 17 00:00:00 2001 From: cbbcbail Date: Mon, 14 Jun 2021 12:49:30 -0600 Subject: [PATCH 03/20] Revert "Adds full support for tdms rendering" This reverts commit 5fd18045812b650816b3ef3589b28398f37271d7. --- AUTHORS.rst | 1 - mfr/extensions/tdms/render.py | 121 ++++------------ mfr/extensions/tdms/static/css/tdms.css | 160 ++-------------------- mfr/extensions/tdms/static/js/tdms.js | 33 ----- mfr/extensions/tdms/templates/viewer.mako | 52 ++----- setup.py | 3 - supportedextensions.md | 3 - tests/extensions/tdms/__init__.py | 0 tests/extensions/tdms/files/invalid.tdms | Bin 78396 -> 0 bytes tests/extensions/tdms/files/test6.tdms | Bin 46962 -> 0 bytes tests/extensions/tdms/test_renderer.py | 65 --------- 11 files changed, 39 insertions(+), 399 deletions(-) delete mode 100644 mfr/extensions/tdms/static/js/tdms.js delete mode 100644 tests/extensions/tdms/__init__.py delete mode 100644 tests/extensions/tdms/files/invalid.tdms delete mode 100644 tests/extensions/tdms/files/test6.tdms delete mode 100644 tests/extensions/tdms/test_renderer.py diff --git a/AUTHORS.rst b/AUTHORS.rst index d2f37d82..a1565ccb 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -34,4 +34,3 @@ Contributors - Longze Chen `@cslzchen `_ - Jonathon Love `@jonathon-love `_ - Josh Bird `@birdbrained `_ -- Connor Bailey `@cbbcbail `_ diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py index 6330d804..b3084be3 100644 --- a/mfr/extensions/tdms/render.py +++ b/mfr/extensions/tdms/render.py @@ -1,16 +1,16 @@ import os -import base64 -from io import BytesIO import nptdms -import pandas as pd -import matplotlib.pyplot as plt -import numpy as np -import datetime +from nptdms import TdmsFile from mako.lookup import TemplateLookup from mfr.core import extension -from mfr.core import utils + +# class EscapeHtml(Extension): +# def extendMarkdown(self, md, md_globals): +# del md.preprocessors['html_block'] +# del md.inlinePatterns['html'] + class TdmsRenderer(extension.BaseRenderer): @@ -25,105 +25,30 @@ def __init__(self, *args, **kwargs): def render(self): """Render a tdms file to html.""" - maxTableLength = 100 # maximum rows to include in data table - minDigitLength = 4 # minumum digits before scientific notation is used - formatString = "{:." + str(minDigitLength) + "g}" - - fig, ax = plt.subplots() # create matplotlib figure object - ax.grid(True, alpha=0.1) # specify matplotlib grid properties - # empty data structures to be filled with file data in loops - channelNames = [] - lineCollections = [] - properties = "" - data = pd.DataFrame() + tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) - tdms_file = nptdms.TdmsFile.open(self.file_path, raw_timestamps=True) - fileMetadata = TdmsRenderer.formatMetadata(tdms_file.properties.items()) - - # Parse group data and metadata and generate html + body = "

      " + for property, value in tdms_file.properties.items(): + body += "
    • File = " + str(value) + "
    • \n\n" + body += "
      " for group in tdms_file.groups(): - groupClass = group.name.replace(" ", "") - buttonId = groupClass + "Button" - showHide = "showHide(\'" + groupClass + "\', \'" + buttonId + "\')" - rowTag = "" - buttonTag = "+" - properties += rowTag + "Group " + group.name + "" - properties += buttonTag + "" - - # Parse channel data and metadata and generate html + body += "
    • Channel group = " + group.name + "
    • \n" + body += "
        " for channel in group.channels(): - channelClass = channel.name.replace(" ", "") - buttonId = channel.name.replace(" ", "") + "Button" - showHide = "showHide(\'" + channelClass + "\', \'" + buttonId + "\')" - rowTag = "" - buttonTag = "+" - properties += rowTag + "Channel " + channel.name + "" + buttonTag + "" - channelLength = len(channel) - - # Parse dictionary of properties: + body += "
      • Channel = " + channel.name + "
      • \n" + body += "
          " + # Access dictionary of properties: for property, value in channel.properties.items(): - rowTag = "" - leftCol = rowTag + "" + property + "" - if utils.isfloat(value): # reformat float values - value = formatString.format(float(value)) - rightCol = "" + str(value) + "" - properties += leftCol + rightCol + body += "
        • " + property + " = " + str(value) + "
        • \n\n" # Access numpy array of data for channel: - if (channelLength > 1): # Only access channels with datasets > 1 - # Plotting on a time axis - if (channel.properties['wf_start_time'] and channel.properties['wf_increment']): - start = channel.properties['wf_start_time'].as_datetime() - start = (start - datetime.datetime(1904, 1, 1)).total_seconds() - increment = channel.properties['wf_increment'] - stop = start + increment * channelLength - timeAxis = np.linspace(start, stop, channelLength) - line = ax.plot(timeAxis, channel, linewidth=2, label=channel.name) - plt.xticks(rotation=45) - plt.xlabel("Time (s)") - else: - line = ax.plot(channel, linewidth=2, label=channel.name) - - lineCollections.append(line) - channelNames.append(channel.name) - data[channel.name] = channel[:maxTableLength] - - ax.legend(channelNames, bbox_to_anchor=(1, 1)) - plotFile = BytesIO() # create byte sream object - fig.savefig(plotFile, format='png', bbox_inches='tight') # export plot to png in byte stream - encoded = base64.b64encode(plotFile.getvalue()).decode('utf-8') # encode base 64 byte stream data - plot = '\'data:image/png;base64,{}\''.format(encoded) # format encoded data as string - table = data.to_html() # export pandas DataFrame to HTML - - return self.TEMPLATE.render(base=self.assets_url, fileMetadata=fileMetadata, properties=properties, plot=plot, table=table) - - def formatMetadata(items): - # Parse property value pairs in file level metadata and generate html - - minDigitLength = 4 # minumum digits before scientific notation is used - formatString = "{:." + str(minDigitLength) + "G}" - fileMetadata = "" - - for property, value in items: - value = str(value) - if value.find("\n") > 1: - value = value.split("\n") - fileMetadata += "
        • " + value[0] + "
        • " - fileMetadata += "
            " - for v in value[1:]: - v = v.replace("\\n", " ").replace("\"", "").split("=") - v[0] = "".join(v[0].split(".")[1:]) - v[1] = v[1].strip() - if utils.isfloat(v[1]): # reformat float values - v[1] = formatString.format(float(v[1])) - fileMetadata += "
          • " + "= ".join(v) + "
          • " - fileMetadata += "
          " - else: - fileMetadata += "
        • " + str(property) + ": " + value + "
        • " - fileMetadata += "
        " + # body = body + str(channel[:]) + "" + body += "
      " + body += "
    " + body += "
    " - return fileMetadata + return self.TEMPLATE.render(base=self.assets_url, body=body) @property def file_required(self): diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css index 9e840ee1..9b586b31 100644 --- a/mfr/extensions/tdms/static/css/tdms.css +++ b/mfr/extensions/tdms/static/css/tdms.css @@ -1,155 +1,11 @@ -/* ---- Quadrant Grid Layout ------------------------------------------------ */ -#topLeft { - max-height: 50%; -} +.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; + background: red; border:solid #000; border-width: 0 10px 10px 0; } -#bottomLeft { - border-top: solid #000 0.5px; -} +.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; + background: blue; border:solid #000; border-width: 0 0 10px 0; } -#topRight { - height: 50%; - overflow: hidden; - background-color: white; -} +.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; + background: yellow; border:solid #000; border-width: 0 10px 0 0; } -#bottomRight { - height: 50%; - border-top: solid #000 0.5px; -} - -.quadrant { - display: flex; - flex-direction: column; - flex-shrink: 0; - width: 100%; - overflow: auto; - margin: 0; - padding: 0; -} - -.row { - display: flex; - flex-direction: row; -} - -.column { - display: flex; - flex-direction: column; - width: 50%; - height: 100%; - overflow: hidden; - border: solid #000 0.5px; - background-color: #F5F5F5; -} - -/* ---- Fixed Title Bar above Scrolling Content ------------------------------*/ - -.titleBar { - margin: 0; - padding: 0 1.5vw 0 1.5vw; - background-color: #FFFFFF; - border-bottom: solid #000 0.5px; -} - -.miniTitleBar { - display: flex; - flex-direction: row; - justify-content: space-between; - flex-shrink: 0; - align-items: center; - border-bottom: solid #000 0.5px; - margin: 0; - padding: 0 6vw 0 1.5vw; - height: 6vh; - cursor: pointer; - position: sticky; -} - -.belowTitle { - overflow-y: auto; - visibility: visible; -} - -/* ---- Tables -------------------------------------------------------------- */ - -table { - width: 100%; -} - -table, th, td { - border-left: 0.5px solid black; - border-bottom: 0.5px solid black; - border-collapse: collapse; - padding: 6px 0 6px 8px; - margin: 0; -} - -tr:nth-child(even) { - background: #FFFFFF; -} - -tr:nth-child(odd) { - background: #F5F5F5; -} - -th { - text-align: center; - background-color: #EBEBEB; -} - -.group { - background: #EBEBEB !important; - display: table-row; - cursor: pointer; - font-weight: bold; -} - -.channel { - background: #FFFFFF !important; - display: none; - cursor: pointer; -} - -.channel > td { - padding-left: 5%; -} - -.property { - background: #F5F5F5 !important; - display: none; - cursor: pointer; -} - -.property > td:nth-child(odd) { - padding-left: 10%; -} - -#propertyTable td { - width: 50%; -} - -/* ---- Miscellaneous ------------------------------------------------------- */ - -body { - height: 800px; -} - -#plot { - height: auto; - width: 100%; -} - -.button { - text-align: center; - font-weight: bold; - font-size: 18pt; - border-left: none; - - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} +.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; + background: green; } diff --git a/mfr/extensions/tdms/static/js/tdms.js b/mfr/extensions/tdms/static/js/tdms.js deleted file mode 100644 index 848180cc..00000000 --- a/mfr/extensions/tdms/static/js/tdms.js +++ /dev/null @@ -1,33 +0,0 @@ -// Shows or hides content and changes button text accordingly -function showHide(contentClass, buttonId) { - var contents = document.getElementsByClassName(contentClass); - var button = document.getElementById(buttonId); - - if (button.textContent == "+") { // Show if hidden - for (var i = 0; i < contents.length; i++) { - element = contents[i] - if (element.nodeName == "TR") { - element.style.display = "table-row"; - } - else { - element.style.display = "block"; - } - } - button.textContent = "-"; - } - else { // Hide if showing - for (var i = 0; i < contents.length; i++) { - contents[i].style.display = "none"; - for (var j = 0; j < contents[i].children.length; j++) { - if (contents[i].children[j].classList.contains("button")) { - contents[i].children[j].textContent = "+"; - } - } - } - var children = document.getElementsByClassName(contentClass + "Child"); - for (var i = 0; i < children.length; i++) { - children[i].style.display = "none"; - } - button.textContent = "+"; - } -}; diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako index c4f67147..53619e69 100644 --- a/mfr/extensions/tdms/templates/viewer.mako +++ b/mfr/extensions/tdms/templates/viewer.mako @@ -1,50 +1,14 @@ - + -
    -
    -
    -

    File Contents

    -
    -
    -
    -
    File Metadata
    -

    -

    -
    -
    -
    -
      - ${fileMetadata} -
    -
    -
    -
    - - ${properties} -
    -
    -
    + +
    + ${body}
    -
    -
    -
    -

    Data Plot

    -
    - -
    -
    -
    -

    Data Table

    -
    -
    - ${table} -
    -
    -
    -
    - +
    +
    +
    + - diff --git a/setup.py b/setup.py index 248000ee..ecfe3aeb 100755 --- a/setup.py +++ b/setup.py @@ -662,9 +662,6 @@ def parse_requirements(requirements): #'.todo.txt = mfr.extensions.codepygments:CodePygmentsRenderer', #'.vimrc' = mfr.extensions.codepygments:CodePygmentsRenderer', - #tdms - '.tdms = mfr.extensions.tdms:TdmsRenderer', - # docx # '.docx = mfr.extensions.docx:DocxRenderer', diff --git a/supportedextensions.md b/supportedextensions.md index 36fd0080..9c6ae199 100644 --- a/supportedextensions.md +++ b/supportedextensions.md @@ -53,9 +53,6 @@ Some file types may not be in the correct list. Please search for the file type ## PDB * .pdb -## Data -* .tdms - ## PDF * .pdf diff --git a/tests/extensions/tdms/__init__.py b/tests/extensions/tdms/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/extensions/tdms/files/invalid.tdms b/tests/extensions/tdms/files/invalid.tdms deleted file mode 100644 index c59f175ed65dbda596d01a7705b15f9bf8ce6597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78396 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

    R|01!swXJq#X=} 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 diff --git a/tests/extensions/tdms/files/test6.tdms b/tests/extensions/tdms/files/test6.tdms deleted file mode 100644 index 38addcaecef77176e75dd57e2c775475d27eaf11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46962 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

    8v5@ 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 H{O|q`JVg&O diff --git a/tests/extensions/tdms/test_renderer.py b/tests/extensions/tdms/test_renderer.py deleted file mode 100644 index 2ed761bb..00000000 --- a/tests/extensions/tdms/test_renderer.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -import pytest - -from bs4 import BeautifulSoup - -from mfr.core.provider import ProviderMetadata -from mfr.extensions.tdms import TdmsRenderer - - -@pytest.fixture -def metadata(): - return ProviderMetadata('test8', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') - - -@pytest.fixture -def test_tdms_file_path(): - return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'test6.tdms') - - -@pytest.fixture -def invalid_tdms_file_path(): - return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'invalid.tdms') - -@pytest.fixture -def url(): - return 'http://osf.io/file/test6.tdms' - - -@pytest.fixture -def assets_url(): - return 'http://mfr.osf.io/assets' - - -@pytest.fixture -def export_url(): - return 'http://mfr.osf.io/export?url=' + url() - - -@pytest.fixture -def renderer(metadata, test_tdms_file_path, url, assets_url, export_url): - return TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) - - -class TestTdmsRenderer: - - def test_render_tdms_file_required(self, renderer): - assert renderer.file_required is True - - def test_render_tdms_cache_result(self, renderer): - assert renderer.cache_result is True - - def test_render_tdms(self, test_tdms_file_path, assets_url, export_url): - metadata = ProviderMetadata('test6', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') - renderer = TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) - body = renderer.render() - name = "sp0006_042419" - startTime = "wf_start_time: 2019-04-24T18:17:11.234133" - startFrequency = "4E+05" - endFrequency = "5E+05" - plot = """data:image/png;base64,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ICBJllYXTJgwQXfccYfmzZunl19+WaNGjTptD05pURi+7777NHz4cGVkZGjXrl2aPXu2IiMjdeuttyo+Pl7jx49Xfn6+OnfuLLfbrXvuuUc5OTm67LLLJEnDhg1T3759dccdd2ju3LkqKyvTQw89pMmTJ5sh9K677tKCBQs0ffp0jRs3Th988IGWLFmiZcuWmfPIz8/X6NGjNWjQIA0ePFjz58/XoUOHNHbsWEmyNBcAAHBihmHou8oaleyo1Lod+7Vue6W2lB9Qc8txnVERykxL0KCMRGVnJGpgeqISO8ac+IBzyPmdGl8Ma8vvO3DgQP3f//2fevTooaioxnHvP/7jPxQdHa1PP/1U6enpkqTKykp98803IVdozz//fO3evdt8/a9//UuHDx8OeZ/Fixera9eucrvdJzXX/v37KxAIaNWqVY2aKARdd9116tixo1588UUtX75cH3300Um9V1NaFIa/++473Xrrrdq3b5/OP/98/fjHP9aaNWvM5D9v3jxFRERo5MiR8vl8ys3N1QsvvGAeHxkZqXfeeUeTJk1STk6OOnbsqNGjR+uxxx4zx/Ts2VPLli3TtGnT9Nxzz6l79+5auHCheWekJI0aNUp79uxRQUGBysrKlJWVpeXLl4fcVBduLgAA4Bj/kYA27arWuu379dm2fdrwnUcVYZYNdO3k1KAeicrO6KzsjET1TXErJqptPty2JUsV2oLJkyfr97//vW699VZNnz5dnTt31rfffqs33nhDCxcuVFxcnMaPH6/7779fXbp0UdeuXTVr1ixFRIR+/376059qwYIFysnJUV1dnWbMmBFylff222/XU089peuvv16PPfaYunfvrh07dugvf/mLpk+fbmkNco8ePTR69GiNGzfOvIFux44dqqio0M033yypPkOOGTNGM2fO1IUXXtjs3/S3VIvC8BtvvNHsfpfLpeeff17PP//8CcdkZGQ0WgZxvCuuuEKff/55s2OmTJliLos42bkAAGBX+w/5tX5HpdbtqNT6HZXa+F2VfEcCJxwf4ZB6J7vNq77ZGYnqnhjLkpNzVGpqqlavXq0ZM2Zo2LBh8vl8ysjI0DXXXGMG3qeeespcTtGpUyf98pe/VHV1dch5nnnmGY0dO1Y/+clPlJqaqueee04lJSXm/g4dOuijjz7SjBkzdOONN+rAgQPq1q2brrrqqhZd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""" - - assert plot in body - assert startTime in body - assert startFrequency in body - assert endFrequency in body From e4c5799b91148823955b5ec4f31ed7c6d28861a6 Mon Sep 17 00:00:00 2001 From: cbbcbail Date: Mon, 14 Jun 2021 12:49:36 -0600 Subject: [PATCH 04/20] Revert "Render TDMS Metadata" This reverts commit d9967b3c2265153d280423f08ba07264a6fbfb64. --- mfr/extensions/tdms/__init__.py | 1 - mfr/extensions/tdms/render.py | 59 ----------------------- mfr/extensions/tdms/static/css/tdms.css | 11 ----- mfr/extensions/tdms/templates/viewer.mako | 14 ------ requirements.txt | 5 +- 5 files changed, 1 insertion(+), 89 deletions(-) delete mode 100644 mfr/extensions/tdms/__init__.py delete mode 100644 mfr/extensions/tdms/render.py delete mode 100644 mfr/extensions/tdms/static/css/tdms.css delete mode 100644 mfr/extensions/tdms/templates/viewer.mako diff --git a/mfr/extensions/tdms/__init__.py b/mfr/extensions/tdms/__init__.py deleted file mode 100644 index 751fcda4..00000000 --- a/mfr/extensions/tdms/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .render import TdmsRenderer # noqa diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py deleted file mode 100644 index b3084be3..00000000 --- a/mfr/extensions/tdms/render.py +++ /dev/null @@ -1,59 +0,0 @@ -import os - -import nptdms -from nptdms import TdmsFile -from mako.lookup import TemplateLookup - -from mfr.core import extension - -# class EscapeHtml(Extension): -# def extendMarkdown(self, md, md_globals): -# del md.preprocessors['html_block'] -# del md.inlinePatterns['html'] - - -class TdmsRenderer(extension.BaseRenderer): - - TEMPLATE = TemplateLookup( - directories=[ - os.path.join(os.path.dirname(__file__), 'templates') - ]).get_template('viewer.mako') - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.metrics.add('nptdms_version', nptdms.version.__version__) - - def render(self): - """Render a tdms file to html.""" - - tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) - - body = "

      " - for property, value in tdms_file.properties.items(): - body += "
    • File = " + str(value) + "
    • \n\n" - body += "
      " - for group in tdms_file.groups(): - body += "
    • Channel group = " + group.name + "
    • \n" - body += "
        " - for channel in group.channels(): - body += "
      • Channel = " + channel.name + "
      • \n" - body += "
          " - # Access dictionary of properties: - for property, value in channel.properties.items(): - body += "
        • " + property + " = " + str(value) + "
        • \n\n" - - # Access numpy array of data for channel: - # body = body + str(channel[:]) + "" - body += "
        " - body += "
      " - body += "
    " - - return self.TEMPLATE.render(base=self.assets_url, body=body) - - @property - def file_required(self): - return True - - @property - def cache_result(self): - return True diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css deleted file mode 100644 index 9b586b31..00000000 --- a/mfr/extensions/tdms/static/css/tdms.css +++ /dev/null @@ -1,11 +0,0 @@ -.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; - background: red; border:solid #000; border-width: 0 10px 10px 0; } - -.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; - background: blue; border:solid #000; border-width: 0 0 10px 0; } - -.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; - background: yellow; border:solid #000; border-width: 0 10px 0 0; } - -.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; - background: green; } diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako deleted file mode 100644 index 53619e69..00000000 --- a/mfr/extensions/tdms/templates/viewer.mako +++ /dev/null @@ -1,14 +0,0 @@ - - - - - -
    - ${body} -
    -
    -
    -
    - - - diff --git a/requirements.txt b/requirements.txt index 5653f642..77aeb03e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ jinja2==2.10.1 mistune==0.8.1 # Pdf -reportlab==3.5.56 +reportlab==3.4.0 # Pptx # python-pptx==0.5.7 @@ -53,8 +53,5 @@ scipy==0.19.1 # Md markdown==2.6.2 -# TDMS -npTDMS==1.1.0 - # Issue: certifi-2015.9.6.1 and 2015.9.6.2 fail verification (https://github.com/certifi/python-certifi/issues/26) certifi==2015.4.28 From ee52e743cdbc8eb5d107daf7ce51a1abc4e94252 Mon Sep 17 00:00:00 2001 From: cbbcbail Date: Mon, 14 Jun 2021 13:05:22 -0600 Subject: [PATCH 05/20] Revert "Revert "Render TDMS Metadata"" This reverts commit e4c5799b91148823955b5ec4f31ed7c6d28861a6. --- mfr/extensions/tdms/__init__.py | 1 + mfr/extensions/tdms/render.py | 59 +++++++++++++++++++++++ mfr/extensions/tdms/static/css/tdms.css | 11 +++++ mfr/extensions/tdms/templates/viewer.mako | 14 ++++++ requirements.txt | 5 +- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 mfr/extensions/tdms/__init__.py create mode 100644 mfr/extensions/tdms/render.py create mode 100644 mfr/extensions/tdms/static/css/tdms.css create mode 100644 mfr/extensions/tdms/templates/viewer.mako diff --git a/mfr/extensions/tdms/__init__.py b/mfr/extensions/tdms/__init__.py new file mode 100644 index 00000000..751fcda4 --- /dev/null +++ b/mfr/extensions/tdms/__init__.py @@ -0,0 +1 @@ +from .render import TdmsRenderer # noqa diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py new file mode 100644 index 00000000..b3084be3 --- /dev/null +++ b/mfr/extensions/tdms/render.py @@ -0,0 +1,59 @@ +import os + +import nptdms +from nptdms import TdmsFile +from mako.lookup import TemplateLookup + +from mfr.core import extension + +# class EscapeHtml(Extension): +# def extendMarkdown(self, md, md_globals): +# del md.preprocessors['html_block'] +# del md.inlinePatterns['html'] + + +class TdmsRenderer(extension.BaseRenderer): + + TEMPLATE = TemplateLookup( + directories=[ + os.path.join(os.path.dirname(__file__), 'templates') + ]).get_template('viewer.mako') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.metrics.add('nptdms_version', nptdms.version.__version__) + + def render(self): + """Render a tdms file to html.""" + + tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) + + body = "
      " + for property, value in tdms_file.properties.items(): + body += "
    • File = " + str(value) + "
    • \n\n" + body += "
      " + for group in tdms_file.groups(): + body += "
    • Channel group = " + group.name + "
    • \n" + body += "
        " + for channel in group.channels(): + body += "
      • Channel = " + channel.name + "
      • \n" + body += "
          " + # Access dictionary of properties: + for property, value in channel.properties.items(): + body += "
        • " + property + " = " + str(value) + "
        • \n\n" + + # Access numpy array of data for channel: + # body = body + str(channel[:]) + "" + body += "
        " + body += "
      " + body += "
    " + + return self.TEMPLATE.render(base=self.assets_url, body=body) + + @property + def file_required(self): + return True + + @property + def cache_result(self): + return True diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css new file mode 100644 index 00000000..9b586b31 --- /dev/null +++ b/mfr/extensions/tdms/static/css/tdms.css @@ -0,0 +1,11 @@ +.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; + background: red; border:solid #000; border-width: 0 10px 10px 0; } + +.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; + background: blue; border:solid #000; border-width: 0 0 10px 0; } + +.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; + background: yellow; border:solid #000; border-width: 0 10px 0 0; } + +.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; + background: green; } diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako new file mode 100644 index 00000000..53619e69 --- /dev/null +++ b/mfr/extensions/tdms/templates/viewer.mako @@ -0,0 +1,14 @@ + + + + + +
    + ${body} +
    +
    +
    +
    + + + diff --git a/requirements.txt b/requirements.txt index 77aeb03e..5653f642 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ jinja2==2.10.1 mistune==0.8.1 # Pdf -reportlab==3.4.0 +reportlab==3.5.56 # Pptx # python-pptx==0.5.7 @@ -53,5 +53,8 @@ scipy==0.19.1 # Md markdown==2.6.2 +# TDMS +npTDMS==1.1.0 + # Issue: certifi-2015.9.6.1 and 2015.9.6.2 fail verification (https://github.com/certifi/python-certifi/issues/26) certifi==2015.4.28 From 344473bdb46e59f1bf2378429d17d4b6f79ae5c1 Mon Sep 17 00:00:00 2001 From: cbbcbail Date: Mon, 14 Jun 2021 13:06:10 -0600 Subject: [PATCH 06/20] Revert "Revert "Adds full support for tdms rendering"" This reverts commit 4122b24d6b4c8355d1a3b674a34e8f754b7b4b87. --- AUTHORS.rst | 1 + mfr/extensions/tdms/render.py | 121 ++++++++++++---- mfr/extensions/tdms/static/css/tdms.css | 160 ++++++++++++++++++++-- mfr/extensions/tdms/static/js/tdms.js | 33 +++++ mfr/extensions/tdms/templates/viewer.mako | 52 +++++-- setup.py | 3 + supportedextensions.md | 3 + tests/extensions/tdms/__init__.py | 0 tests/extensions/tdms/files/invalid.tdms | Bin 0 -> 78396 bytes tests/extensions/tdms/files/test6.tdms | Bin 0 -> 46962 bytes tests/extensions/tdms/test_renderer.py | 65 +++++++++ 11 files changed, 399 insertions(+), 39 deletions(-) create mode 100644 mfr/extensions/tdms/static/js/tdms.js create mode 100644 tests/extensions/tdms/__init__.py create mode 100644 tests/extensions/tdms/files/invalid.tdms create mode 100644 tests/extensions/tdms/files/test6.tdms create mode 100644 tests/extensions/tdms/test_renderer.py diff --git a/AUTHORS.rst b/AUTHORS.rst index a1565ccb..d2f37d82 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -34,3 +34,4 @@ Contributors - Longze Chen `@cslzchen `_ - Jonathon Love `@jonathon-love `_ - Josh Bird `@birdbrained `_ +- Connor Bailey `@cbbcbail `_ diff --git a/mfr/extensions/tdms/render.py b/mfr/extensions/tdms/render.py index b3084be3..6330d804 100644 --- a/mfr/extensions/tdms/render.py +++ b/mfr/extensions/tdms/render.py @@ -1,16 +1,16 @@ import os +import base64 +from io import BytesIO import nptdms -from nptdms import TdmsFile +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import datetime from mako.lookup import TemplateLookup from mfr.core import extension - -# class EscapeHtml(Extension): -# def extendMarkdown(self, md, md_globals): -# del md.preprocessors['html_block'] -# del md.inlinePatterns['html'] - +from mfr.core import utils class TdmsRenderer(extension.BaseRenderer): @@ -25,30 +25,105 @@ def __init__(self, *args, **kwargs): def render(self): """Render a tdms file to html.""" + maxTableLength = 100 # maximum rows to include in data table + minDigitLength = 4 # minumum digits before scientific notation is used + formatString = "{:." + str(minDigitLength) + "g}" + + fig, ax = plt.subplots() # create matplotlib figure object + ax.grid(True, alpha=0.1) # specify matplotlib grid properties - tdms_file = TdmsFile.open(self.file_path, raw_timestamps=True) + # empty data structures to be filled with file data in loops + channelNames = [] + lineCollections = [] + properties = "" + data = pd.DataFrame() - body = "
      " - for property, value in tdms_file.properties.items(): - body += "
    • File = " + str(value) + "
    • \n\n" - body += "
      " + tdms_file = nptdms.TdmsFile.open(self.file_path, raw_timestamps=True) + fileMetadata = TdmsRenderer.formatMetadata(tdms_file.properties.items()) + + # Parse group data and metadata and generate html for group in tdms_file.groups(): - body += "
    • Channel group = " + group.name + "
    • \n" - body += "
        " + groupClass = group.name.replace(" ", "") + buttonId = groupClass + "Button" + showHide = "showHide(\'" + groupClass + "\', \'" + buttonId + "\')" + rowTag = "" + buttonTag = "+" + properties += rowTag + "Group " + group.name + "" + properties += buttonTag + "" + + # Parse channel data and metadata and generate html for channel in group.channels(): - body += "
      • Channel = " + channel.name + "
      • \n" - body += "
          " - # Access dictionary of properties: + channelClass = channel.name.replace(" ", "") + buttonId = channel.name.replace(" ", "") + "Button" + showHide = "showHide(\'" + channelClass + "\', \'" + buttonId + "\')" + rowTag = "" + buttonTag = "+" + properties += rowTag + "Channel " + channel.name + "" + buttonTag + "" + channelLength = len(channel) + + # Parse dictionary of properties: for property, value in channel.properties.items(): - body += "
        • " + property + " = " + str(value) + "
        • \n\n" + rowTag = "" + leftCol = rowTag + "" + property + "" + if utils.isfloat(value): # reformat float values + value = formatString.format(float(value)) + rightCol = "" + str(value) + "" + properties += leftCol + rightCol # Access numpy array of data for channel: - # body = body + str(channel[:]) + "" - body += "
        " - body += "
      " - body += "
    " + if (channelLength > 1): # Only access channels with datasets > 1 + # Plotting on a time axis + if (channel.properties['wf_start_time'] and channel.properties['wf_increment']): + start = channel.properties['wf_start_time'].as_datetime() + start = (start - datetime.datetime(1904, 1, 1)).total_seconds() + increment = channel.properties['wf_increment'] + stop = start + increment * channelLength + timeAxis = np.linspace(start, stop, channelLength) + line = ax.plot(timeAxis, channel, linewidth=2, label=channel.name) + plt.xticks(rotation=45) + plt.xlabel("Time (s)") + else: + line = ax.plot(channel, linewidth=2, label=channel.name) + + lineCollections.append(line) + channelNames.append(channel.name) + data[channel.name] = channel[:maxTableLength] + + ax.legend(channelNames, bbox_to_anchor=(1, 1)) + plotFile = BytesIO() # create byte sream object + fig.savefig(plotFile, format='png', bbox_inches='tight') # export plot to png in byte stream + encoded = base64.b64encode(plotFile.getvalue()).decode('utf-8') # encode base 64 byte stream data + plot = '\'data:image/png;base64,{}\''.format(encoded) # format encoded data as string + table = data.to_html() # export pandas DataFrame to HTML + + return self.TEMPLATE.render(base=self.assets_url, fileMetadata=fileMetadata, properties=properties, plot=plot, table=table) + + def formatMetadata(items): + # Parse property value pairs in file level metadata and generate html + + minDigitLength = 4 # minumum digits before scientific notation is used + formatString = "{:." + str(minDigitLength) + "G}" + fileMetadata = "" + + for property, value in items: + value = str(value) + if value.find("\n") > 1: + value = value.split("\n") + fileMetadata += "
  • " + value[0] + "
  • " + fileMetadata += "
      " + for v in value[1:]: + v = v.replace("\\n", " ").replace("\"", "").split("=") + v[0] = "".join(v[0].split(".")[1:]) + v[1] = v[1].strip() + if utils.isfloat(v[1]): # reformat float values + v[1] = formatString.format(float(v[1])) + fileMetadata += "
    • " + "= ".join(v) + "
    • " + fileMetadata += "
    " + else: + fileMetadata += "
  • " + str(property) + ": " + value + "
  • " + fileMetadata += "" - return self.TEMPLATE.render(base=self.assets_url, body=body) + return fileMetadata @property def file_required(self): diff --git a/mfr/extensions/tdms/static/css/tdms.css b/mfr/extensions/tdms/static/css/tdms.css index 9b586b31..9e840ee1 100644 --- a/mfr/extensions/tdms/static/css/tdms.css +++ b/mfr/extensions/tdms/static/css/tdms.css @@ -1,11 +1,155 @@ -.tl { position: absolute; top: 0; left: 0; right: 30%; bottom: 30%; - background: red; border:solid #000; border-width: 0 10px 10px 0; } +/* ---- Quadrant Grid Layout ------------------------------------------------ */ +#topLeft { + max-height: 50%; +} -.tr { position: absolute; top: 0; left: 70%; right: 0; bottom: 30%; - background: blue; border:solid #000; border-width: 0 0 10px 0; } +#bottomLeft { + border-top: solid #000 0.5px; +} -.bl { position: absolute; top: 70%; left: 0; right: 30%; bottom: 0; - background: yellow; border:solid #000; border-width: 0 10px 0 0; } +#topRight { + height: 50%; + overflow: hidden; + background-color: white; +} -.br { position: absolute; top: 70%; left: 70%; right: 0; bottom: 0; - background: green; } +#bottomRight { + height: 50%; + border-top: solid #000 0.5px; +} + +.quadrant { + display: flex; + flex-direction: column; + flex-shrink: 0; + width: 100%; + overflow: auto; + margin: 0; + padding: 0; +} + +.row { + display: flex; + flex-direction: row; +} + +.column { + display: flex; + flex-direction: column; + width: 50%; + height: 100%; + overflow: hidden; + border: solid #000 0.5px; + background-color: #F5F5F5; +} + +/* ---- Fixed Title Bar above Scrolling Content ------------------------------*/ + +.titleBar { + margin: 0; + padding: 0 1.5vw 0 1.5vw; + background-color: #FFFFFF; + border-bottom: solid #000 0.5px; +} + +.miniTitleBar { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-shrink: 0; + align-items: center; + border-bottom: solid #000 0.5px; + margin: 0; + padding: 0 6vw 0 1.5vw; + height: 6vh; + cursor: pointer; + position: sticky; +} + +.belowTitle { + overflow-y: auto; + visibility: visible; +} + +/* ---- Tables -------------------------------------------------------------- */ + +table { + width: 100%; +} + +table, th, td { + border-left: 0.5px solid black; + border-bottom: 0.5px solid black; + border-collapse: collapse; + padding: 6px 0 6px 8px; + margin: 0; +} + +tr:nth-child(even) { + background: #FFFFFF; +} + +tr:nth-child(odd) { + background: #F5F5F5; +} + +th { + text-align: center; + background-color: #EBEBEB; +} + +.group { + background: #EBEBEB !important; + display: table-row; + cursor: pointer; + font-weight: bold; +} + +.channel { + background: #FFFFFF !important; + display: none; + cursor: pointer; +} + +.channel > td { + padding-left: 5%; +} + +.property { + background: #F5F5F5 !important; + display: none; + cursor: pointer; +} + +.property > td:nth-child(odd) { + padding-left: 10%; +} + +#propertyTable td { + width: 50%; +} + +/* ---- Miscellaneous ------------------------------------------------------- */ + +body { + height: 800px; +} + +#plot { + height: auto; + width: 100%; +} + +.button { + text-align: center; + font-weight: bold; + font-size: 18pt; + border-left: none; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/mfr/extensions/tdms/static/js/tdms.js b/mfr/extensions/tdms/static/js/tdms.js new file mode 100644 index 00000000..848180cc --- /dev/null +++ b/mfr/extensions/tdms/static/js/tdms.js @@ -0,0 +1,33 @@ +// Shows or hides content and changes button text accordingly +function showHide(contentClass, buttonId) { + var contents = document.getElementsByClassName(contentClass); + var button = document.getElementById(buttonId); + + if (button.textContent == "+") { // Show if hidden + for (var i = 0; i < contents.length; i++) { + element = contents[i] + if (element.nodeName == "TR") { + element.style.display = "table-row"; + } + else { + element.style.display = "block"; + } + } + button.textContent = "-"; + } + else { // Hide if showing + for (var i = 0; i < contents.length; i++) { + contents[i].style.display = "none"; + for (var j = 0; j < contents[i].children.length; j++) { + if (contents[i].children[j].classList.contains("button")) { + contents[i].children[j].textContent = "+"; + } + } + } + var children = document.getElementsByClassName(contentClass + "Child"); + for (var i = 0; i < children.length; i++) { + children[i].style.display = "none"; + } + button.textContent = "+"; + } +}; diff --git a/mfr/extensions/tdms/templates/viewer.mako b/mfr/extensions/tdms/templates/viewer.mako index 53619e69..c4f67147 100644 --- a/mfr/extensions/tdms/templates/viewer.mako +++ b/mfr/extensions/tdms/templates/viewer.mako @@ -1,14 +1,50 @@ - + - -
    - ${body} +
    +
    +
    +

    File Contents

    +
    +
    +
    +
    File Metadata
    +

    -

    +
    +
    +
    +
      + ${fileMetadata} +
    +
    +
    +
    + + ${properties} +
    +
    +
    -
    -
    -
    - +
    +
    +
    +

    Data Plot

    +
    + +
    +
    +
    +

    Data Table

    +
    +
    + ${table} +
    +
    +
    +
    + + diff --git a/setup.py b/setup.py index ecfe3aeb..248000ee 100755 --- a/setup.py +++ b/setup.py @@ -662,6 +662,9 @@ def parse_requirements(requirements): #'.todo.txt = mfr.extensions.codepygments:CodePygmentsRenderer', #'.vimrc' = mfr.extensions.codepygments:CodePygmentsRenderer', + #tdms + '.tdms = mfr.extensions.tdms:TdmsRenderer', + # docx # '.docx = mfr.extensions.docx:DocxRenderer', diff --git a/supportedextensions.md b/supportedextensions.md index 9c6ae199..36fd0080 100644 --- a/supportedextensions.md +++ b/supportedextensions.md @@ -53,6 +53,9 @@ Some file types may not be in the correct list. Please search for the file type ## PDB * .pdb +## Data +* .tdms + ## PDF * .pdf diff --git a/tests/extensions/tdms/__init__.py b/tests/extensions/tdms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/extensions/tdms/files/invalid.tdms b/tests/extensions/tdms/files/invalid.tdms new file mode 100644 index 0000000000000000000000000000000000000000..c59f175ed65dbda596d01a7705b15f9bf8ce6597 GIT binary patch literal 78396 zcmeFa2V7HE{|9_S21~ZM_W(z6Z>@Wwwpz8WYTb3$iK|)@61L(%sp3|YDhdh+f(SA! zP>@jwkg`G{1fJ|P+a%}x-Gm?_*r$)r)BopvU#^DSbI$Ml#u>kR&iS5mvuW?%T^L+@ zHXbm1Pk?*;LmEZE|JuVJ!?ktE;6LWlp3N|Y=Z_>{WC##|?CXPD4;+Mhi^lMQy?eKB z+Pd+8d1H9?)`Pna?cImjG=|5I8$WXVIJXfahaKIs8{%*w1PVxl?~d>p0G~1N!TFJh z7&bB)Zs0P7I}&io@4`_n!l&cNxbjVWx4``&_%Pse5k6huLokC6eB)PdxNrWA-{UMh z;NL*>#m3D$zCX10;PyWAXPb1u`lNK|0qJ-cSA0hFFDg*gpgW#t#*A5GW{jFR-firx zk#pQePna{#ZQ}TeW86lKn>lCfm^tHTj~YADqz4W15rC6u+WX(QemJk;MiCeh7XY$m z4kH-!-?91ogBW4h%;k$`^?{TnI}VN>g<)pb4o=tubxE+;u^SItBk_Mo*QH#bT+3 z8%9GEjb0{`bL3PhrlBEwjb5pgtB^`Amq|4UX{1z57r4<#)hd-SLaSA2kyiEgtrY03 zG*Z1@jnsNQ9wLSTp(i2&;UioxUxYRPzT+E0xQ$xaCKic=g1SnU$u`g&k0>_UW?`@$ zB3QU>P!hQ1B4KUz%hwRbEw{iUc%0vh4e8RgP6i6QwRK>d)mkT+Z0eAyQiR#9Sb+M^d-fFF#UVjifsMq5mux+g! z*an2nZ8F*TPuRA~Xd7{r!M0Uk+fd3-sf4%+Y+D7k4efHf%TSq&xC)_FM6ivx$_>6% z_QnXUcFW;_!&~0I#p$h95gTp8Ltxt~BG?9mZQEvQ+ZYy%Oc#dt3(ORPZ$r;*7Dg@7 zf#N;-|3Uaf`vtD1E;?7k8D-Gh;A-z5y*77X9>b_=Ed*ZiECcOrml-<2IKR%u0L~5q9J9IY0Uj9(%W~ zU$ty8bs^zkGOeCcSHrF-a*w2Agot#nG+HW_>)Bw(<o(l`aYVtzKQHK(#Vy9-AlNl*rW_6{?Zxjftgtq~>T4N2RW+sHo9s8xHeC9`M4m*Qg%1-A>VEX>JfSVDP}sYg({K`x~@%@$R- zpk$GmC)PEwI?mJ|%W{&SM1U z6k0vGuBNKI$em$ok=KTg8YTf(n*Fo#HCRp0p+mJ1wb>Htgq}tTFH#&Pj>+aNT z26ltioz%;fZED?|W&N*7^qVGaI(BmZlHEv^H)+_5cdff}`Gjy8Yvr-a*U#*$R9AdC zF{XLzE?qe68s+_G1Ix9*U258GRJd+P?@4(_|Xb%TR%a^uZ> zw`qogkJB*B{ARPE4%`;*vu>QB8PjdwPlnKbtL6kwAEcvQMuPAUQyOD7TjCtVZKk6& zIKfBK(J~9OkERRUEeRjXkJytbA5BNmHXlz%PJfZ^9MQIYc#1RD%>}LrZBaQJ%ip;@ zz4a3K|48|?(tnKhIzUM+c}RGoh+fZt zkzWnFs*IV(DlBM8)I-FphjA0DC@=eUO2V_qhoLt@U$EI_%$%$moY)>Y&r8 zYNDg6E0|d?c{Q{=^TssMIn={2ZxRdnW!`LdNmfFIye2mpx>bV{8_n~zE|(o$Z&h>QKIid$Qn@i^F*?tk}91t^SRY?vX6g?dGu zURJ4-D3FA&Nk@4wcZ+!%@pvK7SLD42yVmpKrEB*h^WQ)Q7H+v(Q&rAIm0CdsV%2M2 z(9o&s@UYN3Kwrl$eUlm&9TD;LSyD+BhUL{5ih$Xuv61nk2lwyZxO(~AMm85psEnDP zotc)J`kI}CVK3g4Fbkm|GI5RLW22u&JbDm%8;CDm2-tb9rlB5kR99D(6&DudbMi2( z*TWdRny=ViJmX70b@bq#?VHxFTDD{nZ6SG`S23rdfsRiQt18O)`2iRqvBbBCTv%9C zR?|S`(HqG1bv4zZLP*G|_u~+2Yq>m6KAlHu;Bq8I5X+R(glAz`O>C%_G7Vu*Q6Nku z&3MM3j4looF@yw}ArTh8C=yX!MOm$YDq)Bzf?8I2oe-Z=$_?o%s*EDxWHXt0Jerg) zvF7EK6lT?kV5La~>3x|RSS{mbS4*=h#d29~X;xNAtyCtiD3mj^Ibx|)gA*0&lnP#M zwJ5JbqL8xcVcw;$XG!GZ3Z|&^4Ob@D6$fB8#d@Wns9IQDCQ&LX)O2K{u8=FlcIfL zR-@D5af(Vg0t)LAq?5C?NLi!O>3op2PN%AtBYl-zho^QZL3*8xjgX>Ntx*QjN1QxQyH3C_k48d#|Ca@SzQ%Xaf^-?ZETB(FvRa#tJ zQc){}1rU6;OG8*GPU4B2^>Q9ptX4^dyapamAW^6!+y=SMvys3Dk@PyPMom?b)Eb>$ z@7);hi+uF3tZ86!{iELmmf|XppkzVoW4*W{T+wmA*tClUfME61Hx?6RVqOoM+l zd3myJUq3fzeCFM^XV=b7P7d}IY-5wBHF;r*i?`drp@Urq_U+xh3(U{)3AGih$A9Q^ zDKxjCNA(+qq;UI-^uSOrv`6!;EX^rIF#JOgOrg4U96C5fv|m55iwIq^KY@f+XeQZ= z;EB0@=!q#tJ+=BvP7XqOiB*Xl3rNQrNDVI7o9=(7(FGF>hO5t!)psz#t#lN9gO8!% zUYMQ9`-1Zg#hot|bHt6#s3Bmh^pgbFzd}o{@-b+PmpyS}lk0sP83V4DikT722tQ$V z&3tT1N;*5|8fHJgxgX8X?Hm!uzqra>0>K7}m*y51!Kf1$O9tPw77-uyct-QB1Ku za{KlXYYI~?E}d}>qc(cVzPP6hcG_ZDAW@2l0~vdE@7}{0NE9l>g(Ej$XN=C$7M$g6 zY$WzZs#YJzmM)Hljy=^K+L&1&0|3M*bLhOHJ>i(-m-ZFy3Db!N={+qXj_Q&L+bS7je0%w{mrwH&Xm1bAOXI`) zf3$qat&Sg>D-~?qirVB6M|}6u3nsQLu2u##CU0zE*j#GbrHSXmC0|6Z+^=C*QHuLj z_?zfXm^+*1eun7}0Z(`Ab#wtWpYr11+?i9{-A^~h5(@a&cs30U_4QnC9fwm}Q&U|{ ztFo=Es38Z?u`%_1aoHESa zw|SPc@3K@k%Tk=5l@y!D%)je463^me$l{0jiw$zl)}J-m(wM0ntS&CddinGP2)jLW z_{hn_+`SE%NEntW6#XQg4SPNLfE93RtJ#(1Wu?UcDdc2lq^Bk)Cd569ihLY?KlIM6 z>mh(D1fKTy^`g@P?-mpnX1|OGWxeC+W#CD~GDW%s)E}@KSjknXlnR+tA{LcKoXRfD zNr}9bS&ruzY|w&X$YF-@bkC8iUT4Ulggvl$2GEGt5Ps%OZd%Okh-zadw~-@;xzi1q z2$&!i4K>J6tMELgEP!}$D)y!1WW98GRfGzLo>8L)8cE1tP527ZLQ2VO>;1MHb4&B2`n-I5ikoi%?xN zuDEVE+romp72#=x`N`qe^d{Ct_gx3$rs9pBfbjwmp|HUR5efh>m=Pftr-^yqbQN#?WLRAm27 zM)<%%xC|eY3_>MfB2)Db8ymhF3D`(&Xbv(|S%=h6G!+PyHkLTBhfSXb?kUMhFBd+} zC@IZ;c87-Snj|nE^~WVN3OJ7lFXc2eHILiaTGfc3h7cdGPpv)*OaR@>5i-{2n_mE?FWMBMnT?aaWg*$ zHZgTbFKFzyAguC@3h_#6k+84;gh6#P5lU}fVvUj>g+Byg_OQ5g^}6iRfS29 zeVWUA*0FN<<>~aHS($940^14@ zdTD44CV2*N_d@U7UidV-vWofo=@qXdyLW8gzHQ4c8Z|g7*WlKf@qPRCbsI}u@2dc%G&le?;uhp5YY`uDpo3N+6|_PSoe=x%J-MNG@7%g^?drm(IhEC{ zH;G{(XS`@MD)r=vV;%?g?%IDj8J>8|#D4w3Y&c?rhGKQfriWZ(t5G79U4YwrRgZKA z&j7NaZ5C3IdqQe*QYBJ>y?F@58CnfqyimSi?~Uu%Laqb{gY2rBN@iAK)Wgu*w{dMQ z2L<|ho;Y@tb|;0&OmcA@Ja{0;o`?bB{qA9jcWdy1b&o15z~GEbSoy(S66}J2dWCA& z-iAI=fmC2{t`8c+55*;3y9yF71qGeQg~H}?=9>)INstf^I~t-R9)@1Od_KU}Kk!y^ zVd^NiA)}pep={Cn4?T_^sm?e0*gFC!Zt#I>#DR|fP>ag&nk`2vu=EWGW#0gaS1t!% z3_5>4@XQ%pXdQdt~=XyxUwYyIeYZnVm)*k4rADZS1P8 zKV&{|Kp!+EV>zD&b3rPD?nzw*l0CUS@L@6j=*0)3_@J1X{|1J8X=(Y{Q>RYECBLpP zJeQk2I^TQvwD1sy9{YZKGL*8xSP%;xXy@*zH&t|Q_vVsut6=|1-kY2pX72RqlNo3c zw){;=S(8*qF+ETlA4>4hFm>0)B8Eo%UYo*g_4e|jd*V_lC$_J?_$-gjfWmHOas`Zu z@zH%z0V{vj>?sU14#NgTr9;Zig@%e>@M_)@ zdZSj5%FD`()IVWn_I(qm`N4UYa!CcuikdpVdM6{bVNQcLF(_>#aWF=77(OY7RvTP% zsoJcD!#!Q^05c_g1Z!v#IH`$}>W&p%Q}6Swc`zq57{TGbOS>(+Ce zcsyzY1sBbM?Q}+snEs+*Ln6(n6}O=&ml#jFCm`|pJRTf1BJkd&1c)9B0|f*=p9-f7 z8cYco^R)OU(M91o0U7c%@S9|uf#`ceiU8aj?_KQA;)}3#iVDXO1n)QpN`4aG6On{M zfhiJWo|8ntrYfosYhvgt{aF$u_7lB}36-9a+z^|>uuaQPc3FBy;v*(VnsS|!5v5|G zfW|iyiX9ims45c3XH?MJe&o;nDFaMSQA) zE+K4yUJ7z~Tx4cREtN;+vT~y1 z%DohJGC^g5NTr40y@buI6U%(xalwlHly-7ZRVdeJv^qsy5m%yMC@I{87c8+%<|(Jh zWKwo&LLCFx@GF^8wN|55ORGxiaalyU{GB>V9~DIjoCFHkMMhTC7jbY-7NyTBgd(X- zuAnL{6)-ar2{}n6O1i>M%C9Jq!frHRS6K?|ycGmxlWj_Gm7P*j%M{2oYPCkmV{#-) zx~j7>JFXTEb;%Sk*wGlqI}#y}o0`o~+ROOmEU88V#M1IIo=mA^yyJ%z8`yD}d^vE_ zD22>giISnRD12H`$Ct>JDu&tuCejjq9Xq~&p|X|p%PM4QkPO@F%K0*HCDx=Ekdjq0 zZZS_mQQXp5UJe34h zBP*nph6av zqO?jVXQ3{DEOsZ73ia?s1zx^HRPh0RA#;O95mT_W@=0kRpY6)!wXWR zG8D7|H=m|98Rb;0fuXcgP{x6p26a@`l_HgomYf)$1se`=E~3h;_(X4wlUl|tl^FC@ z$zbcH3YtJ;30sr^50$Wj1LaEr3QmO(XCaGuna`2YlmRNLk}Tuozl@Q3Ys}TMx>6Zf z4cmWYrFD4aml%Bk&P5}wu2n-Rlj>Olr3QG^#iSJTlwM$;7gPES{o?1-S(D;MXuTBwkU2Qsb*7Rm7&Vgfu88Z}`yEBq1w3w!&9SR7~q&LIU|nkgrlo(_*@_;G`-u;#pognwF@n&r{QNWObFSDJKOaY9y5kx}Kyg<|?$l zI!aYSW~D@@J*T5+b&|@=geqShoENO9X6VVBdZo@J(;RYYmAo<)oFkM&^U(U}tm|K7 zR7hbK1ZxYNRAd54lXS|4GT1x| zW(id~n!b5%x*pW3t%ls3YN>{*x6%FL@2ssoXQT2z&vsREu*KsuGcP)V9Ho)TC#SHlZf zNZ1WvVHHQN)zft5S`8BvbBg%7=2ArtZI*@Z==m9VvvDsbf0*TO-DB6b7*Sb;~ItcC-es_W!nd2>#F zz)3Bvgafy(8fb(XP(jd8%Vw7r6c(43mBSdhlv!9<%C6xyh@=X&TE@W}MlIBc-+O%g z5mB!el*5vetXu?79^k@()w(iPAwAzNuaH$U&TZNp|)!`Qw-AeJkXQoLLxY>D>tdkoH?E_x-O(*OhR28BkZ)BqDP z?9Il9$)0s~TyA|s10R3v!%1zGNhArK&{@fr^z(55S{S8a8 z-l7gLeuN>25`Xwh_|yh6k1tke^=IDG;w&5G=1=Ulvj|q-d_ie6tzgW z3JU1a1w7&EdpWM6pZ+qY@Vy-WjSx$Zb73{M{{Jw9B^2EtJbi;RscQPbn;CFS?LP+9 z%%Ei$CSS&>BDKm6pDP;X(jP_Dj0+7oB@5=nhQ*$bqiW4Fz&yPmC*v)WSyukPKucIniK>NL<1XJUslv9`9dw6ric z$A;zPrbXX={2{DnhLQW+GAJ|Hq)cy&#d!kj`O!;ymI?2P!ktzm6u z7^UC!=2{so>w;V6)?}GUDGC&s8PSY@J$s$i2L1-x^}FKcG!*P~b#)mCcJ^+x)0yhj z)nq4>RimAt9xyZ`(6Ek=)3Vc^UP);Ul*73Ow^0FIo798~cxN+kB`~ng4^wlq+5+it zuBY9I^WfAC)vbe}W|T;Y*NhV053~!f8C+vItkOcwTtLVbuNgxjfX2SSJS9K(MQH25 zosqdy-@C9{KiE)H; zv%}f?nrhBchP2aq_g=0?OzTc~&B+j8bqfp)%UX`okqpWq0HHo+gbP?#9IMM{6RX1+ zd*O^ty~hI~PWP^IBqLItx3CiA3|Mm_8$f3oG@}Vz_sZZ-kwsTjOV3v1Nf3n3?*`A1PWON`v5$vF;ctVdhh z`v^VNAhklyS%b(lnvUXBh9HxlUKq$ohvkUcsX4ZLU-ZFmX(3` zXr#g5jboUZQFBj(Y%XGbaX76A;53E-PTLA_+NoCHwBE2hY$}$fx)dV)c-%RI7ntIS znSl^0M$({br~rf*4FDll7qI~b;4G&JI6Kh>aMl|$vuk>^HCAdYLe~wifE%SpvL-1J z&?R;lq)4IpQxUQ>NHIZVcMT9(h!G+?dX)MeMCObUY??jzaQ6xhqL6_RuOalBh8vO! zOc%jR*B}sqKmtaCLz>B_aYLE_u>=Dk7KH<1!2pQ)1>SfEh;_uwteQO=z{&PgBbhfw zgcFr}L2Zx#tTia5NdOfDyfg|hfnT`*er084q$MZBMugn~6!7YuCh*G^-fh?PY=AmQ zHK>L|SBP~~DXP{qL7L~5eM(U5EWAOKaY3}6K=9;R$n#L9~1BsgG# z6A^JDD#y|U&ol>Byc%hmfhu6gJ5a@2@Tdi-Qr!$x!EuqG7NAPC2~=ssP4M*AQ59dv zeXk8v<&H3@EmS1{pc6c?6;uUJ3N@fA4gV&pg2N|422=&6pYQOKK!^_g09AP)4*C#P zISZ&tXbV*3yyS5URK-sk_E)Hizw9UJU3e+ld#DNtM^yyW_h1#W0agJ}rWvl{Dfep= zSD_ej6=}fxz)A-IR*p}eG;!kOsk4#|SP4neuw(jU+CXd}o*hbsm3=NmFfmL%>o;uJ=)b{ov0j36k=1AQ>$Y^!?5Tr@fvun?0K@PL zCsABROqemvVwV9w!4AP$CHr%(SU31SgyTE7E6lK@lkUW1?L1S)9WlO zZS0-8*v%+0;3$+R42s6woN7U|va+`Jw4qvKR#XcLyoZkf15+cU5^C?%*~#9CV@*H9_Xprl`{(XAED-i4~$==>NssVQCOm`r6`v7)%J(%u9 z>K$!>T{;9?+BkLX-G7kVh|y!mQzu}Ps1rJjA2)jBu)zcSbak?^3^u|rn;1@Hj}Kv( zgn{%7xdA9p|kh0a|mV551SgQr3rX4FE-TxBAoj5?7Ytc#Vy3uR#;$uh_Eh=t)n8 zmlxIB2KF0yo;r45+nNQF-1_)>8IYw1kbyLx*#>}fiQz)rY5;I-*sjB-EZMm4q<3J@ zrQpldD>j#dgD;-*rybn7Z2E{nRYpK3VL07|G^?-;Kqr7Pgm}UL=r|Yv9j}oymTx=e z8+7${=>7ZD2R8R%$KCZ{{~va(nmyX95#C81OCLg-p3?@rLuCvj`y1dLn$AYcpE_gt zjvxF(LLWv(MblzzqawraT|0Mb_v+a*cuinW?o9eH(v;LTz@9^lQKV}|u*X%cikP-^ z%Q3&p_Z~$*i;GW4h>MMW92Ro=#EuoSBXO|I0Q?kvNgqX;oY*?>vztDSG$9;XFjeQO zRmmm3i`MR=oxcW;uUOz0`z-RojUdLMO-uY`3Rq9aA)vA~kY!R#TNuz*`Xslhu{@Bj z*C?dIdf#Q657Gj!+`0cK0$z6%cK7N9uOr)6`0+$im0F7fL3`&c@K6U8qbiM*mPN}G&nssIMX1s=4PKkC74-&`$&O(hE4XR(jdr;?_H zwSfgOSJP)WEz033HEM~FTVDL;!OnHt_Z_9usostZ>hS|RH|&0#UtHZFlB-p+nlp?U z#A|I}K?Td`vm93x2>_hpb4v1FC&mYD{btj)UDQ1eyS8s$xBcRal&t*nI)O|nRT zB3@_(3j$0@kh6q7&t(fsC>QZLrFj`I;+{p^rSFFBv|-yG`km<5gruy(sycyGT>D@? zeIC)T6+nmtfY9s3^aTUMZ;hRTw>^pqC~@vz}7Cgxd8OkCWH#FVUp(psKK!cF*+ zzJPeD6-Wq}@KTo07utLC#1a9g0+zzlQ<4%B5?@dgZC@n5OwGtHEUl~;ip4q0=?jU+ zS^>1D%aJZhF*cJ`b6qT;e@e6x?_$_X0vB02bW zO)Id_&}OiZQmv4P1oiMbDmFgJ!v9xP)^O?op8|ME@o#`b{qda%3c1v@`xLMU*k8pL zh(uzk91y0q0V3n(ZUCk57h*8P@Tzur2eATj03_QIBBB9yOVDV&0724dJaMSF9WD9~ zk6^W&WB3U#yfoU;qGpG=+R>tqoZo6k zi`qJq)s7amqebm#Q9D`$$BB$baN5zLcC@G+Eo$W$PCHuEjuy3}MeglrQ9D`$uT^R~ z%+rn*{r?9o^8W9lMFOsO>u6Df@b9BV!g_Y;;tsuQEm~t zUif#=B3^BAZdyX@`Q~WRwxHOgj9kF5{(ZEFS6h;sp78AHquaDy@I#I3x9#@46%iHt zG9$l|!~b{CB0C%{64qA~ze!Dse-;zbY>VzrG&eA|V`#{u^i!CiWCz?T8Wnh6ciW zCz0AbUu61uWvu=BND1KEcqmOTqJ8%Y#J|2Xr;y+n$46NIJ4pm0#R~Sybm{uHug=bn zww4s)Cn{h@>Cmy4%V#4-{q1YSXD+=v+nRr(0z|8hp@x%i|H+?-&wDypewqSgyI%i^ zh`ZW0{b=tsBP~g+$qx9)69WDN{1k8_Rz+3MAC)ev~f31Ld#{WdLk?AjgSptM3 z|3mR`fMvSt$J>AzyaeuldEq7Sv0gxe*9rblugqyKP9IT#45t|Xw^tT4!nPfeIlL?K ze|%-(exR*~(LW#`eN2IWLO#lAy9)jh`RGlX3j8zjaRpi*5Bx*&QQowHtt#+O$w&Fq zaRojY`Tk?_(Qi-%79S|^&&fxHtts#i%11@uh+3AwKPev-;Xf}QRZi$-M}}907_R>V`KV}E zXDd?y{9njN_xjkv4;%cS*^l^xohT;x@Pg@o{un zvBy7tjqYmMSpFot5i$Sf?}hyrwH)2eWWSkZm%$UJ&ze1_<+X6-j{l;-7OdWtKY`St z%RskLqd&MN&ikfCrvGB_oqYJQEh`6DW$f1S>N{fIe^FoyR?XzYn+eFRt+Lwpnb0EB ze=*oxeq%#y`So8|e`#CccKN3M*Rt4~!tLe%sq2qzH@{~7zp1=i-n5s0d-;E)1$|ml zyZ>wVe=QwOi*URDY4<;$=43vSyWRh^`=1v6re(0*|Frv`k9d$zOKSH&?f$2w!)Xz2 z_do6a=hK|bM{>9OpLYM#!r!zEw)>xU|ML+K@@Yx!{-@plv~)Nv!tMU2-T!==lle&Q zcK_4ve_HsPmce%a)9!yh;z2$wsonpy`=6E$r$xBk|NQ^l|9tBCw~u+K5ncYW|9$HD zzmJJWpEd1&Y|-l91wZlp<446Km!|!n?*z8E`?T|)9~X~c18@s*9|Yn2Yw}-k`Hz!B zJ2vhA{XniM;y*wC`|$(Aa5}hG#|{+J{%4c855E8N^UohYFx{n-6aKple|;|WKR^Hd z@e|_s&pmze>F^JV>pzLuv3bM<_{EGM$lGD(l0JQGtbDBCzT92|e|y--;^apz6B*@|2tD4yPa7-*UI( zxSG*B9WDF#jZGMT&7S&X>1$7`kcV|@v++X3f$!~i_3JB~cBbT__cyET$jsfVzwbYM zebw-`nw`|+(+Q*(~llz?$ zyxTF(8z;y9Ua?e|pU`RD+3a1%h`J7^@?KI-);lO~V%>bU$Omw49Gv{!ikJFO|A*=W z*9Hvh_scTDkV9AIfANdeRpRur`i`$v-aV|ACR(b8({Fy3A-hBy^P~LImyAd2S6B5M zomjg^+s9(cvGPG9%-AmMqnB214;RnrRKs~3koRig^IIo{Td7$|LRxLlV|P6?*EHX` zAD`su!#7{CjK|UQPMqd&So7$2Se0{`rP|87?cgeDho6pka@z*SR{PF28y`wETR*-3Nd6 zT~_w`vTmm1qXC?0ofn}W#|)uuiAsN68Th<{bYt?tuP?5$470O3dpTf**`HU&^S$;w zJ@a7inw|shUwPOm_bboziOiDC$$cj6|MpPte?2)FDe!$Ue7dC@yMx!L*T*J&{>!VS z;et!%Pwua6m^H6p1V_3(*H?`W^&(aWArCA`my#qqG*Rj6CZjE zwp+Sk=aQ^?N!Mw4sTnsK2d-m@eky-{<+H@a`NiO>m~)dMgKtX*g>}Lb|NRC+rscAiD3s)X8Kq4 z%k1>ijmHT(EjF|ML_mLTN!J%Hy8}fYg$K%oqpi%oubI2~_GIKb+aUR>&yyO-i#Qf96X3F}kucc{19xZIN**NSsnM@7yZ|9rzzAMd66 zomS1BlWcdTv(p^g!%1d`>!o7PUj|kDYsaRi!jHW(@vAaZxp5 zcBhK)`)7tPp!(ZHM!TFp^s0D3SlYCHO1mlC?0NGosi!Yf=-IVi9!rL--}L0F$bHW9 zp%TZ0iC@>ua6B-#sC*eQf6w+2&YMHlO&>ew<&ogMqmNFp>R0N1)_TF6QnvXQ-`VZC zo!T#JLG=vj?wkb1`Lb?5KO3-iOL*{?b+Ye&y_eJ>JuhFHJZiJqd%?{+@2t+&npc+N9Y7p7cyn_TdipuA1~9 z{!Hx3Z-#Q8z4WSlY%#UVIo z?wwyNI8+dEFMNf&S|C39{nve*sx70E*LOHnPVr+w9-`>}IX`JU++adb~=Jd4Jem4%Kc(O4yCKp}!qV?BNAJ7i?jJ0?)@ZcYcWcwc;SA<%6Svy_p@Aqra*5Dsc z&Y0}{dBHPwnmyZW!}@1MrNLgkcTbx1=929>|Lrda{gmSQd(S@hS42MDr$lcUmDo#= z_wu;*(q_@*J~Q7?1IIZ2m@#;W#fFKCzQ17oi&u=b$1(qP85!<}2;IvDjqH)l$bMolVkM&*MR37SDY~ zO4+~n(J5Jee4?dGw}|ya*p9)n^}njVobeXp+@Y{^3m(4sa#RPWNw%8h%cT#uEbiyw z7CX-ISMD#$f*Idp*V#KC9-cfn;UHs#3wAYcef6~UUs+2Qp4z!0+`Z;Wk6FJhJy4`@IsPl$sdS2RkbDhsO3Ctb7@&^}sjfw0vR=j3@&<^{1 zgm|CBSGFGuI}y69a@EssU26|q{^qmJIS-;PI+Q*<{rwV~1wG?4dPk?7_Mbifp_}46 z2j_XUkMh4|*&SZG<6?Y0K|S_LmVeRJ%Vg?y(bx61E-^=M|8a>q^?}konXjk&r5vgW z>GJumP4}|*dyjas-6=n%VoJbNn&sKgclN2hOYo?hVyR&AEvPvzD}ErjGSj{I{8&-MM2b_{YgchI;$ z4mx+d>&hdOy!Rx1zw`!I6n!f|F7G*oVe5VCl`<>d_3`QLiQST)cD<)Lm$pAme&%p> zrnEBV$!X=0-F+`V7R|37kauH}hCH_07JV<4wg0M(OT%xDEu1bav5Iq_KXiW7_tune zh}APAM?5j3mgk!%J=$||;GopP6+_OUz>J!K4UUf--@sk$h0@!QEpwKOa8#=+iEJI^LK=u1?K&*>~;7y7f0V{XFONuPNW%3!gSG zb`ctRI$+e>IS1CSTv51XctmLTO}9yLb}NNfl(FX1AKklnh5C8iHu~_S@E|+g*O3c+Z5U%7c&uUGnm=dW1bs~BuYOEtx$oBAQ)T@4YM0aD zed~%scdhyQwQ&D0i}w`O5CGX;(SA;1$JuBQo_h9`hW~u9 z`@Px=A+-^ssrA2q%d^(s9hf2MdsDP)*imYab7S^zkeMBNd0Kqn>t(^epN-w@^HrBC zPh9+Z?Q{%tii=)Mit`Qo%sp=ALjK4V3L|Z1^=s*@{@1s-+&{lJrQ6i;8JBO|aoOJR_`&OEpY=4iy3y^k&iU5gWF#G1wRO>G z(I0Qd4nLT&v23#y)6Ldx_OGiK6f8MP=(KUdkxmX1_l4Hn-{P`yy-&y;ZwoWoMBSt! ztb19|;8(N|zTNk%z=FxY@VD)kDlm`r+mLugkcvCVw0C*724u zGv;YeZTPKoD-JVL8V=6gWV`CK)H&(B2PAva{@}lG?a+PATHe*uy?bofl~})OUD6j% z9WFk;W0A6C?xMGE-18!TTq#jJ86VPb-|++EonHw%%~V8vd1GmpE(faD{k+TPM9{$i z^Sc@GL%pKR`dvG*VEn|(4^kX`c5jZ%N#5{e@xn{?3*!1eaut3bzw++*a7*^FxPia* z#2ANeIm|xs`%L$(SDf}PSDPKkee&bDRXNO2bC2wn_bgPVW#T?Vsj3j{W1|MKfcV)ycyWPWq-_3paStFLN;JDvzz zKW)R}yQ{bBSQhLrGKTgJn7FdWue8Gw_1H4`>)T@VQSChUkjK0Qm}?IAR)oZeL&}o(v4h3YX122*u%eh|F-b; z#?it2SF(oq*dx&yia+*UF6x=LeW>MGLVm`{{NEi{>T)leIm)X8&F+o%>9IU=&F?&B zB(cXA(wO+uIz_LaznK616!PMbZV8j7n|)W`^@;;)#8*qWl%xBG6V_P|T%2gvJ5AVd zzWWYh{LeLij$C`a_`$^ss}`CMIqPvEa5tJYZg+J*n;yKU7ynFOoOWY8X%vC(A9T)V z#lij8!d6w)oU~r6du+*i_HBUbBmdHg;E^OC^e* zv(|0v>D<-I(({rPzuz9lP1_q*-D7)B;9uJRdXaQa*|32HaYb*ttvQ{2v3h~Sg7T7{ zDP5`p`~R9qSt3~T*-zg;jh!NqbojZ?t;FT!6C+1Wnedz%ykze7X+NI7;1j=hbmR?2 z&G~x|`=jIgC(cWcPhwtjs6BV+UsF0wE0wao6MUP)TNTr>XZ;tm{Ei;_@j~3@C2OrS zk1?X$lCZJ0Lu2>c>i(Q_#&2Pq$C~}W_CJ17s*bSV6vA|TS(t2NpZV~P?A*FsHve3j z*qrxZxli(w)C}(@U;pr6-Q$ALFC6ynW-a_h@<#Y=+Pt;h@|R4X!~LUQeENhPD7e2-4a*4P$eD*kvQvj&&Zob0W|E6>(7V<4Jpa zCfEJSnVjLWK+|PhioP!qmC3uW);kW6u6{ees21?Lk~`8_DZwu z-Op@G&V^2q!zL>)$S3?N8xlDBdGNZ?Kd*VNzs0b+dot%U+dmhcJU8KD@XMGv&U-Fc zk?l|U9`EkM*q-rAX-{#dqsJ@WM4deQ-RB+lX4?NT=Cb;;jWZ8SqD~bruIZ@G?w#Z` z>lMQ_Vfskkrpc2+zMa}9GPBxlUfRH_DHm^jM~n^$#;(5pZTZ-&XJ_s%&a@bmIi+%q zYu;~(hvyx58M^x3{1IZaV*b+b?v6Qg{Z+S}&s-W@H+^)+sjL@kZv;*<|IEv5jzz3z z%B9Z{wfM_v&P#;-1>P4vzog7cD6I4}Px@iUtI=DNo`-~em%PI!Tr}iP%DT*R9{f|U z=ShCO5@O}3%h|)|TxJ)#c;ZW9^x$hAwrFwBl=|?W#>G@=X$Lc0kA$7otttJ3y5@|{ zV4GW|iT2-_jaWE*<(2)*?N>h-xBtosvvs30(|XwiJk@3Q>g6u^BWd*=U1VIP-%*db z6+Ub}hH zt@rVLXFTC&pr6UUxS&4vmMZVZ8?V>ZBpKLZ4o^b5YbI#1Y{GUSB2C^Owdx)hR z^O*GP+4L`d68TOl9e!OlmY}WA8!=ftAl}_vVs(!L;{lxQD9=m2gj_hcAezomLKPT~}hTMCLsvV1%r_tb%>a`yHndN(l;SZX zg!dp^x;71fQ!k4g{Nn?F000_~mQ^rg{N{5gr~m*FBSrrCqeu{F zZH);sqhwPCH!4(d>vy(SQ-M+Gtucalq6_9NC86@@k>9!{zyiJ<4*ut5o!9k?DHKS< z{Q!T=wZgB?w@!Jb85;Llz|%5mcN*8ssF1H?L$}AY>b=M@x0O3p+C?AF!_^H%>~_6H{R`EwKI*4Eoy3_FYLts+1fP%3+s@RF=NAyPRR2n{KJL8d z&>48#jJAPifD zMkSxV0IcpNm_WHAu|Z~LN<87ZGBD?qT{#fU<_7C;Ke1hUh=a(pF_WGQ>=QT&@>YPp z*9Ow0^3s+k0-Dy8ed6`~=MZ)2XGS@)alF8PNdt3^M>OOe3YiC3ut|W(&mWu6wU95f(Y}k%Rdcu%sl*2T%OLl(HSqL`A*}MAp~~!ouUz_s!1LW{VSV z27WpTkv`MpfC&+r)ZxWu>`1k3m>%;b17gNOD?+M)W+S+gvwL)PR2vd7m6ZDMvoM!n zRYq%KlbjR$4DAjnh&c&=Ten@-@r4su$<6<6g8);krOB!3YKV9TPDXTu0R1WYpBbY0 zz<1(Ca0-}_NR#rh#*jjbl&fyT-4V(YdhRT<@f0|)>)4-3^YP4{HJS6urT{#jst_Gi zpy)U92<*(*@jZhFlUb|E+TkN{A#an(r#RpEV~8V_OHrP5i0Zxss^H(lz1q`ur#bB- z^Ig1B#5Pm@U3Vq7gR*cr}SMGa;66Gi}+X==oEbRm!`lRab2*nR5WvwNkrwirJxxdKZ6&>GGRN^k0;&+%pGsta|tBkR}G4DE*Rf+VU^n3RcpZU>3xhHvq-$ z*T&#rnb)kspF|6~2Q3v%xs7k4VD|OLymItS{I=$sYfnBjam3YJzk6dLvmFvbUk;2h_XQxBa^Ec)d7LJ+lzj(LVW< z{o}Ft3N}be?CxOCv%aG(Vr8Y(mpMTCrEj~%7Z}m;zvn>zWM%41PD`@4%DD^#V}cn+ zS?l&osR56v0hjxiC6C3bA9aFSU#a{4L6>C zP%Ko$Kzjogmrz*SW$aaPoPUeYX%)p6B&edc7N;q_dGF&3ouHxtj#hYh*oLQVjqVbC z-K8&!jb^rxPw)sHV2KJWZvQM8}MbbQzxbqJOeTI)ikmHha z&if!1WRp2I^_g(f&a(6@E+Dsvk}_a9sCdsypq}LqGOoJAZUu}n4WV^NtZQdUQho$S z%KI$QmcnD~c7|FxHM2mzJh=vmM-cWP7m=N16`6&<>^p=sqZn%kPsn8lJJ7Qyv2-S; zOj5gw?N`9ec7wK>Ki)cZ-QiEExh$>{mAWvI9`Ul_2jo(<999OW2RxbFscdF7QQEd5 zM~CH067PI$-7D7GnTvFiKiC(UwZDT2C;RPz)OOD8nn z5%wEh^9B`L0|?wq3lV?iCABruS8fgg zL1SQ`&bp(0U@nphlrL5=e6`1a_&-eZumc)|UL0J?Uh7xvblG>t6Pn)4!{*Q$CD-ni z@8TX}Oa`I*g(US(nYtb#VSTApA5PBh>;t5I*rSHX!zDlfC!r9JF+u<*JJ=Cw zIVf%?dnA2{DBclWKp72u7^naM0000001X|3aYG1uvJ0Pgh+Cp6&TR?X|90i0z5>0~ z;`cnG@Cy};zpjdOuNS2!c<2u0Im|i`m&Pc^nvnh#Xp{s1hUTeAB7w#d8Z{t=R1LMK z5%D}r|5~OP_KNlt#_b~Por?kMa}33@ zJoG~cs~-0=^yvj)&@;i3iXQMhmt5}Qo8Q(^c@5Y@g@R}<1Lq|AeajJ5lzSGfdI;EP zx;%9Rc94&@n>7GsrGgJ>{7jQC|9s9AUqC>@Kpid3nVm9nmI_CWa+==K}rkO#a`9SLB>dsD#APtsGgTSj&)wk;^GS5_G2_ry@VJ%T;)f>Oau3w+7uk`Ha_s$^ z&&5?UBNI$A5w{YobePCW>ll8lp)_P<)ygTv6VuUl8RDiu^&dHXIHYL085{2kauaodTZ~5 zAIw(~?rHkKcz`AKB{D834{*jfcIsA&vnaKqyk%?*8Cqk<#(S~1%lvg*8; zzP|I{vI$`k*L1KvHR$Q-QVK8Hw_`dLktW`VDR&B8bN2N5khJ=Iv1~ z^BLAk>={m&x4Ze;SkTJ~=zCtor0J@$s*0qg9Eo~!)Kdey2bY_q4 zGaE0RI)ndNUBNQUldT573;Xdon$09JVQzZ6UhWu$-BUa}KaCkgSK@(k;6x&>n@!|E z*jdeJ2!*_ejR#&5Dg?M!p4U$F%YW?kHVazV$iM;P*>_(PtI#HrQixMv3;iZ}v-yA9 z%@#d(lZb)D|V!9P$OvG1r7F?wP9X}g9nk(io;0_7ahvM)^0bTLd@lus%ko{4T}PTJ9Jz! zWc!SAZzjAO-bH;RETYvk=4?2R@O`ug(8PUb!T~2P`I~U#0SPIj6;!TZY$2CsPF#Up z)SOHIZCXz7#GBjtFA&_bAiM&s<1xdobY6S2C=QBg&oz&qsfH`$*sbhhgLPiwxWqSy z_YnHH!GKmi@#HFFCB(+;;o-i#q}$dtq=WG7Lu;!uy&^y+*6PaLD&?d4l;vp=*X_1EXKLDg;MS7!kK zLs6x8`8qHkJE&Qp( zLfS9bwTpeUArX;Zl+w#*Ew7U#6@Yv=xn!s?f2+#(Dy~l%=g+`R1QO{spaoc9I|DjN zLuJ69Aw)|W`d@w(YuxC@+r_)b22A%r7=o}pZnpY{#3e_WqR;m2WPDF^I+VOz*iG=1oEM#M5F)u{Zn5>#vPhUUW=5p-sV}d76fGIW|5!9=5QynxLLQIF;7i z+E-Nkm-E`Q*()~b3*9AA!5}i~u9bF+C;k5=0ogab`WZ7}v%JhC0^@V_$giS-^RhPj< z*ZzC&Wh1%MI5K4H5NhSR;JhzDgz*pLMU&=c0n^r0#d`_Or;T`UFMen$BAsQ9Te86IfY zcOr4@nwr<4FlUYeN_J5A+Q;!mtO5tbQn8wTuZAq~?MU?lsg)Jt?Y}v3=!px^ixWzt z_(}$+gx|Vu)r5M8cMvIL6NBrkp=T*fyNN)^ov#x}H(U^2GdvBfQZ-Y;HcHTMmHZ?i z!U6!oU=yn{jd|q$2d_KnKk=^C?HzkeaD1jCW$V|W2bJAlz&e}q#vAMl1iOId4Eo~2D{GjP z-a98u9Dnomy?jsLL zKE>#tlN%jSlvz7@N3<(EFOMRW#Bi_Nh7|^rT!r}<9zNm{Eyb05s#VWj+#dRsHVb?! zR+@w$%;^;p>2sS`VGa(nXCv;OIJl3%f!OyStVd`PR z!=L?@TPgocoG}bgI6YQY$8)2TvtBq2D}2G6x|T{S=1VQp>oARE*dZkmp$_&owtrKD zen+}Ik{Kr&^zEM8vJ+V*?=3>!eJck1Xci>IaMTk3dEk;O&gFN+XcTLb(x9XqF86@Q z5w&?NESID{V$UxoLMm>0JF#?OSxadW^T=n|k0KUUfUoe&g|haO^=7>_!DTq;kaSK) zpMnAcn915=uy?K28iyavA?}ynsF&k#J3l_-4#PvpPcAQfTyal=|9Pv36oJ7|YOgI2 zpMCgW>5UjZT!G9wbg!k(vc4``PZvr)MeQ}h7WJj>v}7xzree+0ptPHO8r}8Op02Uz zF$kZH37RqO*eANBo1pubQSZl=9J-AR10OINJZ<#|Y~?ag8!59^0|pP>XCi%B(VGwv zZb^30fRmN_DELB={O#hxV@5y$Mmi^BK;A|!KzOGxzFeCdJiCSLB;s6x%9yBj_A0rYD5rR{&q@-%XC2GxyYJuw7&ZLt}swF7dId0fXBELxEJAQ8R7V2lkqWN$w3D4!}4g)|yw|2nY&*wOhs_c^wv7 z!Z>;?^ee@lI-<#P!Hqda$IkVN$?i=R>6V;tkK{pfH{&$gzm-ak0$Ky%Sbqlr(r4YYK8UD@den;dv%{knTX7vO;6QO{?H7K_y zDoc@P9H;M45_}efNxpHW{JqrG`rEPP2iP!w=;CGta0#v54;`{hI}@0lFb)is#Q>7qtjmE@b(=b2UjU6y55!HFtouY`_A;x1fA~KxXcrh=pCx!Y8Ch!imz0f1 z##_sLbUEX-V6k3UY->!dwHhDaDxAo!#E|HD5{BIxvvy@>3ijpGPx7a#! zG#5H^%7JXGql=3Fb|u8$R{m~$LBD4HqI0!IE+u<+p%4*MWzA;DwseGyR_P%64E2_y zsGfp=47d-ZLF1l4&5oOcB1F}N@*ew)rdMfQGBJ7fN^auBSVM2h50hBQISLV^KBqI* zd#TP{QpLgPbcF$CSb~RZhltYmh%IfeciMUm!gbUdbNFGSclPxYckayB3{iE5N*Sg3&tI`v?< zGgo>xBP#xdaf{QCso(E!hr_!&1oj#Q_z8_*$6fRR>&SBg?eFV_a{)npDrCzBtgd4irVLpRBpRRz~dgBgqON zwd`GDh(*Jh%%Jwa%3G=4HWc*cx|LdIPWGO_A{KGV79Sx?o@q<6D`*~Ugkz#XARb;> z90yIgW$_5rw2h$HV%h#(KgqLT&_GZ?9$&xZkZ5r2UF`r?j{X}D^av8(SWS9A7Rrt3 z+?M0%Zr~r3Oh!^Nx2R4&<|haYG}OhM?P}mskr9isXGc0NY!5x2=GSozs_e^@=x$}f zGy_L|b9*qvyco<6TxTKwb(+n4+M1@y?-io|dMfcgQChgtC}z3zj=hz`mO|kJ>^aYgtDC>3Re)SLz!`^L*zUCO|b-C;~#mzEwvdfGa7;sZ1y-ld#PRHHc5^B zDyjRw+LE*$D zpFc|X-`C|1Fhm1{OZ@<~B&fNxhuPKd2CskZa@%t%YXtJUb=9ZCZIGW;fvmw$lvkGr z8Pd$_r@JPQX#R+a`uT^qWllTUK)G$vc-`jCw~YXjOu)C>0*a-q|ig0lCXHs zc7nLV%eWxXFdf>P z4$u>vkTuZBkBUs-2&|XW*x)8Y14D;&|2pM3m^shGNGIW-F#Bl$u-WRn0mw1<(toM| zKj8Qh=>8|vAxi@IR^5ExH_h{W-!q8(EZmlcl)b@JoTzTTZ=2@%zHgi6;S`G#0+{7H zMgC30aNjNA^TaR@2Mm~Cm&h32eYDe>jieGvnh`#26ifAq>a6}oDW(ZhG7FnH%*p804IkOb08H5To5d27Xx~iUH-(LE8 z%SAf&$MP`kFDEM*IK_@;xl&oc4u}R3iFP(MG}k&>tOJqOP`x}$0;+W{^etR6*($)q zN^m|U|05SyPK(&!9YJPU*aolpDZEvUr#WT3)uq18wR>!wA5iUV>90qr#ovjbzxsmQ{bHF*knMeP3n zf9LS*R{MJNzTTQIx3xU}9ircFV|UxX*W24(KZj8_+tkJO?bY`6r0RF}t;}=!Q+o=C z?X}Q*G93uej0epK`yfCGhcGf(7Fjf;jx35-T4Xec*t<5J+{jDQ+hrd;DNp^HU zhwGNl!=>8r$kYgZjbdc?&c;n&Z~$RwHtB#q7xYCAe8o)m$>K#!e zZgOa6XgYAzxE6!P3H4e@hO>vfknJwpPm@OpVTi=dulIU7D@3VpC()v*)6n=*LEQs+Ft}^OTbEwi9Tz*iK^$hvLHMNI z!^5LxyE4Iv=J4ZcyQn%F@?;)YwOWEZXBi?6^G2h5C3J%_Z#!iCp=cOOAv#4`Fo&15I%?{;)9O<_fj! z1uYsGyVNbD@;cM1M2z_CiTHDiq-w@p4{y`!dSKYFTVVAr%1%HzcFX!CroUqNc(p0~ zL9I7QD3*&N>hzy>KaHfhs}=Kovs~!tH3WLHueHw!E@cOnwEm2x%qZF2F|2KSDmW? z(*IOg-MKU8PItI3NkEP{!A>wGvRz+Z&<6J#6G^NO9 zaHT(>vWnqAot21gF#kU~w?Y zFVF|0AGj_@N4mMiqfxKA# zYT9`!@6s0Y1au^5-R`u$m@siv)6!bxQm5IXrcJ{O7oFD?H8r1RSrPz-(MXeyE_wtA zZwC^eeB+Nbi*ZgCnAi_o6P5JDtmEp+4Khqygpz}HSw#{n+?iq7%v{1>2wzgc(+<*? zG0wFPUFzX}fIjRtEe*4*RG~d|eI@w-LV-CdNG1|2VfkdyX?vPyih19fdH_3Co2=x% zv=hsMi{is#@%$GWTGkjh9&cyf^iVEXk0GwvmraWhtFuOPb7WNPEYxWK75l=-QD3r; z;+e@uOgESp_q3adEm zY~|~}##hB71MB1%dB68*%vs%hUFzSrHoYa_k7xz@g#UVU(djYn;EdN3@P7B2ty5

    R|01!swXJq#X=} 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 literal 0 HcmV?d00001 diff --git a/tests/extensions/tdms/files/test6.tdms b/tests/extensions/tdms/files/test6.tdms new file mode 100644 index 0000000000000000000000000000000000000000..38addcaecef77176e75dd57e2c775475d27eaf11 GIT binary patch literal 46962 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

    8v5@ z@a*A3r#u0y_j-_jwB>fDV|K?eM`N7H@0bUBkDI;1M(a!$sbt}-@t|; z|K$pk_$inlSX15Z8uu%>4tMF_An{GG-u;Yze_Hb244=PAd=zKuGdMAiW0N#BV;m{} zbmDvs+E3yQykHVfhwKpXbpn`Km~2UN)hN!(d@LJoc|XIS`>#slUKX7lqIg~5L7PWM z+nYo&MbG7v-aeJFk;_`W{ZJ}n?Hp(S_Hx7bzA(m1@$42GUu6@N%xqIkwN!PL{6J?} z_|&iIEdIjO6>DV~Y|y#*K^AM?G0Yz_Szb+M53dLB8OE7;Z1k;u%e(pKvlnU&yIEg9Q2q2HGZ1cTE;h_z7d|;% zy0Y*y!~W72HugibcDcb9w$J-$BQ5O$>c13HJ+hGL9enk>iDwa8n*5;Cv4kSlXa4F) z?~oG8e@j`{t{;B0aw}%$fhRlI|60PF?u*FWxy zLw9akH4yujcn@DO3XVB~VA+NH4=*k$piR)d;| zGol_Wu#RdX{(4rcY@%~hvCUptUV3CRap32mtz~~T7Y*C(D{3?0Cy{V>VvxG?u;~RY zM8w;+5YL-!y}-EtZ3b{ljspU!KjI>vuGFeI<)F+SMlip<#?Av-Nj);$E4i6 zrz!sI9>{sfSo~HoUc2RZp=~<91sfRrL}#t=kx+I=+v1QgJ+{VPs!%;(*V-=HvQ{ z?-xI_KNc}SeB2>nkYe{BQSZ)}V~)dq6$3nOU7b}kSk!K5GO%Wfwm5&)C}Zz9ZE-}w zl48#xLq+WaM;};h9V+JKo?qQ+_)t-E_^gR%?rV!Do=t4s$Zd#d5>KA#j6+F=~`Y@;=K-3rKswvi&%$kDPFW(>)>** zp{UoUM?kS&8M6zt*!QM;9z%YloKZdu$OBD*wep3Eeihm9P|QjDDensecVBdH>);|t z>c74o!8mp7Gv z1Hu`>@XV<6tn3KWkqNI_FQFTzae$rVY}4J4>|^TFJV4>#zzKYL@iZ@P!o+d!)=} z)bWrl)(_Mc_&LYmq9}Q`GZkYOJR1C;BvRKB@ppx)La)OcH_}j z%a0*yr7-G})-s3DC2-H+)-CsoC4haGVn`_))$ZEfV!{KLz>(AXRsK086epDe@(D^{ z)fAl~yWSm9)7sixw-_2tc^+r*OA)lpXn$)> zR3TLDJTPlRbsHXN0o;m9m^$WC z0aPV!Iydfq0mX$ygoiGGAt6OkogU`{@^tdy^O%PFhHoi=u3x+(r!^^rac^dQQ;v*> z88(L%GrJVRup#fp3c&?1&&YY*oH2!fb&h;EsomwzzKsh2^NRx5yL>{6*5mU*<(E+% z`>PdDe2@=)%i77+*5(rqJfGr^TzKEvM&X(DLyvO%o z-L!$)y});XeakE`T{7j-YsdFcpci*0&Hn>`J$3NnODo+nfbd{Y^Ux~qkXt4YFCVTp z`D4(yd+C7nzzmAd(un7q3c&^14chNl;?#*p{66=}FGoF-pl#$ntE7`DaM@~&Z~G%@ z5OZnrNVOGdaAQK3pPRQzqxwxE)ZD0gu;f4@gtT05oot>01NNs5aGw4aCb&FL${&&n zIDa7#E_s+wINv!LR*kyz#4IZbG-s%OnVOXV*+-w&d^Jynn6!_Xw@xNg|0@}={wV{j zBgX=qd)slr;zW3=UmB#Blt^(^0uUdO>N-(?d>I*F{*(-2EI7QJ|CZwHctC!BEFd3C z0oZ?vfldd1?OOdv4iC2E|KewZ0dbk}fb#)jfN(yfud!gS@u$w9 zfzh;|QP6kAvMB9E(LA5(q?y@!F2n%!y(phZ0GvM%4Tx6^cyRyfOxm4;;qx8muoe&ilqbcN9>40;D{K`pr~-iiZBi=XREFi6mZmG{w>3fO&ir z&ugXpBEtOhLgoL&Nj!Vy{?_@QSmK38!BqF$WL;-~{?M@g@i-k1? z?Ne^-O$O{cDtY{Me9{D{9=)nKZg2&m1Ok+uy6bU-uGXbTKy~wO0N9= zVRGb0pm-G07ib-vrIJH_E*I7gzZWH2o5$_h#;%4Y-6QfLYn0uM{_P6@`!WT59zuHY z*zq33VIa_7$#Q5}ogP_ZNx=x{ffY87SDVtH^t~ z@K<4?dxYAP&f3Dwd!xnjD?^2z>va#b`!Ys~R0SOxp`Y5H~yl|^wwd2i`Az8By@JFC^2Z$ zT)15M)Wbi!snFw(7WpnlO@%nd4r;7#B8(q8VL_#3Vr(9QuG!izO zuFjg0+fbmopKxA3M}Nx4h63``8wx954Cr}regk3EHS?UD2H)WDUc-ua(KRsYNP1B0 z%o?&gUjcE*U%{-CN%Ko%zrvqa)0&(}tb+X+4iDDHR6?iZ?yJ^%SAy{YjqtH2D`4Cb z52FdUE1=ITy*KkFR>H=%;Ug-|zw`7atZc1Swzmulhcyq3U0n)UzdBxbJ5>UI+L+FL z+OY&)P3?8y#+hO;EvkNI5iV@x>>UbLi2|A(=RRrLHi;|UmF=ui?~9Y2dlMwu2sg>C-g{u%{54l%Sb zcMNNh2gonVgJumU=bkM1M0KiM7{5S$(8*7qz@cW9zUA4^u=e(Ob-U)d&|>4TMbFf7 zL2KsgIJ?%lfO8){fq!Dw)cq$uf$g=QyKZg&38FfzE?99V2QKwGWU|&L2gC_l`KKyA z!Hu(iffq-A2AVSiDJSMe|1mWOeo@WsxxLRP@Sb$|@s#+FfViTMP-R(u=%NPz7w=yRmie zBn8lX188E=u&CTHmFmVxFxa*F%{cP}SaW^cviw1*fH=2AXq6c7Q|Wd&?Vs}X)?x2I zs>-RakWA;C1S9%gc^tPv1~m5x3hv&XxAK)TUTNINc=zHYK>XQTibs>6$!OQgnava7 z)T_)xdkvGQ50wmPFOqqj_OSBBqZ6q~fc?lMK-^s-Y}WmvQ2R{*Sm#y17`+#BRyf3f z>psipPdmlKL#s^=vOO{YZHw*?^WrF;l>_1(WK;)>1K;POP0S)0bkEuW$u=_LvnpVD z)H9uRL5Xns-U%jKuS~Inw)~KTM!}Ne(y3mI^?;lN{{t_`DoCJpr2N zC-1TLOa|nIq!I5@MtPNt>bP=1{D+MCb#m%^%7Nx`kbjrK!EQYh-{;Br{vvKIhR3(k zIYjQS*uQ6E64jrT{M9h@d#OI3HJUVu12Jct|+&z#Eljc{W?bI`b6V&7E` z0qq@C%J#^CcqP#1gw_=$Gl=UE*0be6bHMm>SkF#|v)-rkKKGRqZ}j_l<6I9pP@ND4 z{n2_u2SWvq8?kQg58j&9#%imgsID6W4Xoy_)L5*5ZBJ7tjoOj`h%ZY5vxUt4V@#tCB@-X7NzG zR_>%NBmm;Z6SzJg4>k#C-Uzo(m=DVNJ;FM*DcP7@@Y;gxG`huU?ECw_V?AU;19GL{}5(KJgAe{5MFogtF};xpoS z9)$d+@A66c9rkMyh~J;Y^EBkC#>0>t`e(mqJ{@4)Nh0}eio z<@+bC6X$;=P#r1>nonA}MP%_HJ&$wRV!8d9GkB`ja`Qx(I^=Vo2BMtbcU7HNJ3E;x zfcQ=DbaeD@t@|nMejQIH0T7?0pni7}<#XTdCE{mO;B1$;50>W1fb);y;r^I?Q(r8K z2i>nm1-XOeV5j=+;1|U z#0!@J;hD+rCV|%R6Sw+*Q&7C{76?BJgmd9}{&eQ>r;qDfZXa>JRumBL3#_V^-W%8^ z0cbuT*K3+X$o(75KLncJ$n7ZhMH2z>iE@}!7;$9Z-X!X8C2%{8eqTZL5(OZSC7$x0 zM4-8fT)(7wYJ_*?`-%NjIp7?t1nL{5aDPB^i{QOzcxOQK1b+V|J)rrF+}~f(Jo3F1>l^(c$&wS#Pxel zOy%%redD=*KpbQu&s!ybt=%aE@3C*jK37 zr#(*r<7Jm_HgB6oeZf>nKlVqtwU`WAX_1%Z8&i0FPIIBtm@U0Cf#y+CA21n~&K&np zMLP|UN0|Z0J5%jCc$Pu-?*p$hAdc!i_5a^de>W4b{*(!!vrM|TTbT`iG}>dXIy4*b z{^syGi5N#^(SGK@)eGKtbzXmjcfDHnn-cvIyo3QEV-A0WmrZ}FUh_H!Fi+1V|C$4T zXj`gmc%K6yM)NWqN9KZw)((rdi}L~JEh+02ACjJoy{*ijsNP)M^t}5~SrKT7bJje} zFNVCUrKwpprGx`32W_{i$B%g@tbSPugJ*5hbsAF*%*}1nW&H-ivS))TBWE`f zd_SaizjeKd@HNVRk+Fet4v)oyJrf_a5Eh0lo>R6>MbIq|dpyRZ1%6U~Q)*PJ_*;Kr>P3JLF;$Zx24b?W4R5F~K zS4#7rlzqnC`+9XS&F6SSsyj)zXX*@-~Yd$Whd@cu61M3nrhy7`b{Oya#_A2*O8UdxYo8jSb_UYy^9_SK(o z=k^TG-G}2`kq^q4ge%6l`V~X`hC9buNxV&*>*zx`FISFZmvGTE_mcRB&J5$`{)O}uJ%dj1OW*j@tSsBI;D0iVB!^9>&|!r^fI7vipLh!5(>F#ffr{=X9- zzV`{)hl7mp2*ii8=kptp$G49me$I&S9A2)qY^2Y8-e@}QNYvLE4qB!X>$6+8&U7;zq zh4QmUfIJQ-j+ekV;|btg%9lX%H2M5d3IB+3;$y~f8}Xz8`^T>-zjmYZb_T+AQ2c5KgnQ?>Rtf)uxJeJP z_fM(*|D5uPhd?}B%6kJTkMblxZpZOycz({*r*NSB`W45s5^kB})i7Ru$Z?yfH;zDd zfX}0q@SVgv=Xg2dJJXyfk?Q>cgv)u#*N6F;C*fCJf##!9-{2*`H<+(`)Bb(O4@)>x z#2LAB+?AwHxX<2zb1MBPZV?G*>qqgfJL#1x#}PN6FXVw9rT*9}j!P!qC^!z4-?Z-> z0jU87zn@n3r@oInosSFYl^4f9A@9(faJS!ac{r!c1#nKd2lchQIgXn6QluY&{2YiE zP3sQ=;%#vp7|!u!TtB39A$}O;Qz4{(0el`Y`h%Aoe~bOnU?9Ff-E&KtCy`0>R11jj z5D6c9xV^ry=PPK~&l$a7eKX;9rGs{#cja{N&M=x6%;)JMujL5wdCt)Nx<`DA@AG}p z-rfM3cTD(GCqQ1qOTxFkCOvr0ani^;drtblo$j3{$A6=KAK~@{ad7se5BDh!cL&Md z;`0~Dj*9etX9=feO@81S@rWk%Zc%Ah>gEQx0OI^#(0M=SIB?vTdq8t~ zVS(=aZK_J$G*EBQz`8ps>7{P?vzPKmGv)V?ej5yS_xq;&s{MUi{+l8FjCN@5HrS@$ zubuLDEtTI5>09}u?k`&_f9~C|+GzLMUAtG;KB-&#%D=vp|3S?6hYUAtFw$54ml5B; zTH(tE+t=^X-=@F)Z?EMGwa?YQ|JrRkw(1)-R{pDY1-0_bow<6-rnTF*>u;UAcALJY z@;A+u-?ZM^PgFiIb>EH!$~Dd3t^9MoFwOk&wo5)JlutCMeGFxYa%(q25@4SG+AZ4ubN#i?|9@J4?S9s+_6LvY-%<{(S5glBk5Ue+S5gl9 zk5Ue=S5glDK`B-Kb}y&Zk4xD|x#VfuKPX@AW0KujY@oM$Q~i*!))3-ye^5@1zsWgC z>4FS)8|&%U4_RwH=l3Q5puB%S*Lj=P8r2h7YtI#z`-5`UdP7Nnm#o`ZKTfoXa?!Pm z{SPuOtxq!6F7^jy{Ci|D-Oy04ejH?N{8P8uAC&SR-lTp6KXu;ZM z&i>n*)DIygZ}Ov3{==Kpk0i6soBU{o`FE>R=S}K|jNF_2sGR@Po74|k|KUx3RNlXz zYn?Z#AF^_9@}qM8%bU~>Dao7s7a5fXy8g&myV(EeP3nh`k~jHLDgWV3>PIoJ&YS#b zCGYQ6r_P(y4;i^P`B6Flr#Gn|vi`%H{HVNtKi4{MQa@zn-sDH+{FgVWA5xMx`7bgm z4RrmHv39Zl(VNr{Ati6}qf$08$!ZtY<t(<`_pLI$ zFggFbluY^YPRjLO?RV+3?7hB@-lDcqCYx>ug9nsucf467`i$uKdd$(IkTUOc)#UE! H{O|q`JVg&O literal 0 HcmV?d00001 diff --git a/tests/extensions/tdms/test_renderer.py b/tests/extensions/tdms/test_renderer.py new file mode 100644 index 00000000..2ed761bb --- /dev/null +++ b/tests/extensions/tdms/test_renderer.py @@ -0,0 +1,65 @@ +import os +import pytest + +from bs4 import BeautifulSoup + +from mfr.core.provider import ProviderMetadata +from mfr.extensions.tdms import TdmsRenderer + + +@pytest.fixture +def metadata(): + return ProviderMetadata('test8', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') + + +@pytest.fixture +def test_tdms_file_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'test6.tdms') + + +@pytest.fixture +def invalid_tdms_file_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'invalid.tdms') + +@pytest.fixture +def url(): + return 'http://osf.io/file/test6.tdms' + + +@pytest.fixture +def assets_url(): + return 'http://mfr.osf.io/assets' + + +@pytest.fixture +def export_url(): + return 'http://mfr.osf.io/export?url=' + url() + + +@pytest.fixture +def renderer(metadata, test_tdms_file_path, url, assets_url, export_url): + return TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) + + +class TestTdmsRenderer: + + def test_render_tdms_file_required(self, renderer): + assert renderer.file_required is True + + def test_render_tdms_cache_result(self, renderer): + assert renderer.cache_result is True + + def test_render_tdms(self, test_tdms_file_path, assets_url, export_url): + metadata = ProviderMetadata('test6', '.tdms', 'text/plain', '1234', 'http://wb.osf.io/file/test6.tdms?token=1234') + renderer = TdmsRenderer(metadata, test_tdms_file_path, url, assets_url, export_url) + body = renderer.render() + name = "sp0006_042419" + startTime = "wf_start_time: 2019-04-24T18:17:11.234133" + startFrequency = "4E+05" + endFrequency = "5E+05" + plot = """data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsMAAAGzCAYAAADKRhoeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhU9d3//9dkmwmESQJKFkgC3igIQiKhYLrcakWiptyiVHH5KntvEbyEVEFEgxuNxQVscblbWtGrWoH7rraK4o9GQYtBJAhVFKwUCApJWJIMS2YmZM7vjzCHDAmZE7aQnOfjunLpnPM5Zz6+I5NXDp/zPg7DMAwBAAAANhTR2hMAAAAAWgthGAAAALZFGAYAAIBtEYYBAABgW4RhAAAA2BZhGAAAALZFGAYAAIBtEYYBAABgW1GtPYFzWSAQ0K5du9SpUyc5HI7Wng4AALDAMAwdOHBAqampiojguh+aRxhuxq5du5SWltba0wAAACdh586d6t69e2tPA+c4wnAzOnXqJKn+D5Pb7Ta3G4Yhr9crl8vFFeMToEbWUKfwqJE11Ck8amRNe6iTx+NRWlqa+XMcaA5huBnBDwG3290oDMfExLTpD4ozjRpZQ53Co0bWUKfwqJE17alObX3+ODtYSAMAAADbIgwDAADAtgjDAAAAsC3WDAMAAFuqq6tTbW1ta08Dp1l0dLQiIyMtjycMAwAAWzEMQ2VlZaqqqmrtqeAMSUhIUHJysqWbKAnDAADAVoJBuGvXrurQoQNdJ9oRwzB0+PBhVVRUSJJSUlLCHkMYBgAAtlFXV2cG4S5durT2dHAGxMbGSpIqKirUtWvXsEsmuIEOAADYRnCNcIcOHVp5JjiTgt9fK2vCCcMAAMB2WBrRvrXk+9uiMPzII4/I4XCEfPXp08fc7/V6NXnyZHXp0kVxcXEaOXKkysvLQ85RWlqqvLw8dejQQV27dtX999+vI0eOhIxZuXKlBg4cKKfTqV69emnRokWN5vL888+rR48ecrlcGjJkiNauXRuy38pcAAAAYG8tvjLcr18/7d692/z6xz/+Ye6bNm2a3n77bS1dulSrVq3Srl27dOONN5r76+rqlJeXJ7/fr08++USvvPKKFi1apIKCAnPMtm3blJeXpyuvvFIbNmzQ1KlTNWHCBL3//vvmmMWLFys/P1+zZ8/W+vXrlZmZqdzcXHOxtJW5AAAAtCVjxoxpdFHS4XDo22+/be2ptW1GC8yePdvIzMxscl9VVZURHR1tLF261Nz29ddfG5KM4uJiwzAM49133zUiIiKMsrIyc8yLL75ouN1uw+fzGYZhGNOnTzf69esXcu5Ro0YZubm55uvBgwcbkydPNl/X1dUZqampRmFhoeW5WFFdXW1IMqqrq0O2BwIB4/Dhw0YgELB8LruhRtZQp/CokTXUKTxqZE17qNOJfn4bhmHU1NQYX331lVFTU9MKMzs1o0ePNq655hpj9+7dIV9HjhwJGRfMVHbWku9zi68M/+tf/1JqaqouuOAC3X777SotLZUklZSUqLa2VkOHDjXH9unTR+np6SouLpYkFRcXq3///kpKSjLH5ObmyuPxaNOmTeaYhucIjgmew+/3q6SkJGRMRESEhg4dao6xMhcAAHD2GYahbysOaslnOzX9fzfq+gX/UCBgtPa02gyn06nk5OSQr6uuukpTpkzR1KlTdd555yk3N1eS9OWXX+raa69VXFyckpKSdMcdd2jv3r3muQ4dOqQ777xTcXFxSklJ0TPPPKMrrrhCU6dONcc4HA699dZbIXNISEgIWcK6c+dO3XzzzUpISFDnzp11/fXXa/v27eb+MWPGaMSIEXr66aeVkpKiLl26aPLkySE3t/l8Ps2YMUNpaWnmMtk//OEPMgxDvXr10tNPPx0yhw0bNpy2q+Itaq02ZMgQLVq0SL1799bu3bv16KOP6ic/+Ym+/PJLlZWVKSYmRgkJCSHHJCUlqaysTFJ9X7+GQTi4P7ivuTEej0c1NTWqrKxUXV1dk2M2b95sniPcXJri8/nk8/nM1x6PR1L9H1zDOPYHNfi64TaEokbWUKfwqJE11Ck8amTN6a6Tt7ZOG7+rVsmO/SrZUaX1OypVVRN6h/+/Kg7ooqROp+X9JNnye/zKK69o0qRJWr16tSSpqqpKP/3pTzVhwgTNmzdPNTU1mjFjhm6++WZ98MEHkqT7779fq1at0l//+ld17dpVDz74oNavX6+srCzL71tbW6vc3Fzl5OTo448/VlRUlJ544gldc801+uc//6mYmBhJ0ocffqiUlBR9+OGH+vbbbzVq1ChlZWVp4sSJkqQ777xTxcXF+s1vfqPMzExt27ZNe/fulcPh0Lhx4/Tyyy/rvvvuM9/35Zdf1n/+53+qV69ep1y7FoXha6+91vz3AQMGaMiQIcrIyNCSJUvMnm5tWWFhoR599NFG271er/nNDPL5fNyJGgY1soY6hUeNrKFO4VEja06lThUHfPp8Z7X59dXuAzrSzJXfqAiHNn9fqfT46JOdbiNer/e0netc88477yguLs58HcxmF154oebOnWtuf+KJJ3TppZfqV7/6lbntj3/8o9LS0vTNN98oNTVVf/jDH/SnP/1JV111laT6QN29e/cWzWfx4sUKBAJauHCh+f/Myy+/rISEBK1cuVLDhg2TJCUmJmrBggWKjIxUnz59lJeXp6KiIk2cOFHffPONlixZohUrVph/q3/BBReY7zFmzBgVFBRo7dq1Gjx4sGpra/X66683ulp8sk7poRsJCQm66KKL9O233+rqq6+W3+9XVVVVyBXZ8vJyJScnS5KSk5MbdX0IdnhoOOb4rg/l5eVyu92KjY1VZGSkIiMjmxzT8Bzh5tKUmTNnKj8/33zt8XiUlpYml8sll8tlbg/+xux0OvlQPQFqZA11Co8aWUOdwqNG1rSkTnUBQ1vKDqhkR6VKSitVsqNS31XWNHtMQmy0BmYkalBGogZmJCqze7xc0c0/FKGl/H5/i48Z/tt/aM8BX/iBp9n5nZx6+54fWx5/5ZVX6sUXXzRfd+zYUbfeequys7NDxm3cuFEffvhhSHAO2rp1q2pqauT3+zVkyBBze+fOndW7d+8WzX/jxo369ttv1alT6JV9r9errVu3mq/79esX8vCLlJQUffHFF5LqlzxERkbq8ssvb/I9UlNTlZeXpz/+8Y8aPHiw3n77bfl8Pt10000tmuuJnFIYPnjwoLZu3ao77rhD2dnZio6OVlFRkUaOHClJ2rJli0pLS5WTkyNJysnJ0Zw5c8wngkjSihUr5Ha71bdvX3PMu+++G/I+K1asMM8RExOj7OxsFRUVacSIEZKkQCCgoqIiTZkyRZIszaUpTqdTTqez0fbg3ZpNbeMD9cSokTXUKTxqZA11Co8aWXOiOh3w1urz0qr68LujUp+XVuqQv67Zc/3H+R2VnZGoQRmdNTAjUf9xfsczXv+TOf+eAz6Vec79K8odO3ZscmlAx44dQ14fPHhQw4cP169//etGY1NSUiyvtXU4HI2WnTRc63vw4EFlZ2frtddea3Ts+eefb/57dHTolX+Hw6FAICBJllYXTJgwQXfccYfmzZunl19+WaNGjTptD05pURi+7777NHz4cGVkZGjXrl2aPXu2IiMjdeuttyo+Pl7jx49Xfn6+OnfuLLfbrXvuuUc5OTm67LLLJEnDhg1T3759dccdd2ju3LkqKyvTQw89pMmTJ5sh9K677tKCBQs0ffp0jRs3Th988IGWLFmiZcuWmfPIz8/X6NGjNWjQIA0ePFjz58/XoUOHNHbsWEmyNBcAAHBihmHou8oaleyo1Lod+7Vue6W2lB9Qc8txnVERykxL0KCMRGVnJGpgeqISO8ac+IBzyPmdGl8Ma8vvO3DgQP3f//2fevTooaioxnHvP/7jPxQdHa1PP/1U6enpkqTKykp98803IVdozz//fO3evdt8/a9//UuHDx8OeZ/Fixera9eucrvdJzXX/v37KxAIaNWqVY2aKARdd9116tixo1588UUtX75cH3300Um9V1NaFIa/++473Xrrrdq3b5/OP/98/fjHP9aaNWvM5D9v3jxFRERo5MiR8vl8ys3N1QsvvGAeHxkZqXfeeUeTJk1STk6OOnbsqNGjR+uxxx4zx/Ts2VPLli3TtGnT9Nxzz6l79+5auHCheWekJI0aNUp79uxRQUGBysrKlJWVpeXLl4fcVBduLgAA4Bj/kYA27arWuu379dm2fdrwnUcVYZYNdO3k1KAeicrO6KzsjET1TXErJqptPty2JUsV2oLJkyfr97//vW699VZNnz5dnTt31rfffqs33nhDCxcuVFxcnMaPH6/7779fXbp0UdeuXTVr1ixFRIR+/376059qwYIFysnJUV1dnWbMmBFylff222/XU089peuvv16PPfaYunfvrh07dugvf/mLpk+fbmkNco8ePTR69GiNGzfOvIFux44dqqio0M033yypPkOOGTNGM2fO1IUXXtjs3/S3VIvC8BtvvNHsfpfLpeeff17PP//8CcdkZGQ0WgZxvCuuuEKff/55s2OmTJliLos42bkAAGBX+w/5tX5HpdbtqNT6HZXa+F2VfEcCJxwf4ZB6J7vNq77ZGYnqnhjLkpNzVGpqqlavXq0ZM2Zo2LBh8vl8ysjI0DXXXGMG3qeeespcTtGpUyf98pe/VHV1dch5nnnmGY0dO1Y/+clPlJqaqueee04lJSXm/g4dOuijjz7SjBkzdOONN+rAgQPq1q2brrrqqhZd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""" + + assert plot in body + assert startTime in body + assert startFrequency in body + assert endFrequency in body From 7ead1be01605d62080797c76730a64d768700d85 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 15:48:15 -0600 Subject: [PATCH 07/20] Create configuringDevEnv --- configuringDevEnv | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 configuringDevEnv diff --git a/configuringDevEnv b/configuringDevEnv new file mode 100644 index 00000000..6977dc44 --- /dev/null +++ b/configuringDevEnv @@ -0,0 +1,97 @@ +# Configuring the OSF Development Environment: + +Instructions for MacOS Big Sur compiled by from https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md '''README-docker-compose.md''', the https://cosdev.readthedocs.io/en/latest/osf/setup.html, and correspondence with Fitz Elliot and modified to fix errors. + + - Clone the repository: + $ git clone [osf.io] + $ cd osf.io + + - Install the Docker Client + + - Grant Docker minimum resources of 1 CPU, 8GB memory, 2GB swap, and 32GB disk image size + + - Alias the loopback interface: + $ export libdir='/Library/LaunchDaemons' + $ export file='com.runlevel1.lo0.192.168.168.167.plist' + $ sudo cp $file $libdir + $ sudo chmod 0644 $libdir/$file + $ sudo chown root:wheel $libdir/$file + $ sudo launchctl load $libdir/$file + + - Configure application: + $ cp ./website/settings/local-dist.py ./website/settings/local.py + $ cp ./api/base/settings/local-dist.py ./api/base/settings/local.py + $ cp ./docker-compose-dist.override.yml ./docker-compose.override.yml + $ cp ./tasks/local-dist.py ./tasks/local.py + + - Start Application: + $ docker compose up requirements mfr\_requirements wb\_requirements} + $ docker compose up -d elasticsearch postgres mongo rabbitmq} + $ rm -Rf ./node\_modules + $ docker compose up -d assets + $ docker compose up -d admin\_assets + $ docker-compose up -d mfr wb fakecas sharejs + $ docker-compose run --rm web python3 manage.py migrate + $ docker-compose up -d worker web api admin preprints registries ember\_osf\_web + + - *Note: once it has been setup, you can quickstart: https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md\#quickstart-running-all-osf-services-in-the-background to quickly launch in the future.* + + - Access the OSF at http://localhost:5000. + + - Click sign up to create an account. + + - Access the 'web' containers logs to view the confirmation email for new accounts: + $ docker compose logs -f --tail 1000 web + + - Copy the confirmation link and paste into the browser to confirm the account then log in using the email address used to create the account. This allows test files, projects, and folders to be created and accessed through the normal methods. + +Instructions for building and testing the modified MFR container: + + - Go to the modular-file-renderer directory + - $ docker image build -t mfr:local . + - Go to the osf.io directory + - Edit the docker-compose.yml file. Under mfr and mfr_requirements, change the image to image: mfr:local + - $ docker compose up -d --force-recreate mfr_requirements + - $ docker compose up -d --force-recreate mfr + - Restart the Docker application + + +In order to verify that the version of MFR you are running is the correct, most up to date version: + + - Modify the version number in modular-file-renderer/mfr/version.py to indicate that changes have been made. + - Check the version of the container at http://localhost:7778/status + - If the status version number matches the modified version number, you know that the modified version of the MFR container has been successfully built and deployed by Docker. + + +#Debugging Problems + + - Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea: + + $ docker system prune -a + + +#Configuring the MFR development environment: + + Instructions for MacOS Big Sur compiled from https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/CONTRIBUTING.rst, https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/README.md, the https://modular-file-renderer.readthedocs.io/en/latest/install.html\#install and https://modular-file-renderer.readthedocs.io/en/latest/contributing.html and modified to fix errors. + + - Clone the repository: + $ git clone [modular-file-renderer] + $ cd modular-file-renderer + + - Create the virtual environment: + - $ pip install virtualenv virtualenvwrapper + - $ brew update + - $ brew install python3 r pspp unoconv pyenv + - Add the following initialization lines to either the \home/.bashrc} or \code{\home/.zprofile files for either bash or zsh shells respectively: + \code{eval "$(pyenv init -)" + \code{eval "$(pyenv virtualenv-init -)" + - $ source \home/.[bashrc or zprofile] + - $ pyenv virtualenv 3.6.4 mfr + - $ pip install setuptools==37.0.0 + - $ pip install invoke==0.13.0 + - Modify \code{requirements.txt} to update the version number for reportlab==3.4.0 to reportlab==3.5.56 due to an incompatibility with the old version. + - $ invoke install -d + + - In order to run the development unit testing procedure: + + - $ invoke test From 2e32131e2e63b2a49ce9021259c4eb94f325fd69 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 15:48:37 -0600 Subject: [PATCH 08/20] Rename configuringDevEnv to configuringDevEnv.md --- configuringDevEnv => configuringDevEnv.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename configuringDevEnv => configuringDevEnv.md (100%) diff --git a/configuringDevEnv b/configuringDevEnv.md similarity index 100% rename from configuringDevEnv rename to configuringDevEnv.md From d0ef3b25429343e8f371223c44e7579472aa4305 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 15:49:48 -0600 Subject: [PATCH 09/20] Update configuringDevEnv.md --- configuringDevEnv.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 6977dc44..ce03b336 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -45,7 +45,7 @@ Instructions for MacOS Big Sur compiled by from https://github.com/CenterForOpen - Copy the confirmation link and paste into the browser to confirm the account then log in using the email address used to create the account. This allows test files, projects, and folders to be created and accessed through the normal methods. -Instructions for building and testing the modified MFR container: +## Instructions for building and testing the modified MFR container: - Go to the modular-file-renderer directory - $ docker image build -t mfr:local . @@ -56,21 +56,21 @@ Instructions for building and testing the modified MFR container: - Restart the Docker application -In order to verify that the version of MFR you are running is the correct, most up to date version: +## In order to verify that the version of MFR you are running is the correct, most up to date version: - Modify the version number in modular-file-renderer/mfr/version.py to indicate that changes have been made. - Check the version of the container at http://localhost:7778/status - If the status version number matches the modified version number, you know that the modified version of the MFR container has been successfully built and deployed by Docker. -#Debugging Problems +## Debugging Problems - Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea: $ docker system prune -a -#Configuring the MFR development environment: +# Configuring the MFR development environment: Instructions for MacOS Big Sur compiled from https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/CONTRIBUTING.rst, https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/README.md, the https://modular-file-renderer.readthedocs.io/en/latest/install.html\#install and https://modular-file-renderer.readthedocs.io/en/latest/contributing.html and modified to fix errors. From a91287478c757836f3b4b5b15bbdd3000210b151 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:14:48 -0600 Subject: [PATCH 10/20] Clean up markdown --- configuringDevEnv.md | 139 ++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index ce03b336..3100eb51 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -1,97 +1,98 @@ -# Configuring the OSF Development Environment: +# Configuring the Development Environment for OSF: -Instructions for MacOS Big Sur compiled by from https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md '''README-docker-compose.md''', the https://cosdev.readthedocs.io/en/latest/osf/setup.html, and correspondence with Fitz Elliot and modified to fix errors. +Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md), correspondence with Fitz Elliot, and the [documentation](https://cosdev.readthedocs.io/en/latest/osf/setup.html): modified to fix errors. - - Clone the repository: - $ git clone [osf.io] - $ cd osf.io - - Install the Docker Client +- Clone the repository: +$ git clone [osf.io] +$ cd osf.io} - - Grant Docker minimum resources of 1 CPU, 8GB memory, 2GB swap, and 32GB disk image size +- Install the Docker Client - - Alias the loopback interface: - $ export libdir='/Library/LaunchDaemons' - $ export file='com.runlevel1.lo0.192.168.168.167.plist' - $ sudo cp $file $libdir - $ sudo chmod 0644 $libdir/$file - $ sudo chown root:wheel $libdir/$file - $ sudo launchctl load $libdir/$file +- Grant Docker minimum resources of 1 CPU, 8GB memory, 2GB swap, and 32GB disk image size - - Configure application: - $ cp ./website/settings/local-dist.py ./website/settings/local.py - $ cp ./api/base/settings/local-dist.py ./api/base/settings/local.py - $ cp ./docker-compose-dist.override.yml ./docker-compose.override.yml - $ cp ./tasks/local-dist.py ./tasks/local.py +- Alias the loopback interface: +$ export libdir='/Library/LaunchDaemons' +$ export file='com.runlevel1.lo0.192.168.168.167.plist' +$ sudo cp $file $libdir} +$ sudo chmod 0644 $libdir/$file +$ sudo chown root:wheel $libdir/$file +$ sudo launchctl load $libdir/$file - - Start Application: - $ docker compose up requirements mfr\_requirements wb\_requirements} - $ docker compose up -d elasticsearch postgres mongo rabbitmq} - $ rm -Rf ./node\_modules - $ docker compose up -d assets - $ docker compose up -d admin\_assets - $ docker-compose up -d mfr wb fakecas sharejs - $ docker-compose run --rm web python3 manage.py migrate - $ docker-compose up -d worker web api admin preprints registries ember\_osf\_web +- Configure application: +$ cp ./website/settings/local-dist.py ./website/settings/local.py +$ cp ./api/base/settings/local-dist.py ./api/base/settings/local.py +$ cp ./docker-compose-dist.override.yml ./docker-compose.override.yml +$ cp ./tasks/local-dist.py ./tasks/local.py - - *Note: once it has been setup, you can quickstart: https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md\#quickstart-running-all-osf-services-in-the-background to quickly launch in the future.* +- Start Application: +$ docker compose up requirements mfr_requirements wb_requirements +$ docker compose up -d elasticsearch postgres mongo rabbitmq +$ rm -Rf ./node_modules +$ docker compose up -d assets +$ docker compose up -d admin_assets +$ docker-compose up -d mfr wb fakecas sharejs +$ docker-compose run --rm web python3 manage.py migrate +$ docker-compose up -d worker web api admin preprints registries ember\_osf\_web - - Access the OSF at http://localhost:5000. +- *Note: once it has been setup, you can [quickstart](https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md\#quickstart-running-all-osf-services-in-the-background) to quickly launch in the future.* - - Click sign up to create an account. +- Access the OSF at **http://localhost:5000**. - - Access the 'web' containers logs to view the confirmation email for new accounts: - $ docker compose logs -f --tail 1000 web +- Click sign up to create an account. - - Copy the confirmation link and paste into the browser to confirm the account then log in using the email address used to create the account. This allows test files, projects, and folders to be created and accessed through the normal methods. +- Access the 'web' containers logs to view the confirmation email for new accounts: -## Instructions for building and testing the modified MFR container: +- $ docker compose logs -f -{}-tail 1000 web - - Go to the modular-file-renderer directory - - $ docker image build -t mfr:local . - - Go to the osf.io directory - - Edit the docker-compose.yml file. Under mfr and mfr_requirements, change the image to image: mfr:local - - $ docker compose up -d --force-recreate mfr_requirements - - $ docker compose up -d --force-recreate mfr - - Restart the Docker application +- Copy the confirmation link and paste into the browser to confirm the account then log in using the email address used to create the account. This allows test files, projects, and folders to be created and accessed through the normal methods. -## In order to verify that the version of MFR you are running is the correct, most up to date version: +# Instructions for building and testing the modified MFR container: - - Modify the version number in modular-file-renderer/mfr/version.py to indicate that changes have been made. - - Check the version of the container at http://localhost:7778/status - - If the status version number matches the modified version number, you know that the modified version of the MFR container has been successfully built and deployed by Docker. +- Go to the **modular-file-renderer** directory +- $ docker image build -t mfr:local . +- Go to the **osf.io** directory +- Edit the **docker-compose.yml** file. Under **mfr** and **mfr_requirements**, change the image to **image: mfr:local** +- $ docker compose up -d --force-recreate mfr_requirements +- $ docker compose up -d --force-recreate mfr +- Restart the Docker application +### In order to verify that the version of MFR you are running is the correct, most up to date version: + +- Modify the version number in **modular-file-renderer/mfr/version.py** to indicate that changes have been made. +- Check the version of the container at **http://localhost:7778/status** +- If the status version number matches the modified version number, you know that the modified version of the MFR container has been successfully built and deployed by Docker. -## Debugging Problems - - Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea: +## Debugging Problems - $ docker system prune -a +- Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea. +- $ docker system prune -a +# Configuring the development environment for MFR: +Instructions for MacOS Big Sur compiled from []**CONTRIBUTING.rst**](https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/CONTRIBUTING.rst), [**README.md**](https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/README.md), the [installation documentation](https://modular-file-renderer.readthedocs.io/en/latest/install.html\#install) and the [contribution documentation](https://modular-file-renderer.readthedocs.io/en/latest/contributing.html) and modified to fix errors. -# Configuring the MFR development environment: +- Clone the repository: +$ git clone [modular-file-renderer] +$ cd modular-file-renderer +- Create the virtual environment: - Instructions for MacOS Big Sur compiled from https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/CONTRIBUTING.rst, https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/README.md, the https://modular-file-renderer.readthedocs.io/en/latest/install.html\#install and https://modular-file-renderer.readthedocs.io/en/latest/contributing.html and modified to fix errors. +- $ pip install virtualenv virtualenvwrapper +- $ brew update +- $ brew install python3 r pspp unoconv pyenv - - Clone the repository: - $ git clone [modular-file-renderer] - $ cd modular-file-renderer +- Add the following initialization lines to either the **~/.bashrc** or **~/.zprofile** files for either bash or zsh shells respectively: +**eval "$(pyenv init -)"** +**eval "$(pyenv virtualenv-init -)"** - - Create the virtual environment: - - $ pip install virtualenv virtualenvwrapper - - $ brew update - - $ brew install python3 r pspp unoconv pyenv - - Add the following initialization lines to either the \home/.bashrc} or \code{\home/.zprofile files for either bash or zsh shells respectively: - \code{eval "$(pyenv init -)" - \code{eval "$(pyenv virtualenv-init -)" - - $ source \home/.[bashrc or zprofile] - - $ pyenv virtualenv 3.6.4 mfr - - $ pip install setuptools==37.0.0 - - $ pip install invoke==0.13.0 - - Modify \code{requirements.txt} to update the version number for reportlab==3.4.0 to reportlab==3.5.56 due to an incompatibility with the old version. - - $ invoke install -d +- $ source ~/.[bashrc or zprofile] +- $ pyenv virtualenv 3.6.4 mfr +- $ pip install setuptools==37.0.0 +- $ pip install invoke==0.13.0 +- Modify **requirements.txt** to update the version number for **reportlab==3.4.0** to **reportlab==3.5.56** due to an incompatibility with the old version. +- $ invoke install -d - - In order to run the development unit testing procedure: +- In order to run the development unit testing procedure: - - $ invoke test +- $ invoke test From 78dba591cc0e5b725141a77cc6830024fbb96a7d Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:15:19 -0600 Subject: [PATCH 11/20] Update configuringDevEnv.md --- configuringDevEnv.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 3100eb51..285da93f 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -12,11 +12,17 @@ $ cd osf.io} - Grant Docker minimum resources of 1 CPU, 8GB memory, 2GB swap, and 32GB disk image size - Alias the loopback interface: + $ export libdir='/Library/LaunchDaemons' + $ export file='com.runlevel1.lo0.192.168.168.167.plist' -$ sudo cp $file $libdir} + +$ sudo cp $file $libdir + $ sudo chmod 0644 $libdir/$file + $ sudo chown root:wheel $libdir/$file + $ sudo launchctl load $libdir/$file - Configure application: From 0c240636afeb98172825ecfb4d3b32e05f0eabcc Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:15:59 -0600 Subject: [PATCH 12/20] Update configuringDevEnv.md --- configuringDevEnv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 285da93f..e32a945b 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -13,7 +13,7 @@ $ cd osf.io} - Alias the loopback interface: -$ export libdir='/Library/LaunchDaemons' +```$ export libdir='/Library/LaunchDaemons'``` $ export file='com.runlevel1.lo0.192.168.168.167.plist' From ff21f6b196dfccf28914cb933d354d65fbd2edd1 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:16:11 -0600 Subject: [PATCH 13/20] Update configuringDevEnv.md --- configuringDevEnv.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index e32a945b..5bad4182 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -14,8 +14,7 @@ $ cd osf.io} - Alias the loopback interface: ```$ export libdir='/Library/LaunchDaemons'``` - -$ export file='com.runlevel1.lo0.192.168.168.167.plist' +```$ export file='com.runlevel1.lo0.192.168.168.167.plist'``` $ sudo cp $file $libdir From c6041cd3068ebf4de2fb577b05866a852a5530c5 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:16:18 -0600 Subject: [PATCH 14/20] Update configuringDevEnv.md --- configuringDevEnv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 5bad4182..499a0f01 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -14,6 +14,7 @@ $ cd osf.io} - Alias the loopback interface: ```$ export libdir='/Library/LaunchDaemons'``` + ```$ export file='com.runlevel1.lo0.192.168.168.167.plist'``` $ sudo cp $file $libdir From 94a4cb9677364aa2a678cbf1d31384e0fe287bd0 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:16:55 -0600 Subject: [PATCH 15/20] Update configuringDevEnv.md --- configuringDevEnv.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 499a0f01..74aa0a6e 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -4,8 +4,10 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](http - Clone the repository: -$ git clone [osf.io] -$ cd osf.io} + + - ```$ git clone [osf.io]``` + + - ```$ cd osf.io``` - Install the Docker Client From e39baca36e4f06d08473560a80e5de6641aa4c32 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:17:14 -0600 Subject: [PATCH 16/20] Update configuringDevEnv.md --- configuringDevEnv.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 74aa0a6e..9bf7630a 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -4,9 +4,7 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](http - Clone the repository: - - ```$ git clone [osf.io]``` - - ```$ cd osf.io``` - Install the Docker Client @@ -15,7 +13,7 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](http - Alias the loopback interface: -```$ export libdir='/Library/LaunchDaemons'``` + - ```$ export libdir='/Library/LaunchDaemons'``` ```$ export file='com.runlevel1.lo0.192.168.168.167.plist'``` From 902c516a500280fbed61e30a9d696653fcace135 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:21:19 -0600 Subject: [PATCH 17/20] Clean up markdown --- configuringDevEnv.md | 86 +++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 9bf7630a..6ecc2b9f 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -2,7 +2,6 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md), correspondence with Fitz Elliot, and the [documentation](https://cosdev.readthedocs.io/en/latest/osf/setup.html): modified to fix errors. - - Clone the repository: - ```$ git clone [osf.io]``` - ```$ cd osf.io``` @@ -12,58 +11,48 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](http - Grant Docker minimum resources of 1 CPU, 8GB memory, 2GB swap, and 32GB disk image size - Alias the loopback interface: - - ```$ export libdir='/Library/LaunchDaemons'``` - -```$ export file='com.runlevel1.lo0.192.168.168.167.plist'``` - -$ sudo cp $file $libdir - -$ sudo chmod 0644 $libdir/$file - -$ sudo chown root:wheel $libdir/$file - -$ sudo launchctl load $libdir/$file + - ```$ export file='com.runlevel1.lo0.192.168.168.167.plist'``` + - ```$ sudo cp $file $libdir``` + - ```$ sudo chmod 0644 $libdir/$file``` + - ```$ sudo chown root:wheel $libdir/$file``` + - ```$ sudo launchctl load $libdir/$file``` - Configure application: -$ cp ./website/settings/local-dist.py ./website/settings/local.py -$ cp ./api/base/settings/local-dist.py ./api/base/settings/local.py -$ cp ./docker-compose-dist.override.yml ./docker-compose.override.yml -$ cp ./tasks/local-dist.py ./tasks/local.py + - ```$ cp ./website/settings/local-dist.py ./website/settings/local.py``` + - ```$ cp ./api/base/settings/local-dist.py ./api/base/settings/local.py``` + - ```$ cp ./docker-compose-dist.override.yml ./docker-compose.override.yml``` + - ```$ cp ./tasks/local-dist.py ./tasks/local.py``` - Start Application: -$ docker compose up requirements mfr_requirements wb_requirements -$ docker compose up -d elasticsearch postgres mongo rabbitmq -$ rm -Rf ./node_modules -$ docker compose up -d assets -$ docker compose up -d admin_assets -$ docker-compose up -d mfr wb fakecas sharejs -$ docker-compose run --rm web python3 manage.py migrate -$ docker-compose up -d worker web api admin preprints registries ember\_osf\_web + - ```$ docker compose up requirements mfr_requirements wb_requirements``` + - ```$ docker compose up -d elasticsearch postgres mongo rabbitmq``` + - ```$ rm -Rf ./node_modules``` + - ```$ docker compose up -d assets``` + - ```$ docker compose up -d admin_assets``` + - ```$ docker-compose up -d mfr wb fakecas sharejs``` + - ```$ docker-compose run --rm web python3 manage.py migrate``` + - ```$ docker-compose up -d worker web api admin preprints registries ember\_osf\_web``` - *Note: once it has been setup, you can [quickstart](https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md\#quickstart-running-all-osf-services-in-the-background) to quickly launch in the future.* - - Access the OSF at **http://localhost:5000**. - - Click sign up to create an account. - - Access the 'web' containers logs to view the confirmation email for new accounts: - -- $ docker compose logs -f -{}-tail 1000 web - +- ```$ docker compose logs -f --tail 1000 web``` - Copy the confirmation link and paste into the browser to confirm the account then log in using the email address used to create the account. This allows test files, projects, and folders to be created and accessed through the normal methods. -# Instructions for building and testing the modified MFR container: +## Instructions for building and testing the modified MFR container: - Go to the **modular-file-renderer** directory -- $ docker image build -t mfr:local . +- ```$ docker image build -t mfr:local .``` - Go to the **osf.io** directory - Edit the **docker-compose.yml** file. Under **mfr** and **mfr_requirements**, change the image to **image: mfr:local** -- $ docker compose up -d --force-recreate mfr_requirements -- $ docker compose up -d --force-recreate mfr +- ```$ docker compose up -d --force-recreate mfr_requirements``` +- ```$ docker compose up -d --force-recreate mfr``` - Restart the Docker application + ### In order to verify that the version of MFR you are running is the correct, most up to date version: - Modify the version number in **modular-file-renderer/mfr/version.py** to indicate that changes have been made. @@ -76,29 +65,28 @@ $ docker-compose up -d worker web api admin preprints registries ember\_osf\_web - Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea. - $ docker system prune -a + # Configuring the development environment for MFR: Instructions for MacOS Big Sur compiled from []**CONTRIBUTING.rst**](https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/CONTRIBUTING.rst), [**README.md**](https://github.com/CenterForOpenScience/modular-file-renderer/blob/develop/README.md), the [installation documentation](https://modular-file-renderer.readthedocs.io/en/latest/install.html\#install) and the [contribution documentation](https://modular-file-renderer.readthedocs.io/en/latest/contributing.html) and modified to fix errors. - Clone the repository: -$ git clone [modular-file-renderer] -$ cd modular-file-renderer + - ```$ git clone [modular-file-renderer]``` + - ```$ cd modular-file-renderer``` - Create the virtual environment: - -- $ pip install virtualenv virtualenvwrapper -- $ brew update -- $ brew install python3 r pspp unoconv pyenv + - ```$ pip install virtualenv virtualenvwrapper``` + - ```$ brew update``` + - ```$ brew install python3 r pspp unoconv pyenv``` - Add the following initialization lines to either the **~/.bashrc** or **~/.zprofile** files for either bash or zsh shells respectively: -**eval "$(pyenv init -)"** -**eval "$(pyenv virtualenv-init -)"** +```**eval "$(pyenv init -)"** +**eval "$(pyenv virtualenv-init -)"**``` -- $ source ~/.[bashrc or zprofile] -- $ pyenv virtualenv 3.6.4 mfr -- $ pip install setuptools==37.0.0 -- $ pip install invoke==0.13.0 +- ```$ source ~/.[bashrc or zprofile]``` +- ```$ pyenv virtualenv 3.6.4 mfr``` +- ```$ pip install setuptools==37.0.0``` +- ```$ pip install invoke==0.13.0``` - Modify **requirements.txt** to update the version number for **reportlab==3.4.0** to **reportlab==3.5.56** due to an incompatibility with the old version. -- $ invoke install -d +- ```$ invoke install -d``` - In order to run the development unit testing procedure: - -- $ invoke test + - ```$ invoke test``` From dff1f5c34b44f8f376bbe83c397c608faa837192 Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:22:11 -0600 Subject: [PATCH 18/20] Update configuringDevEnv.md --- configuringDevEnv.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index 6ecc2b9f..a22da81c 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -63,7 +63,7 @@ Instructions for MacOS Big Sur compiled from [**README-docker-compose.md**](http ## Debugging Problems - Running out of memory in Docker can be solved by doing a system prune of the containers and reinstalling them. Allocating more memory in Docker is a good idea. -- $ docker system prune -a +- ```$ docker system prune -a``` # Configuring the development environment for MFR: @@ -78,8 +78,8 @@ Instructions for MacOS Big Sur compiled from []**CONTRIBUTING.rst**](https://git - ```$ brew install python3 r pspp unoconv pyenv``` - Add the following initialization lines to either the **~/.bashrc** or **~/.zprofile** files for either bash or zsh shells respectively: -```**eval "$(pyenv init -)"** -**eval "$(pyenv virtualenv-init -)"**``` +**eval "$(pyenv init -)"** +**eval "$(pyenv virtualenv-init -)"** - ```$ source ~/.[bashrc or zprofile]``` - ```$ pyenv virtualenv 3.6.4 mfr``` From 85a689540a64aace776d90d774de4a0c41b0aa1a Mon Sep 17 00:00:00 2001 From: cbb-lanl <86747960+cbb-lanl@users.noreply.github.com> Date: Fri, 16 Jul 2021 16:22:48 -0600 Subject: [PATCH 19/20] Update configuringDevEnv.md --- configuringDevEnv.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/configuringDevEnv.md b/configuringDevEnv.md index a22da81c..fed57a39 100644 --- a/configuringDevEnv.md +++ b/configuringDevEnv.md @@ -78,8 +78,10 @@ Instructions for MacOS Big Sur compiled from []**CONTRIBUTING.rst**](https://git - ```$ brew install python3 r pspp unoconv pyenv``` - Add the following initialization lines to either the **~/.bashrc** or **~/.zprofile** files for either bash or zsh shells respectively: -**eval "$(pyenv init -)"** -**eval "$(pyenv virtualenv-init -)"** +``` +eval "$(pyenv init -)" +eval "$(pyenv virtualenv-init -)" +``` - ```$ source ~/.[bashrc or zprofile]``` - ```$ pyenv virtualenv 3.6.4 mfr``` From ccc4a6c7b1ef2e7d34f5922feb950a6276569bfb Mon Sep 17 00:00:00 2001 From: Fitz Elliott Date: Wed, 8 Dec 2021 21:56:29 -0500 Subject: [PATCH 20/20] convert travis ci to github actions * conversion based off @aaxelb's work in @CenterForOpenScience/SHARE * update CI badge urls in README.md * add explicit upload to coveralls * replace python-coveralls with coveralls in dev-requirements.txt * remove old travis config files [ENG-3265] --- .github/workflows/test-build.yml | 63 ++++++++++++++++++++++++++++++++ .travis.yml | 41 --------------------- README.md | 6 +-- dev-requirements.txt | 2 +- travis-config.json | 1 - 5 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 .github/workflows/test-build.yml delete mode 100644 .travis.yml delete mode 100644 travis-config.json diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml new file mode 100644 index 00000000..2c77176e --- /dev/null +++ b/.github/workflows/test-build.yml @@ -0,0 +1,63 @@ +name: mfr_ci_testing + +on: [push, pull_request, workflow_dispatch] + +jobs: + + build: + runs-on: ubuntu-20.04 + env: + GHA_DISTRO: ubuntu-20.04 + if: "!contains(github.event.head_commit.message, 'skip ci')" + strategy: + matrix: + python-version: [3.6] + steps: + - name: Git checkout + uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Cache Build Requirements + id: pip-cache-step + uses: actions/cache@v2 + with: + path: ${{ env.pythonLocation }} + key: ${{ env.GHA_DISTRO }}-${{ env.pythonLocation }}-${{ hashFiles('requirements.txt', 'dev-requirements.txt') }} + - name: install dependencies + if: steps.pip-cache-step.outputs.cache-hit != 'true' + run: | + python -m pip install --upgrade pip + pip install -r dev-requirements.txt + + runtests: + name: Run unit tests + needs: build + runs-on: ubuntu-20.04 + env: + GHA_DISTRO: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.6 + uses: actions/setup-python@v2 + with: + python-version: 3.6 + - name: Cache pip + uses: actions/cache@v2 + with: + path: ${{ env.pythonLocation }} + key: ${{ env.GHA_DISTRO }}-${{ env.pythonLocation }}-${{ hashFiles('requirements.txt', 'dev-requirements.txt') }} + - name: run syntax checks + run: | + flake8 . + - name: build plugins + run: | + python setup.py develop + - name: run unit tests + run: | + py.test --cov-report term-missing --cov mfr tests + - name: Upload coverage data to coveralls.io + run: coveralls --service=github + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0ead8959..00000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: python - -python: - - "3.5" - - "3.6" - -sudo: false - -cache: - directories: - - $HOME/wheelhouse - -before_install: - - export WHEELHOUSE=$HOME/wheelhouse - -install: - - travis_retry pip install --upgrade pip - - travis_retry pip install setuptools==37.0.0 - - travis_retry pip install wheel==0.26.0 - - travis_retry pip install invoke==0.13.0 - - travis_retry invoke wheelhouse --develop - - travis_retry invoke install --develop - -env: - - MFR_CONFIG=./travis-config.json - -script: - - invoke test - -before_cache: - # force reinstall for reqs pulled from github repos - - rm -f $HOME/wheelhouse/xlrd-*.whl - - rm -f $HOME/wheelhouse/waterbutler-*.whl - - rm -f $HOME/wheelhouse/aiohttpretty-*.whl - - -notifications: - flowdock: 0221882cdda034c0e9ac2a0e766053dd - -after_success: - coveralls diff --git a/README.md b/README.md index 14187c90..cf2a5382 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # MFR (Modular File Renderer) -`master` Build Status: [![Build Status](https://travis-ci.org/CenterForOpenScience/modular-file-renderer.svg?branch=master)](https://travis-ci.org/CenterForOpenScience/modular-file-renderer) +`master` Build Status: ![Build Status](https://github.com/CenterForOpenScience/modular-file-renderer/actions/workflows/test-build.yml/badge.svg?branch=master)[![Coverage Status](https://coveralls.io/repos/github/CenterForOpenScience/modular-file-renderer/badge.svg?branch=master)](https://coveralls.io/github/CenterForOpenScience/modular-file-renderer?branch=master) -`develop` Build Status: [![Build Status](https://travis-ci.org/CenterForOpenScience/modular-file-renderer.svg?branch=develop)](https://travis-ci.org/CenterForOpenScience/modular-file-renderer) - -[![Coverage Status](https://coveralls.io/repos/github/CenterForOpenScience/modular-file-renderer/badge.svg)](https://coveralls.io/github/CenterForOpenScience/modular-file-renderer) +`develop` Build Status: ![Build Status](https://github.com/CenterForOpenScience/modular-file-renderer/actions/workflows/test-build.yml/badge.svg?branch=develop)[![Coverage Status](https://coveralls.io/repos/github/CenterForOpenScience/modular-file-renderer/badge.svg?branch=develop)](https://coveralls.io/github/CenterForOpenScience/modular-file-renderer?branch=develop) A Python package for rendering files to HTML via an embeddable iframe. diff --git a/dev-requirements.txt b/dev-requirements.txt index 2ae08bb4..37036c25 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -5,6 +5,7 @@ beautifulsoup4 colorlog==2.5.0 +coveralls flake8==3.0.4 ipdb mccabe @@ -12,5 +13,4 @@ pydevd==0.0.6 pyflakes pytest==2.8.2 pytest-cov==2.2.0 -python-coveralls==2.9.1 pyzmq==14.4.1 diff --git a/travis-config.json b/travis-config.json deleted file mode 100644 index 9e26dfee..00000000 --- a/travis-config.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file