diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..be006de9a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +# Keep GitHub Actions up to date with GitHub's Dependabot... +# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot +# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + groups: + github-actions: + patterns: + - "*" # Group all Actions updates into a single larger pull request + schedule: + interval: weekly diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml new file mode 100644 index 000000000..29db2cb51 --- /dev/null +++ b/.github/workflows/continuous_integration.yml @@ -0,0 +1,77 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Continuous Integration + +on: [push, pull_request] + +jobs: + build_and_test: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install build prerequisites + run: | + python -m pip install --upgrade build pip + sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev swig libevent-dev + - name: Setup protoc + uses: arduino/setup-protoc@v3 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Create OpenHTF package + run: | + python -m build + - name: Test with tox + run: | + python -m pip install tox tox-gh-actions + tox + - name: Publish to Coveralls with GitHub Action + uses: coverallsapp/github-action@v2 + with: + parallel: true + flag-name: python-${{ matrix.python-version }} + + web_ui: + runs-on: ubuntu-latest + defaults: + run: + working-directory: openhtf/output/web_gui + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm install + - run: npm run build + + finish: + needs: build_and_test + if: ${{ always() }} + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true diff --git a/.github/workflows/python_publish.yml b/.github/workflows/python_publish.yml new file mode 100644 index 000000000..91d809189 --- /dev/null +++ b/.github/workflows/python_publish.yml @@ -0,0 +1,106 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Upload Python Package to PyPI and TestPyPI + +on: + release: + types: [published] + +jobs: + build: + name: Build OpenHTF distribution + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Install build prerequisites + run: | + sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev swig libevent-dev + - name: Setup protoc + uses: arduino/setup-protoc@v3 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Build a binary wheel and source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: Publish OpenHTF distribution to PyPI + if: startsWith(github.ref, 'refs/tags') + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/openhtf + permissions: + id-token: write + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + publish-to-testpypi: + name: Publish OpenHTF distribution to TestPyPI + needs: + - build + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/openhtf + + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + diff --git a/.gitignore b/.gitignore index 3a3161c23..830849eee 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ htmlcov/ env/ venv/ .env +.venv # built protos *_pb2.py diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8df6732a6..000000000 --- a/.travis.yml +++ /dev/null @@ -1,37 +0,0 @@ -language: python -matrix: - include: - - python: 3.6 - env: TOXENV=py36 -addons: - apt: - packages: - - python3 - - python3-pip - - swig - - libusb-1.0-0-dev - - libprotobuf-dev -cache: - pip: true - apt: true - directories: - - "$HOME/.cache/pip" -install: -- pip install tox coveralls -- pip install -e . -- wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip -- unzip protoc-3.6.1-linux-x86_64.zip -- sudo cp bin/protoc /usr/bin/protoc && sudo chmod 777 /usr/bin/protoc -- sudo cp -r include/. /usr/include && sudo chmod -R +r /usr/include/google -- protoc --version -script: tox -after_success: -- coveralls -deploy: - provider: pypi - user: "__token__" - on: - tags: true - password: - secure: gWriMCwCITTFTXKl4k7/eVYpx07N/z2zUGxZ3lme/pl6mRfJvj8QbpvnJAQGNn5VEZfWuuKveCoAySfrLcojV8RJuaRLcAnIuJInZt/Cf8QXmHLm7LK9xAnKofi++RRqk0B81CwbKjq3/JhMmygvSjSR5vRDogo3KB2GHRnE3HQUSy3IlBeZDDDpr7LcNcNVSr/z9TXC1/UA05erhUvRWuMiDI9AKqvPZ80K+GlzWEPSxkeFotC/i7PyrZfJWEzVPrgt1iFOK9lNmh5lKyQ4do0nuVHAZFcxsMb+6uBek7WNgmUOUAhOTHa/AM//b8qIhVzSPFc8tQlqdyN6lH8l0SbbzX7BkKNqS1hL5XzLJ+/VZgBbSUDWSDq08Dmu4snRvxPZc6RzfmQKQ0H0esOKzBwS8dIAQDEVwj13WuCnV7G0yHD2yRXmyWbLcbhDW7rNwC7VsyenPA9SwJ9vrCRoCuB3+zKERAya47dgflFHtxITHVdDR/tJ7h83YiEuVp/GkdOOet2gHMO5HyqoipaXryg7fu7JAhZ727l9t8PGWWKwKE0GBL7/IgrAIhR3GuYK33fInB2SpSoAmoxipfU31TpO1Xb+WT+yQwXft+wFYK6DH65yhaedHqKnxu7ph2ZE36XB4qY84sbvE/GgWF6KJjXoA1RTxmohI97i2dmTQJI= - skip_existing: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7217c5a0..5a59078f1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -231,11 +231,31 @@ virtualenv venv # Activate the new virtualenv. . venv/bin/activate -# Update setuptools. -pip install setuptools --upgrade +# Update build (run setuptools). +pip install build --upgrade # Install openhtf into the virtualenv in dev mode. -python setup.py develop +pip install --editable . + +# Install tox and run unit tests. +pip install tox +tox +``` + +As a developer it's a good practice to verify wheel-building. + +``` +python -m build +``` + +This will create a .whl in the `dist` directory. Try creating a fresh venv in +a different directory, following steps above, and installing the wheel there: + +``` +pip install path/to/openhtf.whl + +# Try launching the dashboard server. +python -m openhtf.output.servers.dashboard_server ``` ### MacOS @@ -268,7 +288,7 @@ virtualenv venv . venv/bin/activate # Install openhtf into the virtualenv in dev mode. -python setup.py develop +pip install --editable . ``` If you're having issues with the python setup, it's possible that the problem is due to El Capitan not including ssl headers. This [link](http://adarsh.io/bundler-failing-on-el-capitan/) may help you in that regard. @@ -278,7 +298,7 @@ OpenHTF ships with a built-in web gui found in the `openhtf.output.web_gui` modu We don't expect everyone to go through the steps of building the frontend from source, so we provide a prebuilt version of the frontend in the -`openhtf/output/web_gui/prebuilt` directory. If you don't plan to contribute to +`openhtf/output/web_gui/` directory. If you don't plan to contribute to the built-in frontend, you can feel free to stop reading here; OpenHTF will automatically use the the prebuilt version of the frontend we include. @@ -318,12 +338,8 @@ npm start ``` Now you've got the frontend building, but you still need to serve it. The -frontend server is started as a runnable module. In a terminal where your Python -virtual environment (set up above) is active, start the server with: - -```bash -python -m openhtf.output.web_gui -``` +frontend server is started as a runnable module. See the associated +[readme](openhtf/output/web_gui/README.md). If you want the server to automatically restart when changes are detected, use the `--dev` flag. diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e3718a83e..225413614 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -17,3 +17,4 @@ Joe Ethier John Hawley Keith Suda-Cederquist Kenneth Schiller +Christian Paulin diff --git a/LICENSE b/LICENSE index d64569567..fcfaa50a9 100644 --- a/LICENSE +++ b/LICENSE @@ -200,3 +200,29 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + +=============================================================================== +License for angular +=============================================================================== +The MIT License + +Copyright (c) 2010-2022 Google LLC. https://angular.io/license + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..179921378 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include openhtf/output/proto/*.proto + diff --git a/README.md b/README.md index 166644b27..a407af7ee 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ # OpenHTF The open-source hardware testing framework. -[![Build Status](https://travis-ci.org/google/openhtf.svg?branch=master)](https://travis-ci.org/google/openhtf) +[![Build Status](https://github.com/google/openhtf/actions/workflows/build_and_deploy.yml/badge.svg?branch=master)](https://github.com/google/openhtf/actions?branch=master) [![Coverage Status](https://coveralls.io/repos/google/openhtf/badge.svg?branch=master&service=github)](https://coveralls.io/github/google/openhtf?branch=master) - -[Issue Stats](http://issuestats.com/github/google/openhtf) +[![Percentage of issues still open](http://isitmaintained.com/badge/open/google/openhtf.svg)](http://isitmaintained.com/project/google/openhtf "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/google/openhtf.svg)](http://isitmaintained.com/project/google/openhtf "Average time to resolve an issue") ## Overview OpenHTF is a Python library that provides a set of convenient abstractions @@ -40,11 +40,8 @@ If you want to install from source instead (for example, if you want some new feature that hasn't made it to the production release yet), you can download [the source code](https://github.com/google/openhtf) via [git](https://git-scm.com/) or other means, and install the `openhtf` package -into your Python environment using the standard `setup.py` script. - -```bash -python setup.py install -``` +into your Python environment using the standard `build` command. See +[CONTRIBUTING.md](CONTRIBUTING.md) for details. ## Using OpenHTF diff --git a/bin/units_from_xls.py b/bin/units_from_xls.py index 36bc70188..824f180c0 100644 --- a/bin/units_from_xls.py +++ b/bin/units_from_xls.py @@ -44,7 +44,6 @@ import sys import tempfile -import six import xlrd # Column names for the columns we care about. This list must be populated in @@ -163,10 +162,10 @@ def __call__(self, name_or_suffix): '15': 'FIFTEEN', '30': 'THIRTY', '\\': '_', - six.unichr(160): '_', # NO-BREAK SPACE - six.unichr(176): 'DEG_', # DEGREE SIGN - six.unichr(186): 'DEG_', # MASCULINE ORDINAL INDICATOR - six.unichr(8211): '_', # EN DASH + chr(160): '_', # NO-BREAK SPACE + chr(176): 'DEG_', # DEGREE SIGN + chr(186): 'DEG_', # MASCULINE ORDINAL INDICATOR + chr(8211): '_', # EN DASH } @@ -222,7 +221,7 @@ def unit_defs_from_sheet(sheet, column_names): rows = sheet.get_rows() # Find the indices for the columns we care about. - for idx, cell in enumerate(six.next(rows)): + for idx, cell in enumerate(next(rows)): if cell.value in column_names: col_indices[cell.value] = idx @@ -250,7 +249,7 @@ def unit_key_from_name(name): """Return a legal python name for the given name for use as a unit key.""" result = name - for old, new in six.iteritems(UNIT_KEY_REPLACEMENTS): + for old, new in UNIT_KEY_REPLACEMENTS.items(): result = result.replace(old, new) # Collapse redundant underscores and convert to uppercase. diff --git a/docs/event_sequence.md b/docs/event_sequence.md index 3d95b07cf..8861d20af 100644 --- a/docs/event_sequence.md +++ b/docs/event_sequence.md @@ -75,7 +75,7 @@ callbacks. `PhaseGroup` collections behave like contexts. They are entered if their `setup` phases are all non-terminal; if this happens, the `teardown` phases are -guarenteed to run. `PhaseGroup` collections can contain additional `PhaseGroup` +guaranteed to run. `PhaseGroup` collections can contain additional `PhaseGroup` instances. If a nested group has a terminal phase, the outer groups will trigger the same shortcut logic. @@ -123,7 +123,7 @@ When you hit Ctrl-C to the process the following occurs: `PhaseGroup` main phase, the phase's thread is attempted to be killed. No other phases of these kinds are run. * `PhaseGroup` teardown phases are still run unless a second Ctrl-C is sent. -* We then follow the same steps as in [Test error shirt-circuiting]( - #test-error-shirt-circuiting) +* We then follow the same steps as in [Test error short-circuiting]( + #test-error-short-circuiting) * All plugs are deleted. * Test outcome is ABORTED for output callbacks. diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 000000000..d2aade794 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,72 @@ +# Running the examples + +## Install dependencies + +Some examples have their own additional dependencies. They can be installed +with the following command: + +``` +# Activate your virtualenv if not already done. +pip install pandas +``` + +## Running the examples + +Each example can be run as a Python script, so for `measurements.py`: + +``` +python examples/measurements.py +``` + +Running the test will print the outcome on the terminal. You can examine +the run's JSON file, generated in the working directory, to view the +measurements for the run. This example generates a JSON output because it +configures one via output callbacks; read on for more examples with other +types of outputs. + +Some examples also have user prompts, you'll have to enter some text at the +prompt to continue the example. + +## List of examples + +### Canonical examples + +1. [`hello_world.py`](hello_world.py): start here if learning how to write + an OpenHTF test. + Comments explain usage of basic OpenHTF features: measurements, phases, + `TestApi` and the OpenHTF test, and output callbacks. +2. [`measurements.py`](measurements.py): measurements are the canonical + mechanism to record text or numeric parameters for a phase. + This example walks you through defining measurements with pass-fail rules ("validators"), units, dimensions, and how to set the measurements from + your phases. +3. [`with_plugs.py`](with_plugs.py): how to define and subclass plugs, and + use them in a phase. +4. [`frontend_example.py`](frontend_example.py): How to use the OpenHTF web + frontend in a test. This gives your test a GUI via the default browser on + the system. +5. [`all_the_things.py`](all_the_things.py): demonstates use of plugs, + measurements, attachments and `PhaseOptions`. Multiple phases are sequenced + via a `Test` and executed, with some output callbacks defined (JSON file, + pickle file and console). + +### Feature showcases + +1. [`checkpoints.py`](checkpoints.py): checkpoints with measurements can be + used to stop a test if any phase before the checkpoint had failed + measurements. + By default, failed measurements don't stop a test execution. +2. [`stop_on_first_failure.py`](stop_on_first_failure.py): shows how to use + `TestOptions`, in this case the `stop_on_first_failure` option, to + customize test execution. + Also shows how to set this via a `Configuration`. +3. [`ignore_early_canceled_tests.py`](ignore_early_canceled_tests.py): shows + how to customize output callbacks; in this case, JSON output. +4. [`phase_groups.py`](phase_groups.py): phase groups can be used to combine + phases with their own setup and teardown logic. +5. [`repeat.py`](repeat.py): uses `openhtf.PhaseResult.REPEAT` to + conditionally repeat execution of a phase in a test. + +### Tutorials + +1. [resistor_tutorial](resistor_tutorial/): Walk-through on how to validate a resistor using Measurements and Plugs. + diff --git a/examples/__init__.py b/examples/__init__.py index e69de29bb..6d6d1266c 100644 --- a/examples/__init__.py +++ b/examples/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/examples/all_the_things.py b/examples/all_the_things.py index 0a1595382..899663637 100644 --- a/examples/all_the_things.py +++ b/examples/all_the_things.py @@ -28,11 +28,9 @@ from openhtf.output.callbacks import json_factory from openhtf.plugs import user_input from openhtf.util import units -from six.moves import range -from six.moves import zip -@htf.plug(example=example_plugs.ExamplePlug) +@htf.plug(example=example_plugs.example_plug_configured) @htf.plug(frontend_aware=example_plugs.ExampleFrontendAwarePlug) def example_monitor(example, frontend_aware): time.sleep(.2) @@ -50,7 +48,7 @@ def example_monitor(example, frontend_aware): docstring='Helpful docstring', units=units.HERTZ, validators=[util.validators.matches_regex('Measurement')]) -@htf.plug(example=example_plugs.ExamplePlug) +@htf.plug(example=example_plugs.example_plug_configured) @htf.plug(prompts=user_input.UserInput) def hello_world(test, example, prompts): """A hello world test phase.""" @@ -112,6 +110,23 @@ def measures_with_args(test, minimum, maximum): test.measurements.replaced_min_max = 1 +@htf.measures( + htf.Measurement('replaced_marginal_min_only').in_range( + 0, 10, '{marginal_minimum}', 8, type=int), + htf.Measurement('replaced_marginal_max_only').in_range( + 0, 10, 2, '{marginal_maximum}', type=int), + htf.Measurement('replaced_marginal_min_max').in_range( + 0, 10, '{marginal_minimum}', '{marginal_maximum}', type=int), +) +def measures_with_marginal_args(test, marginal_minimum, marginal_maximum): + """Phase with measurement with marginal arguments.""" + del marginal_minimum # Unused. + del marginal_maximum # Unused. + test.measurements.replaced_marginal_min_only = 3 + test.measurements.replaced_marginal_max_only = 3 + test.measurements.replaced_marginal_min_max = 3 + + def attachments(test): test.attach('test_attachment', 'This is test attachment data.'.encode('utf-8')) @@ -147,8 +162,8 @@ def teardown(test): test.logger.info('Running teardown') -def main(): - test = htf.Test( +def make_test(): + return htf.Test( htf.PhaseGroup.with_teardown(teardown)( hello_world, set_measurements, @@ -156,6 +171,8 @@ def main(): attachments, skip_phase, measures_with_args.with_args(minimum=1, maximum=4), + measures_with_marginal_args.with_args( + marginal_minimum=4, marginal_maximum=6), analysis, ), # Some metadata fields, these in particular are used by mfg-inspector, @@ -163,6 +180,10 @@ def main(): test_name='MyTest', test_description='OpenHTF Example Test', test_version='1.0.0') + + +def main(): + test = make_test() test.add_output_callbacks( callbacks.OutputToFile( './{dut_id}.{metadata[test_name]}.{start_time_millis}.pickle')) diff --git a/examples/example_config.yaml b/examples/example_config.yaml index 32de548f1..7105e4bcf 100644 --- a/examples/example_config.yaml +++ b/examples/example_config.yaml @@ -1,2 +1,16 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + station_id: hello_world example_plug_increment_size: 3 diff --git a/examples/example_plugs.py b/examples/example_plugs.py index afc0e728f..7e08459c4 100644 --- a/examples/example_plugs.py +++ b/examples/example_plugs.py @@ -14,30 +14,27 @@ """Example plugs for OpenHTF.""" from openhtf.core import base_plugs -from openhtf.util import conf +from openhtf.util import configuration -conf.declare( +CONF = configuration.CONF + +EXAMPLE_PLUG_INCREMENT_SIZE = CONF.declare( 'example_plug_increment_size', default_value=1, description='increment constant for example plug.') -class ExamplePlug(base_plugs.BasePlug): # pylint: disable=no-init +class ExamplePlug(base_plugs.BasePlug): """Example of a simple plug. This plug simply keeps a value and increments it each time increment() is called. You'll notice a few paradigms here: - - @conf.inject_positional_args + - configuration.bind_init_args This is generally a good way to pass in any configuration that your plug needs, such as an IP address or serial port to connect to. If - You want to use your plug outside of the OpenHTF framework, you can - still manually instantiate it, but you must pass the arguments by - keyword (as a side effect of the way inject_positional_args is - implemented). - - For example, if you had no openhtf.conf loaded, you could do this: - my_plug = ExamplePlug(example_plug_increment_size=4) + you want to use your plug outside of the OpenHTF framework, you can + still manually instantiate it. - tearDown() This method will be called automatically by the OpenHTF framework at @@ -61,7 +58,6 @@ class ExamplePlug(base_plugs.BasePlug): # pylint: disable=no-init a with: block at the beginning of every phase where it is used. """ - @conf.inject_positional_args def __init__(self, example_plug_increment_size): self.increment_size = example_plug_increment_size self.value = 0 @@ -79,6 +75,10 @@ def increment(self): return self.value - self.increment_size +example_plug_configured = configuration.bind_init_args( + ExamplePlug, EXAMPLE_PLUG_INCREMENT_SIZE) + + class ExampleFrontendAwarePlug(base_plugs.FrontendAwareBasePlug): """Example of a simple frontend-aware plug. diff --git a/examples/frontend_example.py b/examples/frontend_example.py index fdd7ac457..14824c966 100644 --- a/examples/frontend_example.py +++ b/examples/frontend_example.py @@ -17,7 +17,9 @@ from openhtf.output.servers import station_server from openhtf.output.web_gui import web_launcher from openhtf.plugs import user_input -from openhtf.util import conf +from openhtf.util import configuration + +CONF = configuration.CONF @htf.measures(htf.Measurement('hello_world_measurement')) @@ -27,7 +29,7 @@ def hello_world(test): def main(): - conf.load(station_server_port='4444') + CONF.load(station_server_port='4444') with station_server.StationServer() as server: web_launcher.launch('http://localhost:4444') for _ in range(5): diff --git a/examples/hello_world.py b/examples/hello_world.py index cff69afba..00435e020 100644 --- a/examples/hello_world.py +++ b/examples/hello_world.py @@ -26,14 +26,14 @@ For more information on output, see the output.py example. """ +import os.path + # Import openhtf with an abbreviated name, as we'll be using a bunch of stuff # from it throughout our test scripts. See __all__ at the top of # openhtf/__init__.py for details on what's in top-of-module namespace. import openhtf as htf - # Import this output mechanism as it's the specific one we want to use. from openhtf.output.callbacks import json_factory - from openhtf.plugs import user_input @@ -63,7 +63,7 @@ def hello_world(test): test.measurements.hello_world_measurement = 'Hello Again!' -def main(): +def create_and_run_test(output_dir: str = '.'): # We instantiate our OpenHTF test with the phases we want to run as args. # Multiple phases would be passed as additional args, and additional # keyword arguments may be passed as well. See other examples for more @@ -73,10 +73,13 @@ def main(): # In order to view the result of the test, we have to output it somewhere, # and a local JSON file is a convenient way to do this. Custom output # mechanisms can be implemented, but for now we'll just keep it simple. - # This will always output to the same ./hello_world.json file, formatted - # slightly for human readability. + # With the default output_dir argument, this will always output to the + # same ./hello_world.json file, formatted slightly for human readability. test.add_output_callbacks( - json_factory.OutputToJSON('./{dut_id}.hello_world.json', indent=2)) + json_factory.OutputToJSON( + os.path.join(output_dir, '{dut_id}.hello_world.json'), indent=2 + ) + ) # prompt_for_test_start prompts the operator for a DUT ID, a unique identifier # for the DUT (Device Under Test). OpenHTF requires that a DUT ID is set @@ -89,4 +92,4 @@ def main(): if __name__ == '__main__': - main() + create_and_run_test() diff --git a/examples/measurements.py b/examples/measurements.py index 23b044041..eb99c74db 100644 --- a/examples/measurements.py +++ b/examples/measurements.py @@ -43,16 +43,15 @@ measurements, which some output formats require. """ +import os.path +import random + # Import openhtf with an abbreviated name, as we'll be using a bunch of stuff # from it throughout our test scripts. See __all__ at the top of # openhtf/__init__.py for details on what's in top-of-module namespace. -import random - import openhtf as htf - # Import this output mechanism as it's the specific one we want to use. from openhtf.output.callbacks import json_factory - # You won't normally need to import this, see validators.py example for # more details. It's used for the inline measurement declaration example # below, but normally you'll only import it when you want to define custom @@ -94,9 +93,11 @@ def lots_of_measurements(test): # describing the measurement. Validators can get quite complex, for more # details, see the validators.py example. @htf.measures( - htf.Measurement('validated_measurement').in_range( - 0, - 10).doc('This measurement is validated.').with_units(htf.units.SECOND)) + htf.Measurement('validated_measurement') + .in_range(0, 10) + .doc('This measurement is validated.') + .with_units(htf.units.SECOND) +) def measure_seconds(test): # The 'outcome' of this measurement in the test_record result will be a PASS # because its value passes the validator specified (0 <= 5 <= 10). @@ -112,7 +113,8 @@ def measure_seconds(test): 'inline_kwargs', docstring='This measurement is declared inline!', units=htf.units.HERTZ, - validators=[validators.in_range(0, 10)]) + validators=[validators.in_range(0, 10)], +) @htf.measures('another_inline', docstring='Because why not?') def inline_phase(test): """Phase that declares a measurements validators as a keyword argument.""" @@ -128,7 +130,8 @@ def inline_phase(test): # A multidim measurement including how to convert to a pandas dataframe and # a numpy array. @htf.measures( - htf.Measurement('power_time_series').with_dimensions('ms', 'V', 'A')) + htf.Measurement('power_time_series').with_dimensions('ms', 'V', 'A') +) @htf.measures(htf.Measurement('average_voltage').with_units('V')) @htf.measures(htf.Measurement('average_current').with_units('A')) @htf.measures(htf.Measurement('resistance').with_units('ohm').in_range(9, 11)) @@ -138,7 +141,7 @@ def multdim_measurements(test): for t in range(10): resistance = 10 voltage = 10 + 10.0 * t - current = voltage / resistance + .01 * random.random() + current = voltage / resistance + 0.01 * random.random() dimensions = (t, voltage, current) test.measurements['power_time_series'][dimensions] = 0 @@ -152,20 +155,41 @@ def multdim_measurements(test): test.measurements['average_voltage'] = power_df['V'].mean() # We can convert the dataframe to a numpy array as well - power_array = power_df.as_matrix() + power_array = power_df.to_numpy() test.logger.info('This is the same data in a numpy array:\n%s', power_array) test.measurements['average_current'] = power_array.mean(axis=0)[2] # Finally, let's estimate the resistance test.measurements['resistance'] = ( - test.measurements['average_voltage'] / - test.measurements['average_current']) + test.measurements['average_voltage'] + / test.measurements['average_current'] + ) + + +# Marginal measurements can be used to obtain a finer granularity of by how much +# a measurement is passing. Marginal measurements have stricter minimum and +# maximum limits, which are used to flag measurements/phase/test records as +# marginal without affecting the overall phase outcome. +@htf.measures( + htf.Measurement('resistance') + .with_units('ohm') + .in_range(minimum=5, maximum=17, marginal_minimum=9, marginal_maximum=11) +) +def marginal_measurements(test): + """Phase with a marginal measurement.""" + test.measurements.resistance = 13 -def main(): +def create_and_run_test(output_dir: str = '.'): # We instantiate our OpenHTF test with the phases we want to run as args. - test = htf.Test(hello_phase, again_phase, lots_of_measurements, - measure_seconds, inline_phase, multdim_measurements) + test = htf.Test( + hello_phase, + again_phase, + lots_of_measurements, + measure_seconds, + inline_phase, + multdim_measurements, + ) # In order to view the result of the test, we have to output it somewhere, # and a local JSON file is a convenient way to do this. Custom output @@ -173,7 +197,10 @@ def main(): # This will always output to the same ./measurements.json file, formatted # slightly for human readability. test.add_output_callbacks( - json_factory.OutputToJSON('./measurements.json', indent=2)) + json_factory.OutputToJSON( + os.path.join(output_dir, 'measurements.json'), indent=2 + ) + ) # Unlike hello_world.py, where we prompt for a DUT ID, here we'll just # use an arbitrary one. @@ -181,4 +208,4 @@ def main(): if __name__ == '__main__': - main() + create_and_run_test() diff --git a/examples/phase_groups.py b/examples/phase_groups.py index 0a9c95d6e..326248bdc 100644 --- a/examples/phase_groups.py +++ b/examples/phase_groups.py @@ -14,7 +14,7 @@ """Example OpenHTF Phase Groups. PhaseGroups are used to control phase shortcutting due to terminal errors to -better guarentee when teardown phases run. +better guarantee when teardown phases run. """ import openhtf as htf diff --git a/examples/resistor_tutorial/main_test.py b/examples/resistor_tutorial/main_test.py new file mode 100644 index 000000000..868b5bfa3 --- /dev/null +++ b/examples/resistor_tutorial/main_test.py @@ -0,0 +1,64 @@ +import time + +import resistor_plugs + +import openhtf as htf +from openhtf.output.callbacks import console_summary +from openhtf.util import configuration, units + +CONF = configuration.CONF +SIMULATE_MODE = CONF.declare( + "simulate", default_value=False, description="Set simulation mode" +) +CONF.load(simulate=True) # Change to True if running simulated hardware + + +MultimeterPlug = configuration.bind_init_args( + resistor_plugs.MultimeterPlug, SIMULATE_MODE +) + +PowerSupplyPlug = configuration.bind_init_args( + resistor_plugs.PowerSupplyPlug, SIMULATE_MODE +) + + +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + .in_range(5320, 5880) + .with_units(units.OHM) +) +@htf.plug(dmm=MultimeterPlug) +@htf.plug(supply=PowerSupplyPlug) +def resistor_test( + test, dmm: resistor_plugs.MultimeterPlug, supply: resistor_plugs.PowerSupplyPlug +) -> None: + """Check if resistor value in acceptable. + + Args: + test (Test): Openhtf Test object + dmm (MultimeterPlug): Multimeter object + supply (PowerSupplyPlug): Powr supply object + """ + supply.connect() + dmm.connect() + + input_voltage = 4 # in V + supply.set_voltage(input_voltage) + + time.sleep(3) + current = float(dmm.read_current()[1]) + measured_r = round(input_voltage / current, 3) + test.measurements["resistor_val"] = measured_r + + print(f"R value is: {measured_r}") + + +def main(): + test = htf.Test(resistor_test) + test.add_output_callbacks(console_summary.ConsoleSummary()) + test.execute() + + +if __name__ == "__main__": + main() diff --git a/examples/resistor_tutorial/resistor_plugs.py b/examples/resistor_tutorial/resistor_plugs.py new file mode 100644 index 000000000..86ab1fed0 --- /dev/null +++ b/examples/resistor_tutorial/resistor_plugs.py @@ -0,0 +1,167 @@ +import random +import time + +import pyvisa + +from openhtf.core import base_plugs + +### To use pyvisa ### +# Use rm.list_resources() to find the devices plugged in +# this will return a list of the connected devices such as: +# ('USB0::0x1AB1::0x0E11::DP8C1234567890::INSTR', +# 'ASRL1::INSTR', 'ASRL10::INSTR') +# +# Then run device = rm.open_resource( +# 'USB0::0x1AB1::0x0E11::DP8C1234567890::INSTR' +# ) +# to connect to the device. +# You can check the device ID with device.query("*IDN?") + + +class MultimeterPlug(base_plugs.BasePlug): + """Plug for control of a multimeter with pyvisa. Using the simulate flag + will bypass the hardware. + + Args: + BasePlug (Plug): OpeHTF Plug object. + """ + + def __init__(self, simulate: bool = False) -> None: + self.simulate = simulate + self.logger.info("Logging mode is %s", self.simulate) + self.rm = None + self.multimeter = None + + def connect(self) -> None: + """Connect to the device using pysisa. + Does nothing if using simulation mode. + """ + if not self.simulate: + try: + self.rm = pyvisa.ResourceManager() + self.multimeter = self.rm.open_resource( + "USB0::6833::8458::DM8A265201811::0::INSTR" + ) + self.logger.info("Connected to Multimeter") + except ConnectionRefusedError as error: + self.logger.warning( + """Connection refused : %s, + Device might already be connected""", + error, + ) + + time.sleep(0.1) + + def read_current(self) -> tuple[float]: + """Read current value from the multimter in A. + If simultation mode is active, will return a random value. + + Returns: + tuple[float]: Tuple containing the timestamp + of the measurement and the actual reading + """ + timestamp = time.time() + + if not self.simulate: + current = self.multimeter.query("MEASure:CURRent:DC? AUTO,1E-3")[:-1] + else: + current = str(random.uniform(1, 10)) + + self.logger.info("Reading current: %s A", current) + return (timestamp, current) + + def read_voltage(self) -> tuple[float]: + """Read voltage value from the multimter in V. + If simultation mode is active, will return a random value. + + Returns: + tuple[float]: Tuple containing the timestamp + of the measurement and the actual reading + """ + timestamp = time.time() + + if not self.simulate: + voltage = self.multimeter.query("MEASure:VOLTage:DC? 10,1E-3")[:-1] + else: + voltage = str(random.uniform(1, 10)) + + self.logger.info("Reading voltage: %s V", voltage) + return (timestamp, voltage) + + def tearDown(self) -> None: + """Disconnect from the multimeter. + Important if running multiple tests sequentially. + This can solve "USB busy" errors. + """ + if not self.simulate: + self.rm.close() + + +class PowerSupplyPlug(base_plugs.BasePlug): + """Plug for control of a power supply with pyvisa. + Using the simulate flag will bypass the hardware. + """ + + def __init__(self, simulate: bool = False): + self.simulate = simulate + self.rm = None + self.supply = None + + def connect(self): + """Connect to the device using pyvisa. + Does nothing if using simulation mode. + """ + if not self.simulate: + try: + self.rm = pyvisa.ResourceManager() + self.supply = self.rm.open_resource( + "USB0::6833::42152::DP9D264501253::0::INSTR" + ) + self.supply.write(":OUTP ALL, OFF") + self.logger.info("Connected to Power Supply") + except ConnectionRefusedError as error: + self.logger.warning( + """Connection refused : %s, + Device might already be connected""", + error, + ) + + time.sleep(0.1) + + def set_voltage(self, voltage: float, channel: str = "CH1") -> None: + """Set output voltage for the power supply. + + Args: + voltage (float): Output voltage value (V). + channel (str, optional): Output channel. Defaults to "CH1". + """ + if not self.simulate: + command = f":APPL {channel}, {voltage}" + self.supply.write(command) + self.supply.write(f":OUTP {channel}, ON") + self.logger.info("Setting voltage to: %s V", voltage) + + def close_channels(self) -> None: + """Shut down all output channels.""" + if not self.simulate: + for source in ["CH1", "CH2", "CH3"]: + self.supply.write(f":APPL {source}, 0") + self.supply.write(":OUTP ALL, OFF") + self.logger.info("Shutting down all channels") + + def tearDown(self) -> None: + """Disconnect from the multimeter. + Important if running multiple tests sequentially. + This can solve "USB busy" errors. + """ + if not self.simulate: + self.close_channels() + self.rm.close() + + +if __name__ == "__main__": + my_multimeter = MultimeterPlug() + my_supply = PowerSupplyPlug() + my_multimeter.connect() + + print(my_multimeter.read_current()) diff --git a/examples/resistor_tutorial/resistor_tutorial.md b/examples/resistor_tutorial/resistor_tutorial.md new file mode 100644 index 000000000..c6135335a --- /dev/null +++ b/examples/resistor_tutorial/resistor_tutorial.md @@ -0,0 +1,293 @@ +## Introduction +The goal of this tutorial is to familarize yourself with some OpenHTF basic functionalities. We'll do so by trying to determine the resistance value of a resistor. This will include using a programmable power supply as well as a digital multimeter. + +We will apply a voltage to the resistor, and measure the corresponding current in the circuit. Using Ohm's law $V = R.I$, this should give us an estimate of the resistance value of the resistor : $R = V/I$ +We will then be able to determine if the resistor if good or bad by comparing the measured value to a threshold. + +During this tutorial, you will learn how to use OpenHTF Plugs, Measurements and Configurations. + + +## Writing your first test +The first step of this tutorial is to create a `main_test.py` that will contain our test: + +```python +# main_test.py + +import openhtf as htf + +def resistor_test(test): + """A placeholder phase that we will fill out later in the example.""" + +def main(): + test = htf.Test(resistor_test) + test.execute() + +if __name__ == "__main__": + main() +``` +After execution of the script, you should see as an output in the console that the test has passed : + +```shell +(.venv-htf)$ python main_test.py + +======================= test: openhtf_test outcome: PASS ====================== +``` + +That was easy enough! Now let's start actually testing things. For this, we are going to use the measurement feature of Openhtf. We will tell Openhtf that a certain value inside of a Phase is something we want to measure and the result of the Phase depends on the value that is measured. This is done using a decorator above the Test Phase definition: + +## Making a Measurement + +```python +# main_test.py + +import openhtf as htf + +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + ) +def resistor_test(test): + """A placeholder phase that we will fill out later in the example.""" + +def main(): + test = htf.Test(resistor_test) + test.execute() + +if __name__ == "__main__": + main() +``` + +If you run the test, You should see that it fails : + +```shell +(.venv-htf)$ python main_test.py + +======================= test: openhtf_test outcome: FAIL ====================== +``` +That is because OpenHTF was told that the `resistor_test` Phase was supposed to make a measurement called `resistor_val`, but since we never declared that measurement's value in the `resistor_test` Phase OpenHTF plays it safe and returns a **FAIL** status. + +> *Note* : You might have noticed that there isn't a lot of information explaining exactly why the test failed. We can change that by adding a few lines to use an output callback: + +```python +# main_test.py + +from openhtf.output.callbacks import console_summary +import openhtf as htf + + +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + ) +def resistor_test(test): + """A placeholder phase that we will fill out later in the example.""" + +def main(): + test = htf.Test(resistor_test) + test.add_output_callbacks(console_summary.ConsoleSummary()) + test.execute() + +if __name__ == "__main__": + main() +``` + +This gives us a more detailed output which is very helpful for debugging when developing tests : +```shell +(.venv-htf)$ python main_test.py +:FAIL +failed phase: resistor_test [ran for 0.00 sec] + failed_item: resistor_val (Outcome.UNSET) + measured_value: UNSET + validators: + + +======================= test: openhtf_test outcome: FAIL ====================== +``` + +To define the measurement, we just need to add the line : `test.measurements["resistor_val"] = 10` inside of our `resistor_test` phase. We set it as an arbitrary value for now, but soon this will be given by an actual measurement. + +```python +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + ) +def resistor_test(test): + test.measurements["resistor_val"] = 10 + +``` + +## Creating Plugs + +To move on with our test definition, we need to be able to communicate with lab instruments. In our case, this is going to be a multimeter and a power supply. OpenHTF is meant to be very modular so the boilerplate code that allows us to interact with each device is going to be implemented inside of a `Plug` object in a seperate script. All we need to do for testing is to import the Plugs we need within our test script, and then interact with the device using the Plugs API. + +The goal is not to dive into how to develop Plugs, so we'll just provide the code for the multimeter and the power supply. The tutorial was developed with a Rigol DM858 and Rigol DP932E, but it also includes a simulation mode so you can run everything without the hardware. + + +To use your plugs in a test phase, import them in your script and then declare them inside of a decorator for your test phase : + +```python +import resistor_plugs + +import time +``` +and then +```python +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + ) +@htf.plug(dmm=resistor_plugs.MultimeterPlug) +@htf.plug(supply=resistor_plugs.PowerSupplyPlug) +def resistor_test(test, dmm: resistor_plugs.MultimeterPlug, supply: resistor_plugs.PowerSupplyPlug) -> None: + test.measurements["resistor_val"] = 10 +``` + +All that's left to do is to connect to the instruments, set the voltage, read the resulting current through the circuit and calculate the resistor value: + +```python +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + .with_units(units.OHM) + ) +@htf.plug(dmm=resistor_plugs.MultimeterPlug) +@htf.plug(supply=resistor_plugs.PowerSupplyPlug) +def resistor_test(test, dmm: resistor_plugs.MultimeterPlug, supply: resistor_plugs.PowerSupplyPlug) -> None: + supply.connect() + dmm.connect() + + input_voltage = 5 #in V + supply.set_voltage(input_voltage) + time.sleep(3) # add a short wait for the voltage and current to stabilize + current = float(dmm.read_current()[1]) + + measured_r = input_voltage/current + test.measurements["resistor_val"] = measured_r + print(f"R value is: {measured_r}") +``` + +At this point we can either run the tutorial with some actual hardware, or we can use the simulation mode. + +We'll start off with actual hardware, but check out the [Simulation mode](#using-simulation-mode) as it includes some information on how to use OpenHTF's configuration settings. + +### Hardware connection +To interact with the hardware, we'll be using pyvisa under the hood. This library provides an easy interfacing solution to most devices that accept SCPI commands. Learning how to use pyvisa is out of scope here however. + +Make sure to have your instruments (multimeter and power supply) wired properly, with the resistor and the ammeter in series. + + +Install the required libraries : +```shell +(.venv-htf)$ pip install pyvisa pyvisa-py pyusb +``` + +Then run the script : + +```shell +(.venv-htf)$ python main_test.py +R value is: 5866.153540919828 +:PASS + + +======================= test: openhtf_test outcome: PASS ====================== +``` + +Cool! This test was done with a resistor rated at $5.6\text K\Omega$ $\pm 5 \%$ so our measured value of $5.87 \text K\Omega$ is fine. + +The final step is going to be to add a rule so that our test fails if we have a bad resistor. For that $5\%$ margin, it means we want values in the $[5.320\text K\Omega: 5.880\text K\Omega]$ range. + +OpenHTF provides a convenient feature called a Validator to check this easily. Since we want to check the value of our measurement, we define this validation rule inside of the measurement decorator. For now we're using one of the default validators but it is possible to make your own custom validators for more specific use cases. + +This is also a good opportunity to mention the `openhtf.utils.units` library that OpenHTF provides. This allows you to declare the unit of a measurement within the `@htf.measures()` statement. + +```python +from openhtf.util import units + +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + .in_range(5320, 5880) + .with_units(units.OHM) +) +@htf.plug(dmm=resistor_plugs.MultimeterPlug) +@htf.plug(supply=resistor_plugs.PowerSupplyPlug) +def resistor_test(test, dmm: resistor_plugs.MultimeterPlug, supply: resistor_plugs.PowerSupplyPlug) -> None: +``` + +And now if we run the test with a resistor that is out of range (here a 220 $\Omega$ resistor), we get a fail: + +```shell +(.venv-htf)$ python main_test.py +R value is: 220.493 +:FAIL +failed phase: resistor_test [ran for 3.38 sec] + failed_item: resistor_val (Outcome.FAIL) + measured_value: 220.493 + validators: + validator: 5320 <= x <= 5880 + + +======================= test: openhtf_test outcome: FAIL ====================== +``` +Congratulations, you have a working OpenHTF test that can be deployed in a resistor manufacturing plant! + +## Using Simulation mode + +As mentionned previously, this tutorial can also be done without actual hardware. For this we will use the fact that our plugs have been provided with a simulation mode. In this case, they will return random values when querying data. + +This means we won't have any correlation between the applied voltage and the measured current, but at least we can check that our test sequence works. + +Right now, we make the call to our plugs inside of the `@plug(dmm=MultimeterPlug)` decorator. However this does not allow us to use the fact that our MultimeterPlug object can be instantiated with the `simulate` argument which we will need: + +```python +class MultimeterPlug(BasePlug): + def __init__(self, simulate: bool = False)-> None: + self.simulate = simulate +``` + +To do so, we'll use the configurations built in OpenHTF : `from openhtf.util import configuration`. +Then we load the useful configuration parameters inside of a configuration object: + +```python +CONF = configuration.CONF +SIMULATE_MODE = CONF.declare("simulate", + default_value=False, + description="Set if the test setup is in simulation mode") +CONF.load(simulate=True) +``` + +Finally, we create instances of the MultimeterPlug and PowerSupplyPlug that use this configuration. All that is left to do is to make sure we call these new plugs inside of our phase decorators: + +```python +MultimeterPlug = configuration.bind_init_args(resistor_plugs.MultimeterPlug, SIMULATE_MODE) +PowerSupplyPlug = configuration.bind_init_args(resistor_plugs.PowerSupplyPlug, SIMULATE_MODE) + +@htf.measures( + htf.Measurement("resistor_val") + .doc("Computed resistor value") + .in_range(5320, 5880) + .with_units(units.OHM) +) +@htf.plug(dmm=MultimeterPlug) +@htf.plug(supply=PowerSupplyPlug ) +def resistor_test(test, dmm: resistor_plugs.MultimeterPlug, supply: resistor_plugs.PowerSupplyPlug) -> None: +``` + + +> *Note* : In this example we're manually declaring and uploading a configuration parameter, but it is also possible to load these parameters from a yaml file or a dict. You can read the `configuration.py` module doc for more details. + +If we run it, we'll have a random current value, so the test will most likely fail with our validator, but at least we have something running: + +```shell +(.venv-htf)$ python main_test.py +R value is: 0.733 +:FAIL +failed phase: resistor_test [ran for 3.00 sec] + failed_item: resistor_val (Outcome.FAIL) + measured_value: 0.733 + validators: + validator: 5320 <= x <= 5880 + + +======================= test: openhtf_test outcome: FAIL ====================== +``` diff --git a/examples/stop_on_first_failure.py b/examples/stop_on_first_failure.py index 2628b2961..6b981bd75 100644 --- a/examples/stop_on_first_failure.py +++ b/examples/stop_on_first_failure.py @@ -22,15 +22,17 @@ test.configure(stop_on_first_failure=True) 2. Using config item. This option lets you toggle this feature dynamically. -conf.load(stop_on_first_failure=True) +CONF.load(stop_on_first_failure=True) """ import openhtf as htf from openhtf.output.callbacks import console_summary from openhtf.plugs import user_input -from openhtf.util import conf # pylint: disable=unused-import +from openhtf.util import configuration from openhtf.util import validators +CONF = configuration.CONF + @htf.measures('number_sum', validators=[validators.in_range(0, 5)]) def add_numbers_fails(test): @@ -58,7 +60,7 @@ def main(): # Option 2 : You can disable option 1 and enable below line # to get same result - # conf.load(stop_on_first_failure=True) + # CONF.load(stop_on_first_failure=True) test.execute(test_start=user_input.prompt_for_test_start()) diff --git a/examples/with_plugs.py b/examples/with_plugs.py index 6c45c4a23..9b636ff1a 100644 --- a/examples/with_plugs.py +++ b/examples/with_plugs.py @@ -74,7 +74,7 @@ class PingDnsB(PingPlug): @htf.PhaseOptions(name='Ping-{pinger.host}-{count}') @htf.plug(pinger=PingPlug.placeholder) @htf.measures('total_time_{pinger.host}_{count}', - htf.Measurement('retcode').equals('{expected_retcode}', type=int)) + htf.Measurement('retcode').equals('{expected_retcode}', type=str)) def test_ping(test, pinger, count, expected_retcode): """This tests that we can ping a host. diff --git a/openhtf/__init__.py b/openhtf/__init__.py index b148e72ff..84abf4536 100644 --- a/openhtf/__init__.py +++ b/openhtf/__init__.py @@ -13,60 +13,130 @@ # limitations under the License. """The main OpenHTF entry point.""" +import importlib.metadata import signal -from openhtf import plugs from openhtf.core import phase_executor from openhtf.core import test_record -from openhtf.core.base_plugs import BasePlug -from openhtf.core.diagnoses_lib import diagnose -from openhtf.core.diagnoses_lib import DiagnosesStore -from openhtf.core.diagnoses_lib import Diagnosis -from openhtf.core.diagnoses_lib import DiagnosisComponent -from openhtf.core.diagnoses_lib import DiagPriority -from openhtf.core.diagnoses_lib import DiagResultEnum -from openhtf.core.diagnoses_lib import PhaseDiagnoser -from openhtf.core.diagnoses_lib import TestDiagnoser - -from openhtf.core.measurements import Dimension -from openhtf.core.measurements import Measurement -from openhtf.core.measurements import measures -from openhtf.core.monitors import monitors -from openhtf.core.phase_branches import BranchSequence -from openhtf.core.phase_branches import DiagnosisCheckpoint -from openhtf.core.phase_branches import DiagnosisCondition -from openhtf.core.phase_branches import PhaseFailureCheckpoint -from openhtf.core.phase_collections import PhaseSequence -from openhtf.core.phase_collections import Subtest -from openhtf.core.phase_descriptor import PhaseDescriptor -from openhtf.core.phase_descriptor import PhaseOptions -from openhtf.core.phase_descriptor import PhaseResult -from openhtf.core.phase_group import PhaseGroup -from openhtf.core.phase_nodes import PhaseNode -from openhtf.core.test_descriptor import Test -from openhtf.core.test_descriptor import TestApi -from openhtf.core.test_descriptor import TestDescriptor -from openhtf.core.test_record import PhaseRecord -from openhtf.core.test_record import TestRecord -from openhtf.plugs import plug -from openhtf.util import conf +import openhtf.core.base_plugs +import openhtf.core.diagnoses_lib +import openhtf.core.measurements +import openhtf.core.monitors +import openhtf.core.phase_branches +import openhtf.core.phase_collections +import openhtf.core.phase_descriptor +import openhtf.core.phase_group +import openhtf.core.phase_nodes +import openhtf.core.test_descriptor +import openhtf.plugs +import openhtf.util +from openhtf.util import configuration from openhtf.util import console_output from openhtf.util import data from openhtf.util import functions from openhtf.util import logs from openhtf.util import units -import pkg_resources +__all__ = ( # Expliclty export certain API components. + # Modules. + 'plugs', + 'phase_executor', + 'test_record', + 'configuration', + 'console_output', + 'data', + 'functions', + 'logs', + 'units', + # Public Functions. + 'plug', + 'monitors', + 'diagnose', + 'measures', + # Public Classes. + 'BasePlug', + 'DiagnosesStore', + 'Diagnosis', + 'DiagnosisComponent', + 'DiagPriority', + 'DiagResultEnum', + 'PhaseDiagnoser', + 'TestDiagnoser', + 'Dimension', + 'Measurement', + 'BranchSequence', + 'DiagnosisCheckpoint', + 'DiagnosisCondition', + 'PhaseFailureCheckpoint', + 'PhaseSequence', + 'Subtest', + 'PhaseDescriptor', + 'PhaseNameCase', + 'PhaseOptions', + 'PhaseResult', + 'PhaseGroup', + 'PhaseNode', + 'Test', + 'TestApi', + 'TestDescriptor', + 'PhaseRecord', + 'TestRecord', + # Globals. + 'conf', +) -def get_version(): - """Returns the version string of the 'openhtf' package. +plugs = openhtf.plugs +plug = openhtf.plugs.plug +BasePlug = openhtf.core.base_plugs.BasePlug + +DiagnosesStore = openhtf.core.diagnoses_lib.DiagnosesStore +Diagnosis = openhtf.core.diagnoses_lib.Diagnosis +DiagnosisComponent = openhtf.core.diagnoses_lib.DiagnosisComponent +DiagPriority = openhtf.core.diagnoses_lib.DiagPriority +DiagResultEnum = openhtf.core.diagnoses_lib.DiagResultEnum +PhaseDiagnoser = openhtf.core.diagnoses_lib.PhaseDiagnoser +TestDiagnoser = openhtf.core.diagnoses_lib.TestDiagnoser + +Dimension = openhtf.core.measurements.Dimension +Measurement = openhtf.core.measurements.Measurement + +monitors = openhtf.core.monitors.monitors + +BranchSequence = openhtf.core.phase_branches.BranchSequence +DiagnosisCheckpoint = openhtf.core.phase_branches.DiagnosisCheckpoint +DiagnosisCondition = openhtf.core.phase_branches.DiagnosisCondition +PhaseFailureCheckpoint = openhtf.core.phase_branches.PhaseFailureCheckpoint + +PhaseSequence = openhtf.core.phase_collections.PhaseSequence +Subtest = openhtf.core.phase_collections.Subtest + +diagnose = openhtf.core.phase_descriptor.diagnose +measures = openhtf.core.phase_descriptor.measures +PhaseDescriptor = openhtf.core.phase_descriptor.PhaseDescriptor +PhaseNameCase = openhtf.core.phase_descriptor.PhaseNameCase +PhaseOptions = openhtf.core.phase_descriptor.PhaseOptions +PhaseResult = openhtf.core.phase_descriptor.PhaseResult - Note: the version number doesn't seem to get properly set when using ipython. - """ +PhaseGroup = openhtf.core.phase_group.PhaseGroup + +PhaseNode = openhtf.core.phase_nodes.PhaseNode + +Test = openhtf.core.test_descriptor.Test +TestApi = openhtf.core.test_descriptor.TestApi +TestDescriptor = openhtf.core.test_descriptor.TestDescriptor + +PhaseRecord = test_record.PhaseRecord +TestRecord = test_record.TestRecord + +conf = configuration.CONF + + +def get_version(): + """Returns the version string of the 'openhtf' package.""" try: - return pkg_resources.get_distribution('openhtf') - except pkg_resources.DistributionNotFound: - return 'Unknown - Perhaps openhtf was not installed via setup.py or pip.' + return importlib.metadata.version('openhtf') + except importlib.metadata.PackageNotFoundError: + return 'Unknown - openhtf not installed via pip.' __version__ = get_version() diff --git a/openhtf/core/__init__.py b/openhtf/core/__init__.py index e69de29bb..6d6d1266c 100644 --- a/openhtf/core/__init__.py +++ b/openhtf/core/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/openhtf/core/base_plugs.py b/openhtf/core/base_plugs.py index d1d47cd15..819a34672 100644 --- a/openhtf/core/base_plugs.py +++ b/openhtf/core/base_plugs.py @@ -60,34 +60,41 @@ def TestPhase(test, example): Tearing down ExamplePlug! Plugs will often need to use configuration values. The recommended way -of doing this is with the conf.inject_positional_args decorator: +of doing this is with the configuration.inject_positional_args decorator: from openhtf import plugs - from openhtf.util import conf + from openhtf.util import configuration - conf.declare('my_config_key', default_value='my_config_value') + CONF = configuration.CONF + MY_CONFIG_KEY = CONF.declare('my_config_key', default_value='my_config_value') + + CONF.declare('my_config_key', default_value='my_config_value') class ExamplePlug(base_plugs.BasePlug): '''A plug that requires some configuration.''' - @conf.inject_positional_args def __init__(self, my_config_key) self._my_config = my_config_key -Note that Plug constructors shouldn't take any other arguments; the -framework won't pass any, so you'll get a TypeError. Any values that are only -known at run time must be either passed into other methods or set via explicit -setter methods. See openhtf/conf.py for details, but with the above -example, you would also need a configuration .yaml file with something like: + example_plug_configured = configuration.bind_init_args( + ExamplePlug, MY_CONFIG_KEY) + +Here, example_plug_configured is a subclass of ExamplePlug with bound args for +the initializer, and it can be passed to phases like any other plug. See +openhtf/conf.py for details, but with the above example, you would also need a +configuration .yaml file with something like: my_config_key: my_config_value -This will result in the ExamplePlug being constructed with +This will result in the example_plug_configured being constructed with self._my_config having a value of 'my_config_value'. + +Note that Plug constructors shouldn't take any other arguments; the +framework won't pass any, so you'll get a TypeError. """ import logging -from typing import Any, Dict, Set, Text, Type, Union +from typing import Any, Dict, Text, Type, Union import attr @@ -103,23 +110,35 @@ class InvalidPlugError(Exception): class BasePlug(object): """All plug types must subclass this type. + Okay to use with multiple inheritance when subclassing an existing + implementation that you want to convert into a plug. Place BasePlug last in + the parent list. For example: + + class MyExistingDriver: + def do_something(self): + pass + + class MyExistingDriverPlug(MyExistingDriver, BasePlug): + def tearDown(self): + ... # Implement the BasePlug interface as desired. + Attributes: logger: This attribute will be set by the PlugManager (and as such it doesn't appear here), and is the same logger as passed into test phases via TestApi. """ # Override this to True in subclasses to support remote Plug access. - enable_remote = False # type: bool + enable_remote: bool = False # Allow explicitly disabling remote access to specific attributes. - disable_remote_attrs = set() # type: Set[Text] + disable_remote_attrs = set() # Override this to True in subclasses to support using with_plugs with this # plug without needing to use placeholder. This will only affect the classes # that explicitly define this; subclasses do not share the declaration. - auto_placeholder = False # type: bool + auto_placeholder: bool = False # Default logger to be used only in __init__ of subclasses. # This is overwritten both on the class and the instance so don't store # a copy of it anywhere. - logger = _LOG # type: logging.Logger + logger: logging.Logger = _LOG @util.classproperty def placeholder(cls) -> 'PlugPlaceholder': # pylint: disable=no-self-argument @@ -147,14 +166,12 @@ def _asdict(self) -> Dict[Text, Any]: def tearDown(self) -> None: """This method is called automatically at the end of each Test execution.""" - pass @classmethod def uses_base_tear_down(cls) -> bool: """Checks whether the tearDown method is the BasePlug implementation.""" - this_tear_down = getattr(cls, 'tearDown') - base_tear_down = getattr(BasePlug, 'tearDown') - return this_tear_down.__code__ is base_tear_down.__code__ + this_tear_down = getattr(cls, BasePlug.tearDown.__name__) + return this_tear_down.__code__ is BasePlug.tearDown.__code__ class FrontendAwareBasePlug(BasePlug, util.SubscribableStateMixin): @@ -168,7 +185,7 @@ class FrontendAwareBasePlug(BasePlug, util.SubscribableStateMixin): Since the Station API runs in a separate thread, the _asdict() method of frontend-aware plugs should be written with thread safety in mind. """ - enable_remote = True # type: bool + enable_remote: bool = True @attr.s(slots=True, frozen=True) diff --git a/openhtf/core/diagnoses_lib.py b/openhtf/core/diagnoses_lib.py index 8b29dc227..f8adbf1ff 100644 --- a/openhtf/core/diagnoses_lib.py +++ b/openhtf/core/diagnoses_lib.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Lint as: python3 """Diagnoses: Measurement and meta interpreters. Diagnoses are higher level signals that result from processing multiple @@ -108,7 +107,7 @@ def example_phase(test, reader): def block_test_diag(test_record, diagnoses_store): if (diagnoses_store.has_diagnosis_result( BlockStatusResult.BLOCK0_OUT_OF_SPEC) and - diagnoses_store.has_diganosis_result( + diagnoses_store.has_diagnosis_result( BlockStatusResult.BLOCK1_OUT_OF_SPEC)): return openhtf.Diagnosis( BlockStatusResult.UNIT_OUT_OF_SPEC, @@ -123,17 +122,14 @@ def main(): """ import abc -import collections +from collections.abc import Iterable as CollectionsIterable +import enum import logging -from typing import Any, Callable, DefaultDict, Dict, Iterable, Iterator, List, Optional, Sequence, Set, Text, Type, TYPE_CHECKING, Union +from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Text, Type, TYPE_CHECKING, Union import attr -import enum # pylint: disable=g-bad-import-order -from openhtf.core import phase_descriptor from openhtf.core import test_record from openhtf.util import data -import six -from six.moves import collections_abc if TYPE_CHECKING: from openhtf.core import test_state # pylint: disable=g-import-not-at-top @@ -147,10 +143,6 @@ class InvalidDiagnosisError(Exception): """A Diagnosis was constructed incorrectly.""" -class DuplicateResultError(Exception): - """Different DiagResultEnum instances define the same value.""" - - @attr.s(slots=True) class DiagnosesStore(object): """Storage and lookup of diagnoses.""" @@ -211,8 +203,8 @@ def _convert_result(self, return elif isinstance(diagnosis_or_diagnoses, Diagnosis): yield self._verify_and_fix_diagnosis(diagnosis_or_diagnoses, diagnoser) - elif (isinstance(diagnosis_or_diagnoses, six.string_types) or - not isinstance(diagnosis_or_diagnoses, collections_abc.Iterable)): + elif (isinstance(diagnosis_or_diagnoses, str) or + not isinstance(diagnosis_or_diagnoses, CollectionsIterable)): raise InvalidDiagnosisError( 'Diagnoser {} must return a single Diagnosis or an iterable ' 'of them.'.format(diagnoser.name)) @@ -265,42 +257,6 @@ def execute_test_diagnoser(self, diagnoser: 'BaseTestDiagnoser', self._add_diagnosis(diag) -def check_for_duplicate_results( - phase_iterator: Iterator[phase_descriptor.PhaseDescriptor], - test_diagnosers: Sequence['BaseTestDiagnoser']) -> None: - """Check for any results with the same enum value in different ResultTypes. - - Args: - phase_iterator: iterator over the phases to check. - test_diagnosers: list of test level diagnosers. - - Raises: - DuplicateResultError: when duplicate enum values are found. - """ - all_result_enums = set() # type: Set[Type['DiagResultEnum']] - for phase in phase_iterator: - for phase_diag in phase.diagnosers: - all_result_enums.add(phase_diag.result_type) - for test_diag in test_diagnosers: - all_result_enums.add(test_diag.result_type) - - values_to_enums = collections.defaultdict( - list) # type: DefaultDict[str, Type['DiagResultEnum']] - for enum_cls in all_result_enums: - for entry in enum_cls: - values_to_enums[entry.value].append(enum_cls) - - duplicates = [] # type: List[str] - for result_value, enum_classes in sorted(values_to_enums.items()): - if len(enum_classes) > 1: - duplicates.append('Value "{}" defined by {}'.format( - result_value, enum_classes)) - if not duplicates: - return - raise DuplicateResultError('Duplicate DiagResultEnum values: {}'.format( - '\n'.join(duplicates))) - - def _check_diagnoser(diagnoser: '_BaseDiagnoser', diagnoser_cls: Type['_BaseDiagnoser']) -> None: """Check that a diagnoser is properly created.""" @@ -368,17 +324,15 @@ def possible_results(self) -> List[Text]: def _check_definition(self) -> None: """Internal function to verify that the diagnoser is completely defined.""" - pass -class BasePhaseDiagnoser(six.with_metaclass(abc.ABCMeta, _BaseDiagnoser)): +class BasePhaseDiagnoser(_BaseDiagnoser, abc.ABC): """Base class for using an object to define a Phase diagnoser.""" __slots__ = () @abc.abstractmethod - def run(self, - phase_record: phase_descriptor.PhaseDescriptor) -> DiagnoserReturnT: + def run(self, phase_record: test_record.PhaseRecord) -> DiagnoserReturnT: """Must be implemented to return list of Diagnoses instances. Args: @@ -421,7 +375,7 @@ def _check_definition(self) -> None: 'PhaseDiagnoser run function not defined for {}'.format(self.name)) -class BaseTestDiagnoser(six.with_metaclass(abc.ABCMeta, _BaseDiagnoser)): +class BaseTestDiagnoser(_BaseDiagnoser, abc.ABC): """Base class for using an object to define a Test diagnoser.""" __slots__ = () @@ -547,21 +501,3 @@ def __attrs_post_init__(self) -> None: def as_base_types(self) -> Dict[Text, Any]: return data.convert_to_base_types( attr.asdict(self, filter=_diagnosis_serialize_filter)) - - -def diagnose( - *diagnosers: BasePhaseDiagnoser -) -> Callable[[phase_descriptor.PhaseT], phase_descriptor.PhaseDescriptor]: - """Decorator to add diagnosers to a PhaseDescriptor.""" - check_diagnosers(diagnosers, BasePhaseDiagnoser) - diags = list(diagnosers) - - def decorate( - wrapped_phase: phase_descriptor.PhaseT - ) -> phase_descriptor.PhaseDescriptor: - """Phase decorator to be returned.""" - phase = phase_descriptor.PhaseDescriptor.wrap_or_copy(wrapped_phase) - phase.diagnosers.extend(diags) - return phase - - return decorate diff --git a/openhtf/core/measurements.py b/openhtf/core/measurements.py index efc878db9..816d85bac 100644 --- a/openhtf/core/measurements.py +++ b/openhtf/core/measurements.py @@ -22,7 +22,7 @@ Measurements are described by the measurements.Measurement class. Essentially, the Measurement class is used by test authors to declare measurements by name, and to optionally provide unit, type, and validation information. Measurements -are attached to Test Phases using the @measurements.measures() decorator. +are attached to Test Phases using the @openhtf.measures() decorator. When measurements are output by the OpenHTF framework, the Measurement objects are serialized into the 'measurements' field on the PhaseRecord, which contain @@ -45,11 +45,11 @@ Examples: - @measurements.measures( + @openhtf.measures( measurements.Measurement( 'number_widgets').in_range(5, 10).doc( '''This phase parameter tracks the number of widgets.''')) - @measurements.measures( + @openhtf.measures( *(measurements.Measurement('level_%s' % lvl) for lvl in ('none', 'some', 'all'))) def WidgetTestPhase(test): @@ -59,20 +59,20 @@ def WidgetTestPhase(test): """ import collections +import copy import enum import functools import logging +import typing from typing import Any, Callable, Dict, Iterator, List, Optional, Text, Tuple, Union import attr - from openhtf import util -from openhtf.core import diagnoses_lib -from openhtf.core import phase_descriptor from openhtf.util import data from openhtf.util import units as util_units from openhtf.util import validators -import six +if typing.TYPE_CHECKING: + from openhtf.core import diagnoses_lib try: # pylint: disable=g-import-not-at-top @@ -119,7 +119,7 @@ class _ConditionalValidator(object): """Conditional validator declaration.""" # The diagnosis result required for the validator to be used. - result = attr.ib(type=diagnoses_lib.DiagResultEnum) + result = attr.ib(type='diagnoses_lib.DiagResultEnum') # The validator to use when the result is present. validator = attr.ib(type=Callable[[Any], bool]) @@ -146,7 +146,7 @@ def _coordinates_len(coordinates: Any) -> int: coordinates: any type, measurement coordinates for multidimensional measurements. """ - if isinstance(coordinates, six.string_types): + if isinstance(coordinates, str): return 1 if hasattr(coordinates, '__len__'): return len(coordinates) @@ -187,6 +187,9 @@ class Measurement(object): notification_cb: An optional function to be called when the measurement is set. outcome: One of the Outcome() enumeration values, starting at UNSET. + marginal: A bool flag indicating if this measurement is marginal if the + outcome is PASS. + set_time_millis: The time the measurement is set in milliseconds. _cached: A cached dict representation of this measurement created initially during as_base_types and updated in place to save allocation time. """ @@ -211,6 +214,8 @@ class Measurement(object): type=Union['MeasuredValue', 'DimensionedMeasuredValue'], default=None) _notification_cb = attr.ib(type=Optional[Callable[[], None]], default=None) outcome = attr.ib(type=Outcome, default=Outcome.UNSET) + marginal = attr.ib(type=bool, default=False) + set_time_millis = attr.ib(type=int, default=None) # Runtime cache to speed up conversions. _cached = attr.ib(type=Optional[Dict[Text, Any]], default=None) @@ -341,7 +346,7 @@ def with_validator(self, validator: Callable[[Any], bool]) -> 'Measurement': return self def validate_on( - self, result_to_validator_mapping: Dict[diagnoses_lib.DiagResultEnum, + self, result_to_validator_mapping: Dict['diagnoses_lib.DiagResultEnum', Callable[[Any], bool]] ) -> 'Measurement': """Adds conditional validators. @@ -357,7 +362,7 @@ def validate_on( Returns: This measurement, used for chaining operations. """ - for result, validator in six.iteritems(result_to_validator_mapping): + for result, validator in result_to_validator_mapping.items(): if not callable(validator): raise ValueError('Validator must be callable', validator) self.conditional_validators.append( @@ -414,11 +419,17 @@ def _with_validator(*args, **kwargs): return _with_validator def validate(self) -> 'Measurement': - """Validate this measurement and update its 'outcome' field.""" + """Validate this measurement and update 'outcome' and 'marginal' fields.""" # PASS if all our validators return True, otherwise FAIL. try: if all(v(self._measured_value.value) for v in self.validators): self.outcome = Outcome.PASS + + # Only check marginality for passing measurements. + if any( + hasattr(v, 'is_marginal') and + v.is_marginal(self._measured_value.value) for v in self.validators): + self.marginal = True else: self.outcome = Outcome.FAIL return self @@ -429,7 +440,7 @@ def validate(self) -> 'Measurement': raise finally: if self._cached: - self._cached['outcome'] = self.outcome.name + self._cached['outcome'] = self.outcome.name # pytype: disable=bad-return-type def as_base_types(self) -> Dict[Text, Any]: """Convert this measurement to a dict of basic types.""" @@ -469,6 +480,35 @@ def to_dataframe(self, columns: Any = None) -> Any: return dataframe + def from_dataframe(self, dataframe: Any, metric_column: str) -> None: + """Convert a pandas DataFrame to a multi-dim measurement. + + Args: + dataframe: A pandas DataFrame. Dimensions for this multi-dim measurement + need to match columns in the DataFrame (can be multi-index). + metric_column: The column name of the metric to be measured. + + Raises: + TypeError: If this measurement is not dimensioned. + ValueError: If dataframe is missing dimensions. + """ + if not isinstance(self._measured_value, DimensionedMeasuredValue): + raise TypeError( + 'Only a dimensioned measurement can be set from a DataFrame' + ) + dimension_labels = [d.name for d in self.dimensions] + dimensioned_df = dataframe.reset_index() + try: + dimensioned_df.set_index(dimension_labels, inplace=True) + except KeyError as e: + raise ValueError('DataFrame is missing dimensions') from e + if metric_column not in dimensioned_df.columns: + raise ValueError( + f'DataFrame does not have a column named {metric_column}' + ) + for row_dimensions, row_metrics in dimensioned_df.iterrows(): + self.measured_value[row_dimensions] = row_metrics[metric_column] + @attr.s(slots=True) class MeasuredValue(object): @@ -648,7 +688,7 @@ def is_value_set(self) -> bool: def __iter__(self) -> Iterator[Any]: """Iterate over items, allows easy conversion to a dict.""" - return iter(six.iteritems(self.value_dict)) + return iter(self.value_dict.items()) def __setitem__(self, coordinates: Any, value: Any) -> None: coordinates_len = _coordinates_len(coordinates) @@ -707,14 +747,14 @@ def value(self) -> List[Any]: raise MeasurementNotSetError('Measurement not yet set', self.name) return [ dimensions + (value,) - for dimensions, value in six.iteritems(self.value_dict) + for dimensions, value in self.value_dict.items() ] def basetype_value(self) -> List[Any]: if self._cached_basetype_values is None: self._cached_basetype_values = list( data.convert_to_base_types(coordinates + (value,)) - for coordinates, value in six.iteritems(self.value_dict)) + for coordinates, value in self.value_dict.items()) return self._cached_basetype_values def to_dataframe(self, columns: Any = None) -> Any: @@ -726,6 +766,42 @@ def to_dataframe(self, columns: Any = None) -> Any: return pandas.DataFrame.from_records(self.value, columns=columns) +@attr.s(slots=True, frozen=True) +class ImmutableMeasurement(object): + """Immutable copy of a measurement.""" + + name = attr.ib(type=Text) + value = attr.ib(type=Any) + units = attr.ib(type=Optional[util_units.UnitDescriptor]) + dimensions = attr.ib(type=Optional[List[Dimension]]) + outcome = attr.ib(type=Optional[Outcome]) + docstring = attr.ib(type=Optional[Text], default=None) + + @classmethod + def from_measurement(cls, measurement: Measurement) -> 'ImmutableMeasurement': + """Convert a Measurement into an ImmutableMeasurement.""" + measured_value = measurement.measured_value + if isinstance(measured_value, DimensionedMeasuredValue): + value = data.attr_copy( + measured_value, value_dict=copy.deepcopy(measured_value.value_dict) + ) + else: + value = ( + copy.deepcopy(measured_value.value) + if measured_value.is_value_set + else None + ) + + return cls( + name=measurement.name, + value=value, + units=measurement.units, + dimensions=measurement.dimensions, + outcome=measurement.outcome, + docstring=measurement.docstring, + ) + + @attr.s(slots=True) class Collection(object): """Encapsulates a collection of measurements. @@ -781,7 +857,7 @@ def _assert_valid_key(self, name: Text) -> None: def __iter__(self) -> Iterator[Tuple[Text, Any]]: """Extract each MeasurementValue's value.""" return ((key, meas.measured_value.value) - for key, meas in six.iteritems(self._measurements)) + for key, meas in self._measurements.items()) def _custom_setattr(self, name: Text, value: Any) -> None: if name == '_measurements': @@ -800,6 +876,7 @@ def __setitem__(self, name: Text, value: Any) -> None: 'Cannot set dimensioned measurement without indices') m.measured_value.set(value) m.notify_value_set() + m.set_time_millis = util.time_millis() def __getitem__(self, name: Text) -> Any: self._assert_valid_key(name) @@ -811,69 +888,9 @@ def __getitem__(self, name: Text) -> Any: # Return the MeasuredValue's value, MeasuredValue will raise if not set. return m.measured_value.value + # Work around for attrs bug in 20.1.0; after the next release, this can be # removed and `Collection._custom_setattr` can be renamed to `__setattr__`. # https://github.com/python-attrs/attrs/issues/680 Collection.__setattr__ = Collection._custom_setattr # pylint: disable=protected-access del Collection._custom_setattr - - -def measures( - *measurements: Union[Text, Measurement], **kwargs: Any -) -> Callable[[phase_descriptor.PhaseT], phase_descriptor.PhaseDescriptor]: - """Decorator-maker used to declare measurements for phases. - - See the measurements module docstring for examples of usage. - - Args: - *measurements: Measurement objects to declare, or a string name from which - to create a Measurement. - **kwargs: Keyword arguments to pass to Measurement constructor if we're - constructing one. Note that if kwargs are provided, the length of - measurements must be 1, and that value must be a string containing the - measurement name. For valid kwargs, see the definition of the Measurement - class. - - Raises: - InvalidMeasurementTypeError: When the measurement is not defined correctly. - - Returns: - A decorator that declares the measurement(s) for the decorated phase. - """ - - def _maybe_make(meas: Union[Text, Measurement]) -> Measurement: - """Turn strings into Measurement objects if necessary.""" - if isinstance(meas, Measurement): - return meas - elif isinstance(meas, six.string_types): - return Measurement(meas, **kwargs) - raise InvalidMeasurementTypeError('Expected Measurement or string', meas) - - # In case we're declaring a measurement inline, we can only declare one. - if kwargs and len(measurements) != 1: - raise InvalidMeasurementTypeError( - 'If @measures kwargs are provided, a single measurement name must be ' - 'provided as a positional arg first.') - - # Unlikely, but let's make sure we don't allow overriding initial outcome. - if 'outcome' in kwargs: - raise ValueError('Cannot specify outcome in measurement declaration!') - - measurements = [_maybe_make(meas) for meas in measurements] - - # 'measurements' is guaranteed to be a list of Measurement objects here. - def decorate( - wrapped_phase: phase_descriptor.PhaseT - ) -> phase_descriptor.PhaseDescriptor: - """Phase decorator to be returned.""" - phase = phase_descriptor.PhaseDescriptor.wrap_or_copy(wrapped_phase) - duplicate_names = ( - set(m.name for m in measurements) - & set(m.name for m in phase.measurements)) - if duplicate_names: - raise DuplicateNameError('Measurement names duplicated', duplicate_names) - - phase.measurements.extend(measurements) - return phase - - return decorate diff --git a/openhtf/core/monitors.py b/openhtf/core/monitors.py index 2e301b1cf..2d16ef15d 100644 --- a/openhtf/core/monitors.py +++ b/openhtf/core/monitors.py @@ -55,7 +55,6 @@ def MyPhase(test): from openhtf.core import test_state as core_test_state from openhtf.util import threads from openhtf.util import units as uom -import six class _MonitorThread(threads.KillableThread): @@ -76,14 +75,9 @@ def __init__(self, measurement_name: Text, self.extra_kwargs = extra_kwargs def get_value(self) -> Any: - if six.PY3: - argspec = inspect.getfullargspec(self.monitor_desc.func) - argspec_args = argspec.args - argspec_keywords = argspec.varkw - else: - argspec = inspect.getargspec(self.monitor_desc.func) # pylint: disable=deprecated-method - argspec_args = argspec.args - argspec_keywords = argspec.keywords + argspec = inspect.getfullargspec(self.monitor_desc.func) + argspec_args = argspec.args + argspec_keywords = argspec.varkw if argspec_keywords: # Monitor phase takes **kwargs, so just pass everything in. kwargs = self.extra_kwargs @@ -155,7 +149,7 @@ def wrapper( @openhtf.PhaseOptions(requires_state=True) @plugs.plug(update_kwargs=False, **monitor_plugs) - @measurements.measures( + @openhtf.measures( measurements.Measurement(measurement_name).with_units( units).with_dimensions(uom.MILLISECOND)) @functools.wraps(phase_desc.func) diff --git a/openhtf/core/phase_branches.py b/openhtf/core/phase_branches.py index f98333c9f..2baac6eb2 100644 --- a/openhtf/core/phase_branches.py +++ b/openhtf/core/phase_branches.py @@ -12,18 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Lint as: python3 """Implements phase node branches. -A BranchSequence is a phase node sequence that runs conditiionally based on the +A BranchSequence is a phase node sequence that runs conditionally based on the diagnosis results of the test run. """ import abc -from typing import Any, Callable, Dict, Iterator, Text, Tuple, TYPE_CHECKING, Union +import enum +from typing import (TYPE_CHECKING, Any, Callable, Dict, Iterator, Optional, + Text, Tuple, Union) import attr -import enum # pylint: disable=g-bad-import-order from openhtf import util from openhtf.core import diagnoses_lib from openhtf.core import phase_collections @@ -31,7 +31,6 @@ from openhtf.core import phase_nodes from openhtf.core import test_record from openhtf.util import data -import six if TYPE_CHECKING: from openhtf.core import test_state # pylint: disable=g-import-not-at-top @@ -56,6 +55,9 @@ class PreviousPhases(enum.Enum): # Check all phases. ALL = 'ALL' + # Check all previous phases in the current subtest. + SUBTEST = 'SUBTEST' + def _not_any(iterable: Iterator[bool]) -> bool: return not any(iterable) @@ -75,7 +77,7 @@ def _not_all(iterable: Iterator[bool]) -> bool: @attr.s(slots=True, frozen=True) class DiagnosisCondition(object): - """Encapsulated object for evaulating DiagResultEnum conditions.""" + """Encapsulated object for evaluating DiagResultEnum conditions.""" # Indicates the diagnosis is tested. condition = attr.ib(type=ConditionOn) @@ -143,7 +145,7 @@ def should_run(self, diag_store: diagnoses_lib.DiagnosesStore) -> bool: @attr.s(slots=True, frozen=True) -class Checkpoint(six.with_metaclass(abc.ABCMeta, phase_nodes.PhaseNode)): +class Checkpoint(phase_nodes.PhaseNode, abc.ABC): """Nodes that check for phase failures or if diagnoses were triggered. When the condition for a checkpoint is triggered, a STOP or FAIL_SUBTEST @@ -181,15 +183,19 @@ def apply_to_all_phases( return self def get_result( - self, running_test_state: 'test_state.TestState' + self, + running_test_state: 'test_state.TestState', + subtest_rec: Optional[test_record.SubtestRecord] = None ) -> phase_descriptor.PhaseReturnT: - if self._check_for_action(running_test_state): + if self._check_for_action(running_test_state, subtest_rec): return self.action return phase_descriptor.PhaseResult.CONTINUE @abc.abstractmethod - def _check_for_action(self, - running_test_state: 'test_state.TestState') -> bool: + def _check_for_action( + self, + running_test_state: 'test_state.TestState', + subtest_rec: Optional[test_record.SubtestRecord] = None) -> bool: """Returns True when the action should be taken.""" @abc.abstractmethod @@ -199,7 +205,7 @@ def record_conditional(self) -> Union[PreviousPhases, DiagnosisCondition]: @attr.s(slots=True, frozen=True) class PhaseFailureCheckpoint(Checkpoint): - """Node that checks if a previous phase or all previous phases failed. + """Node that checks if the specified previous phase(s) failed. If the phases fail, this will be resolved as `action`. @@ -221,6 +227,12 @@ def all_previous(cls, *args, **kwargs) -> 'PhaseFailureCheckpoint': kwargs['previous_phases_to_check'] = PreviousPhases.ALL return cls(*args, **kwargs) + @classmethod + def subtest_previous(cls, *args, **kwargs) -> 'PhaseFailureCheckpoint': + """Checks if any node in the current subtest has failed.""" + kwargs['previous_phases_to_check'] = PreviousPhases.SUBTEST + return cls(*args, **kwargs) + def _asdict(self) -> Dict[Text, Any]: ret = super(PhaseFailureCheckpoint, self)._asdict() ret.update(previous_phases_to_check=self.previous_phases_to_check) @@ -230,14 +242,22 @@ def _phase_failed(self, phase_rec: test_record.PhaseRecord) -> bool: """Returns True if the phase_rec failed; ignores ERRORs.""" return phase_rec.outcome == test_record.PhaseOutcome.FAIL - def _check_for_action(self, - running_test_state: 'test_state.TestState') -> bool: + def _check_for_action( + self, + running_test_state: 'test_state.TestState', + subtest_rec: Optional[test_record.SubtestRecord] = None) -> bool: """Returns True when the specific set of phases fail.""" phase_records = running_test_state.test_record.phases if not phase_records: raise NoPhasesFoundError('No phases found in the test record.') if self.previous_phases_to_check == PreviousPhases.LAST: return self._phase_failed(phase_records[-1]) + elif (self.previous_phases_to_check == PreviousPhases.SUBTEST and + subtest_rec is not None): + for phase_rec in phase_records: + if (phase_rec.subtest_name == subtest_rec.name and + self._phase_failed(phase_rec)): + return True else: for phase_rec in phase_records: if self._phase_failed(phase_rec): @@ -263,8 +283,10 @@ def _asdict(self) -> Dict[Text, Any]: ret.update(diag_condition=self.diag_condition._asdict()) return ret - def _check_for_action(self, - running_test_state: 'test_state.TestState') -> bool: + def _check_for_action( + self, + running_test_state: 'test_state.TestState', + subtest_rec: Optional[test_record.SubtestRecord] = None) -> bool: """Returns True if the condition is true.""" return self.diag_condition.check(running_test_state.diagnoses_manager.store) diff --git a/openhtf/core/phase_collections.py b/openhtf/core/phase_collections.py index a1b1e79d7..0e0425a25 100644 --- a/openhtf/core/phase_collections.py +++ b/openhtf/core/phase_collections.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Lint as: python3 """Implements the basic PhaseNode collections. Phase Sequence are basic collections where each node is sequentially run. These @@ -23,15 +22,14 @@ import abc import collections -from typing import Any, Callable, DefaultDict, Dict, Iterable, Iterator, List, Optional, Text, Tuple, Type, TypeVar, Union +from collections.abc import Iterable as CollectionsIterable +from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Text, Tuple, Type, TypeVar, Union import attr from openhtf import util from openhtf.core import base_plugs from openhtf.core import phase_descriptor from openhtf.core import phase_nodes -import six -from six.moves import collections_abc NodeType = TypeVar('NodeType', bound=phase_nodes.PhaseNode) SequenceClassT = TypeVar('SequenceClassT', bound='PhaseSequence') @@ -46,7 +44,7 @@ class DuplicateSubtestNamesError(Exception): def _recursive_flatten(n: Any) -> Iterator[phase_nodes.PhaseNode]: """Yields flattened phase nodes.""" - if isinstance(n, collections_abc.Iterable): + if isinstance(n, CollectionsIterable): for it in n: for node in _recursive_flatten(it): yield node @@ -63,8 +61,7 @@ def flatten(n: Any) -> List[phase_nodes.PhaseNode]: return list(_recursive_flatten(n)) -class PhaseCollectionNode( - six.with_metaclass(abc.ABCMeta, phase_nodes.PhaseNode)): +class PhaseCollectionNode(phase_nodes.PhaseNode, abc.ABC): """Base class for a node that contains multiple other phase nodes.""" __slots__ = () @@ -224,16 +221,18 @@ def check_for_duplicate_subtest_names(sequence: PhaseSequence): Raises: DuplicateSubtestNamesError: when duplicate subtest names are found. """ - names_to_subtests = collections.defaultdict( - list) # type: DefaultDict[Text, List[Subtest]] + names_to_subtests: collections.defaultdict[str, list[Subtest]] = ( + collections.defaultdict(list) + ) for subtest in sequence.filter_by_type(Subtest): names_to_subtests[subtest.name].append(subtest) - duplicates = [] # type: List[Text] + duplicates: list[str] = [] for name, subtests in names_to_subtests.items(): if len(subtests) > 1: - duplicates.append('Name "{}" used by multiple subtests: {}'.format( - name, subtests)) + duplicates.append( + 'Name "{}" used by multiple subtests: {}'.format(name, subtests) + ) if not duplicates: return duplicates.sort() diff --git a/openhtf/core/phase_descriptor.py b/openhtf/core/phase_descriptor.py index cad849bd4..7327c1a9f 100644 --- a/openhtf/core/phase_descriptor.py +++ b/openhtf/core/phase_descriptor.py @@ -18,29 +18,39 @@ """ +import collections import enum import inspect +import logging +import os.path import pdb -from typing import Any, Callable, Dict, List, Optional, Text, TYPE_CHECKING, Type, Union +import sys +from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Text, TYPE_CHECKING, Type, Union import attr +import inflection import openhtf from openhtf import util from openhtf.core import base_plugs +from openhtf.core import diagnoses_lib +from openhtf.core import measurements as core_measurements from openhtf.core import phase_nodes from openhtf.core import test_record import openhtf.plugs from openhtf.util import data - -import six +from openhtf.util import logs if TYPE_CHECKING: - from openhtf.core import diagnoses_lib # pylint: disable=g-import-not-at-top - from openhtf.core import measurements as core_measurements # pylint: disable=g-import-not-at-top from openhtf.core import test_state # pylint: disable=g-import-not-at-top +DEFAULT_REPEAT_LIMIT = 3 +MAX_REPEAT_LIMIT = sys.maxsize + +_LOGGER = logging.getLogger(__name__) + + class PhaseWrapError(Exception): """Error with phase wrapping.""" @@ -72,6 +82,15 @@ class PhaseResult(enum.Enum): FAIL_SUBTEST = 'FAIL_SUBTEST' +@enum.unique +class PhaseNameCase(enum.Enum): + """Options for formatting casing for phase names.""" + # Does not modify case for phase name. + KEEP = 'KEEP' + # Changes phase name case to CamelCase. + CAMEL = 'CAMEL' + + PhaseReturnT = Optional[PhaseResult] PhaseCallableT = Callable[..., PhaseReturnT] PhaseCallableOrNodeT = Union[PhaseCallableT, phase_nodes.PhaseNode] @@ -93,11 +112,18 @@ class PhaseOptions(object): otherwise only the TestApi will be passed in. This is useful if a phase needs to wrap another phase for some reason, as PhaseDescriptors can only be invoked with a TestState instance. - repeat_limit: Maximum number of repeats. None indicates a phase will be - repeated infinitely as long as PhaseResult.REPEAT is returned. + force_repeat: If True, force the phase to repeat up to repeat_limit times. + repeat_on_measurement_fail: If true, force phase with failed + measurements to repeat up to repeat_limit times. + repeat_on_timeout: If consider repeat on phase timeout, default is No. + repeat_limit: Maximum number of repeats. DEFAULT_REPEAT_LIMIT applies if + this is set to None. MAX_REPEAT_LIMIT can be used to repeat the phase + virtually forever, as long as PhaseResult.REPEAT is returned. run_under_pdb: If True, run the phase under the Python Debugger (pdb). When setting this option, increase the phase timeout as well because the timeout will still apply when under the debugger. + phase_name_case: Case formatting options for phase name. + stop_on_measurement_fail: Whether to stop the test if any measurements fail. Example Usages: @PhaseOptions(timeout_s=1) def PhaseFunc(test): pass @PhaseOptions(name='Phase({port})') def PhaseFunc(test, port, other_info): pass @@ -107,15 +133,20 @@ def PhaseFunc(test, port, other_info): pass timeout_s = attr.ib(type=Optional[TimeoutT], default=None) run_if = attr.ib(type=Optional[Callable[[], bool]], default=None) requires_state = attr.ib(type=bool, default=False) + force_repeat = attr.ib(type=bool, default=False) + repeat_on_measurement_fail = attr.ib(type=bool, default=False) + repeat_on_timeout = attr.ib(type=bool, default=False) repeat_limit = attr.ib(type=Optional[int], default=None) run_under_pdb = attr.ib(type=bool, default=False) + phase_name_case = attr.ib(type=PhaseNameCase, default=PhaseNameCase.KEEP) + stop_on_measurement_fail = attr.ib(type=bool, default=False) def format_strings(self, **kwargs: Any) -> 'PhaseOptions': """String substitution of name.""" return data.attr_copy(self, name=util.format_string(self.name, kwargs)) def update(self, **kwargs: Any) -> None: - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): setattr(self, key, value) def __call__(self, phase_func: PhaseT) -> 'PhaseDescriptor': @@ -128,10 +159,20 @@ def __call__(self, phase_func: PhaseT) -> 'PhaseDescriptor': phase.options.run_if = self.run_if if self.requires_state: phase.options.requires_state = self.requires_state + if self.repeat_on_timeout: + phase.options.repeat_on_timeout = self.repeat_on_timeout + if self.force_repeat: + phase.options.force_repeat = self.force_repeat + if self.repeat_on_measurement_fail: + phase.options.repeat_on_measurement_fail = self.repeat_on_measurement_fail if self.repeat_limit is not None: phase.options.repeat_limit = self.repeat_limit if self.run_under_pdb: phase.options.run_under_pdb = self.run_under_pdb + if self.stop_on_measurement_fail: + phase.options.stop_on_measurement_fail = self.stop_on_measurement_fail + if self.phase_name_case: + phase.options.phase_name_case = self.phase_name_case return phase @@ -144,6 +185,8 @@ class PhaseDescriptor(phase_nodes.PhaseNode): Attributes: func: Function to be called (with TestApi as first argument). + func_location: Location of the function, as 'name at file:line' for + user-defined functions, or 'name ' for built-in functions. options: PhaseOptions instance. plugs: List of PhasePlug instances. measurements: List of Measurement objects. @@ -155,10 +198,32 @@ class PhaseDescriptor(phase_nodes.PhaseNode): """ func = attr.ib(type=PhaseCallableT) + func_location = attr.ib(type=Text) + + @func_location.default + def _func_location(self): + """Assigns this field assuming func is a function or callable instance.""" + obj = self.func + try: + name = obj.__name__ + except AttributeError: + try: + name = obj.__class__.__name__ + except AttributeError: + logs.log_once(_LOGGER.warning, + 'Cannot determine name of callable: %r', obj) + return '' + obj = obj.__class__ + try: + filename = os.path.basename(inspect.getsourcefile(obj)) + line_number = inspect.getsourcelines(obj)[1] + except TypeError: + return name + ' ' + return f'{name} at {filename}:{line_number}' + options = attr.ib(type=PhaseOptions, factory=PhaseOptions) plugs = attr.ib(type=List[base_plugs.PhasePlug], factory=list) - measurements = attr.ib( - type=List['core_measurements.Measurement'], factory=list) + measurements = attr.ib(type=List[core_measurements.Measurement], factory=list) diagnosers = attr.ib( type=List['diagnoses_lib.BasePhaseDiagnoser'], factory=list) extra_kwargs = attr.ib(type=Dict[Text, Any], factory=dict) @@ -196,15 +261,19 @@ def wrap_or_copy(cls, func: PhaseT, **options: Any) -> 'PhaseDescriptor': return retval def _asdict(self) -> Dict[Text, Any]: - ret = attr.asdict(self, filter=attr.filters.exclude('func')) + ret = attr.asdict(self, filter=attr.filters.exclude('func')) # pytype: disable=wrong-arg-types # attr-stubs ret.update(name=self.name, doc=self.doc) return ret @property def name(self) -> Text: if self.options.name and isinstance(self.options.name, str): - return self.options.name - return self.func.__name__ + name = self.options.name + else: + name = self.func.__name__ + if self.options.phase_name_case == PhaseNameCase.CAMEL: + name = inflection.camelize(name) + return name @property def doc(self) -> Optional[Text]: @@ -220,14 +289,10 @@ def with_args(self, **kwargs: Any) -> 'PhaseDescriptor': Returns: Updated PhaseDescriptor. """ - if six.PY3: - argspec = inspect.getfullargspec(self.func) - argspec_keywords = argspec.varkw - else: - argspec = inspect.getargspec(self.func) # pylint: disable=deprecated-method - argspec_keywords = argspec.keywords + argspec = inspect.getfullargspec(self.func) + argspec_keywords = argspec.varkw known_arguments = {} - for key, arg in six.iteritems(kwargs): + for key, arg in kwargs.items(): if key in argspec.args or argspec_keywords: known_arguments[key] = arg @@ -258,7 +323,7 @@ def with_plugs(self, plugs_by_name = {plug.name: plug for plug in self.plugs} new_plugs = {} - for name, sub_class in six.iteritems(subplugs): + for name, sub_class in subplugs.items(): original_plug = plugs_by_name.get(name) accept_substitute = True if original_plug is None: @@ -315,17 +380,18 @@ def __call__(self, Returns: The return value from calling the underlying function. """ - kwargs = dict(self.extra_kwargs) + kwargs = {} + arg_info = inspect.getfullargspec(self.func) + keywords = arg_info.varkw + if arg_info.defaults is not None: + for arg_name, arg_value in zip(arg_info.args[-len(arg_info.defaults):], + arg_info.defaults): + kwargs[arg_name] = arg_value + kwargs.update(self.extra_kwargs) kwargs.update( running_test_state.plug_manager.provide_plugs( (plug.name, plug.cls) for plug in self.plugs if plug.update_kwargs)) - if six.PY3: - arg_info = inspect.getfullargspec(self.func) - keywords = arg_info.varkw - else: - arg_info = inspect.getargspec(self.func) # pylint: disable=deprecated-method - keywords = arg_info.keywords # Pass in test_api if the phase takes *args, or **kwargs with at least 1 # positional, or more positional args than we have keyword args. if arg_info.varargs or (keywords and len(arg_info.args) >= 1) or (len( @@ -337,10 +403,134 @@ def __call__(self, args.append(running_test_state.test_api) if self.options.run_under_pdb: - return pdb.runcall(self.func, *args, **kwargs) + phase_result = pdb.runcall(self.func, *args, **kwargs) else: - return self.func(*args, **kwargs) - if self.options.run_under_pdb: - return pdb.runcall(self.func, **kwargs) + phase_result = self.func(*args, **kwargs) + + elif self.options.run_under_pdb: + phase_result = pdb.runcall(self.func, **kwargs) else: - return self.func(**kwargs) + phase_result = self.func(**kwargs) + + return phase_result + + +def measures(*measurements: Union[Text, core_measurements.Measurement], + **kwargs: Any) -> Callable[[PhaseT], PhaseDescriptor]: + """Creates decorators to declare measurements for phases. + + See the measurements module docstring for examples of usage. + + Args: + *measurements: Measurement objects to declare, or a string name from which + to create a Measurement. + **kwargs: Keyword arguments to pass to Measurement constructor if we're + constructing one. Note that if kwargs are provided, the length of + measurements must be 1, and that value must be a string containing the + measurement name. For valid kwargs, see the definition of the Measurement + class. + + Raises: + InvalidMeasurementTypeError: When the measurement is not defined correctly. + ValueError: If a measurement already has an outcome. + DuplicateNameError: If a measurement's name is already in use. + + Returns: + A decorator that declares the measurement(s) for the decorated phase. + """ + + def _maybe_make( + meas: Union[Text, core_measurements.Measurement] + ) -> core_measurements.Measurement: + """Turn strings into Measurement objects if necessary.""" + if isinstance(meas, core_measurements.Measurement): + return meas + elif isinstance(meas, str): + return core_measurements.Measurement(meas, **kwargs) + raise core_measurements.InvalidMeasurementTypeError( + 'Expected Measurement or string', meas) + + # In case we're declaring a measurement inline, we can only declare one. + if kwargs and len(measurements) != 1: + raise core_measurements.InvalidMeasurementTypeError( + 'If @measures kwargs are provided, a single measurement name must be ' + 'provided as a positional arg first.') + + # Unlikely, but let's make sure we don't allow overriding initial outcome. + if 'outcome' in kwargs: + raise ValueError('Cannot specify outcome in measurement declaration!') + + measurements = [_maybe_make(meas) for meas in measurements] + + # 'measurements' is guaranteed to be a list of Measurement objects here. + def decorate(wrapped_phase: PhaseT) -> PhaseDescriptor: + """Phase decorator to be returned.""" + phase = PhaseDescriptor.wrap_or_copy(wrapped_phase) + duplicate_names = ( + set(m.name for m in measurements) + & set(m.name for m in phase.measurements)) + if duplicate_names: + raise core_measurements.DuplicateNameError('Measurement names duplicated', + duplicate_names) + + phase.measurements.extend(measurements) + return phase + + return decorate + + +class DuplicateResultError(Exception): + """Different DiagResultEnum instances define the same value.""" + + +def check_for_duplicate_results( + phase_iterator: Iterator[PhaseDescriptor], + test_diagnosers: Sequence[diagnoses_lib.BaseTestDiagnoser]) -> None: + """Check for any results with the same enum value in different ResultTypes. + + Args: + phase_iterator: iterator over the phases to check. + test_diagnosers: list of test level diagnosers. + + Raises: + DuplicateResultError: when duplicate enum values are found. + """ + all_result_enums: Set[Type[diagnoses_lib.DiagResultEnum]] = set() + for phase in phase_iterator: + for phase_diag in phase.diagnosers: + all_result_enums.add(phase_diag.result_type) + for test_diag in test_diagnosers: + all_result_enums.add(test_diag.result_type) + + values_to_enums = collections.defaultdict(list) + for enum_cls in all_result_enums: + # pytype incorrectly determines that the enum cannot be iterated over. Using + # __members__.values() allows direct type inference. + for entry in enum_cls.__members__.values(): + values_to_enums[entry.value].append(enum_cls) + + duplicates: List[str] = [] + for result_value, enum_classes in sorted(values_to_enums.items()): + if len(enum_classes) > 1: + duplicates.append('Value "{}" defined by {}'.format( + result_value, enum_classes)) + if not duplicates: + return + raise DuplicateResultError('Duplicate DiagResultEnum values: {}'.format( + '\n'.join(duplicates))) + + +def diagnose( + *diagnosers: diagnoses_lib.BasePhaseDiagnoser +) -> Callable[[PhaseT], PhaseDescriptor]: + """Decorator to add diagnosers to a PhaseDescriptor.""" + diagnoses_lib.check_diagnosers(diagnosers, diagnoses_lib.BasePhaseDiagnoser) + diags = list(diagnosers) + + def decorate(wrapped_phase: PhaseT) -> PhaseDescriptor: + """Phase decorator to be returned.""" + phase = PhaseDescriptor.wrap_or_copy(wrapped_phase) + phase.diagnosers.extend(diags) + return phase + + return decorate diff --git a/openhtf/core/phase_executor.py b/openhtf/core/phase_executor.py index de3f401cc..f68924cba 100644 --- a/openhtf/core/phase_executor.py +++ b/openhtf/core/phase_executor.py @@ -30,7 +30,6 @@ framework. """ -import logging import pstats import sys import threading @@ -52,6 +51,7 @@ from openhtf.core import test_state as htf_test_state # pylint: disable=g-import-not-at-top DEFAULT_PHASE_TIMEOUT_S = 3 * 60 +_JOIN_TRY_INTERVAL_SECONDS = 3 ARG_PARSER = argv.module_parser() ARG_PARSER.add_argument( @@ -61,16 +61,13 @@ target='%s.DEFAULT_PHASE_TIMEOUT_S' % __name__, help='Test phase timeout in seconds') -# TODO(arsharma): Use the test state logger. -_LOG = logging.getLogger(__name__) - @attr.s(slots=True, frozen=True) class ExceptionInfo(object): """Wrap the description of a raised exception and its traceback.""" - exc_type = attr.ib(type=Type[Exception]) - exc_val = attr.ib(type=Exception) + exc_type = attr.ib(type=Type[BaseException]) + exc_val = attr.ib(type=BaseException) exc_tb = attr.ib(type=types.TracebackType) def as_base_types(self) -> Dict[Text, Text]: @@ -168,7 +165,8 @@ def __init__(self, phase_desc: phase_descriptor.PhaseDescriptor, subtest_rec: Optional[test_record.SubtestRecord]): super(PhaseExecutorThread, self).__init__( name='', - run_with_profiling=run_with_profiling) + run_with_profiling=run_with_profiling, + logger=test_state.state_logger.getChild('phase_executor_thread')) self._phase_desc = phase_desc self._test_state = test_state self._subtest_rec = subtest_rec @@ -200,10 +198,15 @@ def _thread_exception(self, *args) -> bool: def join_or_die(self) -> PhaseExecutionOutcome: """Wait for thread to finish, returning a PhaseExecutionOutcome instance.""" + deadline = time.monotonic() + DEFAULT_PHASE_TIMEOUT_S if self._phase_desc.options.timeout_s is not None: - self.join(self._phase_desc.options.timeout_s) - else: - self.join(DEFAULT_PHASE_TIMEOUT_S) + deadline = time.monotonic() + self._phase_desc.options.timeout_s + while time.monotonic() < deadline: + # Using exception to kill thread is not honored when thread is busy, + # so we leave the thread behind, and move on teardown. + self.join(_JOIN_TRY_INTERVAL_SECONDS) + if not self.is_alive() or self._killed.is_set(): + break # We got a return value or an exception and handled it. if self._phase_execution_outcome: @@ -231,12 +234,27 @@ class PhaseExecutor(object): def __init__(self, test_state: 'htf_test_state.TestState'): self.test_state = test_state + self.logger = test_state.state_logger.getChild('phase_executor') # This lock exists to prevent stop() calls from being ignored if called when # _execute_phase_once is setting up the next phase thread. self._current_phase_thread_lock = threading.Lock() self._current_phase_thread = None # type: Optional[PhaseExecutorThread] self._stopping = threading.Event() + def _should_repeat(self, phase: phase_descriptor.PhaseDescriptor, + phase_execution_outcome: PhaseExecutionOutcome) -> bool: + """Returns whether a phase should be repeated.""" + if phase_execution_outcome.is_timeout and phase.options.repeat_on_timeout: + return True + elif phase_execution_outcome.is_repeat: + return True + elif phase.options.force_repeat: + return True + elif phase.options.repeat_on_measurement_fail: + last_phase_outcome = self.test_state.test_record.phases[-1].outcome + return last_phase_outcome == test_record.PhaseOutcome.FAIL + return False + def execute_phase( self, phase: phase_descriptor.PhaseDescriptor, @@ -260,13 +278,15 @@ def execute_phase( requested and successfully ran for this phase execution. """ repeat_count = 1 - repeat_limit = phase.options.repeat_limit or sys.maxsize + repeat_limit = ( + phase.options.repeat_limit or phase_descriptor.DEFAULT_REPEAT_LIMIT + ) while not self._stopping.is_set(): is_last_repeat = repeat_count >= repeat_limit phase_execution_outcome, profile_stats = self._execute_phase_once( phase, is_last_repeat, run_with_profiling, subtest_rec) - - if phase_execution_outcome.is_repeat and not is_last_repeat: + if (self._should_repeat(phase, phase_execution_outcome) and + not is_last_repeat): repeat_count += 1 continue @@ -283,19 +303,31 @@ def _execute_phase_once( ) -> Tuple[PhaseExecutionOutcome, Optional[pstats.Stats]]: """Executes the given phase, returning a PhaseExecutionOutcome.""" # Check this before we create a PhaseState and PhaseRecord. - if phase_desc.options.run_if and not phase_desc.options.run_if(): - _LOG.debug('Phase %s skipped due to run_if returning falsey.', - phase_desc.name) - return PhaseExecutionOutcome(phase_descriptor.PhaseResult.SKIP), None + if phase_desc.options.run_if: + try: + run_phase = phase_desc.options.run_if() + except Exception: # pylint: disable=broad-except + self.logger.debug('Phase %s stopped due to a fault in run_if function.', + phase_desc.name) + # Allow graceful termination + return PhaseExecutionOutcome(ExceptionInfo(*sys.exc_info())), None + + if not run_phase: + self.logger.debug('Phase %s skipped due to run_if returning falsey.', + phase_desc.name) + return PhaseExecutionOutcome(phase_descriptor.PhaseResult.SKIP), None + override_result = None with self.test_state.running_phase_context(phase_desc) as phase_state: if subtest_rec: - _LOG.debug('Executing phase %s under subtest %s', phase_desc.name, - subtest_rec.name) + self.logger.debug('Executing phase %s under subtest %s (from %s)', + phase_desc.name, phase_desc.func_location, + subtest_rec.name) phase_state.set_subtest_name(subtest_rec.name) else: - _LOG.debug('Executing phase %s', phase_desc.name) + self.logger.debug('Executing phase %s (from %s)', phase_desc.name, + phase_desc.func_location) with self._current_phase_thread_lock: # Checking _stopping must be in the lock context, otherwise there is a # race condition: this thread checks _stopping and then switches to @@ -315,7 +347,7 @@ def _execute_phase_once( phase_state.result = phase_thread.join_or_die() if phase_state.result.is_repeat and is_last_repeat: - _LOG.error('Phase returned REPEAT, exceeding repeat_limit.') + self.logger.error('Phase returned REPEAT, exceeding repeat_limit.') phase_state.hit_repeat_limit = True override_result = PhaseExecutionOutcome( phase_descriptor.PhaseResult.STOP) @@ -324,15 +356,15 @@ def _execute_phase_once( # Refresh the result in case a validation for a partially set measurement # or phase diagnoser raised an exception. result = override_result or phase_state.result - _LOG.debug('Phase %s finished with result %s', phase_desc.name, - result.phase_result) + self.logger.debug('Phase %s finished with result %r', phase_desc.name, + result.phase_result) return (result, phase_thread.get_profile_stats() if run_with_profiling else None) def skip_phase(self, phase_desc: phase_descriptor.PhaseDescriptor, subtest_rec: Optional[test_record.SubtestRecord]) -> None: """Skip a phase, but log a record of it.""" - _LOG.debug('Automatically skipping phase %s', phase_desc.name) + self.logger.debug('Automatically skipping phase %s', phase_desc.name) with self.test_state.running_phase_context(phase_desc) as phase_state: if subtest_rec: phase_state.set_subtest_name(subtest_rec.name) @@ -346,16 +378,17 @@ def evaluate_checkpoint( """Evaluate a checkpoint, returning a PhaseExecutionOutcome.""" if subtest_rec: subtest_name = subtest_rec.name - _LOG.debug('Evaluating checkpoint %s under subtest %s', checkpoint.name, - subtest_name) + self.logger.debug('Evaluating checkpoint %s under subtest %s', + checkpoint.name, subtest_name) else: - _LOG.debug('Evaluating checkpoint %s', checkpoint.name) + self.logger.debug('Evaluating checkpoint %s', checkpoint.name) subtest_name = None evaluated_millis = util.time_millis() try: - outcome = PhaseExecutionOutcome(checkpoint.get_result(self.test_state)) - _LOG.debug('Checkpoint %s result: %s', checkpoint.name, - outcome.phase_result) + outcome = PhaseExecutionOutcome(checkpoint.get_result(self.test_state, + subtest_rec)) + self.logger.debug('Checkpoint %s result: %s', checkpoint.name, + outcome.phase_result) if outcome.is_fail_subtest and not subtest_rec: raise InvalidPhaseResultError( 'Checkpoint returned FAIL_SUBTEST, but subtest not running.') @@ -372,7 +405,7 @@ def evaluate_checkpoint( def skip_checkpoint(self, checkpoint: phase_branches.Checkpoint, subtest_rec: Optional[test_record.SubtestRecord]) -> None: """Skip a checkpoint, but log a record of it.""" - _LOG.debug('Automatically skipping checkpoint %s', checkpoint.name) + self.logger.debug('Automatically skipping checkpoint %s', checkpoint.name) subtest_name = subtest_rec.name if subtest_rec else None checkpoint_rec = test_record.CheckpointRecord.from_checkpoint( checkpoint, subtest_name, @@ -404,11 +437,11 @@ def stop( if phase_thread.is_alive(): phase_thread.kill() - _LOG.debug('Waiting for cancelled phase to exit: %s', phase_thread) + self.logger.debug('Waiting for cancelled phase to exit: %s', phase_thread) timeout = timeouts.PolledTimeout.from_seconds(timeout_s) while phase_thread.is_alive() and not timeout.has_expired(): time.sleep(0.1) - _LOG.debug('Cancelled phase %s exit', - "didn't" if phase_thread.is_alive() else 'did') + self.logger.debug('Cancelled phase %s exit', + "didn't" if phase_thread.is_alive() else 'did') # Clear the currently running phase, whether it finished or timed out. self.test_state.stop_running_phase() diff --git a/openhtf/core/phase_group.py b/openhtf/core/phase_group.py index 1694ab1fb..c62357434 100644 --- a/openhtf/core/phase_group.py +++ b/openhtf/core/phase_group.py @@ -141,7 +141,7 @@ def combine(self, def wrap(self, main_phases: phase_collections.SequenceInitializerT, - name: Text = None) -> 'PhaseGroup': + name: Optional[Text] = None) -> 'PhaseGroup': """Returns PhaseGroup with additional main phases.""" other = PhaseGroup(main=main_phases) return self.combine(other, name=name) diff --git a/openhtf/core/phase_nodes.py b/openhtf/core/phase_nodes.py index b27a982e8..01d023cae 100644 --- a/openhtf/core/phase_nodes.py +++ b/openhtf/core/phase_nodes.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Lint as: python3 """Contains the abstract interfaces for phase nodes.""" import abc @@ -20,7 +19,6 @@ from openhtf.core import base_plugs from openhtf.util import data -import six if TYPE_CHECKING: from openhtf.core import phase_descriptor # pylint: disable=g-import-not-at-top @@ -29,7 +27,7 @@ ApplyAllNodesT = TypeVar('ApplyAllNodesT', bound='PhaseNode') -class PhaseNode(six.with_metaclass(abc.ABCMeta, object)): +class PhaseNode(abc.ABC): """Base class for all executable nodes in OpenHTF.""" __slots__ = () diff --git a/openhtf/core/test_descriptor.py b/openhtf/core/test_descriptor.py index 50183b6e5..a017643c7 100644 --- a/openhtf/core/test_descriptor.py +++ b/openhtf/core/test_descriptor.py @@ -34,27 +34,25 @@ import attr import colorama - from openhtf import util from openhtf.core import base_plugs from openhtf.core import diagnoses_lib -from openhtf.core import measurements +from openhtf.core import measurements as htf_measurements from openhtf.core import phase_collections from openhtf.core import phase_descriptor from openhtf.core import phase_executor from openhtf.core import test_executor from openhtf.core import test_record as htf_test_record from openhtf.core import test_state - -from openhtf.util import conf +from openhtf.util import configuration from openhtf.util import console_output from openhtf.util import logs -import six +CONF = configuration.CONF _LOG = logging.getLogger(__name__) -conf.declare( +CONF.declare( 'capture_source', description=textwrap.dedent( """Whether to capture the source of phases and the test module. This @@ -65,6 +63,14 @@ default_value=False) +class MeasurementNotFoundError(Exception): + """Raised when test measurement not found.""" + + +class AttachmentNotFoundError(Exception): + """Raised when test attachment not found.""" + + class UnrecognizedTestUidError(Exception): """Raised when information is requested about an unknown Test UID.""" @@ -96,7 +102,7 @@ def create_arg_parser(add_help: bool = False) -> argparse.ArgumentParser: parser = argparse.ArgumentParser( 'OpenHTF-based testing', parents=[ - conf.ARG_PARSER, + CONF.ARG_PARSER, console_output.ARG_PARSER, logs.ARG_PARSER, phase_executor.ARG_PARSER, @@ -149,7 +155,7 @@ def __init__(self, *nodes: phase_descriptor.PhaseCallableOrNodeT, htf_test_record.CodeInfo.uncaptured(), metadata) - if conf.capture_source: + if CONF.capture_source: # Copy the phases with the real CodeInfo for them. self._test_desc.phase_sequence = ( self._test_desc.phase_sequence.load_code_info()) @@ -234,17 +240,17 @@ def configure(self, **kwargs: Any) -> None: # side effects. known_args, _ = create_arg_parser(add_help=True).parse_known_args() if known_args.config_help: - sys.stdout.write(conf.help_text) + sys.stdout.write(CONF.help_text) sys.exit(0) logs.configure_logging() - for key, value in six.iteritems(kwargs): + for key, value in kwargs.items(): setattr(self._test_options, key, value) @classmethod def handle_sig_int(cls, signalnum: Optional[int], handler: Any) -> None: """Handle the SIGINT callback.""" if not cls.TEST_INSTANCES: - cls.DEFAULT_SIGINT_HANDLER(signalnum, handler) # pylint: disable=not-callable + cls.DEFAULT_SIGINT_HANDLER(signalnum, handler) # pylint: disable=not-callable # pytype: disable=not-callable return _LOG.error('Received SIGINT, stopping all tests.') @@ -267,7 +273,8 @@ def abort_from_sig_int(self) -> None: self._executor.abort() def execute(self, - test_start: Optional[phase_descriptor.PhaseT] = None, + test_start: Optional[Union[phase_descriptor.PhaseT, + Callable[[], str]]] = None, profile_filename: Optional[Text] = None) -> bool: """Starts the framework and executes the given test. @@ -284,7 +291,7 @@ def execute(self, Raises: InvalidTestStateError: if this test is already being executed. """ - diagnoses_lib.check_for_duplicate_results( + phase_descriptor.check_for_duplicate_results( self._test_desc.phase_sequence.all_phases(), self._test_options.diagnosers) phase_collections.check_for_duplicate_subtest_names( @@ -301,7 +308,7 @@ def execute(self, # Snapshot some things we care about and store them. self._test_desc.metadata['test_name'] = self._test_options.name - self._test_desc.metadata['config'] = conf._asdict() + self._test_desc.metadata['config'] = CONF._asdict() self.last_run_time_millis = util.time_millis() if isinstance(test_start, types.LambdaType): @@ -314,7 +321,7 @@ def trigger_phase(test): else: trigger = test_start - if conf.capture_source: + if CONF.capture_source: trigger.code_info = htf_test_record.CodeInfo.for_function(trigger.func) self._executor = test_executor.TestExecutor( @@ -322,7 +329,7 @@ def trigger_phase(test): self.make_uid(), trigger, self._test_options, - run_with_profiling=profile_filename is not None) + run_phases_with_profiling=profile_filename is not None) _LOG.info('Executing test: %s', self.descriptor.code_info.name) self.TEST_INSTANCES[self.uid] = self @@ -362,12 +369,17 @@ def trigger_phase(test): (colorama.Style.BRIGHT, colorama.Fore.GREEN)) # pytype: disable=wrong-arg-types colors[htf_test_record.Outcome.FAIL] = ''.join( (colorama.Style.BRIGHT, colorama.Fore.RED)) # pytype: disable=wrong-arg-types - msg_template = 'test: {name} outcome: {color}{outcome}{rst}' + msg_template = ( + 'test: {name} outcome: {color}{outcome}{marginal}{rst}') console_output.banner_print( msg_template.format( name=final_state.test_record.metadata['test_name'], - color=colors[final_state.test_record.outcome], + color=(colorama.Fore.YELLOW + if final_state.test_record.marginal else + colors[final_state.test_record.outcome]), outcome=final_state.test_record.outcome.name, + marginal=(' (MARGINAL)' + if final_state.test_record.marginal else ''), rst=colorama.Style.RESET_ALL)) finally: del self.TEST_INSTANCES[self.uid] @@ -448,10 +460,10 @@ class TestApi(object): stdout (configurable) and the frontend via the Station API, if it's enabled, in addition to the 'log_records' attribute of the final TestRecord output by the running test. - measurements: A measurements.Collection object used to get/set measurement - values. See util/measurements.py for more implementation details, but in - the simple case, set measurements directly as attributes on this object - (see examples/measurements.py for examples). + measurements: A htf_measurements.Collection object used to get/set + measurement values. See util/measurements.py for more implementation + details, but in the simple case, set measurements directly as attributes + on this object (see examples/measurements.py for examples). attachments: Dict mapping attachment name to test_record.Attachment instance containing the data that was attached (and the MIME type that was assumed based on extension, if any). Only attachments that have been attached in @@ -467,12 +479,12 @@ class TestApi(object): test_record: A reference to the output TestRecord for the currently running openhtf.Test. Direct access to this attribute is *strongly* discouraged, but provided as a catch-all for interfaces not otherwise provided by - TestApi. If you find yourself using this, please file a - feature request for an alternative at: + TestApi. If you find yourself using this, please file a feature request + for an alternative at: https://github.com/google/openhtf/issues/new """ - measurements = attr.ib(type=measurements.Collection) + measurements = attr.ib(type=htf_measurements.Collection) # Internal state objects. If you find yourself needing to use these, please # use required_state=True for the phase to use the test_state object instead. @@ -554,8 +566,8 @@ def attach_from_file( filename, name=name, mimetype=mimetype) def get_measurement( - self, - measurement_name: Text) -> Optional[test_state.ImmutableMeasurement]: + self, measurement_name: Text + ) -> Optional[htf_measurements.ImmutableMeasurement]: """Get a copy of a measurement value from current or previous phase. Measurement and phase name uniqueness is not enforced, so this method will @@ -569,10 +581,36 @@ def get_measurement( """ return self._running_test_state.get_measurement(measurement_name) + def get_measurement_strict( + self, measurement_name: Text + ) -> htf_measurements.ImmutableMeasurement: + """Get a copy of the test measurement from current or previous phase. + + Measurement and phase name uniqueness is not enforced, so this method will + return the value of the most recent measurement recorded. + + Args: + measurement_name: str of the measurement name + + Returns: + an ImmutableMeasurement. + + Raises: + MeasurementNotFoundError: Thrown when the test measurement is not found. + """ + measurement = self._running_test_state.get_measurement(measurement_name) + if measurement is None: + raise MeasurementNotFoundError( + f'Failed to find test measurement {measurement_name}') + return measurement + def get_attachment( self, attachment_name: Text) -> Optional[htf_test_record.Attachment]: """Get a copy of an attachment from current or previous phases. + This method will return None when test attachment is not found. Please use + get_attachment_strict method if exception is expected to be raised. + Args: attachment_name: str of the attachment name @@ -581,6 +619,25 @@ def get_attachment( """ return self._running_test_state.get_attachment(attachment_name) + def get_attachment_strict( + self, attachment_name: Text) -> htf_test_record.Attachment: + """Gets a copy of an attachment or dies when attachment not found. + + Args: + attachment_name: An attachment name. + + Returns: + A copy of the attachment. + + Raises: + AttachmentNotFoundError: Raised when attachment is not found. + """ + attachment = self.get_attachment(attachment_name) + if attachment is None: + raise AttachmentNotFoundError('Failed to find test attachment: ' + f'{attachment_name}') + return attachment + def notify_update(self) -> None: """Notify any update events that there was an update.""" self._running_test_state.notify_update() diff --git a/openhtf/core/test_executor.py b/openhtf/core/test_executor.py index 2a4ca4b6e..634af20dc 100644 --- a/openhtf/core/test_executor.py +++ b/openhtf/core/test_executor.py @@ -34,21 +34,23 @@ from openhtf.core import phase_nodes from openhtf.core import test_record from openhtf.core import test_state -from openhtf.util import conf +from openhtf.util import configuration from openhtf.util import threads +CONF = configuration.CONF + if TYPE_CHECKING: from openhtf.core import test_descriptor # pylint: disable=g-import-not-at-top _LOG = logging.getLogger(__name__) -conf.declare( +CONF.declare( 'cancel_timeout_s', default_value=2, description='Timeout (in seconds) when the test has been cancelled' 'to wait for the running phase to exit.') -conf.declare( +CONF.declare( 'stop_on_first_failure', default_value=False, description='Stop current test execution and return Outcome FAIL' @@ -94,11 +96,10 @@ def __init__(self, test_descriptor: 'test_descriptor.TestDescriptor', execution_uid: Text, test_start: Optional[phase_descriptor.PhaseDescriptor], test_options: 'test_descriptor.TestOptions', - run_with_profiling: bool): - super(TestExecutor, self).__init__( - name='TestExecutorThread', run_with_profiling=run_with_profiling) + run_phases_with_profiling: bool): + super(TestExecutor, self).__init__(name='TestExecutorThread') self.test_state = None # type: Optional[test_state.TestState] - + self._run_phases_with_profiling = run_phases_with_profiling self._test_descriptor = test_descriptor self._test_start = test_start self._test_options = test_options @@ -106,6 +107,7 @@ def __init__(self, test_descriptor: 'test_descriptor.TestDescriptor', self._phase_exec = None # type: Optional[phase_executor.PhaseExecutor] self.uid = execution_uid self._last_outcome = None # type: Optional[phase_executor.PhaseExecutionOutcome] + self._last_execution_unit: str = None self._abort = threading.Event() self._full_abort = threading.Event() # This is a reentrant lock so that the teardown logic that prevents aborts @@ -114,9 +116,21 @@ def __init__(self, test_descriptor: 'test_descriptor.TestDescriptor', # Populated if profiling is enabled. self._phase_profile_stats = [] # type: List[pstats.Stats] + @property + def running_test_state(self) -> test_state.TestState: + if self.test_state is None: + raise TestStopError('Test stopped.') + return self.test_state + + @property + def phase_executor(self) -> phase_executor.PhaseExecutor: + if self._phase_exec is None: + raise TestStopError('Test stopped.') + return self._phase_exec + @property def logger(self) -> logging.Logger: - return self.test_state.state_logger + return self.running_test_state.state_logger @property def phase_profile_stats(self) -> List[pstats.Stats]: @@ -132,7 +146,7 @@ def close(self) -> None: the __del__ function unreliably. """ self.wait() - self.test_state.close() + self.running_test_state.close() def abort(self) -> None: """Abort this test.""" @@ -173,11 +187,12 @@ def wait(self) -> None: """Waits until death.""" # Must use a timeout here in case this is called from the main thread. # Otherwise, the SIGINT abort logic in test_descriptor will not get called. - timeout = 31557600 # Seconds in a year. - if sys.version_info >= (3, 2): - # TIMEOUT_MAX can be too large and cause overflows on 32-bit OSes, so take - # whichever timeout is shorter. - timeout = min(threading.TIMEOUT_MAX, timeout) # pytype: disable=module-attr + # TIMEOUT_MAX can be too large and cause overflows on 32-bit OSes, so take + # whichever timeout is shorter. + timeout = min( + threading.TIMEOUT_MAX, + 31557600, # Seconds in a year. + ) self.join(timeout) def _thread_proc(self) -> None: @@ -226,12 +241,15 @@ def _initialize_plugs( True if there was an error initializing the plugs. """ try: - self.test_state.plug_manager.initialize_plugs(plug_types=plug_types) + self.running_test_state.plug_manager.initialize_plugs( + plug_types=plug_types + ) return False except Exception: # pylint: disable=broad-except # Record the equivalent failure outcome and exit early. self._last_outcome = phase_executor.PhaseExecutionOutcome( phase_executor.ExceptionInfo(*sys.exc_info())) + self._last_execution_unit = 'Plugs Initialization' return True def _execute_test_start(self) -> bool: @@ -247,23 +265,28 @@ def _execute_test_start(self) -> bool: True if there was a terminal error either setting up or running the test start phase. """ + if self._test_start is None: + raise TestStopError('Test stopped.') + # Have the phase executor run the start trigger phase. Do partial plug # initialization for just the plugs needed by the start trigger phase. if self._initialize_plugs( plug_types=[phase_plug.cls for phase_plug in self._test_start.plugs]): return True - outcome, profile_stats = self._phase_exec.execute_phase( - self._test_start, self._run_with_profiling) + outcome, profile_stats = self.phase_executor.execute_phase( + self._test_start, self._run_phases_with_profiling + ) if profile_stats is not None: self._phase_profile_stats.append(profile_stats) if outcome.is_terminal: self._last_outcome = outcome + self._last_execution_unit = 'TestStart' return True - if self.test_state.test_record.dut_id is None: + if self.running_test_state.test_record.dut_id is None: _LOG.warning('Start trigger did not set a DUT ID.') return False @@ -277,7 +300,7 @@ def _stop_phase_executor(self, force: bool = False) -> None: # If locked, teardown phases are running, so do not cancel those. return try: - phase_exec.stop(timeout_s=conf.cancel_timeout_s) + phase_exec.stop(timeout_s=CONF.cancel_timeout_s) # Resetting so phase_exec can run teardown phases. phase_exec.reset_stop() finally: @@ -286,42 +309,49 @@ def _stop_phase_executor(self, force: bool = False) -> None: def _execute_test_teardown(self) -> None: # Plug teardown does not affect the test outcome. - self.test_state.plug_manager.tear_down_plugs() + self.running_test_state.plug_manager.tear_down_plugs() # Now finalize the test state. if self._abort.is_set(): self.logger.debug('Finishing test with outcome ABORTED.') - self.test_state.abort() + self.running_test_state.abort() elif self._last_outcome and self._last_outcome.is_terminal: - self.test_state.finalize_from_phase_outcome(self._last_outcome) + self.running_test_state.finalize_from_phase_outcome( + self._last_outcome, self._last_execution_unit + ) else: - self.test_state.finalize_normally() + self.running_test_state.finalize_normally() def _execute_phase(self, phase: phase_descriptor.PhaseDescriptor, subtest_rec: Optional[test_record.SubtestRecord], in_teardown: bool) -> _ExecutorReturn: if subtest_rec: - self.logger.debug('Executing phase %s under subtest %s', phase.name, - subtest_rec.name) + self.logger.debug('Executing phase %s (from %s) under subtest %s', + phase.name, phase.func_location, subtest_rec.name) else: - self.logger.debug('Executing phase %s', phase.name) + self.logger.debug('Executing phase %s (from %s)', phase.name, + phase.func_location) if not in_teardown and subtest_rec and subtest_rec.is_fail: - self._phase_exec.skip_phase(phase, subtest_rec) + self.phase_executor.skip_phase(phase, subtest_rec) return _ExecutorReturn.CONTINUE - outcome, profile_stats = self._phase_exec.execute_phase( + outcome, profile_stats = self.phase_executor.execute_phase( phase, - run_with_profiling=self._run_with_profiling, - subtest_rec=subtest_rec) + run_with_profiling=self._run_phases_with_profiling, + subtest_rec=subtest_rec, + ) if profile_stats is not None: self._phase_profile_stats.append(profile_stats) - if (self.test_state.test_options.stop_on_first_failure or - conf.stop_on_first_failure): + if ( + self.running_test_state.test_options.stop_on_first_failure + or CONF.stop_on_first_failure + ): # Stop Test on first measurement failure - current_phase_result = self.test_state.test_record.phases[ - len(self.test_state.test_record.phases) - 1] + current_phase_result = self.running_test_state.test_record.phases[ + len(self.running_test_state.test_record.phases) - 1 + ] if current_phase_result.outcome == test_record.PhaseOutcome.FAIL: outcome = phase_executor.PhaseExecutionOutcome( phase_descriptor.PhaseResult.STOP) @@ -330,6 +360,7 @@ def _execute_phase(self, phase: phase_descriptor.PhaseDescriptor, if outcome.is_terminal: if not self._last_outcome: self._last_outcome = outcome + self._last_execution_unit = phase.name return _ExecutorReturn.TERMINAL if outcome.is_fail_subtest: @@ -344,13 +375,14 @@ def _execute_checkpoint(self, checkpoint: phase_branches.Checkpoint, subtest_rec: Optional[test_record.SubtestRecord], in_teardown: bool) -> _ExecutorReturn: if not in_teardown and subtest_rec and subtest_rec.is_fail: - self._phase_exec.skip_checkpoint(checkpoint, subtest_rec) + self.phase_executor.skip_checkpoint(checkpoint, subtest_rec) return _ExecutorReturn.CONTINUE - outcome = self._phase_exec.evaluate_checkpoint(checkpoint, subtest_rec) + outcome = self.phase_executor.evaluate_checkpoint(checkpoint, subtest_rec) if outcome.is_terminal: if not self._last_outcome: self._last_outcome = outcome + self._last_execution_unit = checkpoint.name return _ExecutorReturn.TERMINAL if outcome.is_fail_subtest: @@ -489,7 +521,7 @@ def _execute_phase_branch(self, branch: phase_branches.BranchSequence, return _ExecutorReturn.CONTINUE evaluated_millis = util.time_millis() - if branch.should_run(self.test_state.diagnoses_manager.store): + if branch.should_run(self.running_test_state.diagnoses_manager.store): self.logger.debug('%s: Branch condition met; running phases.', branch_message) branch_taken = True @@ -502,7 +534,7 @@ def _execute_phase_branch(self, branch: phase_branches.BranchSequence, branch_rec = test_record.BranchRecord.from_branch(branch, branch_taken, evaluated_millis) - self.test_state.test_record.add_branch_record(branch_rec) + self.running_test_state.test_record.add_branch_record(branch_rec) return ret def _execute_phase_group(self, group: phase_group.PhaseGroup, @@ -585,8 +617,9 @@ def _execute_node(self, node: phase_nodes.PhaseNode, def _execute_test_diagnoser( self, diagnoser: diagnoses_lib.BaseTestDiagnoser) -> None: try: - self.test_state.diagnoses_manager.execute_test_diagnoser( - diagnoser, self.test_state.test_record) + self.running_test_state.diagnoses_manager.execute_test_diagnoser( + diagnoser, self.running_test_state.test_record + ) except Exception: # pylint: disable=broad-except if self._last_outcome and self._last_outcome.is_terminal: self.logger.exception( @@ -597,6 +630,7 @@ def _execute_test_diagnoser( # Record the equivalent failure outcome and exit early. self._last_outcome = phase_executor.PhaseExecutionOutcome( phase_executor.ExceptionInfo(*sys.exc_info())) + self._last_execution_unit = str(diagnoser.name) def _execute_test_diagnosers(self) -> None: for diagnoser in self._test_options.diagnosers: diff --git a/openhtf/core/test_record.py b/openhtf/core/test_record.py index 8bb768f21..690ecc4fc 100644 --- a/openhtf/core/test_record.py +++ b/openhtf/core/test_record.py @@ -13,6 +13,7 @@ # limitations under the License. """OpenHTF module responsible for managing records of tests.""" +import enum import hashlib import inspect import logging @@ -21,14 +22,13 @@ from typing import Any, Dict, List, Optional, Text, TYPE_CHECKING, Union import attr -import enum # pylint: disable=g-bad-import-order from openhtf import util -from openhtf.util import conf +from openhtf.util import configuration from openhtf.util import data from openhtf.util import logs -import six +CONF = configuration.CONF if TYPE_CHECKING: from openhtf.core import diagnoses_lib # pylint: disable=g-import-not-at-top @@ -37,10 +37,10 @@ from openhtf.core import phase_executor # pylint: disable=g-import-not-at-top from openhtf.core import phase_branches # pylint: disable=g-import-not-at-top -conf.declare( +CONF.declare( 'attachments_directory', default_value=None, - description='Directory where temprorary files can be safely stored.') + description='Directory where temporary files can be safely stored.') _LOG = logging.getLogger(__name__) @@ -72,16 +72,20 @@ class Attachment(object): sha1: str, SHA-1 hash of the data. _file: Temporary File containing the data. data: property that reads the data from the temporary file. + size: Number of bytes of data in the file """ mimetype = attr.ib(type=Text) sha1 = attr.ib(type=Text) _filename = attr.ib(type=Text) + size = attr.ib(type=int) def __init__(self, contents: Union[Text, bytes], mimetype: Text): - contents = six.ensure_binary(contents) + if isinstance(contents, str): + contents = contents.encode() self.mimetype = mimetype self.sha1 = hashlib.sha1(contents).hexdigest() + self.size = len(contents) self._filename = self._create_temp_file(contents) def __del__(self): @@ -89,7 +93,7 @@ def __del__(self): def _create_temp_file(self, contents: bytes) -> Text: with tempfile.NamedTemporaryFile( - 'w+b', dir=conf.attachments_directory, delete=False) as tf: + 'w+b', dir=CONF.attachments_directory, delete=False) as tf: tf.write(contents) return tf.name @@ -178,6 +182,7 @@ class TestRecord(object): type=List['diagnoses_lib.BaseTestDiagnoser'], factory=list) diagnoses = attr.ib(type=List['diagnoses_lib.Diagnosis'], factory=list) log_records = attr.ib(type=List[logs.LogRecord], factory=list) + marginal = attr.ib(type=Optional[bool], default=None) # Cache fields to reduce repeated base type conversions. _cached_record = attr.ib(type=Dict[Text, Any], factory=dict) @@ -194,7 +199,7 @@ def __attrs_post_init__(self) -> None: # Cache data that does not change during execution. # Cache the metadata config so it does not recursively copied over and over # again. - self._cached_config_from_metadata = self.metadata.get('config') + self._cached_config_from_metadata = self.metadata.get('config') # pytype: disable=annotation-type-mismatch self._cached_record = { 'station_id': data.convert_to_base_types(self.station_id), 'code_info': data.convert_to_base_types(self.code_info), @@ -249,6 +254,7 @@ def as_base_types(self) -> Dict[Text, Any]: 'end_time_millis': self.end_time_millis, 'outcome': data.convert_to_base_types(self.outcome), 'outcome_details': data.convert_to_base_types(self.outcome_details), + 'marginal': self.marginal, 'metadata': metadata, 'phases': self._cached_phases, 'subtests': self._cached_subtests, @@ -333,7 +339,7 @@ class PhaseRecord(object): dictionaries, each of which map measurement name to the respective object. In the case of the measurements field, those objects are measurements.Measurement instances. The 'value' attribute of each of those instances is an instance of - measurments.MeasuredValue, which contains either a single value, or a list of + measurements.MeasuredValue, which contains either a single value, or a list of values in the case of a dimensioned measurement. See measurements.Record.GetValues() for more information. @@ -366,6 +372,7 @@ class PhaseRecord(object): result = attr.ib( type=Optional['phase_executor.PhaseExecutionOutcome'], default=None) outcome = attr.ib(type=Optional[PhaseOutcome], default=None) + marginal = attr.ib(type=Optional[bool], default=None) @classmethod def from_descriptor( @@ -411,6 +418,7 @@ class SubtestRecord(object): start_time_millis = attr.ib(type=int, default=0) end_time_millis = attr.ib(type=Optional[int], default=None) outcome = attr.ib(type=Optional[SubtestOutcome], default=None) + marginal = attr.ib(type=Optional[bool], default=None) @property def is_fail(self) -> bool: diff --git a/openhtf/core/test_state.py b/openhtf/core/test_state.py index 780a347b0..c55cd7e3f 100644 --- a/openhtf/core/test_state.py +++ b/openhtf/core/test_state.py @@ -27,15 +27,15 @@ import copy import enum import functools +import itertools import logging import mimetypes import os import socket import sys -from typing import Any, Dict, Iterator, List, Optional, Set, Text, TYPE_CHECKING, Union +from typing import Any, Dict, Iterator, List, Optional, Set, TYPE_CHECKING, Text, Tuple, Union import attr - import openhtf from openhtf import plugs from openhtf import util @@ -44,18 +44,17 @@ from openhtf.core import phase_descriptor from openhtf.core import phase_executor from openhtf.core import test_record -from openhtf.util import conf +from openhtf.util import configuration from openhtf.util import data from openhtf.util import logs -from openhtf.util import units -from past.builtins import long -import six from typing_extensions import Literal +CONF = configuration.CONF + if TYPE_CHECKING: from openhtf.core import test_descriptor # pylint: disable=g-import-not-at-top -conf.declare( +CONF.declare( 'allow_unset_measurements', default_value=False, description='If True, unset measurements do not cause Tests to ' @@ -65,7 +64,7 @@ # conf.load(station_id='My_OpenHTF_Station'), or alongside other configs loaded # with conf.load_from_dict({..., 'station_id': 'My_Station'}). If none of those # are provided then we'll fall back to the machine's hostname. -conf.declare( +CONF.declare( 'station_id', 'The name of this test station', default_value=socket.gethostname()) @@ -76,9 +75,12 @@ class _Infer(enum.Enum): # Sentinel value indicating that the mimetype should be inferred. -INFER_MIMETYPE = _Infer.INFER +INFER_MIMETYPE: Literal[_Infer.INFER] = _Infer.INFER MimetypeT = Union[None, Literal[INFER_MIMETYPE], Text] +# MultiDim measurement failure code. +MULTIDIM_FAIL = 'Multidim Measurement Failure' + class BlankDutIdError(Exception): """DUT serial cannot be blank at the end of a test.""" @@ -92,37 +94,6 @@ class InternalError(Exception): """An internal error.""" -@attr.s(slots=True, frozen=True) -class ImmutableMeasurement(object): - """Immutable copy of a measurement.""" - - name = attr.ib(type=Text) - value = attr.ib(type=Any) - units = attr.ib(type=Optional[units.UnitDescriptor]) - dimensions = attr.ib(type=Optional[List[measurements.Dimension]]) - outcome = attr.ib(type=Optional[measurements.Outcome]) - - @classmethod - def from_measurement( - cls, measurement: measurements.Measurement) -> 'ImmutableMeasurement': - """Convert a Measurement into an ImmutableMeasurement.""" - measured_value = measurement.measured_value - if isinstance(measured_value, measurements.DimensionedMeasuredValue): - value = data.attr_copy( - measured_value, value_dict=copy.deepcopy(measured_value.value_dict)) - else: - value = ( - copy.deepcopy(measured_value.value) - if measured_value.is_value_set else None) - - return cls( - name=measurement.name, - value=value, - units=measurement.units, - dimensions=measurement.dimensions, - outcome=measurement.outcome) - - class TestState(util.SubscribableStateMixin): """This class handles tracking the state of a running Test. @@ -170,7 +141,7 @@ def __init__(self, test_desc: 'test_descriptor.TestDescriptor', self.test_record = test_record.TestRecord( dut_id=None, - station_id=conf.station_id, + station_id=CONF.station_id, code_info=test_desc.code_info, start_time_millis=0, # Copy metadata so we don't modify test_desc. @@ -259,8 +230,9 @@ def get_attachment(self, self.state_logger.warning('Could not find attachment: %s', attachment_name) return None - def get_measurement(self, - measurement_name: Text) -> Optional[ImmutableMeasurement]: + def get_measurement( + self, measurement_name: Text + ) -> Optional[measurements.ImmutableMeasurement]: """Get a copy of a measurement value from current or previous phase. Measurement and phase name uniqueness is not enforced, so this method will @@ -278,8 +250,9 @@ def get_measurement(self, # Check current running phase state if self.running_phase_state: if measurement_name in self.running_phase_state.measurements: - return ImmutableMeasurement.from_measurement( - self.running_phase_state.measurements[measurement_name]) + return measurements.ImmutableMeasurement.from_measurement( + self.running_phase_state.measurements[measurement_name] + ) # Iterate through phases in reversed order to return most recent (necessary # because measurement and phase names are not necessarily unique) @@ -287,7 +260,7 @@ def get_measurement(self, if (phase_record.result not in ignore_outcomes and measurement_name in phase_record.measurements): measurement = phase_record.measurements[measurement_name] - return ImmutableMeasurement.from_measurement(measurement) + return measurements.ImmutableMeasurement.from_measurement(measurement) self.state_logger.warning('Could not find measurement: %s', measurement_name) @@ -382,7 +355,9 @@ def set_status_running(self) -> None: def finalize_from_phase_outcome( self, - phase_execution_outcome: phase_executor.PhaseExecutionOutcome) -> None: + phase_execution_outcome: phase_executor.PhaseExecutionOutcome, + phase_name: str, + ) -> None: """Finalize due to the given phase outcome.""" if self._is_aborted(): return @@ -400,35 +375,90 @@ def finalize_from_phase_outcome( self.test_record.add_outcome_details(code, description) if self._outcome_is_failure_exception(phase_execution_outcome): self.state_logger.error( - 'Outcome will be FAIL since exception was of type %s', - phase_execution_outcome.phase_result.exc_val) + f'Outcome of {phase_name} will be FAIL since exception was of type' + ' {phase_execution_outcome.phase_result.exc_val}' + ) self._finalize(test_record.Outcome.FAIL) else: self.state_logger.critical( - 'Finishing test execution early due to an exception raised during ' - 'phase execution; outcome ERROR.') - # Enable CLI printing of the full traceback with the -v flag. - self.state_logger.critical( - 'Traceback:%s%s%s%s', - os.linesep, - phase_execution_outcome.phase_result.get_traceback_string(), - os.linesep, - description, + f'Finishing test execution of {phase_name} early due to an ' + 'exception raised during phase execution; outcome ERROR.' ) + # Enable CLI printing of the full traceback with the -v flag. + if isinstance(result, phase_executor.ExceptionInfo): + self.state_logger.critical( + 'Traceback:%s%s%s%s\n in executing %s', + os.linesep, + phase_execution_outcome.phase_result.get_traceback_string(), + os.linesep, + description, + phase_name, + ) + else: + self.state_logger.critical( + f'Description:{description}, PhaseName:{phase_name}' + ) self._finalize(test_record.Outcome.ERROR) elif phase_execution_outcome.is_timeout: - self.state_logger.error('Finishing test execution early due to ' - 'phase timeout, outcome TIMEOUT.') - self.test_record.add_outcome_details('TIMEOUT', - 'A phase hit its timeout.') + self.state_logger.error( + 'Finishing test execution early due to ' + f'phase {phase_name} experiencing timeout, ' + 'outcome TIMEOUT.' + ) + self.test_record.add_outcome_details( + 'TIMEOUT', f'Phase {phase_name} hit its timeout.' + ) self._finalize(test_record.Outcome.TIMEOUT) elif phase_execution_outcome.phase_result == openhtf.PhaseResult.STOP: - self.state_logger.error('Finishing test execution early due to ' - 'PhaseResult.STOP, outcome FAIL.') - self.test_record.add_outcome_details('STOP', - 'A phase stopped the test run.') + self.state_logger.error( + 'Finishing test execution early due to ' + f'{phase_name} causing PhaseResult.STOP, ' + 'outcome FAIL.' + ) + self.test_record.add_outcome_details( + 'STOP', f'Phase {phase_name} stopped the test run.' + ) self._finalize(test_record.Outcome.FAIL) + def _is_failed_multidim_measurement(self, meas: measurements.Measurement + ) -> bool: + """Returns whether the given value is a failed multidim measurement.""" + return bool(meas.outcome != measurements.Outcome.PASS and meas.dimensions) + + def _get_failed_multidim_measurements( + self, + ) -> List[Tuple[str, openhtf.core.measurements.Measurement]]: + """Gets all the failed phase multidim measurements in the test record. + + Returns: + a flat list containing tuples of (measurement_name, measurement) values. + """ + failed_phases = ( + phase + for phase in self.test_record.phases + if phase.outcome == test_record.PhaseOutcome.FAIL + ) + phases_meas_items = (phase.measurements.items() for phase in failed_phases) + flat_meas_items = itertools.chain.from_iterable(phases_meas_items) + failed_multidim_meas = [ + meas_item + for meas_item in flat_meas_items + if self._is_failed_multidim_measurement(meas_item[1]) + ] + return failed_multidim_meas + + def _add_multidim_outcome_details(self): + """Adds additional outcome details for failed multidim measurements.""" + failed_multidim_meas = self._get_failed_multidim_measurements() + + for name, measurement in failed_multidim_meas: + message = [f' failed_item: {name} ({measurement.outcome})'] + message.append(f' measured_value: {measurement.measured_value}') + message.append(' validators:') + for validator in measurement.validators: + message.append(f' validator: {str(validator)}') + self.test_record.add_outcome_details(MULTIDIM_FAIL, '\n'.join(message)) + def finalize_normally(self) -> None: """Mark the state as finished. @@ -443,29 +473,38 @@ def finalize_normally(self) -> None: # Vacuously PASS a TestRecord with no phases. self._finalize(test_record.Outcome.PASS) elif any( - phase.outcome == test_record.PhaseOutcome.FAIL for phase in phases): + phase.outcome == test_record.PhaseOutcome.FAIL for phase in phases + ): + # Look for multidim failures to add to outcome details. + self._add_multidim_outcome_details() # Any FAIL phase results in a test failure. self._finalize(test_record.Outcome.FAIL) elif all( - phase.outcome == test_record.PhaseOutcome.SKIP for phase in phases): + phase.outcome == test_record.PhaseOutcome.SKIP for phase in phases + ): # Error when all phases are skipped; otherwise, it could lead to # unintentional passes. self.state_logger.error('All phases were skipped, outcome ERROR.') self.test_record.add_outcome_details( - 'ALL_SKIPPED', 'All phases were unexpectedly skipped.') + 'ALL_SKIPPED', 'All phases were unexpectedly skipped.' + ) self._finalize(test_record.Outcome.ERROR) elif any(d.is_failure for d in self.test_record.diagnoses): self._finalize(test_record.Outcome.FAIL) - elif any(s.outcome == test_record.SubtestOutcome.FAIL - for s in self.test_record.subtests): + elif any( + s.outcome == test_record.SubtestOutcome.FAIL + for s in self.test_record.subtests + ): self._finalize(test_record.Outcome.FAIL) else: # Otherwise, the test run was successful. + self.test_record.marginal = any(phase.marginal for phase in phases) self._finalize(test_record.Outcome.PASS) self.state_logger.debug( 'Finishing test execution normally with outcome %s.', - self.test_record.outcome.name) + self.test_record.outcome.name, + ) def abort(self) -> None: if self._is_aborted(): @@ -535,6 +574,7 @@ class PhaseState(object): place to save allocation time. attachments: Convenience accessor for phase_record.attachments. result: Convenience getter/setter for phase_record.result. + marginal: Convenience getter/setter for phase_record.marginal. """ name = attr.ib(type=Text) @@ -549,7 +589,7 @@ class PhaseState(object): _update_measurements = attr.ib(type=Set[Text], factory=set) def __attrs_post_init__(self): - for m in six.itervalues(self.measurements): + for m in self.measurements.values(): # Using functools.partial to capture the value of the loop variable. m.set_notification_callback(functools.partial(self._notify, m.name)) self._cached = { @@ -563,11 +603,10 @@ def __attrs_post_init__(self): 'options': None, 'measurements': { - k: m.as_base_types() for k, m in six.iteritems(self.measurements) + k: m.as_base_types() for k, m in self.measurements.items() }, 'attachments': {}, - 'start_time_millis': - long(self.phase_record.record_start_time()), + 'start_time_millis': self.phase_record.record_start_time(), 'subtest_name': None, } @@ -627,6 +666,14 @@ def set_subtest_name(self, subtest_name: Text) -> None: self.phase_record.subtest_name = subtest_name self._cached['subtest_name'] = subtest_name + @property + def marginal(self) -> Optional[phase_executor.PhaseExecutionOutcome]: + return self.phase_record.marginal # pytype: disable=bad-return-type # bind-properties + + @marginal.setter + def marginal(self, marginal: bool): + self.phase_record.marginal = marginal + @property def attachments(self) -> Dict[Text, test_record.Attachment]: return self.phase_record.attachments @@ -724,33 +771,49 @@ def _finalize_measurements(self) -> None: def _measurements_pass(self) -> bool: allowed_outcomes = {measurements.Outcome.PASS} - if conf.allow_unset_measurements: + if CONF.allow_unset_measurements: allowed_outcomes.add(measurements.Outcome.UNSET) return all(meas.outcome in allowed_outcomes for meas in self.phase_record.measurements.values()) + def _measurements_marginal(self) -> bool: + return any( + meas.marginal for meas in self.phase_record.measurements.values()) + def _set_prediagnosis_phase_outcome(self) -> None: """Set the phase outcome before running diagnosers.""" result = self.result if result is None or result.is_terminal or self.hit_repeat_limit: - self.logger.debug('Phase outcome is ERROR.') + self.logger.debug('Phase outcome of %s is ERROR.', self.name) outcome = test_record.PhaseOutcome.ERROR elif result.is_repeat or result.is_skip: - self.logger.debug('Phase outcome is SKIP.') + self.logger.debug('Phase outcome of %s is SKIP.', self.name) outcome = test_record.PhaseOutcome.SKIP elif result.is_fail_subtest: - self.logger.debug('Phase outcome is FAIL due to subtest failure.') + self.logger.debug('Phase outcome of %s is FAIL due to subtest failure.', + self.name) outcome = test_record.PhaseOutcome.FAIL elif result.is_fail_and_continue: - self.logger.debug('Phase outcome is FAIL due to phase result.') + self.logger.debug('Phase outcome of %s is FAIL due to phase result.', + self.name) outcome = test_record.PhaseOutcome.FAIL elif not self._measurements_pass(): - self.logger.debug('Phase outcome is FAIL due to measurement outcome.') + self.logger.debug( + 'Phase outcome of %s is FAIL due to measurement outcome.', self.name) + if self.options.stop_on_measurement_fail: + self.logger.debug( + 'Stopping test due to phase %s having stop on fail option.', + self.name, + ) + self.result = phase_executor.PhaseExecutionOutcome( + phase_descriptor.PhaseResult.STOP + ) outcome = test_record.PhaseOutcome.FAIL else: - self.logger.debug('Phase outcome is PASS.') + self.logger.debug('Phase outcome of %s is PASS.', self.name) outcome = test_record.PhaseOutcome.PASS + self.phase_record.marginal = self._measurements_marginal() self.phase_record.outcome = outcome def _set_postdiagnosis_phase_outcome(self) -> None: @@ -758,14 +821,16 @@ def _set_postdiagnosis_phase_outcome(self) -> None: if self.phase_record.outcome == test_record.PhaseOutcome.ERROR: return # Check for errors during diagnoser execution. - if self.result is None or self.result.is_terminal: - self.logger.debug('Phase outcome is ERROR due to diagnoses.') + if self.result is None or self.result.is_terminal: # pytype: disable=attribute-error # always-use-return-annotations + self.logger.debug('Phase outcome of %s is ERROR due to diagnoses.', + self.name) self.phase_record.outcome = test_record.PhaseOutcome.ERROR return if self.phase_record.outcome != test_record.PhaseOutcome.PASS: return if self.phase_record.failure_diagnosis_results: - self.logger.debug('Phase outcome is FAIL due to diagnoses.') + self.logger.debug('Phase outcome of %s is FAIL due to diagnoses.', + self.name) self.phase_record.outcome = test_record.PhaseOutcome.FAIL def _execute_phase_diagnoser( @@ -778,7 +843,7 @@ def _execute_phase_diagnoser( if self.phase_record.result.is_terminal: self.logger.exception( 'Phase Diagnoser %s raised an exception, but phase result is ' - 'already terminal; logging additonal exception here.', + 'already terminal; logging additional exception here.', diagnoser.name) else: self.phase_record.result = phase_executor.PhaseExecutionOutcome( diff --git a/openhtf/output/__init__.py b/openhtf/output/__init__.py index e69de29bb..6d6d1266c 100644 --- a/openhtf/output/__init__.py +++ b/openhtf/output/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/openhtf/output/callbacks/__init__.py b/openhtf/output/callbacks/__init__.py index d83ea1e02..5463c13ce 100644 --- a/openhtf/output/callbacks/__init__.py +++ b/openhtf/output/callbacks/__init__.py @@ -19,7 +19,9 @@ examples. """ +from collections.abc import Iterable import contextlib +import pickle import shutil import tempfile import typing @@ -28,9 +30,6 @@ from openhtf import util from openhtf.core import test_record from openhtf.util import data -import six -from six.moves import collections_abc -from six.moves import cPickle as pickle SerializedTestRecord = Union[Text, bytes, Iterator[Union[Text, bytes]]] @@ -44,7 +43,9 @@ def __init__(self, filename: Text): self.temp = tempfile.NamedTemporaryFile(delete=False) def write(self, write_data: Union[Text, bytes]) -> int: - return self.temp.write(six.ensure_binary(write_data)) + if isinstance(write_data, str): + write_data = write_data.encode() + return self.temp.write(write_data) def close(self) -> None: self.temp.close() @@ -56,7 +57,7 @@ class CloseAttachments(object): def __call__(self, test_rec: test_record.TestRecord) -> None: for phase_rec in test_rec.phases: - for attachment in six.itervalues(phase_rec.attachments): + for attachment in phase_rec.attachments.values(): attachment.close() @@ -79,11 +80,11 @@ class OutputToFile(object): def __init__(self, filename_pattern_or_file: Union[Text, Callable[..., Text], BinaryIO]): - self.filename_pattern = None # type: Optional[Union[Text, Callable[..., Text]]] - self.output_file = None # type: Optional[BinaryIO] - if (isinstance(filename_pattern_or_file, six.string_types) or + self.filename_pattern: Optional[Union[Text, Callable[..., Text]]] = None + self.output_file: Optional[BinaryIO] = None + if (isinstance(filename_pattern_or_file, str) or callable(filename_pattern_or_file)): - self.filename_pattern = filename_pattern_or_file + self.filename_pattern = filename_pattern_or_file # pytype: disable=annotation-type-mismatch else: self.output_file = filename_pattern_or_file @@ -130,11 +131,11 @@ def open_output_file( def __call__(self, test_rec: test_record.TestRecord) -> None: with self.open_output_file(test_rec) as outfile: serialized_record = self.serialize_test_record(test_rec) - if isinstance(serialized_record, six.string_types): - outfile.write(six.ensure_binary(serialized_record)) - elif isinstance(serialized_record, collections_abc.Iterable): + if isinstance(serialized_record, str): + outfile.write(serialized_record.encode()) + elif isinstance(serialized_record, Iterable): for chunk in serialized_record: - outfile.write(six.ensure_binary(chunk)) + outfile.write(chunk.encode() if isinstance(chunk, str) else chunk) else: raise TypeError('Expected string or iterable but got {}.'.format( type(serialized_record))) diff --git a/openhtf/output/callbacks/console_summary.py b/openhtf/output/callbacks/console_summary.py index e351dcb74..3d5ac22e7 100644 --- a/openhtf/output/callbacks/console_summary.py +++ b/openhtf/output/callbacks/console_summary.py @@ -1,18 +1,34 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Module to display test summary on console.""" import os import sys +from typing import TextIO from openhtf.core import measurements from openhtf.core import test_record -import six class ConsoleSummary(): """Print test results with failure info on console.""" # pylint: disable=invalid-name - def __init__(self, indent=2, output_stream=sys.stdout): + def __init__(self, + indent: int = 2, + output_stream: TextIO = sys.stdout) -> None: self.indent = ' ' * indent if os.name == 'posix': # Linux and Mac. self.RED = '\033[91m' @@ -38,17 +54,22 @@ def __init__(self, indent=2, output_stream=sys.stdout): # pylint: enable=invalid-name - def __call__(self, record): + def __call__(self, record: test_record.TestRecord) -> None: + if record is None: + raise ValueError('record is None') + outcome = record.outcome + if outcome is None: + raise ValueError('record.outcome is None') output_lines = [ ''.join((self.color_table[record.outcome], self.BOLD, - record.code_info.name, ':', record.outcome.name, self.RESET)) + record.code_info.name, ':', outcome.name, self.RESET)) ] if record.outcome != test_record.Outcome.PASS: for phase in record.phases: new_phase = True phase_time_sec = (float(phase.end_time_millis) - float(phase.start_time_millis)) / 1000.0 - for name, measurement in six.iteritems(phase.measurements): + for name, measurement in phase.measurements.items(): if measurement.outcome != measurements.Outcome.PASS: if new_phase: output_lines.append('failed phase: %s [ran for %.2f sec]' % @@ -68,7 +89,8 @@ def __call__(self, record): if not phase_result: # Timeout. output_lines.append('timeout phase: %s [ran for %.2f sec]' % (phase.name, phase_time_sec)) - elif 'CONTINUE' not in str(phase_result): # Exception. + elif 'CONTINUE' not in str(phase_result) and record.outcome_details: + # Exception. output_lines.append('%sexception type: %s' % (self.indent, record.outcome_details[0].code)) diff --git a/openhtf/output/callbacks/json_factory.py b/openhtf/output/callbacks/json_factory.py index e410f24ab..cd9247c44 100644 --- a/openhtf/output/callbacks/json_factory.py +++ b/openhtf/output/callbacks/json_factory.py @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Module for outputting test record to JSON-formatted files.""" import base64 @@ -7,7 +21,6 @@ from openhtf.core import test_record from openhtf.output import callbacks from openhtf.util import data -import six class TestRecordEncoder(json.JSONEncoder): @@ -40,7 +53,7 @@ def convert_test_record_to_json( as_dict = data.convert_to_base_types(test_rec, json_safe=(not allow_nan)) if inline_attachments: for phase, original_phase in zip(as_dict['phases'], test_rec.phases): - for name, attachment in six.iteritems(original_phase.attachments): + for name, attachment in original_phase.attachments.items(): phase['attachments'][name] = attachment return as_dict @@ -61,7 +74,7 @@ def stream_json( json_encoder = TestRecordEncoder(allow_nan=allow_nan, **kwargs) # The iterencode return type in typeshed for PY2 is wrong; not worried about - # fixing it as we are droping PY2 support soon. + # fixing it as we are dropping PY2 support soon. return json_encoder.iterencode(encoded_test_rec) # pytype: disable=bad-return-type diff --git a/openhtf/output/callbacks/mfg_inspector.py b/openhtf/output/callbacks/mfg_inspector.py index 28ad52803..1815b8965 100644 --- a/openhtf/output/callbacks/mfg_inspector.py +++ b/openhtf/output/callbacks/mfg_inspector.py @@ -1,21 +1,39 @@ -"""Output and/or upload a TestRun or MfgEvent proto for mfg-inspector.com. -""" - -import json +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Output and/or upload a TestRun or MfgEvent proto for mfg-inspector.com.""" + +import functools import logging -import threading import time import zlib +from typing import Optional -import httplib2 -import oauth2client.client - +from google.auth import credentials as credentials_lib +from google.auth.transport import requests +from google.oauth2 import service_account from openhtf.output import callbacks -from openhtf.output.proto import guzzle_pb2 from openhtf.output.proto import test_runs_converter -import six -from six.moves import range +from openhtf.output.proto import test_runs_pb2 +from openhtf.output.proto import mfg_event_pb2 +from openhtf.output.proto import guzzle_pb2 + +from typing import Any, Dict, Union + + +_MFG_INSPECTOR_UPLOAD_TIMEOUT = 60 * 5 class UploadFailedError(Exception): @@ -26,46 +44,76 @@ class InvalidTestRunError(Exception): """Raised if test run is invalid.""" -def _send_mfg_inspector_request(envelope_data, credentials, destination_url): +def _send_mfg_inspector_request( + envelope_data: bytes, + authorized_session: requests.AuthorizedSession, + destination_url: str, +) -> Dict[str, Any]: """Send upload http request. Intended to be run in retry loop.""" logging.info('Uploading result...') - http = httplib2.Http() - - if credentials.access_token_expired: - credentials.refresh(http) - credentials.authorize(http) - resp, content = http.request(destination_url, 'POST', envelope_data) + response = authorized_session.request( + 'POST', + destination_url, + data=envelope_data, + timeout=_MFG_INSPECTOR_UPLOAD_TIMEOUT, + ) try: - result = json.loads(content) - except Exception: - logging.warning('Upload failed with response %s: %s', resp, content) - raise UploadFailedError(resp, content) - - if resp.status == 200: + result = response.json() + except Exception as e: + logging.exception( + 'Upload failed with response %s: %s', response, response.text + ) + raise UploadFailedError(response, response.text) from e + + if response.status_code == 200: return result message = '%s: %s' % (result.get('error', 'UNKNOWN_ERROR'), result.get('message')) - if resp.status == 400: + if response.status_code == 400: raise InvalidTestRunError(message) else: raise UploadFailedError(message) -def send_mfg_inspector_data(inspector_proto, credentials, destination_url, - payload_type): +@functools.lru_cache(len(guzzle_pb2.PayloadType.values())) +def _is_compressed_payload_type( + payload_type: guzzle_pb2.PayloadType, +) -> bool: + return ( + guzzle_pb2.PayloadType.Name(payload_type) + .lower() + .startswith('compressed_') + ) + + +def send_mfg_inspector_data( + inspector_proto: Union[mfg_event_pb2.MfgEvent, test_runs_pb2.TestRun], + credentials: credentials_lib.Credentials, + destination_url: str, + payload_type: guzzle_pb2.PayloadType, + authorized_session: Optional[requests.AuthorizedSession] = None, +) -> Dict[str, Any]: """Upload MfgEvent to steam_engine.""" - envelope = guzzle_pb2.TestRunEnvelope() - envelope.payload = zlib.compress(inspector_proto.SerializeToString()) + envelope = guzzle_pb2.TestRunEnvelope() # pytype: disable=module-attr # gen-stub-imports + data = inspector_proto.SerializeToString() + if _is_compressed_payload_type(payload_type): + data = zlib.compress(data) + + envelope.payload = data envelope.payload_type = payload_type envelope_data = envelope.SerializeToString() + if authorized_session is None: + authorized_session = requests.AuthorizedSession(credentials) + for _ in range(5): try: - result = _send_mfg_inspector_request(envelope_data, credentials, - destination_url) + result = _send_mfg_inspector_request( + envelope_data, authorized_session, destination_url + ) return result except UploadFailedError: time.sleep(1) @@ -76,26 +124,6 @@ def send_mfg_inspector_data(inspector_proto, credentials, destination_url, return {} -class _MemStorage(oauth2client.client.Storage): - """Helper Storage class that keeps credentials in memory.""" - - def __init__(self): - self._lock = threading.Lock() - self._credentials = None - - def acquire_lock(self): - self._lock.acquire(True) - - def release_lock(self): - self._lock.release() - - def locked_get(self): - return self._credentials - - def locked_put(self, credentials): - self._credentials = credentials - - class MfgInspector(object): """Interface to convert a TestRun to a mfg-inspector compatible proto. @@ -107,7 +135,7 @@ class MfgInspector(object): my_custom_converter) my_tester.add_output_callbacks(interface.save_to_disk(), interface.upload()) - **Important** the conversion of the TestRecord to protofbuf as specified in + **Important** the conversion of the TestRecord to protobuf as specified in the _converter callable attribute only occurs once and the resulting protobuf is cached in memory on the instance. @@ -115,10 +143,10 @@ class MfgInspector(object): username and authentication key (which should be the key data itself, not a filename or file). - In typical productin setups, we *first* save the protobuf to disk then attempt - to upload the protobuf to mfg-inspector. In the event of a network outage, - the result of the test run is available on disk and a separate process can - retry the upload when network is available. + In typical production setups, we *first* save the protobuf to disk then + attempt to upload the protobuf to mfg-inspector. In the event of a network, + outage the result of the test run is available on disk and a separate process + can retry the upload when the network is available. """ TOKEN_URI = 'https://accounts.google.com/o/oauth2/token' @@ -149,15 +177,18 @@ def __init__(self, self.destination_url = destination_url if user and keydata: - self.credentials = oauth2client.client.SignedJwtAssertionCredentials( - service_account_name=self.user, - private_key=six.ensure_binary(self.keydata), - scope=self.SCOPE_CODE_URI, - user_agent='OpenHTF Guzzle Upload Client', - token_uri=self.token_uri) - self.credentials.set_store(_MemStorage()) + self.credentials = service_account.Credentials.from_service_account_info( + { + 'client_email': self.user, + 'token_uri': self.token_uri, + 'private_key': self.keydata, + 'user_agent': 'OpenHTF Guzzle Upload Client', + }, + scopes=[self.SCOPE_CODE_URI]) + self.authorized_session = requests.AuthorizedSession(self.credentials) else: self.credentials = None + self.authorized_session = None self.upload_result = None @@ -194,6 +225,11 @@ def _convert(self, test_record_obj): """Convert and cache a test record to a mfg-inspector proto.""" if (self._cached_proto is None or not self._check_cached_params(test_record_obj)): + if self._converter is None: + raise RuntimeError( + 'Must set _converter on subclass or via set_converter before' + ' calling save_to_disk.' + ) self._cached_proto = self._converter(test_record_obj) for param in self.PARAMS: self._cached_params[param] = getattr(test_record_obj, param) @@ -230,11 +266,18 @@ def upload(self, payload_type=guzzle_pb2.COMPRESSED_TEST_RUN): if not self.credentials: raise RuntimeError('Must provide credentials to use upload callback.') + if self.authorized_session is None: + self.authorized_session = requests.AuthorizedSession(self.credentials) + def upload_callback(test_record_obj): proto = self._convert(test_record_obj) - self.upload_result = send_mfg_inspector_data(proto, self.credentials, - self.destination_url, - payload_type) + self.upload_result = send_mfg_inspector_data( + proto, + self.credentials, + self.destination_url, + payload_type, + self.authorized_session, + ) return upload_callback diff --git a/openhtf/output/proto/__init__.py b/openhtf/output/proto/__init__.py index e69de29bb..6d6d1266c 100644 --- a/openhtf/output/proto/__init__.py +++ b/openhtf/output/proto/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/openhtf/output/proto/assembly_event.proto b/openhtf/output/proto/assembly_event.proto index 5e7dfc9f2..b4a89202d 100644 --- a/openhtf/output/proto/assembly_event.proto +++ b/openhtf/output/proto/assembly_event.proto @@ -1,3 +1,17 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package openhtf; @@ -22,7 +36,7 @@ message AssemblyEvent { // An individual Component, potentially a member of an assembly. message Component { string part_number = 1; // GPN - // Unique idenfier of a component, either serial or lot/index. + // Unique identifier of a component, either serial or lot/index. oneof id { string serial = 2; // GSN. Most components will have this. ByLot lot = 3; // For tracking resistors, lenses, etc. diff --git a/openhtf/output/proto/mfg_event.proto b/openhtf/output/proto/mfg_event.proto index f0e31fd5e..ff6cc0ff9 100644 --- a/openhtf/output/proto/mfg_event.proto +++ b/openhtf/output/proto/mfg_event.proto @@ -1,3 +1,17 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto2"; package openhtf; @@ -13,7 +27,7 @@ message MfgEvent { // The serial number or lot info of the device under test. // For non-serialized items, we can track them via lot_number and an // optional lot_index within the lot (such as "This tray of items is lot - // #FOT123 and this is the part in slot 6 of the tray. + // #FOT123 and this is the part in slot 6 of the tray.)s message ByLot { required string lot_number = 1; optional string lot_index = 2; @@ -85,6 +99,10 @@ message Measurement { optional double numeric_minimum = 12; optional double numeric_maximum = 13; + // Fields to determine numeric marginality which are used in RangeValidators. + optional double numeric_marginal_minimum = 25; + optional double numeric_marginal_maximum = 26; + // If this parameter is text then fill in these fields optional string text_value = 14; // This field may be a regular expression describing the expected value @@ -100,17 +118,36 @@ message Measurement { // Created for visualization by UIs that don't support certain fancy // parameters. UIs that do support them should hide these parameters. optional string associated_attachment = 21; - // Next tag = 24 + // Next tag = 27 extensions 5000 to 5199; + + reserved 24; } // A parameter which is extra information from a test run. These values are not // used to pass or fail a test but may be useful when inspecting data. message EventAttachment { + // A stripped, vendor compatible, BlobRef, we convert this to + // blobstore.Blobref on the backend. + message ExistingBlobRef { + optional bytes blob_id = 1; + optional int64 size = 2; + } + required string name = 1; - optional bytes value_binary = 2; + oneof value { + // The binary value of the attachment. Note that the total maximum size for + // all value_binary attachments is 1.9GB per test run. If you need more, + // upload these in chunks as partial test runs. + bytes value_binary = 2; + + // An existing BlobRef already uploaded into SteamEngine. If you upload a + // partial test run, you should get a BlobRef back that you can use to + // populate this. This does not count against the 1.9GB file limit. + ExistingBlobRef existing_blobref = 9; + } optional string description = 3; optional int64 set_time_millis = 4; @@ -122,5 +159,5 @@ message EventAttachment { string mime_type = 7; } - // next tag = 9 + // next tag = 10 } diff --git a/openhtf/output/proto/mfg_event_converter.py b/openhtf/output/proto/mfg_event_converter.py index ae4613a9e..25a8b941b 100644 --- a/openhtf/output/proto/mfg_event_converter.py +++ b/openhtf/output/proto/mfg_event_converter.py @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Convert a TestRecord into a mfg_event proto for upload to mfg inspector. Also includes utilities to handle multi-dim conversion into an attachment @@ -8,12 +22,15 @@ """ import collections +import dataclasses +import datetime import itertools import json import logging import numbers import os import sys +from typing import Mapping, Optional, Tuple from openhtf.core import measurements from openhtf.core import test_record as htf_test_record @@ -24,11 +41,6 @@ from openhtf.util import units from openhtf.util import validators - -from past.builtins import unicode -import six - - TEST_RECORD_ATTACHMENT_NAME = 'OpenHTF_record.json' # To be lazy loaded by _LazyLoadUnitsByCode when needed. @@ -37,6 +49,7 @@ # Map test run Status (proto) name to measurement Outcome (python) enum's and # the reverse. Note: there is data lost in converting an UNSET/PARTIALLY_SET to # an ERROR so we can't completely reverse the transformation. + MEASUREMENT_OUTCOME_TO_TEST_RUN_STATUS_NAME = { measurements.Outcome.PASS: 'PASS', measurements.Outcome.FAIL: 'FAIL', @@ -45,10 +58,38 @@ } TEST_RUN_STATUS_NAME_TO_MEASUREMENT_OUTCOME = { 'PASS': measurements.Outcome.PASS, + 'MARGINAL_PASS': measurements.Outcome.PASS, 'FAIL': measurements.Outcome.FAIL, 'ERROR': measurements.Outcome.UNSET } +_GIBI_BYTE_TO_BASE = 1 << 30 +MAX_TOTAL_ATTACHMENT_BYTES = int(0.9 * _GIBI_BYTE_TO_BASE) + +_LOGGER = logging.getLogger(__name__) + + +@dataclasses.dataclass(eq=True, frozen=True) # Ensures __hash__ is generated. +class AttachmentCacheKey: + name: str + size: int + + +AttachmentCacheT = Mapping[AttachmentCacheKey, mfg_event_pb2.EventAttachment] + + +def _measurement_outcome_to_test_run_status_name(outcome: measurements.Outcome, + marginal: bool) -> str: + """Returns the test run status name given the outcome and marginal args.""" + return ('MARGINAL_PASS' + if marginal else MEASUREMENT_OUTCOME_TO_TEST_RUN_STATUS_NAME[outcome]) + + +def _test_run_status_name_to_measurement_outcome_and_marginal( + name: str) -> Tuple[measurements.Outcome, bool]: + """Returns the outcome and marginal args given the test run status name.""" + return TEST_RUN_STATUS_NAME_TO_MEASUREMENT_OUTCOME[name], 'MARGINAL' in name + def _lazy_load_units_by_code(): """Populate dict of units by code iff UNITS_BY_CODE is empty.""" @@ -60,7 +101,10 @@ def _lazy_load_units_by_code(): UNITS_BY_CODE[unit.code] = unit -def mfg_event_from_test_record(record): +def mfg_event_from_test_record( + record: htf_test_record.TestRecord, + attachment_cache: Optional[AttachmentCacheT] = None, +) -> mfg_event_pb2.MfgEvent: """Convert an OpenHTF TestRecord to an MfgEvent proto. Most fields are copied over directly and some are pulled out of metadata @@ -79,6 +123,8 @@ def mfg_event_from_test_record(record): Args: record: An OpenHTF TestRecord. + attachment_cache: Provides a lookup to get EventAttachment protos for + already uploaded (or converted) attachments. Returns: An MfgEvent proto representing the given test record. @@ -96,14 +142,16 @@ def mfg_event_from_test_record(record): for assembly_event in record.metadata['assembly_events']: mfg_event.assembly_events.add().CopyFrom(assembly_event) convert_multidim_measurements(record.phases) - phase_copier = PhaseCopier(phase_uniquizer(record.phases)) + phase_copier = PhaseCopier(phase_uniquizer(record.phases), attachment_cache) phase_copier.copy_measurements(mfg_event) - phase_copier.copy_attachments(mfg_event) + if not phase_copier.copy_attachments(mfg_event): + mfg_event.test_run_type = mfg_event_pb2.TEST_RUN_PARTIAL return mfg_event -def _populate_basic_data(mfg_event, record): +def _populate_basic_data(mfg_event: mfg_event_pb2.MfgEvent, + record: htf_test_record.TestRecord) -> None: """Copies data from the OpenHTF TestRecord to the MfgEvent proto.""" # TODO(openhtf-team): # * Missing in proto: set run name from metadata. @@ -117,10 +165,12 @@ def _populate_basic_data(mfg_event, record): mfg_event.end_time_ms = record.end_time_millis mfg_event.tester_name = record.station_id mfg_event.test_name = record.metadata.get('test_name') or record.station_id - mfg_event.test_status = test_runs_converter.OUTCOME_MAP[record.outcome] mfg_event.operator_name = record.metadata.get('operator_name', '') mfg_event.test_version = str(record.metadata.get('test_version', '')) mfg_event.test_description = record.metadata.get('test_description', '') + mfg_event.test_status = ( + test_runs_pb2.MARGINAL_PASS + if record.marginal else test_runs_converter.OUTCOME_MAP[record.outcome]) # Populate part_tags. mfg_event.part_tags.extend(record.metadata.get('part_tags', [])) @@ -174,15 +224,20 @@ def _convert_object_to_json(obj): # pylint: disable=missing-function-docstring # measurement or in the logs, we have to be careful and convert everything # to unicode, merge, then encode to UTF-8 to put it into the proto. - def bytes_handler(o): + def unsupported_type_handler(o): # For bytes, JSONEncoder will fallback to this function to convert to str. - if six.PY3 and isinstance(o, six.binary_type): - return six.ensure_str(o, encoding='utf-8', errors='replace') + if isinstance(o, bytes): + return o.decode(encoding='utf-8', errors='replace') + elif isinstance(o, (datetime.date, datetime.datetime)): + return o.isoformat() else: raise TypeError(repr(o) + ' is not JSON serializable') json_encoder = json.JSONEncoder( - sort_keys=True, indent=2, ensure_ascii=False, default=bytes_handler) + sort_keys=True, + indent=2, + ensure_ascii=False, + default=unsupported_type_handler) return json_encoder.encode(obj).encode('utf-8', errors='replace') @@ -276,7 +331,7 @@ def multidim_measurement_to_attachment(name, measurement): if d.suffix is None: suffix = u'' else: - suffix = six.ensure_text(d.suffix) + suffix = d.suffix dims.append({ 'uom_suffix': suffix, 'uom_code': d.code, @@ -284,16 +339,18 @@ def multidim_measurement_to_attachment(name, measurement): }) # Refer to the module docstring for the expected schema. dimensioned_measured_value = measurement.measured_value - value = (sorted(dimensioned_measured_value.value, key=lambda x: x[0]) - if dimensioned_measured_value.is_value_set else None) - outcome_str = MEASUREMENT_OUTCOME_TO_TEST_RUN_STATUS_NAME[measurement.outcome] + value = ( + sorted(dimensioned_measured_value.value, key=lambda x: x[0]) + if dimensioned_measured_value.is_value_set else None) + outcome_str = _measurement_outcome_to_test_run_status_name( + measurement.outcome, measurement.marginal) data = _convert_object_to_json({ 'outcome': outcome_str, 'name': name, 'dimensions': dims, 'value': value, }) - attachment = htf_test_record.Attachment(data, test_runs_pb2.MULTIDIM_JSON) + attachment = htf_test_record.Attachment(data, test_runs_pb2.MULTIDIM_JSON) # pytype: disable=wrong-arg-types # gen-stub-imports return attachment @@ -325,19 +382,24 @@ def convert_multidim_measurements(all_phases): class PhaseCopier(object): """Copies measurements and attachments to an MfgEvent.""" - def __init__(self, all_phases): + def __init__(self, + all_phases, + attachment_cache: Optional[AttachmentCacheT] = None): self._phases = all_phases + self._using_partial_uploads = attachment_cache is not None + self._attachment_cache = ( + attachment_cache if self._using_partial_uploads else {}) def copy_measurements(self, mfg_event): for phase in self._phases: for name, measurement in sorted(phase.measurements.items()): # Multi-dim measurements should already have been removed. assert measurement.dimensions is None - self._copy_unidimensional_measurement( - phase, name, measurement, mfg_event) + self._copy_unidimensional_measurement(phase, name, measurement, + mfg_event) - def _copy_unidimensional_measurement( - self, phase, name, measurement, mfg_event): + def _copy_unidimensional_measurement(self, phase, name, measurement, + mfg_event): """Copy uni-dimensional measurements to the MfgEvent.""" mfg_measurement = mfg_event.measurement.add() @@ -361,8 +423,8 @@ def _copy_unidimensional_measurement( # Copy measurement value. measured_value = measurement.measured_value - status_str = MEASUREMENT_OUTCOME_TO_TEST_RUN_STATUS_NAME[ - measurement.outcome] + status_str = _measurement_outcome_to_test_run_status_name( + measurement.outcome, measurement.marginal) mfg_measurement.status = test_runs_pb2.Status.Value(status_str) if not measured_value.is_value_set: return @@ -371,12 +433,7 @@ def _copy_unidimensional_measurement( if isinstance(value, numbers.Number): mfg_measurement.numeric_value = float(value) elif isinstance(value, bytes): - # text_value expects unicode or ascii-compatible strings, so we must - # 'decode' it, even if it's actually just garbage bytestring data. - mfg_measurement.text_value = unicode(value, errors='replace') # pytype: disable=wrong-keyword-args - elif isinstance(value, unicode): - # Don't waste time and potential errors decoding unicode. - mfg_measurement.text_value = value + mfg_measurement.text_value = value.decode(errors='replace') else: # Coercing to string. mfg_measurement.text_value = str(value) @@ -388,16 +445,58 @@ def _copy_unidimensional_measurement( mfg_measurement.numeric_minimum = float(validator.minimum) if validator.maximum is not None: mfg_measurement.numeric_maximum = float(validator.maximum) + if validator.marginal_minimum is not None: + mfg_measurement.numeric_marginal_minimum = float( + validator.marginal_minimum) + if validator.marginal_maximum is not None: + mfg_measurement.numeric_marginal_maximum = float( + validator.marginal_maximum) elif isinstance(validator, validators.RegexMatcher): mfg_measurement.expected_text = validator.regex else: mfg_measurement.description += '\nValidator: ' + str(validator) - def copy_attachments(self, mfg_event): + def copy_attachments(self, mfg_event: mfg_event_pb2.MfgEvent) -> bool: + """Copies attachments into the MfgEvent from the configured phases. + + If partial uploads are in use (indicated by configuring this class instance + with an Attachments cache), this function will exit early if the total + attachment data size exceeds a reasonable threshold to avoid the 2 GB + serialized proto limit. + + Args: + mfg_event: The MfgEvent to copy into. + + Returns: + True if all attachments are copied and False if only some attachments + were copied (only possible when partial uploads are being used). + """ + value_copied_attachment_sizes = [] + skipped_attachment_names = [] for phase in self._phases: for name, attachment in sorted(phase.attachments.items()): - self._copy_attachment(name, attachment.data, attachment.mimetype, - mfg_event) + size = attachment.size + attachment_cache_key = AttachmentCacheKey(name, size) + if attachment_cache_key in self._attachment_cache: + mfg_event.attachment.append( + self._attachment_cache[attachment_cache_key]) + else: + at_least_one_attachment_for_partial_uploads = ( + self._using_partial_uploads and value_copied_attachment_sizes) + if at_least_one_attachment_for_partial_uploads and ( + sum(value_copied_attachment_sizes) + size > + MAX_TOTAL_ATTACHMENT_BYTES): + skipped_attachment_names.append(name) + else: + value_copied_attachment_sizes.append(size) + self._copy_attachment(name, attachment.data, attachment.mimetype, + mfg_event) + if skipped_attachment_names: + _LOGGER.info( + 'Skipping upload of %r attachments for this cycle. ' + 'To avoid max proto size issues.', skipped_attachment_names) + return False + return True def _copy_attachment(self, name, data, mimetype, mfg_event): """Copies an attachment to mfg_event.""" @@ -430,7 +529,7 @@ def attachment_to_multidim_measurement(attachment, name=None): Args: attachment: an `openhtf.test_record.Attachment` from a multi-dim. name: an optional name for the measurement. If not provided will use the - name included in the attachment. + name included in the attachment. Returns: An multi-dim `openhtf.Measurement`. @@ -453,8 +552,13 @@ def attachment_to_multidim_measurement(attachment, name=None): attachment_outcome_str = None # Convert test status outcome str to measurement outcome - outcome = TEST_RUN_STATUS_NAME_TO_MEASUREMENT_OUTCOME.get( - attachment_outcome_str) + if attachment_outcome_str: + outcome, marginal = ( + _test_run_status_name_to_measurement_outcome_and_marginal( + attachment_outcome_str)) + else: + outcome = None + marginal = False # convert dimensions into htf.Dimensions _lazy_load_units_by_code() @@ -476,9 +580,7 @@ def attachment_to_multidim_measurement(attachment, name=None): # created dimensioned_measured_value and populate with values. measured_value = measurements.DimensionedMeasuredValue( - name=name, - num_dimensions=len(dimensions) - ) + name=name, num_dimensions=len(dimensions)) for row in attachment_values: coordinates = tuple(row[:-1]) val = row[-1] @@ -489,6 +591,6 @@ def attachment_to_multidim_measurement(attachment, name=None): units=units_, dimensions=tuple(dimensions), measured_value=measured_value, - outcome=outcome - ) + outcome=outcome, + marginal=marginal) return measurement diff --git a/openhtf/output/proto/test_runs.proto b/openhtf/output/proto/test_runs.proto index 036723ac7..99f940750 100644 --- a/openhtf/output/proto/test_runs.proto +++ b/openhtf/output/proto/test_runs.proto @@ -75,6 +75,7 @@ enum Status { REWORK = 12; SCRAP = 13; DEBUG = 14; + MARGINAL_PASS = 15; } @@ -109,7 +110,7 @@ message Phase { optional TimeInfo timing = 4; } -// A parameter which is tested during a test run. These are parameteric values +// A parameter which is tested during a test run. These are parametric values // which are used to pass or fail the test. message TestParameter { // reserved 9; @@ -127,6 +128,10 @@ message TestParameter { optional double numeric_minimum = 12; optional double numeric_maximum = 13; + // Fields to determine numeric marginality which are used in RangeValidators. + optional double numeric_marginal_minimum = 26; + optional double numeric_marginal_maximum = 27; + // If this parameter is text then fill in these fields optional string text_value = 14; // This field may be a regular expression describing the expected value @@ -139,9 +144,11 @@ message TestParameter { // Created for visualization by UIs that don't support certain fancy // parameters. UIs that do support them should hide these parameters. optional string associated_attachment = 21; - // Next tag = 22 + // Next tag = 28 extensions 5000 to 5199; + + reserved 25; } @@ -216,7 +223,7 @@ message TestRun { // Not supported by OpenHTF. // For non-serialized items, we can track them via lot_number and a part_id // within the lot (such as "This try of items is lot #FOT123 and this is the - // part in slot 6 of the tray. In this case, a unique dut should be + // part in slot 6 of the tray). In this case, a unique dut should be // synthesized and stored in the required field dut_serial, and the // synthetic_dut flag should be set. optional string lot_number = 23; diff --git a/openhtf/output/proto/test_runs_converter.py b/openhtf/output/proto/test_runs_converter.py index f12a18aed..f849525f5 100644 --- a/openhtf/output/proto/test_runs_converter.py +++ b/openhtf/output/proto/test_runs_converter.py @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Utils to convert OpenHTF TestRecord to test_runs_pb2 proto. MULTIDIM_JSON schema: @@ -36,7 +50,6 @@ from openhtf.output.callbacks import json_factory from openhtf.output.proto import test_runs_pb2 from openhtf.util import validators -import six # pylint: disable=g-complex-comprehension @@ -60,8 +73,8 @@ UOM_CODE_MAP = { u.GetOptions().Extensions[ test_runs_pb2.uom_code]: num - for num, u in six.iteritems( - test_runs_pb2.Units.UnitCode.DESCRIPTOR.values_by_number) + for num, u in + test_runs_pb2.Units.UnitCode.DESCRIPTOR.values_by_number.items() } # pylint: enable=no-member @@ -92,7 +105,9 @@ def _populate_header(record, testrun): testrun.test_info.description = record.metadata['test_description'] if 'test_version' in record.metadata: testrun.test_info.version_string = record.metadata['test_version'] - testrun.test_status = OUTCOME_MAP[record.outcome] + testrun.test_status = ( + test_runs_pb2.MARGINAL_PASS + if record.marginal else OUTCOME_MAP[record.outcome]) testrun.start_time_millis = record.start_time_millis testrun.end_time_millis = record.end_time_millis if 'run_name' in record.metadata: @@ -145,7 +160,7 @@ def _attach_json(record, testrun): def _extract_attachments(phase, testrun, used_parameter_names): """Extract attachments, just copy them over.""" - for name, attachment in sorted(six.iteritems(phase.attachments)): + for name, attachment in sorted(phase.attachments.items()): attachment_data, mimetype = attachment.data, attachment.mimetype name = _ensure_unique_parameter_name(name, used_parameter_names) testrun_param = testrun.info_parameters.add() @@ -205,7 +220,7 @@ def _extract_parameters(record, testrun, used_parameter_names): mangled_parameters = {} for phase in record.phases: _extract_attachments(phase, testrun, used_parameter_names) - for name, measurement in sorted(six.iteritems(phase.measurements)): + for name, measurement in sorted(phase.measurements.items()): tr_name = _ensure_unique_parameter_name(name, used_parameter_names) testrun_param = testrun.test_parameters.add() testrun_param.name = tr_name @@ -214,7 +229,9 @@ def _extract_parameters(record, testrun, used_parameter_names): if measurement.units and measurement.units.code in UOM_CODE_MAP: testrun_param.unit_code = UOM_CODE_MAP[measurement.units.code] - if measurement.outcome == measurements.Outcome.PASS: + if measurement.marginal: + testrun_param.status = test_runs_pb2.MARGINAL_PASS + elif measurement.outcome == measurements.Outcome.PASS: testrun_param.status = test_runs_pb2.PASS elif (not measurement.measured_value or not measurement.measured_value.is_value_set): @@ -275,7 +292,7 @@ def _extract_parameters(record, testrun, used_parameter_names): def _add_mangled_parameters(testrun, mangled_parameters, used_parameter_names): """Add any mangled parameters we generated from multidim measurements.""" - for mangled_name, mangled_param in sorted(six.iteritems(mangled_parameters)): + for mangled_name, mangled_param in sorted(mangled_parameters.items()): if mangled_name != _ensure_unique_parameter_name(mangled_name, used_parameter_names): logging.warning('Mangled name %s in use by non-mangled parameter', @@ -327,7 +344,7 @@ def test_run_from_test_record(record): Returns: An instance of the TestRun proto for the given record. """ - testrun = test_runs_pb2.TestRun() + testrun = test_runs_pb2.TestRun() # pytype: disable=module-attr # gen-stub-imports _populate_header(record, testrun) _attach_json(record, testrun) diff --git a/openhtf/output/servers/__init__.py b/openhtf/output/servers/__init__.py index e69de29bb..6d6d1266c 100644 --- a/openhtf/output/servers/__init__.py +++ b/openhtf/output/servers/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/openhtf/output/servers/dashboard_server.py b/openhtf/output/servers/dashboard_server.py index 76db03c97..a1276dacf 100644 --- a/openhtf/output/servers/dashboard_server.py +++ b/openhtf/output/servers/dashboard_server.py @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Serves a list of stations found via multicast. Run with: @@ -18,7 +32,6 @@ from openhtf.output.web_gui import web_launcher from openhtf.util import data from openhtf.util import multicast -import six import sockjs.tornado import tornado.web @@ -90,7 +103,7 @@ def update_stations(cls, station_info_list): with cls.station_map_lock: # By default, assume old stations are unreachable. - for host_port, station_info in six.iteritems(cls.station_map): + for host_port, station_info in cls.station_map.items(): cls.station_map[host_port] = station_info._replace(status='UNREACHABLE') for station_info in station_info_list: diff --git a/openhtf/output/servers/pub_sub.py b/openhtf/output/servers/pub_sub.py index dc2acfdcd..b900f4b82 100644 --- a/openhtf/output/servers/pub_sub.py +++ b/openhtf/output/servers/pub_sub.py @@ -67,8 +67,6 @@ def on_close(self): def on_subscribe(self, info): """Called when new clients subscribe. Subclasses can override.""" - pass def on_unsubscribe(self): """Called when clients unsubscribe. Subclasses can override.""" - pass diff --git a/openhtf/output/servers/station_server.py b/openhtf/output/servers/station_server.py index 117b3ba6a..29d975c9b 100644 --- a/openhtf/output/servers/station_server.py +++ b/openhtf/output/servers/station_server.py @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Serves an Angular frontend and information about a running OpenHTF test. This server does not currently support more than one test running in the same @@ -5,6 +19,7 @@ aggregate info from multiple station servers with a single frontend. """ +import asyncio import contextlib import itertools import json @@ -15,18 +30,20 @@ import threading import time import types +from typing import Optional, Union import openhtf from openhtf.output.servers import pub_sub from openhtf.output.servers import web_gui_server -from openhtf.util import conf +from openhtf.util import configuration from openhtf.util import data from openhtf.util import functions from openhtf.util import multicast from openhtf.util import timeouts -import six import sockjs.tornado +CONF = configuration.CONF + STATION_SERVER_TYPE = 'station' MULTICAST_QUERY = 'OPENHTF_DISCOVERY' @@ -40,21 +57,21 @@ _WAIT_FOR_ANY_EVENT_POLL_S = 0.05 _WAIT_FOR_EXECUTING_TEST_POLL_S = 0.1 -conf.declare( +CONF.declare( 'frontend_throttle_s', default_value=_DEFAULT_FRONTEND_THROTTLE_S, description=('Min wait time between successive updates to the ' 'frontend.')) -conf.declare( +CONF.declare( 'station_server_port', default_value=0, description=('Port on which to serve the app. If set to zero (the ' 'default) then an arbitrary port will be chosen.')) # These have default values in openhtf.util.multicast.py. -conf.declare('station_discovery_address') -conf.declare('station_discovery_port') -conf.declare('station_discovery_ttl') +CONF.declare('station_discovery_address') +CONF.declare('station_discovery_port') +CONF.declare('station_discovery_ttl') def _get_executing_test(): @@ -70,7 +87,7 @@ def _get_executing_test(): test: The test that was executing when this function was called, or None. test_state: The state of the executing test, or None. """ - tests = list(six.itervalues(openhtf.Test.TEST_INSTANCES)) + tests = list(openhtf.Test.TEST_INSTANCES.values()) if not tests: return None, None @@ -150,6 +167,7 @@ def __init__(self, update_callback): def run(self): """Call self._poll_for_update() in a loop and handle errors.""" + asyncio.set_event_loop(asyncio.new_event_loop()) while True: try: self._poll_for_update() @@ -171,7 +189,7 @@ def run(self): _LOG.exception('Error in station watcher: %s', error) time.sleep(1) - @functions.call_at_most_every(float(conf.frontend_throttle_s)) + @functions.call_at_most_every(float(CONF.frontend_throttle_s)) def _poll_for_update(self): """Call the callback with the current test state, then wait for a change.""" test, test_state = _get_executing_test() @@ -238,7 +256,7 @@ def _make_message(cls): host_port = '%s:%s' % (host, cls.port) return { host_port: { - 'station_id': conf.station_id, # From openhtf.core.test_state. + 'station_id': CONF.station_id, # From openhtf.core.test_state. 'host': host, 'port': cls.port, 'status': 'ONLINE', @@ -359,7 +377,7 @@ def get(self, test_uid): phase_descriptors = [ dict(id=id(phase), **data.convert_to_base_types(phase)) - for phase in test.descriptor.phase_group + for phase in test.descriptor.phase_sequence.all_phases() ] # Wrap value in a dict because writing a list directly is prohibited. @@ -437,10 +455,12 @@ def get(self): history_items = [] + if self.history_path is None: + raise ValueError('history_path is None, try calling initialize() first') + for file_name in os.listdir(self.history_path): if not file_name.endswith('.pb'): continue - if not os.path.isfile(os.path.join(self.history_path, file_name)): continue @@ -501,9 +521,9 @@ class StationMulticast(multicast.MulticastListener): def __init__(self, station_server_port): # These have default values in openhtf.util.multicast.py. kwargs = { - attr: conf['station_discovery_%s' % attr] + attr: CONF['station_discovery_%s' % attr] for attr in ('address', 'port', 'ttl') - if 'station_discovery_%s' % attr in conf + if 'station_discovery_%s' % attr in CONF } super(StationMulticast, self).__init__(self._make_message, **kwargs) self.station_server_port = station_server_port @@ -530,7 +550,7 @@ def _make_message(self, message): return json.dumps({ 'cell': cell, 'port': self.station_server_port, - 'station_id': conf.station_id, # From openhtf.core.test_state. + 'station_id': CONF.station_id, # From openhtf.core.test_state. 'test_description': test_description, 'test_name': test_name, }) @@ -557,7 +577,9 @@ class StationServer(web_gui_server.WebGuiServer): test.execute() """ - def __init__(self, history_path=None): + def __init__( + self, + history_path: Optional[Union[str, bytes, os.PathLike]] = None) -> None: # Disable tornado's logging. # TODO(kenadia): Enable these logs if verbosity flag is at least -vvv. # I think this will require changing how StoreRepsInModule works. @@ -569,7 +591,7 @@ def __init__(self, history_path=None): tornado_logger.addHandler(logging.NullHandler()) # Bind port early so that the correct port number can be used in the routes. - sockets, port = web_gui_server.bind_port(int(conf.station_server_port)) + sockets, port = web_gui_server.bind_port(int(CONF.station_server_port)) # Set up the station watcher. station_watcher = StationWatcher(StationPubSub.publish_update) @@ -613,7 +635,7 @@ def _get_config(self): 'server_type': STATION_SERVER_TYPE, } - def run(self): + def run(self) -> None: _LOG.info('Announcing station server via multicast on %s:%s', self.station_multicast.address, self.station_multicast.port) self.station_multicast.start() @@ -623,13 +645,13 @@ def run(self): host=socket.gethostname(), port=self.port)) super(StationServer, self).run() - def stop(self): + def stop(self) -> None: _LOG.info('Stopping station server.') super(StationServer, self).stop() _LOG.info('Stopping multicast.') self.station_multicast.stop(timeout_s=0) - def publish_final_state(self, test_record): + def publish_final_state(self, test_record: openhtf.TestRecord) -> None: """Test output callback publishing a final state from the test record.""" StationPubSub.publish_test_record(test_record) diff --git a/openhtf/output/servers/web_gui_server.py b/openhtf/output/servers/web_gui_server.py index a066cdc5e..02346f6ce 100644 --- a/openhtf/output/servers/web_gui_server.py +++ b/openhtf/output/servers/web_gui_server.py @@ -13,9 +13,9 @@ # limitations under the License. """Extensible HTTP server serving the OpenHTF Angular frontend.""" +import asyncio import os import threading -import time import tornado.httpclient import tornado.httpserver @@ -112,6 +112,8 @@ class WebGuiServer(threading.Thread): def __init__(self, additional_routes, port, sockets=None): super(WebGuiServer, self).__init__(name=type(self).__name__) + self.ts_event = threading.Event() + self._running = asyncio.Event() # Set up routes. routes = [ @@ -121,24 +123,17 @@ def __init__(self, additional_routes, port, sockets=None): }), ] routes.extend(additional_routes) - - if sockets is None: - sockets, self.port = bind_port(port) - else: - if not port: - raise ValueError('When sockets are passed to the server, port must be ' - 'specified and nonzero.') - self.port = port + self._sockets = sockets + self.port = port + self._loop = None # Configure the Tornado application. - application = tornado.web.Application( + self.application = tornado.web.Application( routes, default_handler_class=DefaultHandler, template_loader=TemplateLoader(STATIC_FILES_ROOT), static_path=STATIC_FILES_ROOT, ) - self.server = tornado.httpserver.HTTPServer(application) - self.server.add_sockets(sockets) def __enter__(self): self.start() @@ -147,14 +142,38 @@ def __enter__(self): def __exit__(self, *unused_args): self.stop() + async def run_app(self): + """Runs the station server application.""" + self.ts_watchdog_task = asyncio.create_task(self._stop_threadsafe()) + if self._sockets is None: + self._sockets, self.port = bind_port(self.port) + else: + if not self.port: + raise ValueError( + 'When sockets are passed to the server, port must be ' + 'specified and nonzero.' + ) + self.server = tornado.httpserver.HTTPServer(self.application) + self.server.add_sockets(self._sockets) + await self._running.wait() + await self.ts_watchdog_task + await self.server.close_all_connections() + + async def _stop_threadsafe(self): + """Handles stopping the server in a threadsafe manner.""" + while not self.ts_event.is_set(): + await asyncio.sleep(0.1) + self._running.set() + def _get_config(self): """Override this to configure the Angular app.""" return {} def run(self): - tornado.ioloop.IOLoop.instance().start() # Blocking IO loop. + """Runs the station server.""" + asyncio.run(self.run_app()) def stop(self): - self.server.stop() - ioloop = tornado.ioloop.IOLoop.instance() - ioloop.add_timeout(time.time() + _SERVER_SHUTDOWN_BUFFER_S, ioloop.stop) + """Stops the station server. Method is threadsafe.""" + self.ts_event.set() + diff --git a/openhtf/output/web_gui/README.md b/openhtf/output/web_gui/README.md index 813b4f28e..b30bd207a 100644 --- a/openhtf/output/web_gui/README.md +++ b/openhtf/output/web_gui/README.md @@ -1,8 +1,13 @@ # OpenHTF web GUI client +## Prerequisites + +Follow the steps from [CONTRIBUTING.md](../../../CONTRIBUTING.md) to set up +the Python virtual environment. Make sure you have done an "editable" install. + ## Development -First, start the dashboard server on the default port by running the following +Start the dashboard server on the default port by running the following from the project root directory: ``` @@ -22,4 +27,10 @@ the dashboard server and should reload automatically when changes are made to frontend files. With the dashboard running, you can run OpenHTF tests separately, and they -should be picked up over multicast and appear on the dashboard. +should be picked up over multicast and appear on the dashboard. To test things +out, you can run the frontend example test: + +``` +python3 examples/frontend_example.py +``` + diff --git a/openhtf/output/web_gui/__init__.py b/openhtf/output/web_gui/__init__.py index e69de29bb..6d6d1266c 100644 --- a/openhtf/output/web_gui/__init__.py +++ b/openhtf/output/web_gui/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css b/openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css similarity index 70% rename from openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css rename to openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css index 89e62e658..1c2ec3813 100644 --- a/openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css +++ b/openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css @@ -1,3 +1,63 @@ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ * { box-sizing: border-box; } @@ -54,6 +114,51 @@ input[type='text'] { 100% { box-shadow: 0 0 0 0 rgba(0, 119, 255, 0), 0 0 10px rgba(0, 0, 0, 0.1) inset; } } +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ .htf-rounded-button-blue { -webkit-appearance: initial; background: transparent; @@ -217,6 +322,36 @@ input[type='text'] { transform: translateX(-100%) translateY(-50%); width: 0; } +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ .htf-layout-nav-container { background: #fff; border-bottom: 1px solid #ccc; @@ -705,6 +840,36 @@ template { [hidden] { display: none; } +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ .u-clamp-text { white-space: nowrap; overflow: hidden; @@ -755,4 +920,4 @@ template { .u-text-color-error { color: #ff5d4e; } -/*# sourceMappingURL=app.d574564a241d7a52038d.css.map*/ \ No newline at end of file +/*# sourceMappingURL=app.7b3b5f043d8771c748e0.css.map*/ \ No newline at end of file diff --git a/openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css.map b/openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css.map similarity index 58% rename from openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css.map rename to openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css.map index 4b3b7d170..6c9bbe13d 100644 --- a/openhtf/output/web_gui/dist/css/app.d574564a241d7a52038d.css.map +++ b/openhtf/output/web_gui/dist/css/app.7b3b5f043d8771c748e0.css.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"css/app.d574564a241d7a52038d.css","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"css/app.7b3b5f043d8771c748e0.css","sourceRoot":""} \ No newline at end of file diff --git a/openhtf/output/web_gui/dist/index.html b/openhtf/output/web_gui/dist/index.html index a03fe3568..d7b85e76b 100644 --- a/openhtf/output/web_gui/dist/index.html +++ b/openhtf/output/web_gui/dist/index.html @@ -1,4 +1,20 @@ - + + + OpenHTF @@ -6,4 +22,4 @@ Loading... - \ No newline at end of file + \ No newline at end of file diff --git a/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js b/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js new file mode 100644 index 000000000..2e876279f --- /dev/null +++ b/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js @@ -0,0 +1,482 @@ +webpackJsonp([1],{21:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.waiting=11]="waiting",e[e.running=12]="running",e[e.pass=13]="pass",e[e.fail=14]="fail",e[e.error=15]="error",e[e.timeout=16]="timeout",e[e.aborted=17]="aborted"}(t.TestStatus||(t.TestStatus={}));var r=function(){return function PlugDescriptor(){}}();t.PlugDescriptor=r;var i=function(){return function TestState(e){Object.assign(this,e)}}();t.TestState=i},233:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"HttpBackend",function(){return d}),n.d(t,"HttpHandler",function(){return p}),n.d(t,"HttpClient",function(){return C}),n.d(t,"HttpHeaders",function(){return f}),n.d(t,"HTTP_INTERCEPTORS",function(){return T}),n.d(t,"JsonpClientBackend",function(){return O}),n.d(t,"JsonpInterceptor",function(){return I}),n.d(t,"HttpClientJsonpModule",function(){return B}),n.d(t,"HttpClientModule",function(){return H}),n.d(t,"HttpClientXsrfModule",function(){return j}),n.d(t,"ɵinterceptingHandler",function(){return interceptingHandler}),n.d(t,"HttpParams",function(){return m}),n.d(t,"HttpUrlEncodingCodec",function(){return h}),n.d(t,"HttpRequest",function(){return y}),n.d(t,"HttpErrorResponse",function(){return S}),n.d(t,"HttpEventType",function(){return g}),n.d(t,"HttpHeaderResponse",function(){return b}),n.d(t,"HttpResponse",function(){return _}),n.d(t,"HttpResponseBase",function(){return v}),n.d(t,"HttpXhrBackend",function(){return D}),n.d(t,"XhrFactory",function(){return L}),n.d(t,"HttpXsrfTokenExtractor",function(){return R}),n.d(t,"ɵa",function(){return w}),n.d(t,"ɵb",function(){return P}),n.d(t,"ɵc",function(){return jsonpCallbackContext}),n.d(t,"ɵd",function(){return x}),n.d(t,"ɵg",function(){return V}),n.d(t,"ɵh",function(){return k}),n.d(t,"ɵe",function(){return M}),n.d(t,"ɵf",function(){return F});var r=n(16),i=n(2),o=n(56),s=(n.n(o),n(74)),a=(n.n(s),n(81)),u=(n.n(a),n(57)),l=(n.n(u),n(19)),c=n(0),p=(n.n(c),function(){function HttpHandler(){}return HttpHandler.prototype.handle=function(e){},HttpHandler}()),d=function(){function HttpBackend(){}return HttpBackend.prototype.handle=function(e){},HttpBackend}(),h=function(){function HttpUrlEncodingCodec(){}return HttpUrlEncodingCodec.prototype.encodeKey=function(e){return standardEncoding(e)},HttpUrlEncodingCodec.prototype.encodeValue=function(e){return standardEncoding(e)},HttpUrlEncodingCodec.prototype.decodeKey=function(e){return decodeURIComponent(e)},HttpUrlEncodingCodec.prototype.decodeValue=function(e){return decodeURIComponent(e)},HttpUrlEncodingCodec}();function standardEncoding(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var m=function(){function HttpParams(e){void 0===e&&(e={}),this.updates=null,this.cloneFrom=null,this.encoder=e.encoder||new h,this.map=e.fromString?function paramParser(e,t){var n=new Map;return e.length>0&&e.split("&").forEach(function(e){var r=e.indexOf("="),i=-1==r?[t.decodeKey(e),""]:[t.decodeKey(e.slice(0,r)),t.decodeValue(e.slice(r+1))],o=i[0],s=i[1],a=n.get(o)||[];a.push(s),n.set(o,a)}),n}(e.fromString,this.encoder):null}return HttpParams.prototype.has=function(e){return this.init(),this.map.has(e)},HttpParams.prototype.get=function(e){this.init();var t=this.map.get(e);return t?t[0]:null},HttpParams.prototype.getAll=function(e){return this.init(),this.map.get(e)||null},HttpParams.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},HttpParams.prototype.append=function(e,t){return this.clone({param:e,value:t,op:"a"})},HttpParams.prototype.set=function(e,t){return this.clone({param:e,value:t,op:"s"})},HttpParams.prototype.delete=function(e,t){return this.clone({param:e,value:t,op:"d"})},HttpParams.prototype.toString=function(){var e=this;return this.init(),this.keys().map(function(t){var n=e.encoder.encodeKey(t);return e.map.get(t).map(function(t){return n+"="+e.encoder.encodeValue(t)}).join("&")}).join("&")},HttpParams.prototype.clone=function(e){var t=new HttpParams({encoder:this.encoder});return t.cloneFrom=this.cloneFrom||this,t.updates=(this.updates||[]).concat([e]),t},HttpParams.prototype.init=function(){var e=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return e.map.set(t,e.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var n=("a"===t.op?e.map.get(t.param):void 0)||[];n.push(t.value),e.map.set(t.param,n);break;case"d":if(void 0===t.value){e.map.delete(t.param);break}var r=e.map.get(t.param)||[],i=r.indexOf(t.value);-1!==i&&r.splice(i,1),r.length>0?e.map.set(t.param,r):e.map.delete(t.param)}}),this.cloneFrom=null)},HttpParams}(),f=function(){function HttpHeaders(e){var t=this;this.normalizedNames=new Map,this.lazyUpdate=null,e?this.lazyInit="string"==typeof e?function(){t.headers=new Map,e.split("\n").forEach(function(e){var n=e.indexOf(":");if(n>0){var r=e.slice(0,n),i=r.toLowerCase(),o=e.slice(n+1).trim();t.maybeSetNormalizedName(r,i),t.headers.has(i)?t.headers.get(i).push(o):t.headers.set(i,[o])}})}:function(){t.headers=new Map,Object.keys(e).forEach(function(n){var r=e[n],i=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(t.headers.set(i,r),t.maybeSetNormalizedName(n,i))})}:this.headers=new Map}return HttpHeaders.prototype.has=function(e){return this.init(),this.headers.has(e.toLowerCase())},HttpHeaders.prototype.get=function(e){this.init();var t=this.headers.get(e.toLowerCase());return t&&t.length>0?t[0]:null},HttpHeaders.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},HttpHeaders.prototype.getAll=function(e){return this.init(),this.headers.get(e.toLowerCase())||null},HttpHeaders.prototype.append=function(e,t){return this.clone({name:e,value:t,op:"a"})},HttpHeaders.prototype.set=function(e,t){return this.clone({name:e,value:t,op:"s"})},HttpHeaders.prototype.delete=function(e,t){return this.clone({name:e,value:t,op:"d"})},HttpHeaders.prototype.maybeSetNormalizedName=function(e,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,e)},HttpHeaders.prototype.init=function(){var e=this;this.lazyInit&&(this.lazyInit instanceof HttpHeaders?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(t){return e.applyUpdate(t)}),this.lazyUpdate=null))},HttpHeaders.prototype.copyFrom=function(e){var t=this;e.init(),Array.from(e.headers.keys()).forEach(function(n){t.headers.set(n,e.headers.get(n)),t.normalizedNames.set(n,e.normalizedNames.get(n))})},HttpHeaders.prototype.clone=function(e){var t=new HttpHeaders;return t.lazyInit=this.lazyInit&&this.lazyInit instanceof HttpHeaders?this.lazyInit:this,t.lazyUpdate=(this.lazyUpdate||[]).concat([e]),t},HttpHeaders.prototype.applyUpdate=function(e){var t=e.name.toLowerCase();switch(e.op){case"a":case"s":var n=e.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(e.name,t);var r=("a"===e.op?this.headers.get(t):void 0)||[];r.push.apply(r,n),this.headers.set(t,r);break;case"d":var i=e.value;if(i){var o=this.headers.get(t);if(!o)return;0===(o=o.filter(function(e){return-1===i.indexOf(e)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,o)}else this.headers.delete(t),this.normalizedNames.delete(t)}},HttpHeaders.prototype.forEach=function(e){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return e(t.normalizedNames.get(n),t.headers.get(n))})},HttpHeaders}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */function isArrayBuffer(e){return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer}function isBlob(e){return"undefined"!=typeof Blob&&e instanceof Blob}function isFormData(e){return"undefined"!=typeof FormData&&e instanceof FormData}var y=function(){function HttpRequest(e,t,n,r){var i;if(this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=e.toUpperCase(), +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function mightHaveBody(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=n||null,i=r):i=n,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.params&&(this.params=i.params)),this.headers||(this.headers=new f),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=t;else{var s=t.indexOf("?"),a=-1===s?"?":s=200&&this.status<300}}(),b=function(e){function HttpHeaderResponse(t){void 0===t&&(t={});var n=e.call(this,t)||this;return n.type=g.ResponseHeader,n}return r.a(HttpHeaderResponse,e),HttpHeaderResponse.prototype.clone=function(e){return void 0===e&&(e={}),new HttpHeaderResponse({headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})},HttpHeaderResponse}(v),_=function(e){function HttpResponse(t){void 0===t&&(t={});var n=e.call(this,t)||this;return n.type=g.Response,n.body=t.body||null,n}return r.a(HttpResponse,e),HttpResponse.prototype.clone=function(e){return void 0===e&&(e={}),new HttpResponse({body:void 0!==e.body?e.body:this.body,headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})},HttpResponse}(v),S=function(e){function HttpErrorResponse(t){var n=e.call(this,t,0,"Unknown Error")||this;return n.name="HttpErrorResponse",n.ok=!1,n.status>=200&&n.status<300?n.message="Http failure during parsing for "+(t.url||"(unknown url)"):n.message="Http failure response for "+(t.url||"(unknown url)")+": "+t.status+" "+t.statusText,n.error=t.error||null,n}return r.a(HttpErrorResponse,e),HttpErrorResponse}(v); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function addBody(e,t){return{body:t,headers:e.headers,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}var C=function(){function HttpClient(e){this.handler=e}return HttpClient.prototype.request=function(e,t,n){var r,i=this;void 0===n&&(n={}),r=e instanceof y?e:new y(e,t,n.body||null,{headers:n.headers,params:n.params,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials});var l=s.concatMap.call(Object(o.of)(r),function(e){return i.handler.handle(e)});if(e instanceof y||"events"===n.observe)return l;var c=a.filter.call(l,function(e){return e instanceof _});switch(n.observe||"body"){case"body":switch(r.responseType){case"arraybuffer":return u.map.call(c,function(e){if(null!==e.body&&!(e.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return e.body});case"blob":return u.map.call(c,function(e){if(null!==e.body&&!(e.body instanceof Blob))throw new Error("Response is not a Blob.");return e.body});case"text":return u.map.call(c,function(e){if(null!==e.body&&"string"!=typeof e.body)throw new Error("Response is not a string.");return e.body});case"json":default:return u.map.call(c,function(e){return e.body})}case"response":return c;default:throw new Error("Unreachable: unhandled observe type "+n.observe+"}")}},HttpClient.prototype.delete=function(e,t){return void 0===t&&(t={}),this.request("DELETE",e,t)},HttpClient.prototype.get=function(e,t){return void 0===t&&(t={}),this.request("GET",e,t)},HttpClient.prototype.head=function(e,t){return void 0===t&&(t={}),this.request("HEAD",e,t)},HttpClient.prototype.jsonp=function(e,t){return this.request("JSONP",e,{params:(new m).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},HttpClient.prototype.options=function(e,t){return void 0===t&&(t={}),this.request("OPTIONS",e,t)},HttpClient.prototype.patch=function(e,t,n){return void 0===n&&(n={}),this.request("PATCH",e,addBody(n,t))},HttpClient.prototype.post=function(e,t,n){return void 0===n&&(n={}),this.request("POST",e,addBody(n,t))},HttpClient.prototype.put=function(e,t,n){return void 0===n&&(n={}),this.request("PUT",e,addBody(n,t))},HttpClient}();C.decorators=[{type:i.Injectable}],C.ctorParameters=function(){return[{type:p}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var A=function(){function HttpInterceptorHandler(e,t){this.next=e,this.interceptor=t}return HttpInterceptorHandler.prototype.handle=function(e){return this.interceptor.intercept(e,this.next)},HttpInterceptorHandler}(),T=new i.InjectionToken("HTTP_INTERCEPTORS"),w=function(){function NoopInterceptor(){}return NoopInterceptor.prototype.intercept=function(e,t){return t.handle(e)},NoopInterceptor}();w.decorators=[{type:i.Injectable}],w.ctorParameters=function(){return[]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var E=0,P=function(){return function JsonpCallbackContext(){}}(),O=function(){function JsonpClientBackend(e,t){this.callbackMap=e,this.document=t}return JsonpClientBackend.prototype.nextCallback=function(){return"ng_jsonp_callback_"+E++},JsonpClientBackend.prototype.handle=function(e){var t=this;if("JSONP"!==e.method)throw new Error("JSONP requests must use JSONP request method.");if("json"!==e.responseType)throw new Error("JSONP requests must use Json response type.");return new c.Observable(function(n){var r=t.nextCallback(),i=e.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/,"="+r+"$1"),o=t.document.createElement("script");o.src=i;var s=null,a=!1,u=!1;t.callbackMap[r]=function(e){delete t.callbackMap[r],u||(s=e,a=!0)};var l=function(){o.parentNode&&o.parentNode.removeChild(o),delete t.callbackMap[r]},c=function(e){u||(l(),a?(n.next(new _({body:s,status:200,statusText:"OK",url:i})),n.complete()):n.error(new S({url:i,status:0,statusText:"JSONP Error",error:new Error("JSONP injected script did not invoke callback.")})))},p=function(e){u||(l(),n.error(new S({error:e,status:0,statusText:"JSONP Error",url:i})))};return o.addEventListener("load",c),o.addEventListener("error",p),t.document.body.appendChild(o),n.next({type:g.Sent}),function(){u=!0,o.removeEventListener("load",c),o.removeEventListener("error",p),l()}})},JsonpClientBackend}();O.decorators=[{type:i.Injectable}],O.ctorParameters=function(){return[{type:P},{type:void 0,decorators:[{type:i.Inject,args:[l.DOCUMENT]}]}]};var I=function(){function JsonpInterceptor(e){this.jsonp=e}return JsonpInterceptor.prototype.intercept=function(e,t){return"JSONP"===e.method?this.jsonp.handle(e):t.handle(e)},JsonpInterceptor}();I.decorators=[{type:i.Injectable}],I.ctorParameters=function(){return[{type:O}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var N=/^\)\]\}',?\n/;var L=function(){function XhrFactory(){}return XhrFactory.prototype.build=function(){},XhrFactory}(),x=function(){function BrowserXhr(){}return BrowserXhr.prototype.build=function(){return new XMLHttpRequest},BrowserXhr}();x.decorators=[{type:i.Injectable}],x.ctorParameters=function(){return[]};var D=function(){function HttpXhrBackend(e){this.xhrFactory=e}return HttpXhrBackend.prototype.handle=function(e){var t=this;if("JSONP"===e.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new c.Observable(function(n){var r=t.xhrFactory.build();if(r.open(e.method,e.urlWithParams),e.withCredentials&&(r.withCredentials=!0),e.headers.forEach(function(e,t){return r.setRequestHeader(e,t.join(","))}),e.headers.has("Accept")||r.setRequestHeader("Accept","application/json, text/plain, */*"),!e.headers.has("Content-Type")){var i=e.detectContentTypeHeader();null!==i&&r.setRequestHeader("Content-Type",i)}if(e.responseType){var o=e.responseType.toLowerCase();r.responseType="json"!==o?o:"text"}var s=e.serializeBody(),a=null,u=function(){if(null!==a)return a;var t=1223===r.status?204:r.status,n=r.statusText||"OK",i=new f(r.getAllResponseHeaders()),o=function getResponseUrl(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(r)||e.url;return a=new b({headers:i,status:t,statusText:n,url:o})},l=function(){var t=u(),i=t.headers,o=t.status,s=t.statusText,a=t.url,l=null;204!==o&&(l=void 0===r.response?r.responseText:r.response),0===o&&(o=l?200:0);var c=o>=200&&o<300;if(c&&"json"===e.responseType&&"string"==typeof l){l=l.replace(N,"");try{l=JSON.parse(l)}catch(e){c=!1,l={error:e,text:l}}}else if(!c&&"json"===e.responseType&&"string"==typeof l)try{l=JSON.parse(l)}catch(e){}c?(n.next(new _({body:l,headers:i,status:o,statusText:s,url:a||void 0})),n.complete()):n.error(new S({error:l,headers:i,status:o,statusText:s,url:a||void 0}))},c=function(e){var t=new S({error:e,status:r.status||0,statusText:r.statusText||"Unknown Error"});n.error(t)},p=!1,d=function(t){p||(n.next(u()),p=!0);var i={type:g.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(i.total=t.total),"text"===e.responseType&&r.responseText&&(i.partialText=r.responseText),n.next(i)},h=function(e){var t={type:g.UploadProgress,loaded:e.loaded};e.lengthComputable&&(t.total=e.total),n.next(t)};return r.addEventListener("load",l),r.addEventListener("error",c),e.reportProgress&&(r.addEventListener("progress",d),null!==s&&r.upload&&r.upload.addEventListener("progress",h)),r.send(s),n.next({type:g.Sent}),function(){r.removeEventListener("error",c),r.removeEventListener("load",l),e.reportProgress&&(r.removeEventListener("progress",d),null!==s&&r.upload&&r.upload.removeEventListener("progress",h)),r.abort()}})},HttpXhrBackend}();D.decorators=[{type:i.Injectable}],D.ctorParameters=function(){return[{type:L}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var M=new i.InjectionToken("XSRF_COOKIE_NAME"),F=new i.InjectionToken("XSRF_HEADER_NAME"),R=function(){function HttpXsrfTokenExtractor(){}return HttpXsrfTokenExtractor.prototype.getToken=function(){},HttpXsrfTokenExtractor}(),V=function(){function HttpXsrfCookieExtractor(e,t,n){this.doc=e,this.platform=t,this.cookieName=n,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return HttpXsrfCookieExtractor.prototype.getToken=function(){if("server"===this.platform)return null;var e=this.doc.cookie||"";return e!==this.lastCookieString&&(this.parseCount++,this.lastToken=Object(l["ɵparseCookieValue"])(e,this.cookieName),this.lastCookieString=e),this.lastToken},HttpXsrfCookieExtractor}();V.decorators=[{type:i.Injectable}],V.ctorParameters=function(){return[{type:void 0,decorators:[{type:i.Inject,args:[l.DOCUMENT]}]},{type:void 0,decorators:[{type:i.Inject,args:[i.PLATFORM_ID]}]},{type:void 0,decorators:[{type:i.Inject,args:[M]}]}]};var k=function(){function HttpXsrfInterceptor(e,t){this.tokenService=e,this.headerName=t}return HttpXsrfInterceptor.prototype.intercept=function(e,t){var n=e.url.toLowerCase();if("GET"===e.method||"HEAD"===e.method||n.startsWith("http://")||n.startsWith("https://"))return t.handle(e);var r=this.tokenService.getToken();return null===r||e.headers.has(this.headerName)||(e=e.clone({headers:e.headers.set(this.headerName,r)})),t.handle(e)},HttpXsrfInterceptor}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function interceptingHandler(e,t){return void 0===t&&(t=[]),t?t.reduceRight(function(e,t){return new A(e,t)},e):e}function jsonpCallbackContext(){return"object"==typeof window?window:{}}k.decorators=[{type:i.Injectable}],k.ctorParameters=function(){return[{type:R},{type:void 0,decorators:[{type:i.Inject,args:[F]}]}]};var j=function(){function HttpClientXsrfModule(){}return HttpClientXsrfModule.disable=function(){return{ngModule:HttpClientXsrfModule,providers:[{provide:k,useClass:w}]}},HttpClientXsrfModule.withOptions=function(e){return void 0===e&&(e={}),{ngModule:HttpClientXsrfModule,providers:[e.cookieName?{provide:M,useValue:e.cookieName}:[],e.headerName?{provide:F,useValue:e.headerName}:[]]}},HttpClientXsrfModule}();j.decorators=[{type:i.NgModule,args:[{providers:[k,{provide:T,useExisting:k,multi:!0},{provide:R,useClass:V},{provide:M,useValue:"XSRF-TOKEN"},{provide:F,useValue:"X-XSRF-TOKEN"}]}]}],j.ctorParameters=function(){return[]};var H=function(){return function HttpClientModule(){}}();H.decorators=[{type:i.NgModule,args:[{imports:[j.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})],providers:[C,{provide:p,useFactory:interceptingHandler,deps:[d,[new i.Optional,new i.Inject(T)]]},D,{provide:d,useExisting:D},x,{provide:L,useExisting:x}]}]}],H.ctorParameters=function(){return[]};var B=function(){return function HttpClientJsonpModule(){}}();B.decorators=[{type:i.NgModule,args:[{providers:[O,{provide:P,useFactory:jsonpCallbackContext},{provide:T,useClass:I,multi:!0}]}]}],B.ctorParameters=function(){return[]}},234:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"AbstractControlDirective",function(){return l}),n.d(t,"AbstractFormGroupDirective",function(){return R}),n.d(t,"CheckboxControlValueAccessor",function(){return g}),n.d(t,"ControlContainer",function(){return c}),n.d(t,"NG_VALUE_ACCESSOR",function(){return f}),n.d(t,"COMPOSITION_BUFFER_MODE",function(){return b}),n.d(t,"DefaultValueAccessor",function(){return _}),n.d(t,"NgControl",function(){return A}),n.d(t,"NgControlStatus",function(){return j}),n.d(t,"NgControlStatusGroup",function(){return H}),n.d(t,"NgForm",function(){return K}),n.d(t,"NgModel",function(){return ie}),n.d(t,"NgModelGroup",function(){return te}),n.d(t,"RadioControlValueAccessor",function(){return E}),n.d(t,"FormControlDirective",function(){return ae}),n.d(t,"FormControlName",function(){return fe}),n.d(t,"FormGroupDirective",function(){return le}),n.d(t,"FormArrayName",function(){return he}),n.d(t,"FormGroupName",function(){return pe}),n.d(t,"NgSelectOption",function(){return L}),n.d(t,"SelectControlValueAccessor",function(){return N}),n.d(t,"SelectMultipleControlValueAccessor",function(){return D}),n.d(t,"CheckboxRequiredValidator",function(){return be}),n.d(t,"EmailValidator",function(){return Se}),n.d(t,"MaxLengthValidator",function(){return we}),n.d(t,"MinLengthValidator",function(){return Ae}),n.d(t,"PatternValidator",function(){return Pe}),n.d(t,"RequiredValidator",function(){return ve}),n.d(t,"FormBuilder",function(){return Oe}),n.d(t,"AbstractControl",function(){return B}),n.d(t,"FormArray",function(){return q}),n.d(t,"FormControl",function(){return G}),n.d(t,"FormGroup",function(){return U}),n.d(t,"NG_ASYNC_VALIDATORS",function(){return d}),n.d(t,"NG_VALIDATORS",function(){return p}),n.d(t,"Validators",function(){return m}),n.d(t,"VERSION",function(){return Ie}),n.d(t,"FormsModule",function(){return Fe}),n.d(t,"ReactiveFormsModule",function(){return Re}),n.d(t,"ɵba",function(){return Me}),n.d(t,"ɵz",function(){return De}),n.d(t,"ɵx",function(){return Le}),n.d(t,"ɵy",function(){return xe}),n.d(t,"ɵa",function(){return y}),n.d(t,"ɵb",function(){return v}),n.d(t,"ɵc",function(){return V}),n.d(t,"ɵd",function(){return k}),n.d(t,"ɵe",function(){return W}),n.d(t,"ɵf",function(){return ne}),n.d(t,"ɵg",function(){return ee}),n.d(t,"ɵbf",function(){return Ne}),n.d(t,"ɵbb",function(){return S}),n.d(t,"ɵbc",function(){return C}),n.d(t,"ɵh",function(){return T}),n.d(t,"ɵi",function(){return w}),n.d(t,"ɵbd",function(){return P}),n.d(t,"ɵbe",function(){return O}),n.d(t,"ɵj",function(){return se}),n.d(t,"ɵk",function(){return me}),n.d(t,"ɵl",function(){return ue}),n.d(t,"ɵn",function(){return de}),n.d(t,"ɵm",function(){return ce}),n.d(t,"ɵo",function(){return I}),n.d(t,"ɵq",function(){return M}),n.d(t,"ɵp",function(){return x}),n.d(t,"ɵs",function(){return ge}),n.d(t,"ɵt",function(){return _e}),n.d(t,"ɵv",function(){return Te}),n.d(t,"ɵu",function(){return Ce}),n.d(t,"ɵw",function(){return Ee}),n.d(t,"ɵr",function(){return ye});var r=n(16),i=n(2),o=n(126),s=(n.n(o),n(80)),a=(n.n(s),n(57)),u=(n.n(a),n(27)),l=function(){function AbstractControlDirective(){}return AbstractControlDirective.prototype.control=function(){},Object.defineProperty(AbstractControlDirective.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),AbstractControlDirective.prototype.reset=function(e){void 0===e&&(e=void 0),this.control&&this.control.reset(e)},AbstractControlDirective.prototype.hasError=function(e,t){return!!this.control&&this.control.hasError(e,t)},AbstractControlDirective.prototype.getError=function(e,t){return this.control?this.control.getError(e,t):null},AbstractControlDirective}(),c=function(e){function ControlContainer(){return null!==e&&e.apply(this,arguments)||this}return r.a(ControlContainer,e),Object.defineProperty(ControlContainer.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(ControlContainer.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),ControlContainer}(l); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function isEmptyInputValue(e){return null==e||0===e.length}var p=new i.InjectionToken("NgValidators"),d=new i.InjectionToken("NgAsyncValidators"),h=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,m=function(){function Validators(){}return Validators.min=function(e){return function(t){if(isEmptyInputValue(t.value)||isEmptyInputValue(e))return null;var n=parseFloat(t.value);return!isNaN(n)&&ne?{max:{max:e,actual:t.value}}:null}},Validators.required=function(e){return isEmptyInputValue(e.value)?{required:!0}:null},Validators.requiredTrue=function(e){return!0===e.value?null:{required:!0}},Validators.email=function(e){return h.test(e.value)?null:{email:!0}},Validators.minLength=function(e){return function(t){if(isEmptyInputValue(t.value))return null;var n=t.value?t.value.length:0;return ne?{maxlength:{requiredLength:e,actualLength:n}}:null}},Validators.pattern=function(e){return e?("string"==typeof e?(n="^"+e+"$",t=new RegExp(n)):(n=e.toString(),t=e),function(e){if(isEmptyInputValue(e.value))return null;var r=e.value;return t.test(r)?null:{pattern:{requiredPattern:n,actualValue:r}}}):Validators.nullValidator;var t,n},Validators.nullValidator=function(e){return null},Validators.compose=function(e){if(!e)return null;var t=e.filter(isPresent);return 0==t.length?null:function(e){return _mergeErrors(function _executeValidators(e,t){return t.map(function(t){return t(e)})}(e,t))}},Validators.composeAsync=function(e){if(!e)return null;var t=e.filter(isPresent);return 0==t.length?null:function(e){var n=function _executeAsyncValidators(e,t){return t.map(function(t){return t(e)})}(e,t).map(toObservable);return a.map.call(Object(o.forkJoin)(n),_mergeErrors)}},Validators}();function isPresent(e){return null!=e}function toObservable(e){var t=Object(i["ɵisPromise"])(e)?Object(s.fromPromise)(e):e;if(!Object(i["ɵisObservable"])(t))throw new Error("Expected validator to return Promise or Observable.");return t}function _mergeErrors(e){var t=e.reduce(function(e,t){return null!=t?Object.assign({},e,t):e},{});return 0===Object.keys(t).length?null:t} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var f=new i.InjectionToken("NgValueAccessor"),y={provide:f,useExisting:Object(i.forwardRef)(function(){return g}),multi:!0},g=function(){function CheckboxControlValueAccessor(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return CheckboxControlValueAccessor.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"checked",e)},CheckboxControlValueAccessor.prototype.registerOnChange=function(e){this.onChange=e},CheckboxControlValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},CheckboxControlValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},CheckboxControlValueAccessor}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */g.decorators=[{type:i.Directive,args:[{selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]",host:{"(change)":"onChange($event.target.checked)","(blur)":"onTouched()"},providers:[y]}]}],g.ctorParameters=function(){return[{type:i.Renderer2},{type:i.ElementRef}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var v={provide:f,useExisting:Object(i.forwardRef)(function(){return _}),multi:!0};var b=new i.InjectionToken("CompositionEventMode"),_=function(){function DefaultValueAccessor(e,t,n){this._renderer=e,this._elementRef=t,this._compositionMode=n,this.onChange=function(e){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function _isAndroid(){var e=Object(u["ɵgetDOM"])()?Object(u["ɵgetDOM"])().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}return DefaultValueAccessor.prototype.writeValue=function(e){var t=null==e?"":e;this._renderer.setProperty(this._elementRef.nativeElement,"value",t)},DefaultValueAccessor.prototype.registerOnChange=function(e){this.onChange=e},DefaultValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},DefaultValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},DefaultValueAccessor.prototype._handleInput=function(e){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(e)},DefaultValueAccessor.prototype._compositionStart=function(){this._composing=!0},DefaultValueAccessor.prototype._compositionEnd=function(e){this._composing=!1,this._compositionMode&&this.onChange(e)},DefaultValueAccessor}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function normalizeValidator(e){return e.validate?function(t){return e.validate(t)}:e}function normalizeAsyncValidator(e){return e.validate?function(t){return e.validate(t)}:e} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */_.decorators=[{type:i.Directive,args:[{selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]",host:{"(input)":"_handleInput($event.target.value)","(blur)":"onTouched()","(compositionstart)":"_compositionStart()","(compositionend)":"_compositionEnd($event.target.value)"},providers:[v]}]}],_.ctorParameters=function(){return[{type:i.Renderer2},{type:i.ElementRef},{type:void 0,decorators:[{type:i.Optional},{type:i.Inject,args:[b]}]}]};var S={provide:f,useExisting:Object(i.forwardRef)(function(){return C}),multi:!0},C=function(){function NumberValueAccessor(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return NumberValueAccessor.prototype.writeValue=function(e){var t=null==e?"":e;this._renderer.setProperty(this._elementRef.nativeElement,"value",t)},NumberValueAccessor.prototype.registerOnChange=function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}},NumberValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},NumberValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},NumberValueAccessor}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function unimplemented(){throw new Error("unimplemented")}C.decorators=[{type:i.Directive,args:[{selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]",host:{"(change)":"onChange($event.target.value)","(input)":"onChange($event.target.value)","(blur)":"onTouched()"},providers:[S]}]}],C.ctorParameters=function(){return[{type:i.Renderer2},{type:i.ElementRef}]};var A=function(e){function NgControl(){var t=e.apply(this,arguments)||this;return t._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return r.a(NgControl,e),Object.defineProperty(NgControl.prototype,"validator",{get:function(){return unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(NgControl.prototype,"asyncValidator",{get:function(){return unimplemented()},enumerable:!0,configurable:!0}),NgControl.prototype.viewToModelUpdate=function(e){},NgControl}(l),T={provide:f,useExisting:Object(i.forwardRef)(function(){return E}),multi:!0},w=function(){function RadioControlRegistry(){this._accessors=[]}return RadioControlRegistry.prototype.add=function(e,t){this._accessors.push([e,t])},RadioControlRegistry.prototype.remove=function(e){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===e)return void this._accessors.splice(t,1)},RadioControlRegistry.prototype.select=function(e){var t=this;this._accessors.forEach(function(n){t._isSameGroup(n,e)&&n[1]!==e&&n[1].fireUncheck(e.value)})},RadioControlRegistry.prototype._isSameGroup=function(e,t){return!!e[0].control&&(e[0]._parent===t._control._parent&&e[1].name===t.name)},RadioControlRegistry}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */w.decorators=[{type:i.Injectable}],w.ctorParameters=function(){return[]};var E=function(){function RadioControlValueAccessor(e,t,n,r){this._renderer=e,this._elementRef=t,this._registry=n,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return RadioControlValueAccessor.prototype.ngOnInit=function(){this._control=this._injector.get(A),this._checkName(),this._registry.add(this._control,this)},RadioControlValueAccessor.prototype.ngOnDestroy=function(){this._registry.remove(this)},RadioControlValueAccessor.prototype.writeValue=function(e){this._state=e===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},RadioControlValueAccessor.prototype.registerOnChange=function(e){var t=this;this._fn=e,this.onChange=function(){e(t.value),t._registry.select(t)}},RadioControlValueAccessor.prototype.fireUncheck=function(e){this.writeValue(e)},RadioControlValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},RadioControlValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},RadioControlValueAccessor.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},RadioControlValueAccessor.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},RadioControlValueAccessor}();E.decorators=[{type:i.Directive,args:[{selector:"input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]",host:{"(change)":"onChange()","(blur)":"onTouched()"},providers:[T]}]}],E.ctorParameters=function(){return[{type:i.Renderer2},{type:i.ElementRef},{type:w},{type:i.Injector}]},E.propDecorators={name:[{type:i.Input}],formControlName:[{type:i.Input}],value:[{type:i.Input}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var P={provide:f,useExisting:Object(i.forwardRef)(function(){return O}),multi:!0},O=function(){function RangeValueAccessor(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return RangeValueAccessor.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(e))},RangeValueAccessor.prototype.registerOnChange=function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}},RangeValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},RangeValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},RangeValueAccessor}();O.decorators=[{type:i.Directive,args:[{selector:"input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]",host:{"(change)":"onChange($event.target.value)","(input)":"onChange($event.target.value)","(blur)":"onTouched()"},providers:[P]}]}],O.ctorParameters=function(){return[{type:i.Renderer2},{type:i.ElementRef}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var I={provide:f,useExisting:Object(i.forwardRef)(function(){return N}),multi:!0};function _buildValueString(e,t){return null==e?""+t:(t&&"object"==typeof t&&(t="Object"),(e+": "+t).slice(0,50))}var N=function(){function SelectControlValueAccessor(e,t){this._renderer=e,this._elementRef=t,this._optionMap=new Map,this._idCounter=0,this.onChange=function(e){},this.onTouched=function(){},this._compareWith=i["ɵlooseIdentical"]}return Object.defineProperty(SelectControlValueAccessor.prototype,"compareWith",{set:function(e){if("function"!=typeof e)throw new Error("compareWith must be a function, but received "+JSON.stringify(e));this._compareWith=e},enumerable:!0,configurable:!0}),SelectControlValueAccessor.prototype.writeValue=function(e){this.value=e;var t=this._getOptionId(e);null==t&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=_buildValueString(t,e);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)},SelectControlValueAccessor.prototype.registerOnChange=function(e){var t=this;this.onChange=function(n){t.value=t._getOptionValue(n),e(t.value)}},SelectControlValueAccessor.prototype.registerOnTouched=function(e){this.onTouched=e},SelectControlValueAccessor.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},SelectControlValueAccessor.prototype._registerOption=function(){return(this._idCounter++).toString()},SelectControlValueAccessor.prototype._getOptionId=function(e){for(var t=0,n=Array.from(this._optionMap.keys());t-1)}}else t=function(e,t){e._setSelected(!1)};this._optionMap.forEach(t)},SelectMultipleControlValueAccessor.prototype.registerOnChange=function(e){var t=this;this.onChange=function(n){var r=[];if(n.hasOwnProperty("selectedOptions"))for(var i=n.selectedOptions,o=0;o1?"path: '"+e.path.join(" -> ")+"'":e.path[0]?"name: '"+e.path+"'":"unspecified name attribute",new Error(t+" "+n)}function composeValidators(e){return null!=e?m.compose(e.map(normalizeValidator)):null}function composeAsyncValidators(e){return null!=e?m.composeAsync(e.map(normalizeAsyncValidator)):null}function isPropertyUpdated(e,t){if(!e.hasOwnProperty("model"))return!1;var n=e.model;return!!n.isFirstChange()||!Object(i["ɵlooseIdentical"])(t,n.currentValue)}M.decorators=[{type:i.Directive,args:[{selector:"option"}]}],M.ctorParameters=function(){return[{type:i.ElementRef},{type:i.Renderer2},{type:D,decorators:[{type:i.Optional},{type:i.Host}]}]},M.propDecorators={ngValue:[{type:i.Input,args:["ngValue"]}],value:[{type:i.Input,args:["value"]}]};var F=[g,O,C,N,D,E];function selectValueAccessor(e,t){if(!t)return null;var n=void 0,r=void 0,i=void 0;return t.forEach(function(t){t.constructor===_?n=t:!function isBuiltInAccessor(e){return F.some(function(t){return e.constructor===t})}(t)?(i&&_throwError(e,"More than one custom value accessor matches form control with"),i=t):(r&&_throwError(e,"More than one built-in value accessor matches form control with"),r=t)}),i||(r||(n||(_throwError(e,"No valid value accessor for form control with"),null)))} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var R=function(e){function AbstractFormGroupDirective(){return null!==e&&e.apply(this,arguments)||this}return r.a(AbstractFormGroupDirective,e),AbstractFormGroupDirective.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},AbstractFormGroupDirective.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(AbstractFormGroupDirective.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"validator",{get:function(){return composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),AbstractFormGroupDirective.prototype._checkParentType=function(){},AbstractFormGroupDirective}(c),V=function(){function AbstractControlStatus(e){this._cd=e}return Object.defineProperty(AbstractControlStatus.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),AbstractControlStatus}(),k={"[class.ng-untouched]":"ngClassUntouched","[class.ng-touched]":"ngClassTouched","[class.ng-pristine]":"ngClassPristine","[class.ng-dirty]":"ngClassDirty","[class.ng-valid]":"ngClassValid","[class.ng-invalid]":"ngClassInvalid","[class.ng-pending]":"ngClassPending"},j=function(e){function NgControlStatus(t){return e.call(this,t)||this}return r.a(NgControlStatus,e),NgControlStatus}(V); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */j.decorators=[{type:i.Directive,args:[{selector:"[formControlName],[ngModel],[formControl]",host:k}]}],j.ctorParameters=function(){return[{type:A,decorators:[{type:i.Self}]}]};var H=function(e){function NgControlStatusGroup(t){return e.call(this,t)||this}return r.a(NgControlStatusGroup,e),NgControlStatusGroup}(V);H.decorators=[{type:i.Directive,args:[{selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]",host:k}]}],H.ctorParameters=function(){return[{type:c,decorators:[{type:i.Self}]}]};function coerceToValidator(e){return Array.isArray(e)?composeValidators(e):e||null}function coerceToAsyncValidator(e){return Array.isArray(e)?composeAsyncValidators(e):e||null}var B=function(){function AbstractControl(e,t){this.validator=e,this.asyncValidator=t,this._onCollectionChange=function(){},this._pristine=!0,this._touched=!1,this._onDisabledChange=[]}return Object.defineProperty(AbstractControl.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"status",{get:function(){return this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"valid",{get:function(){return"VALID"===this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"invalid",{get:function(){return"INVALID"===this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"pending",{get:function(){return"PENDING"==this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"disabled",{get:function(){return"DISABLED"===this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"enabled",{get:function(){return"DISABLED"!==this._status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"errors",{get:function(){return this._errors},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"pristine",{get:function(){return this._pristine},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"touched",{get:function(){return this._touched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"untouched",{get:function(){return!this._touched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"valueChanges",{get:function(){return this._valueChanges},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"statusChanges",{get:function(){return this._statusChanges},enumerable:!0,configurable:!0}),AbstractControl.prototype.setValidators=function(e){this.validator=coerceToValidator(e)},AbstractControl.prototype.setAsyncValidators=function(e){this.asyncValidator=coerceToAsyncValidator(e)},AbstractControl.prototype.clearValidators=function(){this.validator=null},AbstractControl.prototype.clearAsyncValidators=function(){this.asyncValidator=null},AbstractControl.prototype.markAsTouched=function(e){void 0===e&&(e={}),this._touched=!0,this._parent&&!e.onlySelf&&this._parent.markAsTouched(e)},AbstractControl.prototype.markAsUntouched=function(e){void 0===e&&(e={}),this._touched=!1,this._forEachChild(function(e){e.markAsUntouched({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)},AbstractControl.prototype.markAsDirty=function(e){void 0===e&&(e={}),this._pristine=!1,this._parent&&!e.onlySelf&&this._parent.markAsDirty(e)},AbstractControl.prototype.markAsPristine=function(e){void 0===e&&(e={}),this._pristine=!0,this._forEachChild(function(e){e.markAsPristine({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)},AbstractControl.prototype.markAsPending=function(e){void 0===e&&(e={}),this._status="PENDING",this._parent&&!e.onlySelf&&this._parent.markAsPending(e)},AbstractControl.prototype.disable=function(e){void 0===e&&(e={}),this._status="DISABLED",this._errors=null,this._forEachChild(function(e){e.disable({onlySelf:!0})}),this._updateValue(),!1!==e.emitEvent&&(this._valueChanges.emit(this._value),this._statusChanges.emit(this._status)),this._updateAncestors(!!e.onlySelf),this._onDisabledChange.forEach(function(e){return e(!0)})},AbstractControl.prototype.enable=function(e){void 0===e&&(e={}),this._status="VALID",this._forEachChild(function(e){e.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(!!e.onlySelf),this._onDisabledChange.forEach(function(e){return e(!1)})},AbstractControl.prototype._updateAncestors=function(e){this._parent&&!e&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},AbstractControl.prototype.setParent=function(e){this._parent=e},AbstractControl.prototype.setValue=function(e,t){},AbstractControl.prototype.patchValue=function(e,t){},AbstractControl.prototype.reset=function(e,t){},AbstractControl.prototype.updateValueAndValidity=function(e){void 0===e&&(e={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this._errors=this._runValidator(),this._status=this._calculateStatus(),"VALID"!==this._status&&"PENDING"!==this._status||this._runAsyncValidator(e.emitEvent)),!1!==e.emitEvent&&(this._valueChanges.emit(this._value),this._statusChanges.emit(this._status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(e)},AbstractControl.prototype._updateTreeValidity=function(e){void 0===e&&(e={emitEvent:!0}),this._forEachChild(function(t){return t._updateTreeValidity(e)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})},AbstractControl.prototype._setInitialStatus=function(){this._status=this._allControlsDisabled()?"DISABLED":"VALID"},AbstractControl.prototype._runValidator=function(){return this.validator?this.validator(this):null},AbstractControl.prototype._runAsyncValidator=function(e){var t=this;if(this.asyncValidator){this._status="PENDING";var n=toObservable(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){return t.setErrors(n,{emitEvent:e})})}},AbstractControl.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},AbstractControl.prototype.setErrors=function(e,t){void 0===t&&(t={}),this._errors=e,this._updateControlsErrors(!1!==t.emitEvent)},AbstractControl.prototype.get=function(e){return function _find(e,t,n){return null==t?null:(t instanceof Array||(t=t.split(n)),t instanceof Array&&0===t.length?null:t.reduce(function(e,t){return e instanceof U?e.controls[t]||null:e instanceof q&&e.at(t)||null},e))}(this,e,".")},AbstractControl.prototype.getError=function(e,t){var n=t?this.get(t):this;return n&&n._errors?n._errors[e]:null},AbstractControl.prototype.hasError=function(e,t){return!!this.getError(e,t)},Object.defineProperty(AbstractControl.prototype,"root",{get:function(){for(var e=this;e._parent;)e=e._parent;return e},enumerable:!0,configurable:!0}),AbstractControl.prototype._updateControlsErrors=function(e){this._status=this._calculateStatus(),e&&this._statusChanges.emit(this._status),this._parent&&this._parent._updateControlsErrors(e)},AbstractControl.prototype._initObservables=function(){this._valueChanges=new i.EventEmitter,this._statusChanges=new i.EventEmitter},AbstractControl.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this._errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},AbstractControl.prototype._updateValue=function(){},AbstractControl.prototype._forEachChild=function(e){},AbstractControl.prototype._anyControls=function(e){},AbstractControl.prototype._allControlsDisabled=function(){},AbstractControl.prototype._anyControlsHaveStatus=function(e){return this._anyControls(function(t){return t.status===e})},AbstractControl.prototype._anyControlsDirty=function(){return this._anyControls(function(e){return e.dirty})},AbstractControl.prototype._anyControlsTouched=function(){return this._anyControls(function(e){return e.touched})},AbstractControl.prototype._updatePristine=function(e){void 0===e&&(e={}),this._pristine=!this._anyControlsDirty(),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)},AbstractControl.prototype._updateTouched=function(e){void 0===e&&(e={}),this._touched=this._anyControlsTouched(),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)},AbstractControl.prototype._isBoxedValue=function(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e},AbstractControl.prototype._registerOnCollectionChange=function(e){this._onCollectionChange=e},AbstractControl}(),G=function(e){function FormControl(t,n,r){void 0===t&&(t=null);var i=e.call(this,coerceToValidator(n),coerceToAsyncValidator(r))||this;return i._onChange=[],i._applyFormState(t),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i._initObservables(),i}return r.a(FormControl,e),FormControl.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this._value=e,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(function(e){return e(n._value,!1!==t.emitViewToModelChange)}),this.updateValueAndValidity(t)},FormControl.prototype.patchValue=function(e,t){void 0===t&&(t={}),this.setValue(e,t)},FormControl.prototype.reset=function(e,t){void 0===e&&(e=null),void 0===t&&(t={}),this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this._value,t)},FormControl.prototype._updateValue=function(){},FormControl.prototype._anyControls=function(e){return!1},FormControl.prototype._allControlsDisabled=function(){return this.disabled},FormControl.prototype.registerOnChange=function(e){this._onChange.push(e)},FormControl.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},FormControl.prototype.registerOnDisabledChange=function(e){this._onDisabledChange.push(e)},FormControl.prototype._forEachChild=function(e){},FormControl.prototype._applyFormState=function(e){this._isBoxedValue(e)?(this._value=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this._value=e},FormControl}(B),U=function(e){function FormGroup(t,n,r){var i=e.call(this,n||null,r||null)||this;return i.controls=t,i._initObservables(),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return r.a(FormGroup,e),FormGroup.prototype.registerControl=function(e,t){return this.controls[e]?this.controls[e]:(this.controls[e]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)},FormGroup.prototype.addControl=function(e,t){this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.removeControl=function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.setControl=function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],t&&this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.contains=function(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled},FormGroup.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this._checkAllValuesPresent(e),Object.keys(e).forEach(function(r){n._throwIfControlMissing(r),n.controls[r].setValue(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},FormGroup.prototype.patchValue=function(e,t){var n=this;void 0===t&&(t={}),Object.keys(e).forEach(function(r){n.controls[r]&&n.controls[r].patchValue(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},FormGroup.prototype.reset=function(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this._forEachChild(function(n,r){n.reset(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},FormGroup.prototype.getRawValue=function(){return this._reduceChildren({},function(e,t,n){return e[n]=t instanceof G?t.value:t.getRawValue(),e})},FormGroup.prototype._throwIfControlMissing=function(e){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[e])throw new Error("Cannot find form control with name: "+e+".")},FormGroup.prototype._forEachChild=function(e){var t=this;Object.keys(this.controls).forEach(function(n){return e(t.controls[n],n)})},FormGroup.prototype._setUpControls=function(){var e=this;this._forEachChild(function(t){t.setParent(e),t._registerOnCollectionChange(e._onCollectionChange)})},FormGroup.prototype._updateValue=function(){this._value=this._reduceValue()},FormGroup.prototype._anyControls=function(e){var t=this,n=!1;return this._forEachChild(function(r,i){n=n||t.contains(i)&&e(r)}),n},FormGroup.prototype._reduceValue=function(){var e=this;return this._reduceChildren({},function(t,n,r){return(n.enabled||e.disabled)&&(t[r]=n.value),t})},FormGroup.prototype._reduceChildren=function(e,t){var n=e;return this._forEachChild(function(e,r){n=t(n,e,r)}),n},FormGroup.prototype._allControlsDisabled=function(){for(var e=0,t=Object.keys(this.controls);e0||this.disabled},FormGroup.prototype._checkAllValuesPresent=function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control with name: '"+n+"'.")})},FormGroup}(B),q=function(e){function FormArray(t,n,r){var i=e.call(this,n||null,r||null)||this;return i.controls=t,i._initObservables(),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return r.a(FormArray,e),FormArray.prototype.at=function(e){return this.controls[e]},FormArray.prototype.push=function(e){this.controls.push(e),this._registerControl(e),this.updateValueAndValidity(),this._onCollectionChange()},FormArray.prototype.insert=function(e,t){this.controls.splice(e,0,t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},FormArray.prototype.removeAt=function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),this.updateValueAndValidity(),this._onCollectionChange()},FormArray.prototype.setControl=function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),t&&(this.controls.splice(e,0,t),this._registerControl(t)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(FormArray.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),FormArray.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this._checkAllValuesPresent(e),e.forEach(function(e,r){n._throwIfControlMissing(r),n.at(r).setValue(e,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},FormArray.prototype.patchValue=function(e,t){var n=this;void 0===t&&(t={}),e.forEach(function(e,r){n.at(r)&&n.at(r).patchValue(e,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},FormArray.prototype.reset=function(e,t){void 0===e&&(e=[]),void 0===t&&(t={}),this._forEachChild(function(n,r){n.reset(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},FormArray.prototype.getRawValue=function(){return this.controls.map(function(e){return e instanceof G?e.value:e.getRawValue()})},FormArray.prototype._throwIfControlMissing=function(e){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(e))throw new Error("Cannot find form control at index "+e)},FormArray.prototype._forEachChild=function(e){this.controls.forEach(function(t,n){e(t,n)})},FormArray.prototype._updateValue=function(){var e=this;this._value=this.controls.filter(function(t){return t.enabled||e.disabled}).map(function(e){return e.value})},FormArray.prototype._anyControls=function(e){return this.controls.some(function(t){return t.enabled&&e(t)})},FormArray.prototype._setUpControls=function(){var e=this;this._forEachChild(function(t){return e._registerControl(t)})},FormArray.prototype._checkAllValuesPresent=function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control at index: "+n+".")})},FormArray.prototype._allControlsDisabled=function(){for(var e=0,t=this.controls;e0||this.disabled},FormArray.prototype._registerControl=function(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)},FormArray}(B),W={provide:c,useExisting:Object(i.forwardRef)(function(){return K})},z=Promise.resolve(null),K=function(e){function NgForm(t,n){var r=e.call(this)||this;return r._submitted=!1,r.ngSubmit=new i.EventEmitter,r.form=new U({},composeValidators(t),composeAsyncValidators(n)),r}return r.a(NgForm,e),Object.defineProperty(NgForm.prototype,"submitted",{get:function(){return this._submitted},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),NgForm.prototype.addControl=function(e){var t=this;z.then(function(){var n=t._findContainer(e.path);e._control=n.registerControl(e.name,e.control),setUpControl(e.control,e),e.control.updateValueAndValidity({emitEvent:!1})})},NgForm.prototype.getControl=function(e){return this.form.get(e.path)},NgForm.prototype.removeControl=function(e){var t=this;z.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name)})},NgForm.prototype.addFormGroup=function(e){var t=this;z.then(function(){var n=t._findContainer(e.path),r=new U({});setUpFormContainer(r,e),n.registerControl(e.name,r),r.updateValueAndValidity({emitEvent:!1})})},NgForm.prototype.removeFormGroup=function(e){var t=this;z.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name)})},NgForm.prototype.getFormGroup=function(e){return this.form.get(e.path)},NgForm.prototype.updateModel=function(e,t){var n=this;z.then(function(){n.form.get(e.path).setValue(t)})},NgForm.prototype.setValue=function(e){this.control.setValue(e)},NgForm.prototype.onSubmit=function(e){return this._submitted=!0,this.ngSubmit.emit(e),!1},NgForm.prototype.onReset=function(){this.resetForm()},NgForm.prototype.resetForm=function(e){void 0===e&&(e=void 0),this.form.reset(e),this._submitted=!1},NgForm.prototype._findContainer=function(e){return e.pop(),e.length?this.form.get(e):this.form},NgForm}(c);K.decorators=[{type:i.Directive,args:[{selector:"form:not([ngNoForm]):not([formGroup]),ngForm,[ngForm]",providers:[W],host:{"(submit)":"onSubmit($event)","(reset)":"onReset()"},outputs:["ngSubmit"],exportAs:"ngForm"}]}],K.ctorParameters=function(){return[{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Y='\n
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',J='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Q='\n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });',X='\n
\n
\n \n
\n
',$='\n
\n \n \n
\n ',Z=function(){function TemplateDrivenErrors(){}return TemplateDrivenErrors.modelParentException=function(){throw new Error('\n ngModel cannot be used to register form controls with a parent formGroup directive. Try using\n formGroup\'s partner directive "formControlName" instead. Example:\n\n '+Y+"\n\n Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions:\n\n Example:\n\n "+$)},TemplateDrivenErrors.formGroupNameException=function(){throw new Error("\n ngModel cannot be used to register form controls with a parent formGroupName or formArrayName directive.\n\n Option 1: Use formControlName instead of ngModel (reactive strategy):\n\n "+J+"\n\n Option 2: Update ngModel's parent be ngModelGroup (template-driven strategy):\n\n "+X)},TemplateDrivenErrors.missingNameException=function(){throw new Error('If ngModel is used within a form tag, either the name attribute must be set or the form\n control must be defined as \'standalone\' in ngModelOptions.\n\n Example 1: \n Example 2: ')},TemplateDrivenErrors.modelGroupParentException=function(){throw new Error("\n ngModelGroup cannot be used with a parent formGroup directive.\n\n Option 1: Use formGroupName instead of ngModelGroup (reactive strategy):\n\n "+J+"\n\n Option 2: Use a regular form tag instead of the formGroup directive (template-driven strategy):\n\n "+X)},TemplateDrivenErrors}(),ee={provide:c,useExisting:Object(i.forwardRef)(function(){return te})},te=function(e){function NgModelGroup(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return r.a(NgModelGroup,e),NgModelGroup.prototype._checkParentType=function(){this._parent instanceof NgModelGroup||this._parent instanceof K||Z.modelGroupParentException()},NgModelGroup}(R); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */te.decorators=[{type:i.Directive,args:[{selector:"[ngModelGroup]",providers:[ee],exportAs:"ngModelGroup"}]}],te.ctorParameters=function(){return[{type:c,decorators:[{type:i.Host},{type:i.SkipSelf}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]}]},te.propDecorators={name:[{type:i.Input,args:["ngModelGroup"]}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var ne={provide:A,useExisting:Object(i.forwardRef)(function(){return ie})},re=Promise.resolve(null),ie=function(e){function NgModel(t,n,r,o){var s=e.call(this)||this;return s._control=new G,s._registered=!1,s.update=new i.EventEmitter,s._parent=t,s._rawValidators=n||[],s._rawAsyncValidators=r||[],s.valueAccessor=selectValueAccessor(s,o),s}return r.a(NgModel,e),NgModel.prototype.ngOnChanges=function(e){this._checkForErrors(),this._registered||this._setUpControl(),"isDisabled"in e&&this._updateDisabled(e),isPropertyUpdated(e,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)},NgModel.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},Object.defineProperty(NgModel.prototype,"control",{get:function(){return this._control},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"path",{get:function(){return this._parent?controlPath(this.name,this._parent):[this.name]},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),NgModel.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},NgModel.prototype._setUpControl=function(){this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0},NgModel.prototype._isStandalone=function(){return!this._parent||!(!this.options||!this.options.standalone)},NgModel.prototype._setUpStandalone=function(){setUpControl(this._control,this),this._control.updateValueAndValidity({emitEvent:!1})},NgModel.prototype._checkForErrors=function(){this._isStandalone()||this._checkParentType(),this._checkName()},NgModel.prototype._checkParentType=function(){!(this._parent instanceof te)&&this._parent instanceof R?Z.formGroupNameException():this._parent instanceof te||this._parent instanceof K||Z.modelParentException()},NgModel.prototype._checkName=function(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()||this.name||Z.missingNameException()},NgModel.prototype._updateValue=function(e){var t=this;re.then(function(){t.control.setValue(e,{emitViewToModelChange:!1})})},NgModel.prototype._updateDisabled=function(e){var t=this,n=e.isDisabled.currentValue,r=""===n||n&&"false"!==n;re.then(function(){r&&!t.control.disabled?t.control.disable():!r&&t.control.disabled&&t.control.enable()})},NgModel}(A);ie.decorators=[{type:i.Directive,args:[{selector:"[ngModel]:not([formControlName]):not([formControl])",providers:[ne],exportAs:"ngModel"}]}],ie.ctorParameters=function(){return[{type:c,decorators:[{type:i.Optional},{type:i.Host}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[f]}]}]},ie.propDecorators={name:[{type:i.Input}],isDisabled:[{type:i.Input,args:["disabled"]}],model:[{type:i.Input,args:["ngModel"]}],options:[{type:i.Input,args:["ngModelOptions"]}],update:[{type:i.Output,args:["ngModelChange"]}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var oe=function(){function ReactiveErrors(){}return ReactiveErrors.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Y)},ReactiveErrors.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+J+"\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n "+X)},ReactiveErrors.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+Y)},ReactiveErrors.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+J)},ReactiveErrors.arrayParentException=function(){throw new Error("formArrayName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Q)},ReactiveErrors.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},ReactiveErrors}(),se={provide:A,useExisting:Object(i.forwardRef)(function(){return ae})},ae=function(e){function FormControlDirective(t,n,r){var o=e.call(this)||this;return o.update=new i.EventEmitter,o._rawValidators=t||[],o._rawAsyncValidators=n||[],o.valueAccessor=selectValueAccessor(o,r),o}return r.a(FormControlDirective,e),Object.defineProperty(FormControlDirective.prototype,"isDisabled",{set:function(e){oe.disabledAttrWarning()},enumerable:!0,configurable:!0}),FormControlDirective.prototype.ngOnChanges=function(e){this._isControlChanged(e)&&(setUpControl(this.form,this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this.form.updateValueAndValidity({emitEvent:!1})),isPropertyUpdated(e,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)},Object.defineProperty(FormControlDirective.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),FormControlDirective.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},FormControlDirective.prototype._isControlChanged=function(e){return e.hasOwnProperty("form")},FormControlDirective}(A); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ae.decorators=[{type:i.Directive,args:[{selector:"[formControl]",providers:[se],exportAs:"ngForm"}]}],ae.ctorParameters=function(){return[{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[f]}]}]},ae.propDecorators={form:[{type:i.Input,args:["formControl"]}],model:[{type:i.Input,args:["ngModel"]}],update:[{type:i.Output,args:["ngModelChange"]}],isDisabled:[{type:i.Input,args:["disabled"]}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var ue={provide:c,useExisting:Object(i.forwardRef)(function(){return le})},le=function(e){function FormGroupDirective(t,n){var r=e.call(this)||this;return r._validators=t,r._asyncValidators=n,r._submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new i.EventEmitter,r}return r.a(FormGroupDirective,e),FormGroupDirective.prototype.ngOnChanges=function(e){this._checkFormPresent(),e.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(FormGroupDirective.prototype,"submitted",{get:function(){return this._submitted},enumerable:!0,configurable:!0}),Object.defineProperty(FormGroupDirective.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(FormGroupDirective.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(FormGroupDirective.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),FormGroupDirective.prototype.addControl=function(e){var t=this.form.get(e.path);return setUpControl(t,e),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(e),t},FormGroupDirective.prototype.getControl=function(e){return this.form.get(e.path)},FormGroupDirective.prototype.removeControl=function(e){!function remove(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */(this.directives,e)},FormGroupDirective.prototype.addFormGroup=function(e){var t=this.form.get(e.path);setUpFormContainer(t,e),t.updateValueAndValidity({emitEvent:!1})},FormGroupDirective.prototype.removeFormGroup=function(e){},FormGroupDirective.prototype.getFormGroup=function(e){return this.form.get(e.path)},FormGroupDirective.prototype.addFormArray=function(e){var t=this.form.get(e.path);setUpFormContainer(t,e),t.updateValueAndValidity({emitEvent:!1})},FormGroupDirective.prototype.removeFormArray=function(e){},FormGroupDirective.prototype.getFormArray=function(e){return this.form.get(e.path)},FormGroupDirective.prototype.updateModel=function(e,t){this.form.get(e.path).setValue(t)},FormGroupDirective.prototype.onSubmit=function(e){return this._submitted=!0,this.ngSubmit.emit(e),!1},FormGroupDirective.prototype.onReset=function(){this.resetForm()},FormGroupDirective.prototype.resetForm=function(e){void 0===e&&(e=void 0),this.form.reset(e),this._submitted=!1},FormGroupDirective.prototype._updateDomValue=function(){var e=this;this.directives.forEach(function(t){var n=e.form.get(t.path);t._control!==n&&(!function cleanUpControl(e,t){t.valueAccessor.registerOnChange(function(){return _noControlError(t)}),t.valueAccessor.registerOnTouched(function(){return _noControlError(t)}),t._rawValidators.forEach(function(e){e.registerOnValidatorChange&&e.registerOnValidatorChange(null)}),t._rawAsyncValidators.forEach(function(e){e.registerOnValidatorChange&&e.registerOnValidatorChange(null)}),e&&e._clearChangeFns()}(t._control,t),n&&setUpControl(n,t),t._control=n)}),this.form._updateTreeValidity({emitEvent:!1})},FormGroupDirective.prototype._updateRegistrations=function(){var e=this;this.form._registerOnCollectionChange(function(){return e._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},FormGroupDirective.prototype._updateValidators=function(){var e=composeValidators(this._validators);this.form.validator=m.compose([this.form.validator,e]);var t=composeAsyncValidators(this._asyncValidators);this.form.asyncValidator=m.composeAsync([this.form.asyncValidator,t])},FormGroupDirective.prototype._checkFormPresent=function(){this.form||oe.missingFormException()},FormGroupDirective}(c);le.decorators=[{type:i.Directive,args:[{selector:"[formGroup]",providers:[ue],host:{"(submit)":"onSubmit($event)","(reset)":"onReset()"},exportAs:"ngForm"}]}],le.ctorParameters=function(){return[{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]}]},le.propDecorators={form:[{type:i.Input,args:["formGroup"]}],ngSubmit:[{type:i.Output}]};var ce={provide:c,useExisting:Object(i.forwardRef)(function(){return pe})},pe=function(e){function FormGroupName(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return r.a(FormGroupName,e),FormGroupName.prototype._checkParentType=function(){_hasInvalidParent(this._parent)&&oe.groupParentException()},FormGroupName}(R);pe.decorators=[{type:i.Directive,args:[{selector:"[formGroupName]",providers:[ce]}]}],pe.ctorParameters=function(){return[{type:c,decorators:[{type:i.Optional},{type:i.Host},{type:i.SkipSelf}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]}]},pe.propDecorators={name:[{type:i.Input,args:["formGroupName"]}]};var de={provide:c,useExisting:Object(i.forwardRef)(function(){return he})},he=function(e){function FormArrayName(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return r.a(FormArrayName,e),FormArrayName.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},FormArrayName.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(FormArrayName.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"validator",{get:function(){return composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),FormArrayName.prototype._checkParentType=function(){_hasInvalidParent(this._parent)&&oe.arrayParentException()},FormArrayName}(c);function _hasInvalidParent(e){return!(e instanceof pe||e instanceof le||e instanceof he)} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */he.decorators=[{type:i.Directive,args:[{selector:"[formArrayName]",providers:[de]}]}],he.ctorParameters=function(){return[{type:c,decorators:[{type:i.Optional},{type:i.Host},{type:i.SkipSelf}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]}]},he.propDecorators={name:[{type:i.Input,args:["formArrayName"]}]};var me={provide:A,useExisting:Object(i.forwardRef)(function(){return fe})},fe=function(e){function FormControlName(t,n,r,o){var s=e.call(this)||this;return s._added=!1,s.update=new i.EventEmitter,s._parent=t,s._rawValidators=n||[],s._rawAsyncValidators=r||[],s.valueAccessor=selectValueAccessor(s,o),s}return r.a(FormControlName,e),Object.defineProperty(FormControlName.prototype,"isDisabled",{set:function(e){oe.disabledAttrWarning()},enumerable:!0,configurable:!0}),FormControlName.prototype.ngOnChanges=function(e){this._added||this._setUpControl(),isPropertyUpdated(e,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},FormControlName.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},FormControlName.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},Object.defineProperty(FormControlName.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"control",{get:function(){return this._control},enumerable:!0,configurable:!0}),FormControlName.prototype._checkParentType=function(){!(this._parent instanceof pe)&&this._parent instanceof R?oe.ngModelGroupException():this._parent instanceof pe||this._parent instanceof le||this._parent instanceof he||oe.controlParentException()},FormControlName.prototype._setUpControl=function(){this._checkParentType(),this._control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},FormControlName}(A);fe.decorators=[{type:i.Directive,args:[{selector:"[formControlName]",providers:[me]}]}],fe.ctorParameters=function(){return[{type:c,decorators:[{type:i.Optional},{type:i.Host},{type:i.SkipSelf}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[p]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[d]}]},{type:Array,decorators:[{type:i.Optional},{type:i.Self},{type:i.Inject,args:[f]}]}]},fe.propDecorators={name:[{type:i.Input,args:["formControlName"]}],model:[{type:i.Input,args:["ngModel"]}],update:[{type:i.Output,args:["ngModelChange"]}],isDisabled:[{type:i.Input,args:["disabled"]}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var ye={provide:p,useExisting:Object(i.forwardRef)(function(){return ve}),multi:!0},ge={provide:p,useExisting:Object(i.forwardRef)(function(){return be}),multi:!0},ve=function(){function RequiredValidator(){}return Object.defineProperty(RequiredValidator.prototype,"required",{get:function(){return this._required},set:function(e){this._required=null!=e&&!1!==e&&""+e!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),RequiredValidator.prototype.validate=function(e){return this.required?m.required(e):null},RequiredValidator.prototype.registerOnValidatorChange=function(e){this._onChange=e},RequiredValidator}();ve.decorators=[{type:i.Directive,args:[{selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",providers:[ye],host:{"[attr.required]":'required ? "" : null'}}]}],ve.ctorParameters=function(){return[]},ve.propDecorators={required:[{type:i.Input}]};var be=function(e){function CheckboxRequiredValidator(){return null!==e&&e.apply(this,arguments)||this}return r.a(CheckboxRequiredValidator,e),CheckboxRequiredValidator.prototype.validate=function(e){return this.required?m.requiredTrue(e):null},CheckboxRequiredValidator}(ve);be.decorators=[{type:i.Directive,args:[{selector:"input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]",providers:[ge],host:{"[attr.required]":'required ? "" : null'}}]}],be.ctorParameters=function(){return[]};var _e={provide:p,useExisting:Object(i.forwardRef)(function(){return Se}),multi:!0},Se=function(){function EmailValidator(){}return Object.defineProperty(EmailValidator.prototype,"email",{set:function(e){this._enabled=""===e||!0===e||"true"===e,this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),EmailValidator.prototype.validate=function(e){return this._enabled?m.email(e):null},EmailValidator.prototype.registerOnValidatorChange=function(e){this._onChange=e},EmailValidator}();Se.decorators=[{type:i.Directive,args:[{selector:"[email][formControlName],[email][formControl],[email][ngModel]",providers:[_e]}]}],Se.ctorParameters=function(){return[]},Se.propDecorators={email:[{type:i.Input}]};var Ce={provide:p,useExisting:Object(i.forwardRef)(function(){return Ae}),multi:!0},Ae=function(){function MinLengthValidator(){}return MinLengthValidator.prototype.ngOnChanges=function(e){"minlength"in e&&(this._createValidator(),this._onChange&&this._onChange())},MinLengthValidator.prototype.validate=function(e){return null==this.minlength?null:this._validator(e)},MinLengthValidator.prototype.registerOnValidatorChange=function(e){this._onChange=e},MinLengthValidator.prototype._createValidator=function(){this._validator=m.minLength(parseInt(this.minlength,10))},MinLengthValidator}();Ae.decorators=[{type:i.Directive,args:[{selector:"[minlength][formControlName],[minlength][formControl],[minlength][ngModel]",providers:[Ce],host:{"[attr.minlength]":"minlength ? minlength : null"}}]}],Ae.ctorParameters=function(){return[]},Ae.propDecorators={minlength:[{type:i.Input}]};var Te={provide:p,useExisting:Object(i.forwardRef)(function(){return we}),multi:!0},we=function(){function MaxLengthValidator(){}return MaxLengthValidator.prototype.ngOnChanges=function(e){"maxlength"in e&&(this._createValidator(),this._onChange&&this._onChange())},MaxLengthValidator.prototype.validate=function(e){return null!=this.maxlength?this._validator(e):null},MaxLengthValidator.prototype.registerOnValidatorChange=function(e){this._onChange=e},MaxLengthValidator.prototype._createValidator=function(){this._validator=m.maxLength(parseInt(this.maxlength,10))},MaxLengthValidator}();we.decorators=[{type:i.Directive,args:[{selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",providers:[Te],host:{"[attr.maxlength]":"maxlength ? maxlength : null"}}]}],we.ctorParameters=function(){return[]},we.propDecorators={maxlength:[{type:i.Input}]};var Ee={provide:p,useExisting:Object(i.forwardRef)(function(){return Pe}),multi:!0},Pe=function(){function PatternValidator(){}return PatternValidator.prototype.ngOnChanges=function(e){"pattern"in e&&(this._createValidator(),this._onChange&&this._onChange())},PatternValidator.prototype.validate=function(e){return this._validator(e)},PatternValidator.prototype.registerOnValidatorChange=function(e){this._onChange=e},PatternValidator.prototype._createValidator=function(){this._validator=m.pattern(this.pattern)},PatternValidator}();Pe.decorators=[{type:i.Directive,args:[{selector:"[pattern][formControlName],[pattern][formControl],[pattern][ngModel]",providers:[Ee],host:{"[attr.pattern]":"pattern ? pattern : null"}}]}],Pe.ctorParameters=function(){return[]},Pe.propDecorators={pattern:[{type:i.Input}]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Oe=function(){function FormBuilder(){}return FormBuilder.prototype.group=function(e,t){void 0===t&&(t=null);var n=this._reduceControls(e),r=null!=t?t.validator:null,i=null!=t?t.asyncValidator:null;return new U(n,r,i)},FormBuilder.prototype.control=function(e,t,n){return new G(e,t,n)},FormBuilder.prototype.array=function(e,t,n){var r=this,i=e.map(function(e){return r._createControl(e)});return new q(i,t,n)},FormBuilder.prototype._reduceControls=function(e){var t=this,n={};return Object.keys(e).forEach(function(r){n[r]=t._createControl(e[r])}),n},FormBuilder.prototype._createControl=function(e){if(e instanceof G||e instanceof U||e instanceof q)return e;if(Array.isArray(e)){var t=e[0],n=e.length>1?e[1]:null,r=e.length>2?e[2]:null;return this.control(t,n,r)}return this.control(e)},FormBuilder}();Oe.decorators=[{type:i.Injectable}],Oe.ctorParameters=function(){return[]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Ie=new i.Version("4.4.6"),Ne=function(){return function NgNoValidate(){}}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */Ne.decorators=[{type:i.Directive,args:[{selector:"form:not([ngNoForm]):not([ngNativeValidate])",host:{novalidate:""}}]}],Ne.ctorParameters=function(){return[]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Le=[Ne,L,M,_,C,O,g,N,D,E,j,H,ve,Ae,we,Pe,be,Se],xe=[ie,te,K],De=[ae,le,fe,pe,he],Me=function(){return function InternalFormsSharedModule(){}}();Me.decorators=[{type:i.NgModule,args:[{declarations:Le,exports:Le}]}],Me.ctorParameters=function(){return[]}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Fe=function(){return function FormsModule(){}}();Fe.decorators=[{type:i.NgModule,args:[{declarations:xe,providers:[w],exports:[Me,xe]}]}],Fe.ctorParameters=function(){return[]};var Re=function(){return function ReactiveFormsModule(){}}();Re.decorators=[{type:i.NgModule,args:[{declarations:[De],providers:[Oe,w],exports:[Me,De]}]}],Re.ctorParameters=function(){return[]}},235:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=0;!function(e){e[e.error=0]="error",e[e.warn=1]="warn"}(t.FlashMessageType||(t.FlashMessageType={}));var i=function(){return function FlashMessage(e,t,n){this.content=e,this.tooltip=t,this.type=n,this.id=r++,this.isDismissed=!1,this.hasTooltip=Boolean(t),this.showTooltip=!1}}();t.FlashMessage=i},236:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(19),i=n(2),o=n(234),s=n(29),a=n(94),u=n(584),l=function(){function PlugsModule(){}return PlugsModule=__decorate([i.NgModule({imports:[r.CommonModule,o.FormsModule,s.HttpModule,a.SharedModule],declarations:[u.UserInputPlugComponent],providers:[],exports:[r.CommonModule,s.HttpModule,u.UserInputPlugComponent]})],PlugsModule)}();t.PlugsModule=l},237:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function ProgressBarComponent(){this.isReset=!1}return Object.defineProperty(ProgressBarComponent.prototype,"barStyle",{get:function(){return this.isReset?(this.isReset=!1,{width:"0",transition:"none"}):{width:100*Math.max(0,Math.min(1,this.value))+"%"}},enumerable:!0,configurable:!0}),Object.defineProperty(ProgressBarComponent.prototype,"isComplete",{get:function(){return this.value>=1},enumerable:!0,configurable:!0}),ProgressBarComponent.prototype.reset=function(){this.isReset=!0},__decorate([r.Input(),__metadata("design:type",Number)],ProgressBarComponent.prototype,"value",void 0),ProgressBarComponent=__decorate([r.Component({selector:"htf-progress-bar",template:n(578),styles:[n(579)]})],ProgressBarComponent)}();t.ProgressBarComponent=i},238:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(48);t.washIn=[r.state("in",r.style({background:"rgba(0, 119, 255, 0.0)"})),r.transition("void => in",[r.style({background:"rgba(0, 119, 255, 0.1)"}),r.animate(1e3)])],t.washAndExpandIn=function washAndExpandIn(e){return[r.state("in",r.style({background:"rgba(0, 119, 255, 0.0)","max-height":e+"px"})),r.transition("void => in",[r.style({background:"rgba(0, 119, 255, 0.2)","max-height":"0"}),r.animate(500)])]}},239:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(49),o=n(97),s=n(240),a=n(26),u=a.devHost+"/sub/dashboard",l={UNREACHABLE:i.StationStatus.unreachable,ONLINE:i.StationStatus.online},c=function(e){function DashboardService(n){var r=e.call(this,n)||this;return r.stations={},r.messages.subscribe(function(e){var n=t.validateResponse(e.data),i=t.parseResponse(n);r.applyResponse(i)}),r}return __extends(DashboardService,e),t=DashboardService,DashboardService.prototype.subscribe=function(t,n,r){void 0===t&&(t=null),void 0===n&&(n=1),void 0===r&&(r=Number.MAX_VALUE),e.prototype.subscribeToUrl.call(this,u,t,n,r)},DashboardService.validateResponse=function(e){return e},DashboardService.parseResponse=function(e){for(var n={},r=0,o=Object.keys(e);r=0&&-1===s;){for(var a=e.phases[o],u=0,l=t;u1?(console.error("Unrecognized phase descriptor ID.",e.phases,t),e):((i=e.phases).splice.apply(i,[o+2,0].concat(t.slice(s+1))),e)}).catch(function(){return o.Observable.of(e)})},StationService.prototype.getOrRequestPhaseDescriptors=function(e){var t=this;if(!(e.testId in this.phaseDescriptorPromise)){var n=p.getTestBaseUrl(this.config.dashboardEnabled,e)+"/phases";this.phaseDescriptorPromise[e.testId]=this.http.get(n).toPromise().then(function(e){return e.json().data.map(h.makePhaseFromDescriptor)}).catch(function(e){var n=p.messageFromErrorResponse(e);return t.flashMessage.error("HTTP request for phase descriptors failed.",n),Promise.reject(e)})}return o.Observable.fromPromise(this.phaseDescriptorPromise[e.testId])},StationService.prototype.applyResponse=function(e,t){if(e.testId in this.testsById){var n=this.testsById[e.testId];n.status!==e.status&&(e.status===u.TestStatus.error?this.flashMessage.error("The test exited early due to an error. View the test logs for details."):e.status===u.TestStatus.timeout?this.flashMessage.warn("The test exited early due to timeout."):e.status===u.TestStatus.aborted&&this.flashMessage.warn("The test was aborted.")),Object.assign(n,e)}else this.testsById[e.testId]=e,this.testsByStation[t.hostPort]=e},StationService=t=__decorate([r.Injectable(),__metadata("design:paramtypes",[s.ConfigService,a.FlashMessageService,d.HistoryService,i.Http,l.SockJsService])],StationService);var t}(c.Subscription);t.StationService=m},25:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i={server_type:"dashboard",history_from_disk_enabled:!1},o=function(){function ConfigService(){this.config=i}return ConfigService.prototype.initialize=function(e){var t=Object.keys(e).filter(function(e){return!(e in i)});if(t.length>0){console.warn("Received unknown config keys",t);for(var n=0,r=t;nn[t]?1:e[t]0&&e.startDismissal()},500)},FlashMessageService=__decorate([r.Injectable()],FlashMessageService)}();t.FlashMessageService=o},48:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"AnimationBuilder",function(){return r}),n.d(t,"AnimationFactory",function(){return i}),n.d(t,"AUTO_STYLE",function(){return o}),n.d(t,"animate",function(){return animate}),n.d(t,"animateChild",function(){return animateChild}),n.d(t,"animation",function(){return animation}),n.d(t,"group",function(){return group}),n.d(t,"keyframes",function(){return keyframes}),n.d(t,"query",function(){return query}),n.d(t,"sequence",function(){return sequence}),n.d(t,"stagger",function(){return stagger}),n.d(t,"state",function(){return state}),n.d(t,"style",function(){return style}),n.d(t,"transition",function(){return transition}),n.d(t,"trigger",function(){return trigger}),n.d(t,"useAnimation",function(){return useAnimation}),n.d(t,"NoopAnimationPlayer",function(){return s}),n.d(t,"ɵAnimationGroupPlayer",function(){return a}),n.d(t,"ɵPRE_STYLE",function(){return u}); +/** + * @license Angular v4.4.6 + * (c) 2010-2017 Google, Inc. https://angular.io/ + * License: MIT + */ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var r=function(){function AnimationBuilder(){}return AnimationBuilder.prototype.build=function(e){},AnimationBuilder}(),i=function(){function AnimationFactory(){}return AnimationFactory.prototype.create=function(e,t){},AnimationFactory}(),o="*";function trigger(e,t){return{type:7,name:e,definitions:t,options:{}}}function animate(e,t){return void 0===t&&(t=null),{type:4,styles:t,timings:e}}function group(e,t){return void 0===t&&(t=null),{type:3,steps:e,options:t}}function sequence(e,t){return void 0===t&&(t=null),{type:2,steps:e,options:t}}function style(e){return{type:6,styles:e,offset:null}}function state(e,t,n){return{type:0,name:e,styles:t,options:n}}function keyframes(e){return{type:5,steps:e}}function transition(e,t,n){return void 0===n&&(n=null),{type:1,expr:e,animation:t,options:n}}function animation(e,t){return void 0===t&&(t=null),{type:8,animation:e,options:t}}function animateChild(e){return void 0===e&&(e=null),{type:9,options:e}}function useAnimation(e,t){return void 0===t&&(t=null),{type:10,animation:e,options:t}}function query(e,t,n){return void 0===n&&(n=null),{type:11,selector:e,animation:t,options:n}}function stagger(e,t){return{type:12,timings:e,animation:t}} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + * @param {?} cb + * @return {?} + */function scheduleMicroTask(e){Promise.resolve(null).then(e)} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var s=function(){function NoopAnimationPlayer(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return NoopAnimationPlayer.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},NoopAnimationPlayer.prototype.onStart=function(e){this._onStartFns.push(e)},NoopAnimationPlayer.prototype.onDone=function(e){this._onDoneFns.push(e)},NoopAnimationPlayer.prototype.onDestroy=function(e){this._onDestroyFns.push(e)},NoopAnimationPlayer.prototype.hasStarted=function(){return this._started},NoopAnimationPlayer.prototype.init=function(){},NoopAnimationPlayer.prototype.play=function(){this.hasStarted()||(this.triggerMicrotask(),this._onStart()),this._started=!0},NoopAnimationPlayer.prototype.triggerMicrotask=function(){var e=this;scheduleMicroTask(function(){return e._onFinish()})},NoopAnimationPlayer.prototype._onStart=function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]},NoopAnimationPlayer.prototype.pause=function(){},NoopAnimationPlayer.prototype.restart=function(){},NoopAnimationPlayer.prototype.finish=function(){this._onFinish()},NoopAnimationPlayer.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])},NoopAnimationPlayer.prototype.reset=function(){},NoopAnimationPlayer.prototype.setPosition=function(e){},NoopAnimationPlayer.prototype.getPosition=function(){return 0},NoopAnimationPlayer}(),a=function(){function AnimationGroupPlayer(e){var t=this;this._players=e,this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0;var n=0,r=0,i=0,o=this._players.length;0==o?scheduleMicroTask(function(){return t._onFinish()}):this._players.forEach(function(e){e.parentPlayer=t,e.onDone(function(){++n>=o&&t._onFinish()}),e.onDestroy(function(){++r>=o&&t._onDestroy()}),e.onStart(function(){++i>=o&&t._onStart()})}),this.totalTime=this._players.reduce(function(e,t){return Math.max(e,t.totalTime)},0)}return AnimationGroupPlayer.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},AnimationGroupPlayer.prototype.init=function(){this._players.forEach(function(e){return e.init()})},AnimationGroupPlayer.prototype.onStart=function(e){this._onStartFns.push(e)},AnimationGroupPlayer.prototype._onStart=function(){this.hasStarted()||(this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[],this._started=!0)},AnimationGroupPlayer.prototype.onDone=function(e){this._onDoneFns.push(e)},AnimationGroupPlayer.prototype.onDestroy=function(e){this._onDestroyFns.push(e)},AnimationGroupPlayer.prototype.hasStarted=function(){return this._started},AnimationGroupPlayer.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this._players.forEach(function(e){return e.play()})},AnimationGroupPlayer.prototype.pause=function(){this._players.forEach(function(e){return e.pause()})},AnimationGroupPlayer.prototype.restart=function(){this._players.forEach(function(e){return e.restart()})},AnimationGroupPlayer.prototype.finish=function(){this._onFinish(),this._players.forEach(function(e){return e.finish()})},AnimationGroupPlayer.prototype.destroy=function(){this._onDestroy()},AnimationGroupPlayer.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this._players.forEach(function(e){return e.destroy()}),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])},AnimationGroupPlayer.prototype.reset=function(){this._players.forEach(function(e){return e.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},AnimationGroupPlayer.prototype.setPosition=function(e){var t=e*this.totalTime;this._players.forEach(function(e){var n=e.totalTime?Math.min(1,t/e.totalTime):1;e.setPosition(n)})},AnimationGroupPlayer.prototype.getPosition=function(){var e=0;return this._players.forEach(function(t){var n=t.getPosition();e=Math.min(n,e)}),e},Object.defineProperty(AnimationGroupPlayer.prototype,"players",{get:function(){return this._players},enumerable:!0,configurable:!0}),AnimationGroupPlayer.prototype.beforeDestroy=function(){this.players.forEach(function(e){e.beforeDestroy&&e.beforeDestroy()})},AnimationGroupPlayer}(),u="!"; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */},49:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.online=9]="online",e[e.unreachable=10]="unreachable"}(t.StationStatus||(t.StationStatus={}));var r=function(){return function Station(e){Object.assign(this,e)}}();t.Station=r},559:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(111),o=n(560);function main(){return i.platformBrowserDynamic().bootstrapModule(o.AppModule).then(function(e){return e})}r.enableProdMode(),t.main=main,"complete"===document.readyState?main():document.addEventListener("DOMContentLoaded",main)},560:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(561),o=n(27),s=n(233),a=n(29),u=n(234),l=n(563),c=n(567),p=n(236),d=n(94),h=n(588),m=n(218),f=function(){function AppModule(e){this.appRef=e}return AppModule.prototype.hmrOnInit=function(e){console.log("HMR store",e)},AppModule.prototype.hmrOnDestroy=function(e){var t=this.appRef.components.map(function(e){return e.location.nativeElement});e.disposeOldHosts=m.createNewHosts(t),m.removeNgStyles()},AppModule.prototype.hmrAfterDestroy=function(e){e.disposeOldHosts(),delete e.disposeOldHosts},AppModule=__decorate([r.NgModule({imports:[i.BrowserAnimationsModule,o.BrowserModule,s.HttpClientModule,a.HttpModule,u.FormsModule,c.CoreModule,p.PlugsModule,d.SharedModule,h.StationsModule],declarations:[l.AppComponent],providers:[],bootstrap:[l.AppComponent]}),__metadata("design:paramtypes",[r.ApplicationRef])],AppModule)}();t.AppModule=f},561:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"BrowserAnimationsModule",function(){return v}),n.d(t,"NoopAnimationsModule",function(){return b}),n.d(t,"ɵBrowserAnimationBuilder",function(){return u}),n.d(t,"ɵBrowserAnimationFactory",function(){return l}),n.d(t,"ɵAnimationRenderer",function(){return h}),n.d(t,"ɵAnimationRendererFactory",function(){return p}),n.d(t,"ɵa",function(){return d}),n.d(t,"ɵf",function(){return y}),n.d(t,"ɵg",function(){return g}),n.d(t,"ɵb",function(){return m}),n.d(t,"ɵd",function(){return instantiateDefaultStyleNormalizer}),n.d(t,"ɵe",function(){return instantiateRendererFactory}),n.d(t,"ɵc",function(){return instantiateSupportedAnimationDriver});var r=n(16),i=n(2),o=n(27),s=n(48),a=n(562),u=function(e){function BrowserAnimationBuilder(t,n){var r=e.call(this)||this;r._nextAnimationId=0;var o={id:"0",encapsulation:i.ViewEncapsulation.None,styles:[],data:{animation:[]}};return r._renderer=t.createRenderer(n.body,o),r}return r.a(BrowserAnimationBuilder,e),BrowserAnimationBuilder.prototype.build=function(e){var t=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(e)?Object(s.sequence)(e):e;return issueAnimationCommand(this._renderer,null,t,"register",[n]),new l(t,this._renderer)},BrowserAnimationBuilder}(s.AnimationBuilder);u.decorators=[{type:i.Injectable}],u.ctorParameters=function(){return[{type:i.RendererFactory2},{type:void 0,decorators:[{type:i.Inject,args:[o.DOCUMENT]}]}]};var l=function(e){function BrowserAnimationFactory(t,n){var r=e.call(this)||this;return r._id=t,r._renderer=n,r}return r.a(BrowserAnimationFactory,e),BrowserAnimationFactory.prototype.create=function(e,t){return new c(this._id,e,t||{},this._renderer)},BrowserAnimationFactory}(s.AnimationFactory),c=function(){function RendererAnimationPlayer(e,t,n,r){this.id=e,this.element=t,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return RendererAnimationPlayer.prototype._listen=function(e,t){return this._renderer.listen(this.element,"@@"+this.id+":"+e,t)},RendererAnimationPlayer.prototype._command=function(e){for(var t=[],n=1;n=0&&e *";case":leave":return"* => void";default:return t.push('The transition alias value "'+e+'" is not supported'),"* => *"}}(e,n));var r=e.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return n.push('The provided transition expression "'+e+'" is not supported'),t;var i=r[1],o=r[2],s=r[3];t.push(makeLambdaFromStates(i,s));var a=i==C&&s==C;"<"!=o[0]||a||t.push(makeLambdaFromStates(s,i))}(e,n,t)}):n.push(e),n}var A=new Set;A.add("true"),A.add("1");var T=new Set;function makeLambdaFromStates(e,t){var n=A.has(e)||T.has(e),r=A.has(t)||T.has(t);return function(i,o){var s=e==C||e==i,a=t==C||t==o;return!s&&n&&"boolean"==typeof i&&(s=i?A.has(e):T.has(e)),!a&&r&&"boolean"==typeof o&&(a=o?A.has(t):T.has(t)),s&&a}} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */T.add("false"),T.add("0");var w=":self",E=new RegExp("s*"+w+"s*,?","g");function buildAnimationAst(e,t){return(new I).build(e,t)}var P=new RegExp(":leave","g"),O=new RegExp(":enter","g"),I=function(){function AnimationAstBuilderVisitor(){}return AnimationAstBuilderVisitor.prototype.build=function(e,t){var n=new N(t);return this._resetContextStyleTimingState(n),visitDslNode(this,normalizeAnimationEntry(e),n)},AnimationAstBuilderVisitor.prototype._resetContextStyleTimingState=function(e){e.currentQuerySelector="",e.collectedStyles={},e.collectedStyles[""]={},e.currentTime=0},AnimationAstBuilderVisitor.prototype.visitTrigger=function(e,t){var n=this,r=t.queryCount=0,i=t.depCount=0,o=[],s=[];return e.definitions.forEach(function(e){if(n._resetContextStyleTimingState(t),0==e.type){var a=e,u=a.name;u.split(/\s*,\s*/).forEach(function(e){a.name=e,o.push(n.visitState(a,t))}),a.name=u}else if(1==e.type){var l=n.visitTransition(e,t);r+=l.queryCount,i+=l.depCount,s.push(l)}else t.errors.push("only state() and transition() definitions can sit inside of a trigger()")}),{type:7,name:e.name,states:o,transitions:s,queryCount:r,depCount:i,options:null}},AnimationAstBuilderVisitor.prototype.visitState=function(e,t){var n=this.visitStyle(e.styles,t),r=e.options&&e.options.params||null;if(n.containsDynamicStyles){var i=new Set,o=r||{};if(n.styles.forEach(function(e){if(isObject(e)){var t=e;Object.keys(t).forEach(function(e){extractStyleParams(t[e]).forEach(function(e){o.hasOwnProperty(e)||i.add(e)})})}}),i.size){var s=iteratorToArray(i.values());t.errors.push('state("'+e.name+'", ...) must define default values for all the following style substitutions: '+s.join(", "))}}return{type:0,name:e.name,style:n,options:r?{params:r}:null}},AnimationAstBuilderVisitor.prototype.visitTransition=function(e,t){t.queryCount=0,t.depCount=0;var n=visitDslNode(this,normalizeAnimationEntry(e.animation),t);return{type:1,matchers:parseTransitionExpr(e.expr,t.errors),animation:n,queryCount:t.queryCount,depCount:t.depCount,options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitSequence=function(e,t){var n=this;return{type:2,steps:e.steps.map(function(e){return visitDslNode(n,e,t)}),options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitGroup=function(e,t){var n=this,r=t.currentTime,i=0,o=e.steps.map(function(e){t.currentTime=r;var o=visitDslNode(n,e,t);return i=Math.max(i,t.currentTime),o});return t.currentTime=i,{type:3,steps:o,options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitAnimate=function(e,t){var n,r=function constructTimingAst(e,t){var n=null;if(e.hasOwnProperty("duration"))n=e;else if("number"==typeof e){var r=resolveTiming(e,t).duration;return makeTimingAst(r,0,"")}var i=e;if(i.split(/\s+/).some(function(e){return"{"==e.charAt(0)&&"{"==e.charAt(1)})){var o=makeTimingAst(0,0,"");return o.dynamic=!0,o.strValue=i,o}return makeTimingAst((n=n||resolveTiming(i,t)).duration,n.delay,n.easing)}(e.timings,t.errors);t.currentAnimateTimings=r;var o=e.styles?e.styles:Object(i.style)({});if(5==o.type)n=this.visitKeyframes(o,t);else{var s=e.styles,a=!1;if(!s){a=!0;var u={};r.easing&&(u.easing=r.easing),s=Object(i.style)(u)}t.currentTime+=r.duration+r.delay;var l=this.visitStyle(s,t);l.isEmptyStep=a,n=l}return t.currentAnimateTimings=null,{type:4,timings:r,style:n,options:null}},AnimationAstBuilderVisitor.prototype.visitStyle=function(e,t){var n=this._makeStyleAst(e,t);return this._validateStyleAst(n,t),n},AnimationAstBuilderVisitor.prototype._makeStyleAst=function(e,t){var n=[];Array.isArray(e.styles)?e.styles.forEach(function(e){"string"==typeof e?e==i.AUTO_STYLE?n.push(e):t.errors.push("The provided style string value "+e+" is not allowed."):n.push(e)}):n.push(e.styles);var r=!1,o=null;return n.forEach(function(e){if(isObject(e)){var t=e,n=t.easing;if(n&&(o=n,delete t.easing),!r)for(var i in t){if(t[i].toString().indexOf("{{")>=0){r=!0;break}}}}),{type:6,styles:n,easing:o,offset:e.offset,containsDynamicStyles:r,options:null}},AnimationAstBuilderVisitor.prototype._validateStyleAst=function(e,t){var n=t.currentAnimateTimings,r=t.currentTime,i=t.currentTime;n&&i>0&&(i-=n.duration+n.delay),e.styles.forEach(function(e){"string"!=typeof e&&Object.keys(e).forEach(function(n){var o=t.collectedStyles[t.currentQuerySelector],s=o[n],a=!0;s&&(i!=r&&i>=s.startTime&&r<=s.endTime&&(t.errors.push('The CSS property "'+n+'" that exists between the times of "'+s.startTime+'ms" and "'+s.endTime+'ms" is also being animated in a parallel animation between the times of "'+i+'ms" and "'+r+'ms"'),a=!1),i=s.startTime),a&&(o[n]={startTime:i,endTime:r}),t.options&&function validateStyleParams(e,t,n){var r=t.params||{},i=extractStyleParams(e);i.length&&i.forEach(function(e){r.hasOwnProperty(e)||n.push("Unable to resolve the local animation param "+e+" in the given list of values")})}(e[n],t.options,t.errors)})})},AnimationAstBuilderVisitor.prototype.visitKeyframes=function(e,t){var n=this,r={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),r;var i=0,o=[],s=!1,a=!1,u=0,l=e.steps.map(function(e){var r=n._makeStyleAst(e,t),l=null!=r.offset?r.offset:function consumeOffset(e){if("string"==typeof e)return null;var t=null;if(Array.isArray(e))e.forEach(function(e){if(isObject(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}});else if(isObject(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}return t}(r.styles),c=0;return null!=l&&(i++,c=r.offset=l),a=a||c<0||c>1,s=s||c0&&i0?i==d?1:p*i:o[i],a=s*f;t.currentTime=h+m.delay+a,m.duration=a,n._validateStyleAst(e,t),e.offset=s,r.styles.push(e)}),r},AnimationAstBuilderVisitor.prototype.visitReference=function(e,t){return{type:8,animation:visitDslNode(this,normalizeAnimationEntry(e.animation),t),options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitAnimateChild=function(e,t){return t.depCount++,{type:9,options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitAnimateRef=function(e,t){return{type:10,animation:this.visitReference(e.animation,t),options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitQuery=function(e,t){var n=t.currentQuerySelector,r=e.options||{};t.queryCount++,t.currentQuery=e;var i=function normalizeSelector(e){var t=!!e.split(/\s*,\s*/).find(function(e){return e==w});t&&(e=e.replace(E,""));return[e=e.replace(O,y).replace(P,g).replace(/@\*/g,v).replace(/@\w+/g,function(e){return v+"-"+e.substr(1)}).replace(/:animating/g,b),t]}(e.selector),o=i[0],s=i[1];t.currentQuerySelector=n.length?n+" "+o:o,getOrSetAsInMap(t.collectedStyles,t.currentQuerySelector,{});var a=visitDslNode(this,normalizeAnimationEntry(e.animation),t);return t.currentQuery=null,t.currentQuerySelector=n,{type:11,selector:o,limit:r.limit||0,optional:!!r.optional,includeSelf:s,animation:a,originalSelector:e.selector,options:normalizeAnimationOptions(e.options)}},AnimationAstBuilderVisitor.prototype.visitStagger=function(e,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var n="full"===e.timings?{duration:0,delay:0,easing:"full"}:resolveTiming(e.timings,t.errors,!0);return{type:12,animation:visitDslNode(this,normalizeAnimationEntry(e.animation),t),timings:n,options:null}},AnimationAstBuilderVisitor}();var N=function(){return function AnimationAstBuilderContext(e){this.errors=e,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null}}();function isObject(e){return!Array.isArray(e)&&"object"==typeof e}function normalizeAnimationOptions(e){return e?(e=copyObj(e)).params&&(e.params=function normalizeParams(e){return e?copyObj(e):null}(e.params)):e={},e}function makeTimingAst(e,t,n){return{duration:e,delay:t,easing:n}} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */function createTimelineInstruction(e,t,n,r,i,o,s,a){return void 0===s&&(s=null),void 0===a&&(a=!1),{type:1,element:e,keyframes:t,preStyleProps:n,postStyleProps:r,duration:i,delay:o,totalTime:i+o,easing:s,subTimeline:a}} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var L=function(){function ElementInstructionMap(){this._map=new Map}return ElementInstructionMap.prototype.consume=function(e){var t=this._map.get(e);return t?this._map.delete(e):t=[],t},ElementInstructionMap.prototype.append=function(e,t){var n=this._map.get(e);n||this._map.set(e,n=[]),n.push.apply(n,t)},ElementInstructionMap.prototype.has=function(e){return this._map.has(e)},ElementInstructionMap.prototype.clear=function(){this._map.clear()},ElementInstructionMap}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */function buildAnimationTimelines(e,t,n,r,i,o,s,a){return void 0===r&&(r={}),void 0===i&&(i={}),void 0===a&&(a=[]),(new x).buildKeyframes(e,t,n,r,i,o,s,a)}var x=function(){function AnimationTimelineBuilderVisitor(){}return AnimationTimelineBuilderVisitor.prototype.buildKeyframes=function(e,t,n,r,i,o,s,a){void 0===a&&(a=[]),s=s||new L;var u=new M(e,t,s,a,[]);u.options=o,u.currentTimeline.setStyles([r],null,u.errors,o),visitDslNode(this,n,u);var l=u.timelines.filter(function(e){return e.containsAnimation()});if(l.length&&Object.keys(i).length){var c=l[l.length-1];c.allowOnlyTimelineStyles()||c.setStyles([i],null,u.errors,o)}return l.length?l.map(function(e){return e.buildKeyframes()}):[createTimelineInstruction(t,[],[],[],0,0,"",!1)]},AnimationTimelineBuilderVisitor.prototype.visitTrigger=function(e,t){},AnimationTimelineBuilderVisitor.prototype.visitState=function(e,t){},AnimationTimelineBuilderVisitor.prototype.visitTransition=function(e,t){},AnimationTimelineBuilderVisitor.prototype.visitAnimateChild=function(e,t){var n=t.subInstructions.consume(t.element);if(n){var r=t.createSubContext(e.options),i=t.currentTimeline.currentTime,o=this._visitSubInstructions(n,r,r.options);i!=o&&t.transformIntoNewTimeline(o)}t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitAnimateRef=function(e,t){var n=t.createSubContext(e.options);n.transformIntoNewTimeline(),this.visitReference(e.animation,n),t.transformIntoNewTimeline(n.currentTimeline.currentTime),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype._visitSubInstructions=function(e,t,n){var r=t.currentTimeline.currentTime,i=null!=n.duration?resolveTimingValue(n.duration):null,o=null!=n.delay?resolveTimingValue(n.delay):null;return 0!==i&&e.forEach(function(e){var n=t.appendInstructionToTimeline(e,i,o);r=Math.max(r,n.duration+n.delay)}),r},AnimationTimelineBuilderVisitor.prototype.visitReference=function(e,t){t.updateOptions(e.options,!0),visitDslNode(this,e.animation,t),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitSequence=function(e,t){var n=this,r=t.subContextCount,i=t,o=e.options;if(o&&(o.params||o.delay)&&((i=t.createSubContext(o)).transformIntoNewTimeline(),null!=o.delay)){6==i.previousNode.type&&(i.currentTimeline.snapshotCurrentStyles(),i.previousNode=D);var s=resolveTimingValue(o.delay);i.delayNextStep(s)}e.steps.length&&(e.steps.forEach(function(e){return visitDslNode(n,e,i)}),i.currentTimeline.applyStylesToKeyframe(),i.subContextCount>r&&i.transformIntoNewTimeline()),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitGroup=function(e,t){var n=this,r=[],i=t.currentTimeline.currentTime,o=e.options&&e.options.delay?resolveTimingValue(e.options.delay):0;e.steps.forEach(function(s){var a=t.createSubContext(e.options);o&&a.delayNextStep(o),visitDslNode(n,s,a),i=Math.max(i,a.currentTimeline.currentTime),r.push(a.currentTimeline)}),r.forEach(function(e){return t.currentTimeline.mergeTimelineCollectedStyles(e)}),t.transformIntoNewTimeline(i),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype._visitTiming=function(e,t){if(e.dynamic){var n=e.strValue;return resolveTiming(t.params?interpolateParams(n,t.params,t.errors):n,t.errors)}return{duration:e.duration,delay:e.delay,easing:e.easing}},AnimationTimelineBuilderVisitor.prototype.visitAnimate=function(e,t){var n=t.currentAnimateTimings=this._visitTiming(e.timings,t),r=t.currentTimeline;n.delay&&(t.incrementTime(n.delay),r.snapshotCurrentStyles());var i=e.style;5==i.type?this.visitKeyframes(i,t):(t.incrementTime(n.duration),this.visitStyle(i,t),r.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitStyle=function(e,t){var n=t.currentTimeline,r=t.currentAnimateTimings;!r&&n.getCurrentStyleProperties().length&&n.forwardFrame();var i=r&&r.easing||e.easing;e.isEmptyStep?n.applyEmptyStep(i):n.setStyles(e.styles,i,t.errors,t.options),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitKeyframes=function(e,t){var n=t.currentAnimateTimings,r=t.currentTimeline.duration,i=n.duration,o=t.createSubContext().currentTimeline;o.easing=n.easing,e.styles.forEach(function(e){var n=e.offset||0;o.forwardTime(n*i),o.setStyles(e.styles,e.easing,t.errors,t.options),o.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(o),t.transformIntoNewTimeline(r+i),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitQuery=function(e,t){var n=this,r=t.currentTimeline.currentTime,i=e.options||{},o=i.delay?resolveTimingValue(i.delay):0;o&&(6===t.previousNode.type||0==r&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=D);var s=r,a=t.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!i.optional,t.errors);t.currentQueryTotal=a.length;var u=null;a.forEach(function(r,i){t.currentQueryIndex=i;var a=t.createSubContext(e.options,r);o&&a.delayNextStep(o),r===t.element&&(u=a.currentTimeline),visitDslNode(n,e.animation,a),a.currentTimeline.applyStylesToKeyframe();var l=a.currentTimeline.currentTime;s=Math.max(s,l)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(s),u&&(t.currentTimeline.mergeTimelineCollectedStyles(u),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=e},AnimationTimelineBuilderVisitor.prototype.visitStagger=function(e,t){var n=t.parentContext,r=t.currentTimeline,i=e.timings,o=Math.abs(i.duration),s=o*(t.currentQueryTotal-1),a=o*t.currentQueryIndex;switch(i.duration<0?"reverse":i.easing){case"reverse":a=s-a;break;case"full":a=n.currentStaggerTime}var u=t.currentTimeline;a&&u.delayNextStep(a);var l=u.currentTime;visitDslNode(this,e.animation,t),t.previousNode=e,n.currentStaggerTime=r.currentTime-l+(r.startTime-n.currentTimeline.startTime)},AnimationTimelineBuilderVisitor}(),D={},M=function(){function AnimationTimelineContext(e,t,n,r,i,o){this._driver=e,this.element=t,this.subInstructions=n,this.errors=r,this.timelines=i,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=D,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=o||new F(t,0),i.push(this.currentTimeline)}return Object.defineProperty(AnimationTimelineContext.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),AnimationTimelineContext.prototype.updateOptions=function(e,t){var n=this;if(e){var r=e,i=this.options;null!=r.duration&&(i.duration=resolveTimingValue(r.duration)),null!=r.delay&&(i.delay=resolveTimingValue(r.delay));var o=r.params;if(o){var s=i.params;s||(s=this.options.params={}),Object.keys(o).forEach(function(e){t&&s.hasOwnProperty(e)||(s[e]=interpolateParams(o[e],s,n.errors))})}}},AnimationTimelineContext.prototype._copyOptions=function(){var e={};if(this.options){var t=this.options.params;if(t){var n=e.params={};Object.keys(t).forEach(function(e){n[e]=t[e]})}}return e},AnimationTimelineContext.prototype.createSubContext=function(e,t,n){void 0===e&&(e=null);var r=t||this.element,i=new AnimationTimelineContext(this._driver,r,this.subInstructions,this.errors,this.timelines,this.currentTimeline.fork(r,n||0));return i.previousNode=this.previousNode,i.currentAnimateTimings=this.currentAnimateTimings,i.options=this._copyOptions(),i.updateOptions(e),i.currentQueryIndex=this.currentQueryIndex,i.currentQueryTotal=this.currentQueryTotal,i.parentContext=this,this.subContextCount++,i},AnimationTimelineContext.prototype.transformIntoNewTimeline=function(e){return this.previousNode=D,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline},AnimationTimelineContext.prototype.appendInstructionToTimeline=function(e,t,n){var r={duration:null!=t?t:e.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+e.delay,easing:""},i=new R(e.element,e.keyframes,e.preStyleProps,e.postStyleProps,r,e.stretchStartingKeyframe);return this.timelines.push(i),r},AnimationTimelineContext.prototype.incrementTime=function(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)},AnimationTimelineContext.prototype.delayNextStep=function(e){e>0&&this.currentTimeline.delayNextStep(e)},AnimationTimelineContext.prototype.invokeQuery=function(e,t,n,r,i,o){var s=[];if(r&&s.push(this.element),e.length>0){var a=1!=n,u=this._driver.query(this.element,e,a);0!==n&&(u=u.slice(0,n)),s.push.apply(s,u)}return i||0!=s.length||o.push('`query("'+t+'")` returned zero elements. (Use `query("'+t+'", { optional: true })` if you wish to allow this.)'),s},AnimationTimelineContext}(),F=function(){function TimelineBuilder(e,t,n){this.element=e,this.startTime=t,this._elementTimelineStylesLookup=n,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(e),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(e,this._localTimelineStyles)),this._loadKeyframe()}return TimelineBuilder.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},TimelineBuilder.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(TimelineBuilder.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),TimelineBuilder.prototype.delayNextStep=function(e){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+e),t&&this.snapshotCurrentStyles()):this.startTime+=e},TimelineBuilder.prototype.fork=function(e,t){return this.applyStylesToKeyframe(),new TimelineBuilder(e,t||this.currentTime,this._elementTimelineStylesLookup)},TimelineBuilder.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},TimelineBuilder.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},TimelineBuilder.prototype.forwardTime=function(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()},TimelineBuilder.prototype._updateStyle=function(e,t){this._localTimelineStyles[e]=t,this._globalTimelineStyles[e]=t,this._styleSummary[e]={time:this.currentTime,value:t}},TimelineBuilder.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},TimelineBuilder.prototype.applyEmptyStep=function(e){var t=this;e&&(this._previousKeyframe.easing=e),Object.keys(this._globalTimelineStyles).forEach(function(e){t._backFill[e]=t._globalTimelineStyles[e]||i.AUTO_STYLE,t._currentKeyframe[e]=i.AUTO_STYLE}),this._currentEmptyStepKeyframe=this._currentKeyframe},TimelineBuilder.prototype.setStyles=function(e,t,n,r){var o=this;t&&(this._previousKeyframe.easing=t);var s=r&&r.params||{},a=function flattenStyles(e,t){var n,r={};return e.forEach(function(e){"*"===e?(n=n||Object.keys(t)).forEach(function(e){r[e]=i.AUTO_STYLE}):copyStyles(e,!1,r)}),r} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */(e,this._globalTimelineStyles);Object.keys(a).forEach(function(e){var t=interpolateParams(a[e],s,n);o._pendingStyles[e]=t,o._localTimelineStyles.hasOwnProperty(e)||(o._backFill[e]=o._globalTimelineStyles.hasOwnProperty(e)?o._globalTimelineStyles[e]:i.AUTO_STYLE),o._updateStyle(e,t)})},TimelineBuilder.prototype.applyStylesToKeyframe=function(){var e=this,t=this._pendingStyles,n=Object.keys(t);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){var r=t[n];e._currentKeyframe[n]=r}),Object.keys(this._localTimelineStyles).forEach(function(t){e._currentKeyframe.hasOwnProperty(t)||(e._currentKeyframe[t]=e._localTimelineStyles[t])}))},TimelineBuilder.prototype.snapshotCurrentStyles=function(){var e=this;Object.keys(this._localTimelineStyles).forEach(function(t){var n=e._localTimelineStyles[t];e._pendingStyles[t]=n,e._updateStyle(t,n)})},TimelineBuilder.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(TimelineBuilder.prototype,"properties",{get:function(){var e=[];for(var t in this._currentKeyframe)e.push(t);return e},enumerable:!0,configurable:!0}),TimelineBuilder.prototype.mergeTimelineCollectedStyles=function(e){var t=this;Object.keys(e._styleSummary).forEach(function(n){var r=t._styleSummary[n],i=e._styleSummary[n];(!r||i.time>r.time)&&t._updateStyle(n,i.value)})},TimelineBuilder.prototype.buildKeyframes=function(){var e=this;this.applyStylesToKeyframe();var t=new Set,n=new Set,r=1===this._keyframes.size&&0===this.duration,o=[];this._keyframes.forEach(function(s,a){var u=copyStyles(s,!0);Object.keys(u).forEach(function(e){var r=u[e];r==i["ɵPRE_STYLE"]?t.add(e):r==i.AUTO_STYLE&&n.add(e)}),r||(u.offset=a/e.duration),o.push(u)});var s=t.size?iteratorToArray(t.values()):[],a=n.size?iteratorToArray(n.values()):[];if(r){var u=o[0],l=copyObj(u);u.offset=0,l.offset=1,o=[u,l]}return createTimelineInstruction(this.element,o,s,a,this.duration,this.startTime,this.easing,!1)},TimelineBuilder}(),R=function(e){function SubTimelineBuilder(t,n,r,i,o,s){void 0===s&&(s=!1);var a=e.call(this,t,o.delay)||this;return a.element=t,a.keyframes=n,a.preStyleProps=r,a.postStyleProps=i,a._stretchStartingKeyframe=s,a.timings={duration:o.duration,delay:o.delay,easing:o.easing},a}return r.a(SubTimelineBuilder,e),SubTimelineBuilder.prototype.containsAnimation=function(){return this.keyframes.length>1},SubTimelineBuilder.prototype.buildKeyframes=function(){var e=this.keyframes,t=this.timings,n=t.delay,r=t.duration,i=t.easing;if(this._stretchStartingKeyframe&&n){var o=[],s=r+n,a=n/s,u=copyStyles(e[0],!1);u.offset=0,o.push(u);var l=copyStyles(e[0],!1);l.offset=roundOffset(a),o.push(l);for(var c=e.length-1,p=1;p<=c;p++){var d=copyStyles(e[p],!1),h=n+d.offset*r;d.offset=roundOffset(h/s),o.push(d)}r=s,n=0,i="",e=o}return createTimelineInstruction(this.element,e,this.preStyleProps,this.postStyleProps,r,n,i,!0)},SubTimelineBuilder}(F);function roundOffset(e,t){void 0===t&&(t=3);var n=Math.pow(10,t-1);return Math.round(e*n)/n}!function(){function Animation(e,t){this._driver=e;var n=[],r=buildAnimationAst(t,n);if(n.length){var i="animation validation failed:\n"+n.join("\n");throw new Error(i)}this._animationAst=r}Animation.prototype.buildTimelines=function(e,t,n,r,i){var o=Array.isArray(t)?normalizeStyles(t):t,s=Array.isArray(n)?normalizeStyles(n):n,a=[];i=i||new L;var u=buildAnimationTimelines(this._driver,e,this._animationAst,o,s,r,i,a);if(a.length){var l="animation building failed:\n"+a.join("\n");throw new Error(l)}return u}}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var V=function(){return function AnimationStyleNormalizer(){}}(),k=(function(){function NoopAnimationStyleNormalizer(){}NoopAnimationStyleNormalizer.prototype.normalizePropertyName=function(e,t){return e},NoopAnimationStyleNormalizer.prototype.normalizeStyleValue=function(e,t,n,r){return n}}(),function(e){function WebAnimationsStyleNormalizer(){return null!==e&&e.apply(this,arguments)||this}return r.a(WebAnimationsStyleNormalizer,e),WebAnimationsStyleNormalizer.prototype.normalizePropertyName=function(e,t){return dashCaseToCamelCase(e)},WebAnimationsStyleNormalizer.prototype.normalizeStyleValue=function(e,t,n,r){var i="",o=n.toString().trim();if(j[t]&&0!==n&&"0"!==n)if("number"==typeof n)i="px";else{var s=n.match(/^[+-]?[\d\.]+([a-z]*)$/);s&&0==s[1].length&&r.push("Please provide a CSS unit value for "+e+":"+n)}return o+i},WebAnimationsStyleNormalizer}(V)),j=function makeBooleanMap(e){var t={};return e.forEach(function(e){return t[e]=!0}),t} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */("width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(","));function createTransitionInstruction(e,t,n,r,i,o,s,a,u,l,c,p){return{type:0,element:e,triggerName:t,isRemovalTransition:i,fromState:n,fromStyles:o,toState:r,toStyles:s,timelines:a,queriedElements:u,preStyleProps:l,postStyleProps:c,errors:p}} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var H={},B=function(){function AnimationTransitionFactory(e,t,n){this._triggerName=e,this.ast=t,this._stateStyles=n}return AnimationTransitionFactory.prototype.match=function(e,t){return function oneOrMoreTransitionsMatch(e,t,n){return e.some(function(e){return e(t,n)})}(this.ast.matchers,e,t)},AnimationTransitionFactory.prototype.buildStyles=function(e,t,n){var r=this._stateStyles["*"],i=this._stateStyles[e],o=r?r.buildStyles(t,n):{};return i?i.buildStyles(t,n):o},AnimationTransitionFactory.prototype.build=function(e,t,n,r,i,o,s){var a=[],u=this.ast.options&&this.ast.options.params||H,l=i&&i.params||H,c=this.buildStyles(n,l,a),p=o&&o.params||H,d=this.buildStyles(r,p,a),h=new Set,m=new Map,f=new Map,y="void"===r,g={params:Object.assign({},u,p)},v=buildAnimationTimelines(e,t,this.ast.animation,c,d,g,s,a);if(a.length)return createTransitionInstruction(t,this._triggerName,n,r,y,c,d,[],[],m,f,a);v.forEach(function(e){var n=e.element,r=getOrSetAsInMap(m,n,{});e.preStyleProps.forEach(function(e){return r[e]=!0});var i=getOrSetAsInMap(f,n,{});e.postStyleProps.forEach(function(e){return i[e]=!0}),n!==t&&h.add(n)});var b=iteratorToArray(h.values());return createTransitionInstruction(t,this._triggerName,n,r,y,c,d,v,b,m,f)},AnimationTransitionFactory}();var G=function(){function AnimationStateStyles(e,t){this.styles=e,this.defaultParams=t}return AnimationStateStyles.prototype.buildStyles=function(e,t){var n={},r=copyObj(this.defaultParams);return Object.keys(e).forEach(function(t){var n=e[t];null!=n&&(r[t]=n)}),this.styles.styles.forEach(function(e){if("string"!=typeof e){var i=e;Object.keys(i).forEach(function(e){var o=i[e];o.length>1&&(o=interpolateParams(o,r,t)),n[e]=o})}}),n},AnimationStateStyles}(); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var U=function(){function AnimationTrigger(e,t){var n=this;this.name=e,this.ast=t,this.transitionFactories=[],this.states={},t.states.forEach(function(e){var t=e.options&&e.options.params||{};n.states[e.name]=new G(e.style,t)}),balanceProperties(this.states,"true","1"),balanceProperties(this.states,"false","0"),t.transitions.forEach(function(t){n.transitionFactories.push(new B(e,t,n.states))}),this.fallbackTransition=function createFallbackTransition(e,t){return new B(e,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(e,t){return!0}],options:null,queryCount:0,depCount:0},t)}(e,this.states)}return Object.defineProperty(AnimationTrigger.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),AnimationTrigger.prototype.matchTransition=function(e,t){return this.transitionFactories.find(function(n){return n.match(e,t)})||null},AnimationTrigger.prototype.matchStyles=function(e,t,n){return this.fallbackTransition.buildStyles(e,t,n)},AnimationTrigger}();function balanceProperties(e,t,n){e.hasOwnProperty(t)?e.hasOwnProperty(n)||(e[n]=e[t]):e.hasOwnProperty(n)&&(e[t]=e[n])} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var q=new L,W=function(){function TimelineAnimationEngine(e,t){this._driver=e,this._normalizer=t,this._animations={},this._playersById={},this.players=[]}return TimelineAnimationEngine.prototype.register=function(e,t){var n=[],r=buildAnimationAst(t,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: "+n.join("\n"));this._animations[e]=r},TimelineAnimationEngine.prototype._buildPlayer=function(e,t,n){var r=e.element,i=normalizeKeyframes(this._driver,this._normalizer,0,e.keyframes,t,n);return this._driver.animate(r,i,e.duration,e.delay,e.easing,[])},TimelineAnimationEngine.prototype.create=function(e,t,n){var r=this;void 0===n&&(n={});var o,s=[],a=this._animations[e],u=new Map;if(a?(o=buildAnimationTimelines(this._driver,t,a,{},{},n,q,s)).forEach(function(e){var t=getOrSetAsInMap(u,e.element,{});e.postStyleProps.forEach(function(e){return t[e]=null})}):(s.push("The requested animation doesn't exist or has already been destroyed"),o=[]),s.length)throw new Error("Unable to create the animation due to the following errors: "+s.join("\n"));u.forEach(function(e,t){Object.keys(e).forEach(function(n){e[n]=r._driver.computeStyle(t,n,i.AUTO_STYLE)})});var l=optimizeGroupPlayer(o.map(function(e){var t=u.get(e.element);return r._buildPlayer(e,{},t)}));return this._playersById[e]=l,l.onDestroy(function(){return r.destroy(e)}),this.players.push(l),l},TimelineAnimationEngine.prototype.destroy=function(e){var t=this._getPlayer(e);t.destroy(),delete this._playersById[e];var n=this.players.indexOf(t);n>=0&&this.players.splice(n,1)},TimelineAnimationEngine.prototype._getPlayer=function(e){var t=this._playersById[e];if(!t)throw new Error("Unable to find the timeline player referenced by "+e);return t},TimelineAnimationEngine.prototype.listen=function(e,t,n,r){var i=makeAnimationEvent(t,"","","");return listenOnPlayer(this._getPlayer(e),n,i,r),function(){}},TimelineAnimationEngine.prototype.command=function(e,t,n,r){if("register"!=n)if("create"!=n){var i=this._getPlayer(e);switch(n){case"play":i.play();break;case"pause":i.pause();break;case"reset":i.reset();break;case"restart":i.restart();break;case"finish":i.finish();break;case"init":i.init();break;case"setPosition":i.setPosition(parseFloat(r[0]));break;case"destroy":this.destroy(e)}}else{var o=r[0]||{};this.create(e,t,o)}else this.register(e,r[0])},TimelineAnimationEngine}(),z=[],K={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},Y={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},J="__ng_removed",Q=function(){function StateValue(e){var t=e&&e.hasOwnProperty("value"),n=t?e.value:e;if(this.value=function normalizeTriggerValue(e){return null!=e?e:null}(n),t){var r=copyObj(e);delete r.value,this.options=r}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(StateValue.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),StateValue.prototype.absorbOptions=function(e){var t=e.params;if(t){var n=this.options.params;Object.keys(t).forEach(function(e){null==n[e]&&(n[e]=t[e])})}},StateValue}(),X=new Q("void"),$=new Q("DELETED"),Z=function(){function AnimationTransitionNamespace(e,t,n){this.id=e,this.hostElement=t,this._engine=n,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+e,addClass(t,this._hostClassName)}return AnimationTransitionNamespace.prototype.listen=function(e,t,n,r){var i=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'+n+'" because the animation trigger "'+t+"\" doesn't exist!");if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'+t+'" because the provided event is undefined!');if(!function isTriggerEventValid(e){return"start"==e||"done"==e}(n))throw new Error('The provided animation trigger event "'+n+'" for the animation trigger "'+t+'" is not supported!');var o=getOrSetAsInMap(this._elementListeners,e,[]),s={name:t,phase:n,callback:r};o.push(s);var a=getOrSetAsInMap(this._engine.statesByElement,e,{});return a.hasOwnProperty(t)||(addClass(e,"ng-trigger"),addClass(e,"ng-trigger-"+t),a[t]=null),function(){i._engine.afterFlush(function(){var e=o.indexOf(s);e>=0&&o.splice(e,1),i._triggers[t]||delete a[t]})}},AnimationTransitionNamespace.prototype.register=function(e,t){return!this._triggers[e]&&(this._triggers[e]=t,!0)},AnimationTransitionNamespace.prototype._getTrigger=function(e){var t=this._triggers[e];if(!t)throw new Error('The provided animation trigger "'+e+'" has not been registered!');return t},AnimationTransitionNamespace.prototype.trigger=function(e,t,n,r){var i=this;void 0===r&&(r=!0);var o=this._getTrigger(t),s=new te(this.id,t,e),a=this._engine.statesByElement.get(e);a||(addClass(e,"ng-trigger"),addClass(e,"ng-trigger-"+t),this._engine.statesByElement.set(e,a={}));var u=a[t],l=new Q(n);if(!(n&&n.hasOwnProperty("value"))&&u&&l.absorbOptions(u.options),a[t]=l,u){if(u===$)return s}else u=X;if("void"===l.value||u.value!==l.value){var c=getOrSetAsInMap(this._engine.playersByElement,e,[]);c.forEach(function(e){e.namespaceId==i.id&&e.triggerName==t&&e.queued&&e.destroy()});var p=o.matchTransition(u.value,l.value),d=!1;if(!p){if(!r)return;p=o.fallbackTransition,d=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:t,transition:p,fromState:u,toState:l,player:s,isFallbackTransition:d}),d||(addClass(e,"ng-animate-queued"),s.onStart(function(){removeClass(e,"ng-animate-queued")})),s.onDone(function(){var t=i.players.indexOf(s);t>=0&&i.players.splice(t,1);var n=i._engine.playersByElement.get(e);if(n){var r=n.indexOf(s);r>=0&&n.splice(r,1)}}),this.players.push(s),c.push(s),s}if(!function objEquals(e,t){var n=Object.keys(e),r=Object.keys(t);if(n.length!=r.length)return!1;for(var i=0;i=0){for(var r=!1,i=n;i>=0;i--){var o=this._namespaceList[i];if(this.driver.containsElement(o.hostElement,t)){this._namespaceList.splice(i+1,0,e),r=!0;break}}r||this._namespaceList.splice(0,0,e)}else this._namespaceList.push(e);return this.namespacesByHostElement.set(t,e),e},TransitionAnimationEngine.prototype.register=function(e,t){var n=this._namespaceLookup[e];return n||(n=this.createNamespace(e,t)),n},TransitionAnimationEngine.prototype.registerTrigger=function(e,t,n){var r=this._namespaceLookup[e];r&&r.register(t,n)&&this.totalAnimations++},TransitionAnimationEngine.prototype.destroy=function(e,t){var n=this;if(e){var r=this._fetchNamespace(e);this.afterFlush(function(){n.namespacesByHostElement.delete(r.hostElement),delete n._namespaceLookup[e];var t=n._namespaceList.indexOf(r);t>=0&&n._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return r.destroy(t)})}},TransitionAnimationEngine.prototype._fetchNamespace=function(e){return this._namespaceLookup[e]},TransitionAnimationEngine.prototype.trigger=function(e,t,n,r){return!!isElementNode(t)&&(this._fetchNamespace(e).trigger(t,n,r),!0)},TransitionAnimationEngine.prototype.insertNode=function(e,t,n,r){if(isElementNode(t)){var i=t[J];i&&i.setForRemoval&&(i.setForRemoval=!1),e&&this._fetchNamespace(e).insertNode(t,n),r&&this.collectEnterElement(t)}},TransitionAnimationEngine.prototype.collectEnterElement=function(e){this.collectedEnterElements.push(e)},TransitionAnimationEngine.prototype.markElementAsDisabled=function(e,t){t?this.disabledNodes.has(e)||(this.disabledNodes.add(e),addClass(e,"ng-animate-disabled")):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),removeClass(e,"ng-animate-disabled"))},TransitionAnimationEngine.prototype.removeNode=function(e,t,n,r){if(isElementNode(t)){var i=e?this._fetchNamespace(e):null;i?i.removeNode(t,n,r):this.markElementAsRemoved(e,t,!1,n)}else this._onRemovalComplete(t,n)},TransitionAnimationEngine.prototype.markElementAsRemoved=function(e,t,n,r){this.collectedLeaveElements.push(t),t[J]={namespaceId:e,setForRemoval:r,hasAnimation:n,removedBeforeQueried:!1}},TransitionAnimationEngine.prototype.listen=function(e,t,n,r,i){return isElementNode(t)?this._fetchNamespace(e).listen(t,n,r,i):function(){}},TransitionAnimationEngine.prototype._buildInstruction=function(e,t){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,e.fromState.options,e.toState.options,t)},TransitionAnimationEngine.prototype.destroyInnerAnimations=function(e){var t=this,n=this.driver.query(e,v,!0);n.forEach(function(e){var n=t.playersByElement.get(e);n&&n.forEach(function(e){e.queued?e.markedForDestroy=!0:e.destroy()});var r=t.statesByElement.get(e);r&&Object.keys(r).forEach(function(e){return r[e]=$})}),0!=this.playersByQueriedElement.size&&(n=this.driver.query(e,b,!0)).length&&n.forEach(function(e){var n=t.playersByQueriedElement.get(e);n&&n.forEach(function(e){return e.finish()})})},TransitionAnimationEngine.prototype.whenRenderingDone=function(){var e=this;return new Promise(function(t){if(e.players.length)return optimizeGroupPlayer(e.players).onDone(function(){return t()});t()})},TransitionAnimationEngine.prototype.processLeaveNode=function(e){var t=this,n=e[J];if(n&&n.setForRemoval){if(e[J]=K,n.namespaceId){this.destroyInnerAnimations(e);var r=this._fetchNamespace(n.namespaceId);r&&r.clearElementCache(e)}this._onRemovalComplete(e,n.setForRemoval)}this.driver.matchesElement(e,".ng-animate-disabled")&&this.markElementAsDisabled(e,!1),this.driver.query(e,".ng-animate-disabled",!0).forEach(function(n){t.markElementAsDisabled(e,!1)})},TransitionAnimationEngine.prototype.flush=function(e){var t=this;void 0===e&&(e=-1);var n=[];if(this.newHostElements.size&&(this.newHostElements.forEach(function(e,n){return t._balanceNamespaceList(e,n)}),this.newHostElements.clear()),this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){var r=[];try{n=this._flushAnimations(r,e)}finally{for(var i=0;i=0;m--){this._namespaceList[m].drainQueuedTransitions(t).forEach(function(e){var t=e.player;g.push(t);var i=e.element;if(d&&n.driver.containsElement(d,i)){var s=n._buildInstruction(e,r);if(s.errors&&s.errors.length)v.push(s);else{if(e.isFallbackTransition)return t.onStart(function(){return eraseStyles(i,s.fromStyles)}),t.onDestroy(function(){return setStyles(i,s.toStyles)}),void o.push(t);s.timelines.forEach(function(e){return e.stretchStartingKeyframe=!0}),r.append(i,s.timelines);var p={instruction:s,player:t,element:i};a.push(p),s.queriedElements.forEach(function(e){return getOrSetAsInMap(u,e,[]).push(t)}),s.preStyleProps.forEach(function(e,t){var n=Object.keys(e);if(n.length){var r=l.get(t);r||l.set(t,r=new Set),n.forEach(function(e){return r.add(e)})}}),s.postStyleProps.forEach(function(e,t){var n=Object.keys(e),r=c.get(t);r||c.set(t,r=new Set),n.forEach(function(e){return r.add(e)})})}}else t.destroy()})}if(v.length){var _=[];v.forEach(function(e){_.push("@"+e.triggerName+" has failed due to:\n"),e.errors.forEach(function(e){return _.push("- "+e+"\n")})}),g.forEach(function(e){return e.destroy()}),this.reportError(_)}var S=new Set;for(m=0;m0?this.driver.animate(e.element,t,e.duration,e.delay,e.easing,n):new i.NoopAnimationPlayer},TransitionAnimationEngine}(),te=function(){function TransitionAnimationPlayer(e,t,n){this.namespaceId=e,this.triggerName=t,this.element=n,this._player=new i.NoopAnimationPlayer,this._containsRealPlayer=!1,this._queuedCallbacks={},this._destroyed=!1,this.markedForDestroy=!1}return Object.defineProperty(TransitionAnimationPlayer.prototype,"queued",{get:function(){return 0==this._containsRealPlayer},enumerable:!0,configurable:!0}),Object.defineProperty(TransitionAnimationPlayer.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),TransitionAnimationPlayer.prototype.setRealPlayer=function(e){var t=this;this._containsRealPlayer||(this._player=e,Object.keys(this._queuedCallbacks).forEach(function(n){t._queuedCallbacks[n].forEach(function(t){return listenOnPlayer(e,n,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0)},TransitionAnimationPlayer.prototype.getRealPlayer=function(){return this._player},TransitionAnimationPlayer.prototype._queueEvent=function(e,t){getOrSetAsInMap(this._queuedCallbacks,e,[]).push(t)},TransitionAnimationPlayer.prototype.onDone=function(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)},TransitionAnimationPlayer.prototype.onStart=function(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)},TransitionAnimationPlayer.prototype.onDestroy=function(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)},TransitionAnimationPlayer.prototype.init=function(){this._player.init()},TransitionAnimationPlayer.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},TransitionAnimationPlayer.prototype.play=function(){!this.queued&&this._player.play()},TransitionAnimationPlayer.prototype.pause=function(){!this.queued&&this._player.pause()},TransitionAnimationPlayer.prototype.restart=function(){!this.queued&&this._player.restart()},TransitionAnimationPlayer.prototype.finish=function(){this._player.finish()},TransitionAnimationPlayer.prototype.destroy=function(){this._destroyed=!0,this._player.destroy()},TransitionAnimationPlayer.prototype.reset=function(){!this.queued&&this._player.reset()},TransitionAnimationPlayer.prototype.setPosition=function(e){this.queued||this._player.setPosition(e)},TransitionAnimationPlayer.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(TransitionAnimationPlayer.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),TransitionAnimationPlayer}();function isElementNode(e){return e&&1===e.nodeType}function cloakElement(e,t){var n=e.style.display;return e.style.display=null!=t?t:"none",n}function cloakAndComputeStyles(e,t,n,r){var i=[];t.forEach(function(e){return i.push(cloakElement(e))});var o=new Map,s=[];n.forEach(function(t,n){var i={};t.forEach(function(t){var o=i[t]=e.computeStyle(n,t,r);o&&0!=o.length||(n[J]=Y,s.push(n))}),o.set(n,i)});var a=0;return t.forEach(function(e){return cloakElement(e,i[a++])}),[o,s]}var ne="$$classes";function addClass(e,t){if(e.classList)e.classList.add(t);else{var n=e[ne];n||(n=e[ne]={}),n[t]=!0}}function removeClass(e,t){if(e.classList)e.classList.remove(t);else{var n=e[ne];n&&delete n[t]}}function removeNodesAfterAnimationDone(e,t,n){optimizeGroupPlayer(n).onDone(function(){return e.processLeaveNode(t)})}function replacePostStylesAsPre(e,t,n){var r=n.get(e);if(!r)return!1;var i=t.get(e);return i?r.forEach(function(e){return i.add(e)}):t.set(e,r),n.delete(e),!0} +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */var re=function(){function AnimationEngine(e,t){var n=this;this._triggerCache={},this.onRemovalComplete=function(e,t){},this._transitionEngine=new ee(e,t),this._timelineEngine=new W(e,t),this._transitionEngine.onRemovalComplete=function(e,t){return n.onRemovalComplete(e,t)}}return AnimationEngine.prototype.registerTrigger=function(e,t,n,r,i){var o=e+"-"+r,s=this._triggerCache[o];if(!s){var a=[],u=buildAnimationAst(i,a);if(a.length)throw new Error('The animation trigger "'+r+'" has failed to build due to the following errors:\n - '+a.join("\n - "));s=function buildTrigger(e,t){return new U(e,t)}(r,u),this._triggerCache[o]=s}this._transitionEngine.registerTrigger(t,r,s)},AnimationEngine.prototype.register=function(e,t){this._transitionEngine.register(e,t)},AnimationEngine.prototype.destroy=function(e,t){this._transitionEngine.destroy(e,t)},AnimationEngine.prototype.onInsert=function(e,t,n,r){this._transitionEngine.insertNode(e,t,n,r)},AnimationEngine.prototype.onRemove=function(e,t,n){this._transitionEngine.removeNode(e,t,n)},AnimationEngine.prototype.disableAnimations=function(e,t){this._transitionEngine.markElementAsDisabled(e,t)},AnimationEngine.prototype.process=function(e,t,n,r){if("@"==n.charAt(0)){var i=parseTimelineCommand(n),o=i[0],s=i[1],a=r;this._timelineEngine.command(o,t,s,a)}else this._transitionEngine.trigger(e,t,n,r)},AnimationEngine.prototype.listen=function(e,t,n,r,i){if("@"==n.charAt(0)){var o=parseTimelineCommand(n),s=o[0],a=o[1];return this._timelineEngine.listen(s,t,a,i)}return this._transitionEngine.listen(e,t,n,r,i)},AnimationEngine.prototype.flush=function(e){void 0===e&&(e=-1),this._transitionEngine.flush(e)},Object.defineProperty(AnimationEngine.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),AnimationEngine.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},AnimationEngine}(),ie=function(){function WebAnimationsPlayer(e,t,n,r){void 0===r&&(r=[]);var i=this;this.element=e,this.keyframes=t,this.options=n,this.previousPlayers=r,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.previousStyles={},this.currentSnapshot={},this._duration=n.duration,this._delay=n.delay||0,this.time=this._duration+this._delay,function allowPreviousPlayerStylesMerge(e,t){return 0===e||0===t}(this._duration,this._delay)&&r.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return i.previousStyles[e]=t[e]})})}return WebAnimationsPlayer.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},WebAnimationsPlayer.prototype.init=function(){this._buildPlayer(),this._preparePlayerBeforeStart()},WebAnimationsPlayer.prototype._buildPlayer=function(){var e=this;if(!this._initialized){this._initialized=!0;var t=this.keyframes.map(function(e){return copyStyles(e,!1)}),n=Object.keys(this.previousStyles);if(n.length){var r=t[0],i=[];if(n.forEach(function(t){r.hasOwnProperty(t)||i.push(t),r[t]=e.previousStyles[t]}),i.length)for(var o=this,s=function(){var e=t[a];i.forEach(function(t){e[t]=_computeStyle(o.element,t)})},a=1;a\n\n
\n
\n

OpenHTF

\n

Hardware Testing Framework.

\n
\n
\n\n
\n \n \n\n \n \n
\n'},566:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nh1 {\n color: #323232;\n font-size: 20px;\n margin: 0; }\n\nh2 {\n color: #949a9f;\n font-size: 12px;\n margin-left: 5px; }\n'},567:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(19),i=n(2),o=n(25),s=n(32),a=n(568),u=function(){function CoreModule(e){if(e)throw new Error("CoreModule is already loaded. Import it in the AppModule only")}return CoreModule=__decorate([i.NgModule({imports:[r.CommonModule],declarations:[a.FlashMessagesComponent,a.FlashMessageTypeToClass],providers:[o.ConfigService,s.FlashMessageService],exports:[r.CommonModule,a.FlashMessagesComponent]}),__param(0,i.Optional()),__param(0,i.SkipSelf()),__metadata("design:paramtypes",[CoreModule])],CoreModule)}();t.CoreModule=u},568:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(235),o=n(32),s=((u={})[i.FlashMessageType.error]="ng-flash-message-error",u[i.FlashMessageType.warn]="ng-flash-message-warn",u),a=function(){function FlashMessageTypeToClass(){}return FlashMessageTypeToClass.prototype.transform=function(e){return s[e]},FlashMessageTypeToClass=__decorate([r.Pipe({name:"flashMessageTypeToClass"})],FlashMessageTypeToClass)}();t.FlashMessageTypeToClass=a;var u,l=function(){function FlashMessagesComponent(e){this.flashMessage=e}return Object.defineProperty(FlashMessagesComponent.prototype,"message",{get:function(){if(this.flashMessage.messages.length>0)return this.flashMessage.messages[0]},enumerable:!0,configurable:!0}),FlashMessagesComponent.prototype.dismiss=function(){this.flashMessage.dismissEarly()},FlashMessagesComponent.prototype.onMouseEnter=function(e){this.flashMessage.cancelDismissal(),e.showTooltip=e.hasTooltip},FlashMessagesComponent.prototype.onMouseExit=function(e){this.flashMessage.startDismissal(),e.showTooltip=!1},FlashMessagesComponent=__decorate([r.Component({selector:"htf-flash-messages",template:n(569),styles:[n(570)]}),__metadata("design:paramtypes",[o.FlashMessageService])],FlashMessagesComponent)}();t.FlashMessagesComponent=l},569:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
\n \n \n X\n \n {{ message.content }}\n
\n\n \x3c!-- Avoid whitespace since flash-message-tooltip uses white-space: pre --\x3e\n {{ message.tooltip }}\n\n'},570:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@keyframes flash-message-enter {\n 0% {\n top: -32px; }\n 100% {\n top: 0; } }\n\n@keyframes flash-message-exit {\n 0% {\n top: 0; }\n 100% {\n top: -32px; } }\n\n.flash-message {\n animation: flash-message-enter 400ms forwards;\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n height: 32px;\n left: 50%;\n line-height: 31px;\n min-width: 400px;\n opacity: .9;\n padding: 0 20px;\n position: fixed;\n text-align: center;\n top: 0;\n transform: translateX(-50%);\n white-space: nowrap;\n z-index: 2; }\n .flash-message.flash-message--has-tooltip {\n cursor: pointer; }\n .flash-message.flash-message--is-dismissed {\n animation: flash-message-exit 400ms forwards; }\n .flash-message.ng-flash-message-error {\n background: #ff5d4e;\n color: #fff; }\n .flash-message.ng-flash-message-warn {\n background: #ffe54d;\n color: #323232; }\n\n.flash-message-tooltip {\n background: rgba(0, 0, 0, 0.7);\n border-radius: 3px;\n color: #fff;\n font-size: 12px;\n left: 50%;\n line-height: initial;\n max-width: 500px;\n opacity: 0;\n padding: 10px;\n position: fixed;\n text-align: left;\n top: 40px;\n transform: translateX(-50%);\n transition: 200ms ease opacity;\n white-space: pre-wrap;\n word-wrap: break-word;\n z-index: 2; }\n .flash-message-tooltip.flash-message-tooltip--is-visible {\n opacity: 1; }\n\n.flash-message-dismissal-button {\n -webkit-appearance: initial;\n background: transparent;\n border: 0;\n padding: 0;\n border-radius: 50%;\n border: 1px solid #fff;\n color: inherit;\n display: inline-block;\n float: left;\n font-size: 11px;\n height: 18px;\n left: -6px;\n padding-left: 1px;\n position: relative;\n top: 6px;\n width: 18px; }\n .flash-message-dismissal-button:focus, .flash-message-dismissal-button:active {\n outline: none; }\n\n.flash-message.ng-flash-message-warn .flash-message-dismissal-button {\n border-color: #323232; }\n'},571:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(95),o=function(){function ElapsedTimePipe(e){this.time=e}return ElapsedTimePipe.prototype.transform=function(e,t){return void 0===t&&(t="%s"),t.replace("%s",this.getElapsedTimeString(e))},ElapsedTimePipe.prototype.getElapsedTimeString=function(e){if(null===this.time.last)return"0s";var t=e.endTimeMillis||this.time.last,n=Math.round((t-e.startTimeMillis)/1e3),r=Math.floor(n/60);if(0===r)return n+"s";var i=n-60*r,o=Math.floor(r/60);return 0===o?r+"m "+i+"s":o+"h "+(r-60*o)+"m "+i+"s"},ElapsedTimePipe=__decorate([r.Pipe({name:"elapsedTime",pure:!1}),__metadata("design:paramtypes",[i.TimeService])],ElapsedTimePipe)}();t.ElapsedTimePipe=o},572:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function FocusDirective(e){this.ref=e}return FocusDirective.prototype.ngOnChanges=function(){this.focusOn&&this.ref.nativeElement.focus()},__decorate([r.Input("htfFocus"),__metadata("design:type",Boolean)],FocusDirective.prototype,"focusOn",void 0),FocusDirective=__decorate([r.Directive({selector:"[htfFocus]"}),__metadata("design:paramtypes",[r.ElementRef])],FocusDirective)}();t.FocusDirective=i},573:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function GenealogyNodeComponent(){}return GenealogyNodeComponent.prototype.ngOnInit=function(){null===this.maxDepth?this.childMaxDepth=null:this.childMaxDepth=this.maxDepth-1,void 0===this.isRoot&&(this.isRoot=!0)},__decorate([r.Input(),__metadata("design:type",Boolean)],GenealogyNodeComponent.prototype,"isFirst",void 0),__decorate([r.Input(),__metadata("design:type",Boolean)],GenealogyNodeComponent.prototype,"isRoot",void 0),__decorate([r.Input(),__metadata("design:type",Object)],GenealogyNodeComponent.prototype,"node",void 0),__decorate([r.Input(),__metadata("design:type",Number)],GenealogyNodeComponent.prototype,"maxDepth",void 0),GenealogyNodeComponent=__decorate([r.Component({selector:"htf-genealogy-node",template:n(574),styles:[n(575)]})],GenealogyNodeComponent)}();t.GenealogyNodeComponent=i},574:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
\n {{ node.component.serial }}\n {{ node.component.instance_name }}\n ({{ node.component.part_number }})\n
\n\n
    \n
  • \n \n \n
  • \n
\n'},575:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.component-info {\n border: 1px solid #323232;\n display: inline-block;\n margin-bottom: 10px;\n padding: 5px;\n position: relative; }\n\n.component-info:not(.is-root)::before {\n border-bottom: 1px solid #323232;\n border-left: 1px solid #323232;\n content: \'\';\n height: calc(100% + 11px);\n left: -21px;\n position: absolute;\n top: calc(-50% - 11px);\n width: 20px; }\n\n.component-info:not(.is-root).is-first::before {\n height: calc(50% + 11px);\n top: -11px; }\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n padding-left: 40px; }\n\n.serial-number {\n font-weight: bold; }\n'},576:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(96),o=function(){function LogLevelToClassPipe(){}return LogLevelToClassPipe.prototype.transform=function(e){if(e)return e<=i.logLevels.debug?"ng-log-level-debug":e<=i.logLevels.info?"ng-log-level-info":e<=i.logLevels.warning?"ng-log-level-warning":e<=i.logLevels.error?"ng-log-level-error":"ng-log-level-critical"},LogLevelToClassPipe=__decorate([r.Pipe({name:"logLevelToClass"})],LogLevelToClassPipe)}();t.LogLevelToClassPipe=o},577:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function ObjectToSortedValuesPipe(){}return ObjectToSortedValuesPipe.prototype.transform=function(e,t){void 0===t&&(t=null);var n=[],r=Object.keys(e);null===t&&r.sort();for(var i=0,o=r;in[t]?1:0}),n},ObjectToSortedValuesPipe=__decorate([r.Pipe({name:"objectToSortedValues",pure:!1})],ObjectToSortedValuesPipe)}();t.ObjectToSortedValuesPipe=i},578:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
\n
\n
\n
\n
\n
\n
\n'},579:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.outer {\n height: 100%;\n width: 100%;\n background: #e5e5e5;\n border-radius: 3px;\n overflow: hidden; }\n .outer.is-complete {\n animation: htf-progress-bar-pulse 2s infinite; }\n\n.inner-wrapper {\n height: 100%;\n left: -10px;\n position: relative;\n width: calc(100% + 20px); }\n\n.inner {\n background: rgba(0, 119, 255, 0.8);\n height: 100%;\n transition: width .4s ease;\n transform: skewX(-30deg); }\n\n.stripes {\n transform: skewX(45deg);\n height: 100%;\n width: 100%;\n background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.08) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.08) 50%, rgba(255, 255, 255, 0.08) 75%, transparent 75%, transparent);\n background-size: 50px 50px;\n animation: move 4s linear infinite; }\n\n@keyframes htf-progress-bar-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(0, 119, 255, 0.25); }\n 70% {\n box-shadow: 0 0 0 8px rgba(0, 119, 255, 0); }\n 100% {\n box-shadow: 0 0 0 0 rgba(0, 119, 255, 0); } }\n\n@keyframes move {\n 0% {\n background-position: 0 0; }\n 100% {\n background-position: 50px 50px; } }\n'},580:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,i=n(2),o=n(98),s=n(66),a=n(49),u=n(21);!function(e){e[e.fail=0]="fail",e[e.online=1]="online",e[e.pass=2]="pass",e[e.pending=3]="pending",e[e.running=4]="running",e[e.unreachable=5]="unreachable",e[e.warning=6]="warning"}(r||(r={}));var l=((m={})[r.fail]="ng-status-fail",m[r.online]="ng-status-online",m[r.pass]="ng-status-pass",m[r.pending]="ng-status-pending",m[r.running]="ng-status-running",m[r.unreachable]="ng-status-unreachable",m[r.warning]="ng-status-warning",m),c=Symbol("unknownStatus"),p=((f={})[o.MeasurementStatus.unset]=r.pending,f[o.MeasurementStatus.pass]=r.pass,f[o.MeasurementStatus.fail]=r.fail,f[s.PhaseStatus.waiting]=r.pending,f[s.PhaseStatus.running]=r.running,f[s.PhaseStatus.pass]=r.pass,f[s.PhaseStatus.fail]=r.fail,f[s.PhaseStatus.skip]=r.unreachable,f[s.PhaseStatus.error]=r.warning,f[a.StationStatus.online]=r.online,f[a.StationStatus.unreachable]=r.unreachable,f[u.TestStatus.waiting]=r.pending,f[u.TestStatus.running]=r.running,f[u.TestStatus.pass]=r.pass,f[u.TestStatus.fail]=r.fail,f[u.TestStatus.error]=r.warning,f[u.TestStatus.timeout]=r.warning,f[u.TestStatus.aborted]=r.warning,f[c]=r.warning,f),d=((y={})[o.MeasurementStatus.unset]="Unset",y[o.MeasurementStatus.pass]="Pass",y[o.MeasurementStatus.fail]="Fail",y[s.PhaseStatus.waiting]="Waiting",y[s.PhaseStatus.running]="Running",y[s.PhaseStatus.pass]="Pass",y[s.PhaseStatus.fail]="Fail",y[s.PhaseStatus.skip]="Skip",y[s.PhaseStatus.error]="Error",y[a.StationStatus.online]="Online",y[a.StationStatus.unreachable]="Unreachable",y[u.TestStatus.waiting]="Waiting",y[u.TestStatus.running]="Running",y[u.TestStatus.pass]="Pass",y[u.TestStatus.fail]="Fail",y[u.TestStatus.error]="Error",y[u.TestStatus.timeout]="Timeout",y[u.TestStatus.aborted]="Aborted",y[c]="Unknown",y),h=function(){function StatusToClassPipe(){}return StatusToClassPipe.prototype.transform=function(e){return e in p?l[p[e]]:(console.error('Unknown status "'+e+'".'),l[p[c]])},StatusToClassPipe=__decorate([i.Pipe({name:"statusToClass"})],StatusToClassPipe)}();t.StatusToClassPipe=h;var m,f,y,g=function(){function StatusToTextPipe(){}return StatusToTextPipe.prototype.transform=function(e){return e in p?d[e]:(console.error('Unknown status "'+e+'".'),d[c])},StatusToTextPipe=__decorate([i.Pipe({name:"statusToText"})],StatusToTextPipe)}();t.StatusToTextPipe=g},581:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(e){return"—"},o=function(){function TimeAgoPipe(){}return TimeAgoPipe.prototype.transform=function(e){return i(e)},TimeAgoPipe=__decorate([r.Pipe({name:"timeAgo",pure:!1})],TimeAgoPipe)}();t.TimeAgoPipe=o},582:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function TooltipDirective(e){this.ref=e}return TooltipDirective.prototype.ngOnInit=function(){if(0!==this.text.length){this.tooltipElement=document.createElement("div"),this.tooltipElement.innerHTML=this.text,this.tooltipElement.classList.add("ng-tooltip");var e=this.ref.nativeElement;e.classList.add("ng-tooltip-host"),e.insertBefore(this.tooltipElement,e.firstChild)}},TooltipDirective.prototype.onMouseEnter=function(){this.text.length>0&&this.tooltipElement.classList.add("ng-tooltip--is-visible")},TooltipDirective.prototype.onMouseLeave=function(){this.text.length>0&&this.tooltipElement.classList.remove("ng-tooltip--is-visible")},__decorate([r.Input("htfTooltip"),__metadata("design:type",String)],TooltipDirective.prototype,"text",void 0),__decorate([r.HostListener("mouseenter"),__metadata("design:type",Function),__metadata("design:paramtypes",[]),__metadata("design:returntype",void 0)],TooltipDirective.prototype,"onMouseEnter",null),__decorate([r.HostListener("mouseleave"),__metadata("design:type",Function),__metadata("design:paramtypes",[]),__metadata("design:returntype",void 0)],TooltipDirective.prototype,"onMouseLeave",null),TooltipDirective=__decorate([r.Directive({selector:"[htfTooltip]"}),__metadata("design:paramtypes",[r.ElementRef])],TooltipDirective)}();t.TooltipDirective=i},583:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function TrimmedTextComponent(){this.expanded=!1}return Object.defineProperty(TrimmedTextComponent.prototype,"buttonLabel",{get:function(){return!this.content||this.content.length<=this.maxChars?null:this.expanded?"collapse":"expand"},enumerable:!0,configurable:!0}),Object.defineProperty(TrimmedTextComponent.prototype,"trimmedContent",{get:function(){return!this.content||this.expanded||this.content.length<=this.maxChars?this.content:this.content.slice(0,this.maxChars-"…".length)+"…"},enumerable:!0,configurable:!0}),TrimmedTextComponent.prototype.onClick=function(){this.expanded=!this.expanded},__decorate([r.Input(),__metadata("design:type",Number)],TrimmedTextComponent.prototype,"maxChars",void 0),__decorate([r.Input(),__metadata("design:type",String)],TrimmedTextComponent.prototype,"content",void 0),TrimmedTextComponent=__decorate([r.Component({selector:"htf-trimmed-text",template:'\n {{ trimmedContent }}\n \n'})],TrimmedTextComponent)}();t.TrimmedTextComponent=i},584:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(48),i=n(2),o=n(29),s=n(25),a=n(32),u=n(238),l=n(585),c="openhtf.plugs.user_input.UserInput",p=function(e){function UserInputPlugComponent(t,n,r,i){var o=e.call(this,c,t,n,r)||this;return o.ref=i,o}return __extends(UserInputPlugComponent,e),Object.defineProperty(UserInputPlugComponent.prototype,"error",{get:function(){return this.getPlugState().error},enumerable:!0,configurable:!0}),Object.defineProperty(UserInputPlugComponent.prototype,"prompt",{get:function(){var e=this.getPlugState();if(this.lastPromptId!==e.id){this.lastPromptId=e.id;var t=e.message.replace(/ /g,"
");this.lastPromptHtml=t,this.focusSelf(),e.default&&this.setResponse(e.default)}return this.lastPromptHtml},enumerable:!0,configurable:!0}),UserInputPlugComponent.prototype.hasTextInput=function(){return this.getPlugState()["text-input"]},UserInputPlugComponent.prototype.hasImage=function(){return this.getPlugState()["image-url"]},Object.defineProperty(UserInputPlugComponent.prototype,"Image_URL",{get:function(){return this.getPlugState()["image-url"]},enumerable:!0,configurable:!0}),UserInputPlugComponent.prototype.sendResponse=function(e){var t,n=this.getPlugState().id;this.hasTextInput()?(t=e.value,e.value=""):t="",this.respond("respond",[n,t])},UserInputPlugComponent.prototype.getPlugState=function(){return e.prototype.getPlugState.call(this)},UserInputPlugComponent.prototype.focusSelf=function(){var e=this.ref.nativeElement.querySelector("input");e&&e.focus()},UserInputPlugComponent.prototype.setResponse=function(e){var t=this.ref.nativeElement.querySelector("input");t&&(t.value=e)},UserInputPlugComponent=__decorate([i.Component({animations:[r.trigger("animateIn",u.washIn)],selector:"htf-user-input-plug",template:n(586),styles:[n(587)]}),__metadata("design:paramtypes",[s.ConfigService,o.Http,a.FlashMessageService,i.ElementRef])],UserInputPlugComponent)}(l.BasePlug);t.UserInputPlugComponent=p},585:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(29),o=n(21),s=n(26),a=n(26),u=function(){function BasePlug(e,t,n,r){this.className=e,this.config=t,this.http=n,this.flashMessage=r}return BasePlug.prototype.plugExists=function(){return Boolean(this.test&&this.getPlugState())},BasePlug.prototype.respond=function(e,t){var n=this,r=new i.Headers({"Content-Type":"application/json"}),o=new i.RequestOptions({headers:r}),u=a.getTestBaseUrl(this.config.dashboardEnabled,this.test)+"/plugs/"+this.plugName,l=JSON.stringify({method:e,args:t});this.http.post(u,l,o).subscribe(function(){},function(e){var t=s.messageFromErrorResponse(e);n.flashMessage.error("An error occurred trying to respond to plug "+n.plugName+".",t)})},BasePlug.prototype.getPlugState=function(){if(this.plugName&&this.test.plugStates[this.plugName])return this.test.plugStates[this.plugName];for(var e=0,t=Object.keys(this.test.plugStates);e\n\n \x3c!-- Wrap contents in an extra div for the background color animation. --\x3e\n
\n\n
\n
Operator input
\n
\n\n
\n\n user-input-image\n\n
\n\n \n\n
\n {{ error }}\n
\n\n
\n \n {{ hasTextInput() ? \'Submit\' : \'Okay\' }}\n \n
\n\n
\n\n
\n\n'},587:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n:host ::ng-deep ol,\n:host ::ng-deep ul {\n padding-left: 25px;\n margin: 0; }\n\n.user-input-has-error {\n border-color: #ff5d4e; }\n .user-input-has-error:focus {\n border-color: #e71400; }\n\n.user-input-error-text {\n color: #ff5d4e;\n font-size: 12px; }\n'},588:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(19),i=n(2),o=n(236),s=n(94),a=n(239),u=n(589),l=n(592),c=n(595),p=n(99),d=n(599),h=n(602),m=n(604),f=n(607),y=n(243),g=n(610),v=function(){function StationsModule(){}return StationsModule=__decorate([i.NgModule({imports:[r.CommonModule,o.PlugsModule,s.SharedModule],declarations:[u.StationListComponent,l.AttachmentsComponent,c.HistoryComponent,d.LogsComponent,m.PhaseComponent,h.PhaseListComponent,f.StationComponent,g.TestSummaryComponent],providers:[a.DashboardService,p.HistoryService,y.StationService],exports:[r.CommonModule,f.StationComponent,u.StationListComponent]})],StationsModule)}();t.StationsModule=v},589:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(25),o=n(49),s=n(95),a=n(239),u=function(){return function StationSelectedEvent(e){this.station=e}}();t.StationSelectedEvent=u;var l=function(){function StationListComponent(e,t,n){var i=this;if(this.dashboard=e,this.time=t,this.onSelectStation=new r.EventEmitter,this.retryCountdown=this.time.observable.map(function(e){var t=i.dashboard.retryTimeMs-e;return"Retrying in "+Math.round(t/1e3)+"s."}),this.stations=e.stations,!n.dashboardEnabled)var o=e.messages.subscribe(function(){for(var e=0,t=Object.keys(i.stations);e0},enumerable:!0,configurable:!0}),Object.defineProperty(StationListComponent.prototype,"hasError",{get:function(){return this.dashboard.hasError},enumerable:!0,configurable:!0}),Object.defineProperty(StationListComponent.prototype,"isLoading",{get:function(){return this.dashboard.isSubscribing},enumerable:!0,configurable:!0}),Object.defineProperty(StationListComponent.prototype,"stationCount",{get:function(){return Object.keys(this.stations).length},enumerable:!0,configurable:!0}),StationListComponent.prototype.ngOnInit=function(){this.dashboard.subscribe(200,1.5,1500)},StationListComponent.prototype.ngOnDestroy=function(){this.dashboard.unsubscribe()},StationListComponent.prototype.isReachable=function(e){return e.status!==o.StationStatus.unreachable},StationListComponent.prototype.select=function(e){this.onSelectStation.emit(new u(e))},StationListComponent.prototype.manualRetry=function(){this.dashboard.retryNow()},StationListComponent.prototype.manualReload=function(){this.dashboard.refresh()},__decorate([r.Input(),__metadata("design:type",o.Station)],StationListComponent.prototype,"selectedStation",void 0),__decorate([r.Output(),__metadata("design:type",Object)],StationListComponent.prototype,"onSelectStation",void 0),StationListComponent=__decorate([r.Component({selector:"htf-station-list",template:n(590),styles:[n(591)]}),__metadata("design:paramtypes",[a.DashboardService,s.TimeService,i.ConfigService])],StationListComponent)}();t.StationListComponent=l},590:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n\n\n
    \n
  • \n \n\n
    \n
    \n {{ station.label }} ({{ station.status | statusToText }})\n
    \n
    \n
    \n {{ station.host }}:{{ station.port }}\n
    \n
    \n
    \n {{ station.testDescription }}\n
    \n\n \n
  • \n
\n\n
\n Could not connect to the server.\n {{ (retryCountdown | async) || \'Retrying in…\' }}\n \n Try again.\n \n
\n'},591:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.nav-bar {\n color: #949a9f;\n display: -ms-flexbox;\n display: flex;\n font-size: 12px;\n margin-bottom: 14px; }\n\n.station-list {\n list-style: none;\n margin: 0;\n padding: 0; }\n\n.station-list li {\n background: #fff;\n border-radius: 3px;\n border: 1px solid #ccc;\n margin-bottom: 14px; }\n\n.station-list li button {\n -webkit-appearance: initial;\n background: transparent;\n border: 0;\n padding: 0;\n box-shadow: inset 0 0 0 0 #07f;\n cursor: pointer;\n overflow: hidden;\n padding: 15px 20px;\n text-overflow: ellipsis;\n transition: 300ms ease box-shadow;\n white-space: nowrap;\n width: 100%; }\n .station-list li button:focus, .station-list li button:active {\n outline: none; }\n .station-list li button:hover, .station-list li button:active {\n box-shadow: inset 0 -3px 0 0 #07f; }\n .station-list li button:hover .station-label,\n .station-list li button:hover .station-description, .station-list li button:active .station-label,\n .station-list li button:active .station-description {\n color: #07f; }\n .station-list li button:focus .station-label,\n .station-list li button:focus .station-description {\n color: #07f; }\n .station-list li button.is-unreachable {\n color: #949a9f; }\n\n.station-label {\n font-size: 16px;\n transition: 300ms ease color; }\n\n.station-description {\n color: #949a9f;\n transition: 300ms ease color; }\n'},592:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(25),o=n(21),s=n(26),a=function(){function AttachmentsComponent(e){this.config=e,this.expanded=!1}return AttachmentsComponent.prototype.linkForAttachment=function(e){return null!==this.test.testId&&this.test.status===o.TestStatus.running?s.getTestBaseUrl(this.config.dashboardEnabled,this.test)+"/phases/"+e.phaseDescriptorId+"/attachments/"+e.name:null!==this.test.fileName?s.getStationBaseUrl(this.config.dashboardEnabled,this.test.station)+"/history/"+this.test.fileName+"/attachments/"+e.name+"?sha1="+e.sha1:null},AttachmentsComponent.prototype.toggleExpanded=function(){this.expanded=!this.expanded},__decorate([r.Input(),__metadata("design:type",o.TestState)],AttachmentsComponent.prototype,"test",void 0),AttachmentsComponent=__decorate([r.Component({selector:"htf-attachments",template:n(593),styles:[n(594)]}),__metadata("design:paramtypes",[i.ConfigService])],AttachmentsComponent)}();t.AttachmentsComponent=a},593:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
\n\n
\n
Attachments
\n
\n \n {{ expanded? \'Collapse\' : \'Expand\' }}\n \n
\n\n \n There are no attachments yet.\n
\n\n \n Expand to view\n {{ test.attachments.length }}\n {{ test.attachments.length === 1 ? \'attachment\' : \'attachments\' }}.\n \n\n
    \n \n {{ attachment.name }}\n \n {{ attachment.name }}\n \n  {{ attachment.mimeType }}\n \n From phase: {{ attachment.phaseName }}\n \n
\n\n\n'},594:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nul {\n list-style: none;\n margin: 0;\n padding: 0; }\n\nli {\n -ms-flex-align: baseline;\n align-items: baseline;\n display: -ms-flexbox;\n display: flex;\n padding: 10px 15px;\n border-bottom: 1px solid #e5e5e5; }\n li:last-of-type {\n border-bottom: 0; }\n'},595:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(48),i=n(2),o=n(32),s=n(238),a=n(49),u=n(21),l=n(26),c=n(241),p=n(99),d=function(){return function TestSelectedEvent(e){this.test=e}}();t.TestSelectedEvent=d;var h=function(){function HistoryComponent(e,t){this.historyService=e,this.flashMessage=t,this.onSelectTest=new i.EventEmitter,this.collapsedNumTests=5,this.HistoryItemStatus=c.HistoryItemStatus,this.TestStatus=u.TestStatus,this.expanded=!1,this.hasError=!1,this.history=[],this.historyFromDiskEnabled=!1,this.isLoading=!1,this.lastClickedItem=null}return HistoryComponent.prototype.ngOnChanges=function(e){"station"in e&&this.station.status===a.StationStatus.online&&(this.loadHistory(),this.history=this.historyService.getHistory(this.station))},HistoryComponent.prototype.isSelected=function(e){return e.status===c.HistoryItemStatus.loaded&&e.testState===this.selectedTest},HistoryComponent.prototype.onClick=function(e){var t=this;if(this.lastClickedItem=e,e.status!==c.HistoryItemStatus.loading)return e.status===c.HistoryItemStatus.loaded?(this.selectTest(e.testState),void(e.testState===this.selectedTest&&null===e.testState.fileName&&this.historyService.retrieveFileName(this.station,e).catch(function(){t.historyFromDiskEnabled&&t.flashMessage.warn("Could not retrieve history from disk, so attachments are not available. You may try again later.")}))):void this.historyService.loadItem(this.station,e).then(function(n){t.lastClickedItem===e&&t.selectTest(n)}).catch(function(e){console.error(e.stack);var n=l.messageFromErrorResponse(e);t.flashMessage.error("Error loading history item.",n)})},HistoryComponent.prototype.toggleExpanded=function(){this.expanded=!this.expanded},HistoryComponent.prototype.loadHistory=function(){var e=this;this.hasError=!1,this.isLoading=!0,this.historyFromDiskEnabled=!1,this.historyService.refreshList(this.station).then(function(){e.isLoading=!1,e.historyFromDiskEnabled=!0}).catch(function(t){e.isLoading=!1,e.hasError=!0,e.historyFromDiskEnabled=404!==t.status})},HistoryComponent.prototype.selectTest=function(e){e===this.selectedTest?this.selectedTest=null:this.selectedTest=e,this.onSelectTest.emit(new d(this.selectedTest))},__decorate([i.Input(),__metadata("design:type",u.TestState)],HistoryComponent.prototype,"selectedTest",void 0),__decorate([i.Input(),__metadata("design:type",a.Station)],HistoryComponent.prototype,"station",void 0),__decorate([i.Output(),__metadata("design:type",Object)],HistoryComponent.prototype,"onSelectTest",void 0),HistoryComponent=__decorate([i.Component({animations:[r.trigger("animateIn",s.washAndExpandIn(48))],selector:"htf-history",template:n(597),styles:[n(598)]}),__metadata("design:paramtypes",[p.HistoryService,o.FlashMessageService])],HistoryComponent)}();t.HistoryComponent=h},596:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function Attachment(e){Object.assign(this,e)}}();t.Attachment=r},597:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
\n\n
\n
History
\n
\n \n {{ expanded? \'Collapse\' : \'Expand\' }}\n \n
\n\n
    \n \n \n\n \x3c!-- Wrap list item contents in an extra div to enable a “slide down” animation effect. --\x3e\n
    \n
    \n
    \n {{ historyItem.dutId || historyItem.fileName }}\n
    \n
    \n Started {{ historyItem.startTimeMillis | timeAgo }}\n
    \n
    \n
    \n Click to load.\n
    \n
    \n Loading...\n
    \n
    \n An error occurred.\n
    \n \n {{ historyItem.testState.status | statusToText }}\n
    \n
\n \n \n
  • \n Not showing {{ history.length - collapsedNumTests }} additional test\n {{ history.length - collapsedNumTests === 1? \'run\' : \'runs\'}}.\n
  • \n
  • \n There are no known completed test runs.\n
  • \n
  • \n Loading history from the server...\n
  • \n
  • \n History from disk is disabled.\n
  • \n
  • \n \n Could not retrieve test history from the server.\n \n
  • \n \n\n\n'},598:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.history-item-container {\n cursor: pointer;\n overflow: hidden; }\n .history-item-container.is-selected {\n background: rgba(0, 119, 255, 0.2);\n border: 2px solid rgba(0, 119, 255, 0.8); }\n\n.history-item {\n height: 48px;\n line-height: 47px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n\n.history-item-name-container {\n -ms-flex-positive: 1;\n flex-grow: 1;\n line-height: initial;\n min-width: 0; }\n\n.history-item-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n\n.history-item-status {\n color: #949a9f;\n font-size: 12px;\n padding: 10px 0;\n text-align: center;\n margin-left: 15px;\n margin-right: -15px;\n min-width: 100px; }\n\n.status-text {\n color: #949a9f;\n font-size: 12px;\n padding: 10px 0;\n text-align: center; }\n'},599:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(96),o=n(21),s=function(){function LogsComponent(){this.expanded=!1}return Object.defineProperty(LogsComponent.prototype,"collapsedErrorCount",{get:function(){for(var e=0,t=0,n=this.test.logs;ti.logLevels.warning&&(e+=1)}return this.test.logs[0].level>i.logLevels.warning&&(e-=1),e},enumerable:!0,configurable:!0}),LogsComponent.prototype.toggleExpanded=function(){this.expanded=!this.expanded},__decorate([r.Input(),__metadata("design:type",o.TestState)],LogsComponent.prototype,"test",void 0),LogsComponent=__decorate([r.Component({selector:"htf-logs",template:n(600),styles:[n(601)]})],LogsComponent)}();t.LogsComponent=s},600:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
    \n\n
    \n
    Logs
    \n
    \n \n {{ expanded? \'Collapse\' : \'Expand\' }}\n \n
    \n\n \n There are no logs yet.\n
    \n\n
      \n
    • \n\n
      \n {{ test.logs[0].timestampMillis | date:\'mediumTime\' }}\n
      {{ test.logs[0].loggerName }}
      \n
      \n\n
      {{ test.logs[0].message }}
      \n\n
    • \n \n Not showing {{ test.logs.length - 1 }} additional log\n {{ test.logs.length - 1 === 1? \'message\' : \'messages\'}}. \n \n {{ collapsedErrorCount }} additional\n {{ collapsedErrorCount === 1? \'error\' : \'errors\' }}.\n \n \n
    \n\n
      \n \n\n
      \n {{ log.timestampMillis | date:\'mediumTime\' }}\n
      {{ log.loggerName }}
      \n
      \n\n
      {{ log.message }}
      \n\n \n
    \n\n\n'},601:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: 12px; }\n\nli {\n display: -ms-flexbox;\n display: flex;\n padding: 10px 15px;\n border-bottom: 1px solid #e5e5e5; }\n li:last-of-type {\n border-bottom: 0; }\n\n.log-message {\n font-family: monospace, serif; }\n\n.timestamp-column {\n font-size: 10px;\n margin-right: 10px;\n max-width: 170px;\n min-width: 170px; }\n\n.logger-name {\n color: #949a9f; }\n\n.log-message-content {\n white-space: pre-wrap;\n word-break: break-all; }\n\n.ng-log-level-warning {\n background: rgba(255, 229, 77, 0.2); }\n\n.ng-log-level-error {\n background: rgba(255, 93, 78, 0.25); }\n\n.ng-log-level-critical {\n background: rgba(255, 93, 78, 0.45); }\n'},602:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(21),o=function(){function PhaseListComponent(){this.showMeasurements=!1}return PhaseListComponent.prototype.toggleMeasurements=function(){this.showMeasurements=!this.showMeasurements},__decorate([r.Input(),__metadata("design:type",i.TestState)],PhaseListComponent.prototype,"test",void 0),PhaseListComponent=__decorate([r.Component({selector:"htf-phase-list",template:n(603)})],PhaseListComponent)}();t.PhaseListComponent=o},603:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
    \n\n
    \n
    Phases
    \n
    \n \n {{ showMeasurements ? \'Collapse\' : \'Expand\' }} all\n \n
    \n\n
      \n
    • \n \n \n
    • \n
    \n\n
    \n'},604:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(98),o=n(66),s=function(){function PhaseComponent(){this.MeasurementStatus=i.MeasurementStatus,this.PhaseStatus=o.PhaseStatus}return Object.defineProperty(PhaseComponent.prototype,"showMeasurements",{get:function(){return this.expand&&this.phase.measurements.length>0||this.phase.status==o.PhaseStatus.fail||this.phase.status==o.PhaseStatus.running},enumerable:!0,configurable:!0}),__decorate([r.Input(),__metadata("design:type",o.Phase)],PhaseComponent.prototype,"phase",void 0),__decorate([r.Input(),__metadata("design:type",Boolean)],PhaseComponent.prototype,"expand",void 0),PhaseComponent=__decorate([r.Component({selector:"htf-phase",template:n(605),styles:[n(606)]})],PhaseComponent)}();t.PhaseComponent=s},605:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
    \n \n {{ phase.name }}\n \n  {{ phase | elapsedTime:\'(%s)\' }}\n \n \n\n
    \n \n {{ phase.status | statusToText }}\n
    \n\n\n\n \n Measurement name\n Value\n Validators\n Result\n \n \n \n {{ measurement.name }}\n \n \n \n \n {{ measurement.validators }}\n \n Pass\n Fail\n \n \n \n \n\n'},606:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.header-with-measurements {\n border-bottom: 1px solid #e5e5e5; }\n\n.measurement-list {\n border-collapse: separate;\n border-right: 100px solid rgba(50, 50, 50, 0.1);\n border-spacing: 0 3px;\n font-size: 12px;\n padding: 10px 15px;\n width: 100%; }\n .measurement-list.ng-status-fail {\n border-right-color: rgba(255, 93, 78, 0.1); }\n .measurement-list.ng-status-pass {\n border-right-color: rgba(0, 232, 157, 0.1); }\n .measurement-list.ng-status-running {\n border-right-color: rgba(0, 119, 255, 0.1); }\n .measurement-list thead {\n text-decoration: underline; }\n .measurement-list tbody {\n vertical-align: top; }\n .measurement-list td {\n padding: 0; }\n .measurement-list .measurement-column-name {\n width: 30%;\n padding-right: 5px; }\n .measurement-list .measurement-column-value {\n width: 30%;\n padding-right: 5px; }\n .measurement-list .measurement-column-validators {\n width: 30%;\n padding-right: 5px; }\n .measurement-list .measurement-column-result {\n text-align: right; }\n'},607:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(25),o=n(49),s=n(243),a=function(){return function StationDeselectedEvent(){}}();t.StationDeselectedEvent=a;var u=function(){function StationComponent(e,t){this.stationService=e,this.config=t,this.onDeselectStation=new r.EventEmitter,this.selectedTest=null}return Object.defineProperty(StationComponent.prototype,"activeTest",{get:function(){return null!==this.selectedTest?this.selectedTest:this.stationService.getTest(this.selectedStation)},enumerable:!0,configurable:!0}),Object.defineProperty(StationComponent.prototype,"dashboardEnabled",{get:function(){return this.config.dashboardEnabled},enumerable:!0,configurable:!0}),Object.defineProperty(StationComponent.prototype,"hasError",{get:function(){return this.stationService.hasError},enumerable:!0,configurable:!0}),Object.defineProperty(StationComponent.prototype,"isLoading",{get:function(){return this.stationService.isSubscribing},enumerable:!0,configurable:!0}),Object.defineProperty(StationComponent.prototype,"isOnline",{get:function(){return!(this.hasError||this.isLoading)},enumerable:!0,configurable:!0}),StationComponent.prototype.ngOnInit=function(){this.stationService.subscribe(this.selectedStation,200,1.08,1500)},StationComponent.prototype.ngOnDestroy=function(){this.stationService.unsubscribe()},StationComponent.prototype.goBack=function(){this.onDeselectStation.emit(new a)},StationComponent.prototype.manualReload=function(){this.stationService.refresh()},StationComponent.prototype.onSelectTest=function(e){this.selectedTest=e},__decorate([r.Input(),__metadata("design:type",o.Station)],StationComponent.prototype,"selectedStation",void 0),__decorate([r.Output(),__metadata("design:type",Object)],StationComponent.prototype,"onDeselectStation",void 0),StationComponent=__decorate([r.Component({selector:"htf-station",template:n(608),styles:[n(609)]}),__metadata("design:paramtypes",[s.StationService,i.ConfigService])],StationComponent)}();t.StationComponent=u},608:function(e,t){e.exports='\x3c!--\n Copyright 2022 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the "License");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\x3e\n\n
    \n\n \n\n
    \n
    \n
    {{ selectedStation.label }}
    \n
    \n Status: Connected\n Status: Offline\n
    \n
    \n {{ selectedStation.testDescription }}\n
    \n {{ selectedStation.host }}:{{ selectedStation.port }}\n
    \n
    \n\n
    \n
    \n \n
    \n\n
    \n
    \n \n
    \n
    Displaying test record for a previous test run
    \n  ({{ selectedTest.startTimeMillis | timeAgo }})\n
    \n \n Return to current test\n \n
    \n
    \n\n \n \n \n \n
    \n\n
    \n \n \n
    \n
    \n\n
    \n\n\n'},609:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.nav-bar {\n display: -ms-flexbox;\n display: flex;\n font-size: 12px;\n margin-bottom: 12px; }\n\n.status-bar {\n margin-bottom: 16px; }\n\n.status-bar-row {\n -ms-flex-align: baseline;\n align-items: baseline;\n display: -ms-flexbox;\n display: flex; }\n\n.past-test-warning {\n color: #ff5d4e; }\n .past-test-warning .htf-layout-widget-header {\n border: 0; }\n'},610:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(66),o=n(21),s=n(237),a=function(){function TestSummaryComponent(){}return TestSummaryComponent.prototype.ngOnChanges=function(e){"test"in e&&this.progressBar&&this.progressBar.reset()},Object.defineProperty(TestSummaryComponent.prototype,"completedPhaseCount",{get:function(){if(this.test.status===o.TestStatus.waiting)return 0;if(this.test.status===o.TestStatus.pass)return this.test.phases.length;for(var e=0,t=0,n=this.test.phases;t\n\n
    \n
    Current test: {{ test.name }}
    \n
    \n  {{ test | elapsedTime:\'(%s)\' }}\n
    \n
    \n \n {{ test.status | statusToText }}\n
    \n \n\n
    \n
    \n
    \n DUT: {{ test.dutId === null ? \'—\' : test.dutId }}\n
    \n
    \n
    \n Started: {{ test.startTimeMillis ? (test.startTimeMillis | date:\'medium\') : \'—\' }}\n
    \n
    \n
    \n\n
    \n
    \n Ran {{ completedPhaseCount }} of {{ this.test.phases.length }}\n {{ completedPhaseCount === 1? \'phase\' : \'phases\' }}\n
    \n \n
    \n\n
    \n \n
    \n\n\n\x3c!-- Empty state --\x3e\n
    \n
    \n
    Test: —
    \n
    \n
    \n
    \n No test information to display\n
    \n
    \n
    \n'},612:function(e,t){e.exports='/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n.htf-status-indicator {\n line-height: 53px; }\n\n.progress-bar-container {\n -ms-flex-align: center;\n align-items: center;\n display: -ms-flexbox;\n display: flex;\n font-size: 12px;\n white-space: nowrap; }\n\nhtf-progress-bar {\n display: block;\n -ms-flex-positive: 1;\n flex-grow: 1;\n height: 22px;\n margin-left: 15px;\n width: 100%; }\n\n.phase-container {\n padding: 0; }\n\n:host ::ng-deep htf-phase .phase-name {\n font-weight: bold; }\n :host ::ng-deep htf-phase .phase-name::before {\n content: \'Current phase: \'; }\n'},66:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.waiting=3]="waiting",e[e.running=4]="running",e[e.pass=5]="pass",e[e.fail=6]="fail",e[e.skip=7]="skip",e[e.error=8]="error"}(t.PhaseStatus||(t.PhaseStatus={}));var r=function(){return function Phase(e){Object.assign(this,e)}}();t.Phase=r},94:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(19),i=n(2),o=n(29),s=n(571),a=n(572),u=n(573),l=n(576),c=n(577),p=n(237),d=n(97),h=n(580),m=n(581),f=n(95),y=n(582),g=n(583),v=function(){function SharedModule(){}return SharedModule=__decorate([i.NgModule({imports:[r.CommonModule,o.HttpModule],declarations:[s.ElapsedTimePipe,a.FocusDirective,u.GenealogyNodeComponent,l.LogLevelToClassPipe,c.ObjectToSortedValuesPipe,p.ProgressBarComponent,h.StatusToClassPipe,h.StatusToTextPipe,m.TimeAgoPipe,g.TrimmedTextComponent,y.TooltipDirective],providers:[d.SockJsService,f.TimeService],exports:[r.CommonModule,s.ElapsedTimePipe,a.FocusDirective,u.GenealogyNodeComponent,l.LogLevelToClassPipe,c.ObjectToSortedValuesPipe,p.ProgressBarComponent,h.StatusToClassPipe,h.StatusToTextPipe,m.TimeAgoPipe,g.TrimmedTextComponent,y.TooltipDirective]})],SharedModule)}();t.SharedModule=v},95:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(128),n(161),n(173);var r=n(2),i=n(0),o=100,s=function(){function TimeService(){var e=this;this.observable=i.Observable.interval(o).map(function(){return e.last=Date.now(),e.last}).publish(),this.last=null,this.observable.connect()}return TimeService=__decorate([r.Injectable(),__metadata("design:paramtypes",[])],TimeService)}();t.TimeService=s},96:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.logLevels={debug:10,info:20,warning:30,error:40,critical:50};var r=function(){return function LogRecord(e){Object.assign(this,e)}}();t.LogRecord=r},97:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=function(){function SockJsService(){this.sockJs=SockJS}return SockJsService=__decorate([r.Injectable()],SockJsService)}();t.SockJsService=i},98:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.unset=0]="unset",e[e.pass=1]="pass",e[e.fail=2]="fail"}(t.MeasurementStatus||(t.MeasurementStatus={}));var r=function(){return function Measurement(e){Object.assign(this,e)}}();t.Measurement=r},99:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(233),i=n(2),o=n(25),s=n(32),a=n(26),u=n(241),l=n(242),c=function(){function HistoryService(e,t,n){this.config=e,this.http=t,this.flashMessage=n,this.cache={},this.history={}}return HistoryService.prototype.getCache=function(e){return e.hostPort in this.cache||(this.cache[e.hostPort]={}),this.cache[e.hostPort]},HistoryService.prototype.getHistory=function(e){return e.hostPort in this.history||(this.history[e.hostPort]=[]),this.history[e.hostPort]},HistoryService.prototype.loadItem=function(e,t){var n=this;if(t.status===u.HistoryItemStatus.loading||t.status===u.HistoryItemStatus.loaded)throw new Error("Cannot load a history item that is loading or has loaded.");var r=a.getStationBaseUrl(this.config.dashboardEnabled,e)+"/history/"+t.fileName;return t.status=u.HistoryItemStatus.loading,this.http.get(r).toPromise().then(function(r){var i=t.fileName,o=l.makeTest(r,null,i,e);return n.getCache(e)[t.uniqueId]=o,t.status=u.HistoryItemStatus.loaded,t.testState=o,o}).catch(function(e){return t.status=u.HistoryItemStatus.error,Promise.reject(e)})},HistoryService.prototype.prependItemFromTestState=function(e,t){var n=new u.HistoryItem({drawAttention:!0,dutId:t.dutId,fileName:null,startTimeMillis:t.startTimeMillis,status:u.HistoryItemStatus.loaded,testState:t});this.getCache(e)[n.uniqueId]=t,this.getHistory(e).unshift(n)},HistoryService.prototype.refreshList=function(e){var t=this,n=a.getStationBaseUrl(this.config.dashboardEnabled,e)+"/history";return this.http.get(n).toPromise().then(function(n){var r=n.data;t.getHistory(e).length=0;var i,o=r.map(function(n){var r=new u.HistoryItem({drawAttention:!1,dutId:n.dut_id,fileName:n.file_name,startTimeMillis:n.start_time_millis,status:u.HistoryItemStatus.unloaded,testState:null});if(r.uniqueId in t.getCache(e)){var i=t.getCache(e)[r.uniqueId];r.status=u.HistoryItemStatus.loaded,r.testState=i}return r});a.sortByProperty(o,"startTimeMillis",!0),(i=t.history[e.hostPort]).push.apply(i,o)}).catch(function(e){if(404===e.status)console.info("History from disk appears to be disabled.");else{var n=a.messageFromHttpClientErrorResponse(e);t.flashMessage.error("HTTP request for history failed.",n)}return Promise.reject(e)})},HistoryService.prototype.retrieveFileName=function(e,t){if(t.status!==u.HistoryItemStatus.loaded)throw new Error("Cannot retrieve file name for a history item that is not loaded.");var n=a.getStationBaseUrl(this.config.dashboardEnabled,e)+"/history?dutId="+t.dutId+"&startTimeMillis="+t.startTimeMillis;return this.http.get(n).toPromise().then(function(e){var n=e.data;if(0===n.length)return Promise.reject(new Error("Server returned no history items."));if(n.length>1)return Promise.reject(new Error("Server returned more than one history item."));var r=n[0];t.fileName=r.file_name,t.testState.fileName=r.file_name})},HistoryService=__decorate([i.Injectable(),__metadata("design:paramtypes",[o.ConfigService,r.HttpClient,s.FlashMessageService])],HistoryService)}();t.HistoryService=c}},[559]); +//# sourceMappingURL=app.7b3b5f043d8771c748e0.js.map \ No newline at end of file diff --git a/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js.map b/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js.map new file mode 100644 index 000000000..8448f57b1 --- /dev/null +++ b/openhtf/output/web_gui/dist/js/app.7b3b5f043d8771c748e0.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/app/shared/models/test-state.model.ts","webpack:///./node_modules/@angular/common/@angular/common/http.es5.js","webpack:///./node_modules/@angular/forms/@angular/forms.es5.js","webpack:///./src/app/core/flash-message.model.ts","webpack:///./src/app/plugs/plugs.module.ts","webpack:///./src/app/shared/progress-bar.component.ts","webpack:///./src/app/shared/animations.ts","webpack:///./src/app/stations/station-list/dashboard.service.ts","webpack:///./src/app/shared/subscription.ts","webpack:///./src/app/stations/station/history-item.model.ts","webpack:///./src/app/stations/station/station-data.ts","webpack:///./src/app/stations/station/station.service.ts","webpack:///./src/app/core/config.service.ts","webpack:///./src/app/shared/util.ts","webpack:///./src/app/core/flash-message.service.ts","webpack:///./node_modules/@angular/animations/@angular/animations.es5.js","webpack:///./src/app/shared/models/station.model.ts","webpack:///./src/main.ts","webpack:///./src/app/app.module.ts","webpack:///./node_modules/@angular/platform-browser/@angular/platform-browser/animations.es5.js","webpack:///./node_modules/@angular/animations/@angular/animations/browser.es5.js","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.component.html","webpack:///./src/app/app.component.scss","webpack:///./src/app/core/core.module.ts","webpack:///./src/app/core/flash-messages.component.ts","webpack:///./src/app/core/flash-messages.component.html","webpack:///./src/app/core/flash-messages.component.scss","webpack:///./src/app/shared/elapsed-time.pipe.ts","webpack:///./src/app/shared/focus.directive.ts","webpack:///./src/app/shared/genealogy-node.component.ts","webpack:///./src/app/shared/genealogy-node.component.html","webpack:///./src/app/shared/genealogy-node.component.scss","webpack:///./src/app/shared/log-level-to-class.pipe.ts","webpack:///./src/app/shared/object-to-sorted-values.pipe.ts","webpack:///./src/app/shared/progress-bar.component.html","webpack:///./src/app/shared/progress-bar.component.scss","webpack:///./src/app/shared/status-pipes.ts","webpack:///./src/app/shared/time-ago.pipe.ts","webpack:///./src/app/shared/tooltip.directive.ts","webpack:///./src/app/shared/trimmed-text.component.ts","webpack:///./src/app/plugs/user-input-plug.component.ts","webpack:///./src/app/plugs/base-plug.ts","webpack:///./src/app/plugs/user-input-plug.component.html","webpack:///./src/app/plugs/user-input-plug.component.scss","webpack:///./src/app/stations/stations.module.ts","webpack:///./src/app/stations/station-list/station-list.component.ts","webpack:///./src/app/stations/station-list/station-list.component.html","webpack:///./src/app/stations/station-list/station-list.component.scss","webpack:///./src/app/stations/station/attachments.component.ts","webpack:///./src/app/stations/station/attachments.component.html","webpack:///./src/app/stations/station/attachments.component.scss","webpack:///./src/app/stations/station/history.component.ts","webpack:///./src/app/shared/models/attachment.model.ts","webpack:///./src/app/stations/station/history.component.html","webpack:///./src/app/stations/station/history.component.scss","webpack:///./src/app/stations/station/logs.component.ts","webpack:///./src/app/stations/station/logs.component.html","webpack:///./src/app/stations/station/logs.component.scss","webpack:///./src/app/stations/station/phase-list.component.ts","webpack:///./src/app/stations/station/phase-list.component.html","webpack:///./src/app/stations/station/phase.component.ts","webpack:///./src/app/stations/station/phase.component.html","webpack:///./src/app/stations/station/phase.component.scss","webpack:///./src/app/stations/station/station.component.ts","webpack:///./src/app/stations/station/station.component.html","webpack:///./src/app/stations/station/station.component.scss","webpack:///./src/app/stations/station/test-summary.component.ts","webpack:///./src/app/stations/station/test-summary.component.html","webpack:///./src/app/stations/station/test-summary.component.scss","webpack:///./src/app/shared/models/phase.model.ts","webpack:///./src/app/shared/shared.module.ts","webpack:///./src/app/shared/time.service.ts","webpack:///./src/app/shared/models/log-record.model.ts","webpack:///./src/app/shared/sock-js.service.ts","webpack:///./src/app/shared/models/measurement.model.ts","webpack:///./src/app/stations/station/history.service.ts"],"names":["TestStatus","exports","PlugDescriptor","TestState","params","Object","assign","this","HttpHandler","prototype","handle","req","HttpBackend","HttpUrlEncodingCodec","encodeKey","k","standardEncoding","encodeValue","v","decodeKey","decodeURIComponent","decodeValue","encodeURIComponent","replace","HttpParams","options","updates","cloneFrom","encoder","map","fromString","paramParser","rawParams","codec","map$$1","Map","length","split","forEach","param","eqIdx","indexOf","_a","slice","key","val","list","get","push","set","has","init","res","getAll","keys","Array","from","append","value","clone","op","delete","toString","_this","eKey","join","update","concat","base","undefined","base_1","idx","splice","HttpHeaders","headers","normalizedNames","lazyUpdate","lazyInit","line","index","name","toLowerCase","trim","maybeSetNormalizedName","values","lcName","copyFrom","applyUpdate","other","apply","toDelete_1","existing","filter","fn","isArrayBuffer","ArrayBuffer","isBlob","Blob","isFormData","FormData","HttpRequest","method","url","third","fourth","body","reportProgress","withCredentials","responseType","toUpperCase","mightHaveBody","urlWithParams","qIdx","sep","serializeBody","isArray","JSON","stringify","detectContentTypeHeader","type","setHeaders","reduce","setParams","HttpEventType","Sent","UploadProgress","ResponseHeader","DownloadProgress","Response","User","HttpResponseBase","defaultStatus","defaultStatusText","status","statusText","ok","HttpHeaderResponse","_super","call","__WEBPACK_IMPORTED_MODULE_0_tslib__","HttpResponse","HttpErrorResponse","message","error","addBody","observe","HttpClient","handler","request","first","events$","__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_concatMap__","__WEBPACK_IMPORTED_MODULE_2_rxjs_observable_of__","res$","__WEBPACK_IMPORTED_MODULE_4_rxjs_operator_filter__","event","__WEBPACK_IMPORTED_MODULE_5_rxjs_operator_map__","Error","head","jsonp","callbackParam","patch","post","put","decorators","__WEBPACK_IMPORTED_MODULE_1__angular_core__","ctorParameters","HttpInterceptorHandler","next","interceptor","intercept","HTTP_INTERCEPTORS","NoopInterceptor","nextRequestId","JsonpCallbackContext","JsonpClientBackend","callbackMap","document","nextCallback","__WEBPACK_IMPORTED_MODULE_7_rxjs_Observable__","observer","callback","node","createElement","src","finished","cancelled","data","cleanup","parentNode","removeChild","onLoad","complete","onError","addEventListener","appendChild","removeEventListener","args","__WEBPACK_IMPORTED_MODULE_6__angular_common__","JsonpInterceptor","XSSI_PREFIX","XhrFactory","build","BrowserXhr","XMLHttpRequest","HttpXhrBackend","xhrFactory","xhr","open","setRequestHeader","detectedType","reqBody","headerResponse","partialFromXhr","getAllResponseHeaders","getResponseUrl","responseURL","test","getResponseHeader","response","responseText","parse","text","sentHeaders","onDownProgress","progressEvent","loaded","lengthComputable","total","partialText","onUpProgress","progress","upload","send","abort","XSRF_COOKIE_NAME","XSRF_HEADER_NAME","HttpXsrfTokenExtractor","getToken","HttpXsrfCookieExtractor","doc","platform","cookieName","lastCookieString","lastToken","parseCount","cookieString","cookie","HttpXsrfInterceptor","tokenService","headerName","lcUrl","startsWith","token","interceptingHandler","backend","interceptors","reduceRight","jsonpCallbackContext","window","HttpClientXsrfModule","disable","ngModule","providers","provide","useClass","withOptions","useValue","useExisting","multi","HttpClientModule","imports","useFactory","deps","HttpClientJsonpModule","AbstractControlDirective","control","defineProperty","enumerable","configurable","valid","invalid","pending","disabled","enabled","errors","pristine","dirty","touched","untouched","statusChanges","valueChanges","reset","hasError","errorCode","path","getError","ControlContainer","arguments","isEmptyInputValue","NG_VALIDATORS","NG_ASYNC_VALIDATORS","EMAIL_REGEXP","Validators","min","parseFloat","isNaN","actual","max","required","requiredTrue","email","minLength","minlength","requiredLength","actualLength","maxLength","maxlength","pattern","regexStr","regex","RegExp","requiredPattern","actualValue","nullValidator","c","compose","validators","presentValidators","isPresent","_mergeErrors","_executeValidators","composeAsync","observables","_executeAsyncValidators","toObservable","__WEBPACK_IMPORTED_MODULE_4_rxjs_operator_map__","__WEBPACK_IMPORTED_MODULE_2_rxjs_observable_forkJoin__","o","r","obs","__WEBPACK_IMPORTED_MODULE_3_rxjs_observable_fromPromise__","arrayOfErrors","NG_VALUE_ACCESSOR","CHECKBOX_VALUE_ACCESSOR","CheckboxControlValueAccessor","_renderer","_elementRef","onChange","_","onTouched","writeValue","setProperty","nativeElement","registerOnChange","registerOnTouched","setDisabledState","isDisabled","selector","host","(change)","(blur)","DEFAULT_VALUE_ACCESSOR","DefaultValueAccessor","COMPOSITION_BUFFER_MODE","_compositionMode","_composing","_isAndroid","userAgent","__WEBPACK_IMPORTED_MODULE_5__angular_platform_browser__","getUserAgent","normalizedValue","_handleInput","_compositionStart","_compositionEnd","normalizeValidator","validator","validate","normalizeAsyncValidator","(input)","(compositionstart)","(compositionend)","NUMBER_VALUE_ACCESSOR","NumberValueAccessor","unimplemented","NgControl","_parent","valueAccessor","_rawValidators","_rawAsyncValidators","viewToModelUpdate","newValue","RADIO_VALUE_ACCESSOR","RadioControlValueAccessor","RadioControlRegistry","_accessors","add","accessor","remove","i","select","_isSameGroup","fireUncheck","controlPair","_control","_registry","_injector","ngOnInit","_checkName","ngOnDestroy","_state","_fn","formControlName","_throwNameError","propDecorators","RANGE_VALUE_ACCESSOR","RangeValueAccessor","SELECT_VALUE_ACCESSOR","SelectControlValueAccessor","_buildValueString","id","_optionMap","_idCounter","_compareWith","_getOptionId","valueString","_getOptionValue","_registerOption","_i","_extractId","compareWith","NgSelectOption","_element","_select","_setElementValue","ngValue","SELECT_MULTIPLE_VALUE_ACCESSOR","SelectMultipleControlValueAccessor","_buildValueString$1","optionSelectedStateSetter","ids_1","opt","_setSelected","selected","hasOwnProperty","selectedOptions","item","_value","_extractId$1","NgSelectMultipleOption","controlPath","parent","setUpControl","dir","_throwError","asyncValidator","markAsDirty","setValue","emitModelToViewChange","markAsTouched","emitModelEvent","registerOnDisabledChange","registerOnValidatorChange","updateValueAndValidity","setUpFormContainer","_noControlError","messageEnd","composeValidators","composeAsyncValidators","isPropertyUpdated","changes","viewModel","change","isFirstChange","currentValue","BUILTIN_ACCESSORS","selectValueAccessor","valueAccessors","defaultAccessor","builtinAccessor","customAccessor","constructor","isBuiltInAccessor","some","a","AbstractFormGroupDirective","_checkParentType","addFormGroup","formDirective","removeFormGroup","getFormGroup","_validators","_asyncValidators","AbstractControlStatus","cd","_cd","ngControlStatusHost","[class.ng-untouched]","[class.ng-touched]","[class.ng-pristine]","[class.ng-dirty]","[class.ng-valid]","[class.ng-invalid]","[class.ng-pending]","NgControlStatus","NgControlStatusGroup","coerceToValidator","coerceToAsyncValidator","AbstractControl","_onCollectionChange","_pristine","_touched","_onDisabledChange","_status","_errors","_valueChanges","_statusChanges","setValidators","newValidator","setAsyncValidators","clearValidators","clearAsyncValidators","opts","onlySelf","markAsUntouched","_forEachChild","_updateTouched","markAsPristine","_updatePristine","markAsPending","_updateValue","emitEvent","emit","_updateAncestors","changeFn","enable","setParent","patchValue","_setInitialStatus","_cancelExistingSubscription","_runValidator","_calculateStatus","_runAsyncValidator","_updateTreeValidity","ctrl","_allControlsDisabled","_asyncValidationSubscription","subscribe","setErrors","unsubscribe","_updateControlsErrors","_find","delimiter","FormGroup","controls","FormArray","at","x","_initObservables","_anyControlsHaveStatus","cb","_anyControls","condition","_anyControlsDirty","_anyControlsTouched","_isBoxedValue","formState","_registerOnCollectionChange","FormControl","_onChange","_applyFormState","emitViewToModelChange","_clearChangeFns","_setUpControls","registerControl","addControl","removeControl","setControl","contains","controlName","_checkAllValuesPresent","_throwIfControlMissing","getRawValue","_reduceChildren","acc","_reduceValue","initValue","_registerControl","insert","removeAt","formDirectiveProvider","NgForm","resolvedPromise","Promise","resolve","asyncValidators","_submitted","ngSubmit","form","then","container","_findContainer","getControl","group","updateModel","onSubmit","$event","onReset","resetForm","pop","(submit)","(reset)","outputs","exportAs","FormErrorExamples","TemplateDrivenErrors","modelParentException","formGroupNameException","missingNameException","modelGroupParentException","modelGroupProvider","NgModelGroup","formControlBinding","NgModel","resolvedPromise$1","_registered","ngOnChanges","_checkForErrors","_setUpControl","_updateDisabled","model","_isStandalone","_setUpStandalone","standalone","disabledValue","ReactiveErrors","controlParentException","ngModelGroupException","missingFormException","groupParentException","arrayParentException","disabledAttrWarning","console","warn","formControlBinding$1","FormControlDirective","_isControlChanged","formDirectiveProvider$1","FormGroupDirective","directives","_checkFormPresent","_updateValidators","_updateDomValue","_updateRegistrations","el","addFormArray","removeFormArray","getFormArray","newCtrl","cleanUpControl","_oldForm","sync","async","formGroupNameProvider","FormGroupName","_hasInvalidParent","formArrayNameProvider","FormArrayName","controlNameBinding","FormControlName","_added","REQUIRED_VALIDATOR","RequiredValidator","CHECKBOX_REQUIRED_VALIDATOR","CheckboxRequiredValidator","_required","[attr.required]","EMAIL_VALIDATOR","EmailValidator","_enabled","MIN_LENGTH_VALIDATOR","MinLengthValidator","_createValidator","_validator","parseInt","[attr.minlength]","MAX_LENGTH_VALIDATOR","MaxLengthValidator","[attr.maxlength]","PATTERN_VALIDATOR","PatternValidator","[attr.pattern]","FormBuilder","controlsConfig","extra","_reduceControls","array","_createControl","controlConfig","VERSION","NgNoValidate","novalidate","SHARED_FORM_DIRECTIVES","TEMPLATE_DRIVEN_DIRECTIVES","REACTIVE_DRIVEN_DIRECTIVES","InternalFormsSharedModule","declarations","FormsModule","ReactiveFormsModule","messageCount","FlashMessageType","FlashMessage","content","tooltip","isDismissed","hasTooltip","Boolean","showTooltip","common_1","__webpack_require__","core_1","forms_1","http_1","shared_module_1","user_input_plug_component_1","PlugsModule","__decorate","NgModule","CommonModule","HttpModule","SharedModule","UserInputPlugComponent","ProgressBarComponent","isReset","width","transition","Math","Input","Component","template","styles","animations_1","washIn","state","style","background","animate","washAndExpandIn","maxHeight","max-height","station_model_1","sock_js_service_1","subscription_1","util_1","dashboardUrl","devHost","dashboardStatusMap","UNREACHABLE","StationStatus","unreachable","ONLINE","online","DashboardService","sockJsService","stations","messages","DashboardService_1","validateResponse","newStations","parseResponse","applyResponse","__extends","retryMs","retryBackoff","retryMax","Number","MAX_VALUE","subscribeToUrl","hostPort","rawStation","Station","cell","label","getStationLabel","port","stationId","station_id","testDescription","test_description","testName","test_name","newStation","_b","_c","urlHost","Injectable","SockJsService","Subscription","SubscriptionState","Subject_1","Subject","retryTimeMs","currentRetryMs","retryTimeoutId","sock","unsubscribed","failed","waiting","subscribing","refresh","subscribeWithSavedParams","retryNow","cancelTimeout","debug","close","clearTimeout","sockJs","onopen","subscribed","onclose","Date","now","setTimeout","onmessage","HistoryItemStatus","HistoryItem","dutId","startTimeMillis","fileName","attachment_model_1","log_record_model_1","measurement_model_1","phase_model_1","test_state_model_1","testStateStatusCompleted","testStateStatusMap","WAITING_FOR_TEST_START","RUNNING","running","testRecordOutcomeMap","PASS","pass","FAIL","fail","ERROR","TIMEOUT","timeout","ABORTED","aborted","measurementStatusMap","MeasurementStatus","UNSET","unset","PARTIALLY_SET","phaseRecordOutcomeMap","PhaseStatus","SKIP","skip","makePhase","phase","measurements","attachments","rawAttachment","Attachment","mimeType","mimetype","phaseDescriptorId","descriptor_id","phaseName","sha1","sortByProperty","rawMeasuredValue","measured_value","measuredValue","Measurement","outcome","Phase","descriptorId","endTimeMillis","end_time_millis","start_time_millis","makeLog","log","LogRecord","level","lineNumber","lineno","loggerName","logger_name","source","timestampMillis","timestamp_millis","makeTest","rawState","testId","station","logRecords","test_record","log_records","reverse","logs","phases","running_phase_state","accumulator","dut_id","metadata","plugDescriptors","plugs","plug_descriptors","plugStates","plug_states","makePhaseFromDescriptor","descriptor","measurement","Observable_1","config_service_1","flash_message_service_1","history_service_1","station_data_1","StationService","config","flashMessage","historyService","http","phaseDescriptorPromise","testsById","testsByStation","messagesSubscription","mergeMap","StationService_1","applyPhaseDescriptors","stationUrl","getStationBaseUrl","dashboardEnabled","getTest","testState","test_uid","prependItemFromTestState","getOrRequestPhaseDescriptors","descriptors","numExecutedPhases","lastExecutedPhaseIndex","lastExecutedDescriptorIndex","lastExecuted","descriptors_1","catch","Observable","of","getTestBaseUrl","toPromise","json","messageFromErrorResponse","reject","fromPromise","oldTest","ConfigService","FlashMessageService","HistoryService","Http","defaultConfig","server_type","history_from_disk_enabled","initialize","extraKeys","extraKeys_1","location","localhostAddress","errorBody","e","_body","messageFromHttpClientErrorResponse","ErrorEvent","property","sort","b","flash_message_model_1","dismissalJob","cancelDismissal","dismissEarly","dismiss","startDismissal","addMessage","shift","dismissalDurationMs","d","__webpack_exports__","ɵPRE_STYLE","AnimationBuilder","animation","AnimationFactory","create","element","AUTO_STYLE","trigger","definitions","timings","steps","sequence","tokens","offset","keyframes","stateChangeExpr","expr","animateChild","useAnimation","query","stagger","scheduleMicroTask","NoopAnimationPlayer","_onDoneFns","_onStartFns","_onDestroyFns","_started","_destroyed","_finished","parentPlayer","totalTime","_onFinish","onStart","onDone","onDestroy","hasStarted","play","triggerMicrotask","_onStart","pause","restart","finish","destroy","setPosition","p","getPosition","AnimationGroupPlayer","_players","doneCount","destroyCount","startCount","player","_onDestroy","time","timeAtPosition","position","beforeDestroy","players","platform_browser_dynamic_1","app_module_1","main","platformBrowserDynamic","bootstrapModule","AppModule","MODULE_REF","enableProdMode","readyState","platform_browser_1","http_2","app_component_1","core_module_1","plugs_module_1","stations_module_1","hmr_1","appRef","hmrOnInit","store","hmrOnDestroy","cmpLocation","components","cmp","disposeOldHosts","createNewHosts","removeNgStyles","hmrAfterDestroy","BrowserAnimationsModule","BrowserModule","CoreModule","StationsModule","AppComponent","bootstrap","ApplicationRef","BrowserAnimationBuilder","rootRenderer","_nextAnimationId","typeData","encapsulation","None","createRenderer","entry","__WEBPACK_IMPORTED_MODULE_3__angular_animations__","issueAnimationCommand","BrowserAnimationFactory","__WEBPACK_IMPORTED_MODULE_2__angular_platform_browser__","_id","RendererAnimationPlayer","_command","_listen","eventName","listen","command","renderer","AnimationRendererFactory","delegate","engine","_zone","_currentId","_microtaskId","_animationCallbacksBuffer","_rendererCache","_cdRecurDepth","onRemovalComplete","hostElement","BaseAnimationRenderer","componentId","namespaceId","register","registerTrigger","AnimationRenderer","begin","_scheduleCountTask","Zone","current","scheduleListenerCallback","count","run","tuple","end","runOutsideAngular","flush","whenRenderingDone","__WEBPACK_IMPORTED_MODULE_4__angular_animations_browser__","destroyNode","n","namespace","createComment","createText","newChild","onInsert","insertBefore","refChild","oldChild","onRemove","selectRootElement","selectorOrNode","nextSibling","setAttribute","removeAttribute","addClass","removeClass","setStyle","flags","removeStyle","charAt","disableAnimations","target","factory","process","substr","resolveElementFromTarget","parseTriggerCallbackName","triggerName","dotIndex","substring","countId","InjectableAnimationEngine","driver","normalizer","instantiateSupportedAnimationDriver","instantiateDefaultStyleNormalizer","instantiateRendererFactory","zone","SHARED_ANIMATION_PROVIDERS","BROWSER_ANIMATIONS_PROVIDERS","BROWSER_NOOP_ANIMATIONS_PROVIDERS","NoopAnimationsModule","optimizeGroupPlayer","__WEBPACK_IMPORTED_MODULE_1__angular_animations__","normalizeKeyframes","preStyles","postStyles","normalizedKeyframes","previousOffset","previousKeyframe","kf","isSameOffset","normalizedKeyframe","prop","normalizedProp","normalizePropertyName","normalizeStyleValue","listenOnPlayer","copyAnimationEvent","makeAnimationEvent","fromState","toState","getOrSetAsInMap","defaultValue","parseTimelineCommand","separatorPos","_contains","elm1","elm2","_matches","_query","Element","matches","proto","fn_1","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","results","querySelectorAll","elm","querySelector","matchesElement","containsElement","invokeQuery","NoopAnimationDriver","computeStyle","duration","delay","easing","previousPlayers","AnimationDriver","NOOP","ONE_SECOND","ENTER_SELECTOR","LEAVE_SELECTOR","NG_TRIGGER_SELECTOR","NG_ANIMATING_SELECTOR","resolveTimingValue","match","_convertTimeValueToMS","unit","resolveTiming","allowNegativeValues","parseTimeExpression","exp","delayMatch","floor","easingVal","containsErrors","startIndex","copyObj","obj","destination","normalizeStyles","normalizedStyles","copyStyles","readPrototype","setStyles","camelProp","dashCaseToCamelCase","eraseStyles","normalizeAnimationEntry","PARAM_REGEX","SUBSTITUTION_EXPR_START","extractStyleParams","exec","lastIndex","interpolateParams","original","str","varName","localVal","iteratorToArray","iterator","arr","done","DASH_CASE_REGEXP","input","m","visitDslNode","visitor","context","visitTrigger","visitState","visitTransition","visitSequence","visitGroup","visitAnimate","visitKeyframes","visitStyle","visitReference","visitAnimateChild","visitAnimateRef","visitQuery","visitStagger","ANY_STATE","parseTransitionExpr","transitionValue","expressions","parseInnerTransitionStr","eventStr","parseAnimationAlias","alias","separator","makeLambdaFromStates","isFullAnyStateExpr","TRUE_BOOLEAN_VALUES","Set","FALSE_BOOLEAN_VALUES","lhs","rhs","LHS_MATCH_BOOLEAN","RHS_MATCH_BOOLEAN","lhsMatch","rhsMatch","SELF_TOKEN","SELF_TOKEN_REGEX","buildAnimationAst","AnimationAstBuilderVisitor","LEAVE_TOKEN_REGEX","ENTER_TOKEN_REGEX","AnimationAstBuilderContext","_resetContextStyleTimingState","currentQuerySelector","collectedStyles","currentTime","queryCount","depCount","states","transitions","def","stateDef_1","styleAst","astParams","containsDynamicStyles","missingSubs_1","params_1","isObject","stylesObj_1","sub","size","missingSubsArr","matchers","normalizeAnimationOptions","s","furthestTime","step","innerAst","timingAst","constructTimingAst","makeTimingAst","strValue","ast","dynamic","currentAnimateTimings","styleMetadata","styleMetadata_1","isEmpty","newStyleData","_styleAst","isEmptyStep","_makeStyleAst","_validateStyleAst","styleTuple","collectedEasing","styleData","styleMap","endTime","startTime","collectedEntry","updateCollectedStyle","validateStyleParams","totalKeyframesWithOffsets","offsets","offsetsOutOfOrder","keyframesOutOfRange","style$$1","offsetVal","consumeOffset","generatedOffset","limit","animateDuration","durationUpToThisFrame","parentSelector","currentQuery","normalizeSelector","hasAmpersand","find","includeSelf","optional","originalSelector","currentTransition","normalizeParams","createTimelineInstruction","preStyleProps","postStyleProps","subTimeline","ElementInstructionMap","_map","consume","instructions","existingInstructions","clear","buildAnimationTimelines","rootElement","startingStyles","finalStyles","subInstructions","AnimationTimelineBuilderVisitor","buildKeyframes","AnimationTimelineContext","currentTimeline","timelines","timeline","containsAnimation","tl","allowOnlyTimelineStyles","elementInstructions","innerContext","createSubContext","_visitSubInstructions","transformIntoNewTimeline","previousNode","instruction","instructionTimings","appendInstructionToTimeline","updateOptions","subContextCount","ctx","snapshotCurrentStyles","DEFAULT_NOOP_PREVIOUS_NODE","delayNextStep","applyStylesToKeyframe","innerTimelines","mergeTimelineCollectedStyles","_visitTiming","incrementTime","getCurrentStyleProperties","forwardFrame","applyEmptyStep","innerTimeline","forwardTime","elms","currentQueryTotal","sameElementTimeline","currentQueryIndex","parentContext","abs","maxTime","currentStaggerTime","startingTime","_driver","initialTimeline","TimelineBuilder","skipIfExists","newOptions","optionsToUpdate","newParams","paramsToUpdate_1","_copyOptions","oldParams_1","params_2","newTime","fork","updatedTimings","builder","SubTimelineBuilder","stretchStartingKeyframe","elements","_elementTimelineStylesLookup","_previousKeyframe","_currentKeyframe","_keyframes","_styleSummary","_pendingStyles","_backFill","_currentEmptyStepKeyframe","_localTimelineStyles","_globalTimelineStyles","_loadKeyframe","hasPreStyleStep","_updateStyle","flattenStyles","allStyles","allProperties","props","getFinalKeyframe","properties","details0","details1","finalKeyframes","keyframe","finalKeyframe","preProps","postProps","kf0","kf1","_stretchStartingKeyframe","newKeyframes","startingGap","newFirstKeyframe","oldFirstKeyframe","roundOffset","timeAtKeyframe","decimalPoints","mult","pow","round","Animation","errorMessage","_animationAst","buildTimelines","destinationStyles","start","dest","result","AnimationStyleNormalizer","WebAnimationsStyleNormalizer","NoopAnimationStyleNormalizer","propertyName","userProvidedProperty","normalizedProperty","strVal","DIMENSIONAL_PROP_MAP","valAndSuffixMatch","makeBooleanMap","createTransitionInstruction","isRemovalTransition","fromStyles","toStyles","queriedElements","EMPTY_OBJECT","AnimationTransitionFactory","_triggerName","_stateStyles","currentState","nextState","oneOrMoreTransitionsMatch","matchFns","buildStyles","stateName","backupStateStyler","stateStyler","backupStyles","currentOptions","nextOptions","transitionAnimationParams","currentAnimationParams","currentStateStyles","nextAnimationParams","nextStateStyles","preStyleMap","postStyleMap","isRemoval","animationOptions","queriedElementsList","AnimationStateStyles","defaultParams","combinedParams","styleObj_1","AnimationTrigger","transitionFactories","balanceProperties","fallbackTransition","createFallbackTransition","matchTransition","f","matchStyles","key1","key2","EMPTY_INSTRUCTION_MAP","TimelineAnimationEngine","_normalizer","_animations","_playersById","_buildPlayer","autoStylesMap","inst","_getPlayer","baseEvent","EMPTY_PLAYER_ARRAY","NULL_REMOVAL_STATE","setForRemoval","hasAnimation","removedBeforeQueried","NULL_REMOVED_QUERIED_STATE","REMOVAL_FLAG","StateValue","isObj","normalizeTriggerValue","absorbOptions","oldParams_2","DEFAULT_STATE_VALUE","DELETED_STATE_VALUE","AnimationTransitionNamespace","_engine","_triggers","_queue","_elementListeners","_hostClassName","isTriggerEventValid","listeners","triggersWithStates","statesByElement","NG_TRIGGER_CLASSNAME","afterFlush","_getTrigger","defaultToFallback","TransitionAnimationPlayer","playersOnElement","playersByElement","queued","isFallbackTransition","totalQueuedPlayers","index_1","objEquals","k1","k2","fromStyles_1","toStyles_1","reportError","deregister","stateMap","clearElementCache","elementPlayers","_destroyInnerNodes","containsClass","className","classList","classes","CLASSES_CACHE_KEY","innerNs","namespacesByHostElement","removeNode","doNotRecurse","childElementCount","triggerStates","players_1","markElementAsRemoved","processLeaveNode","containsPotentialParentTransition","totalAnimations","currentPlayers","playersByQueriedElement","visitedTriggers_1","listener","destroyInnerAnimations","_onRemovalComplete","insertNode","drainQueuedTransitions","microtaskId","destroyed","markedForDestroy","d0","d1","elementContainsData","containsData","TransitionAnimationEngine","newHostElements","disabledNodes","_namespaceLookup","_namespaceList","_flushFns","_whenQuietFns","collectedEnterElements","collectedLeaveElements","ns","createNamespace","_balanceNamespaceList","collectEnterElement","found","nextNamespace","_fetchNamespace","afterFlushAnimationsDone","isElementNode","details","markElementAsDisabled","_buildInstruction","subTimelines","containerElement","cleanupFns","_flushAnimations","quietFns_1","skippedPlayers","skippedPlayersMap","queuedInstructions","allPreStyleElements","allPostStyleElements","disabledElementsSet","nodesThatAreDisabled","bodyNode","getBodyNode","allEnterNodes","createIsRootFilterFn","nodes","isRoot","nodeSet","knownRootContainer","allLeaveNodes","leaveNodesWithoutAnimations","allPlayers","erroneousTransitions","stringMap","setVal_1","setVal","errors_1","enterNodesWithoutAnimations","allPreviousPlayersMap","sortedParentElements","unshift","_beforeAnimationBuild","_getPreviousPlayers","prevPlayer","replaceNodes","replacePostStylesAsPre","cloakAndComputeStyles","postStylesMap","preStylesMap","pre","rootPlayers","subPlayers","innerPlayer","_buildAnimation","setRealPlayer","parentHasPriority","parentPlayers","playersForElement","queriedPlayerResults","queriedInnerElements","j","queriedPlayers","activePlayers","removeNodesAfterAnimationDone","isQueriedElement","toStateValue","queriedElementPlayers","isRemovalAnimation_1","targetNameSpaceId","targetTriggerName","timelineInstruction","realPlayer","getRealPlayer","allQueriedPlayers","allConsumedElements","allSubElements","allNewPlayers","flattenGroupPlayers","finalPlayers","_flattenGroupPlayersRecur","pp","wrappedPlayer","deleteOrUnsetInMap","currentValues","_player","_containsRealPlayer","_queuedCallbacks","_queueEvent","cloakElement","oldValue","display","elementPropsMap","defaultStyle","cloakVals","valuesMap","failedElements","postEntry","preEntry","AnimationEngine","_triggerCache","_transitionEngine","_timelineEngine","cacheKey","buildTrigger","action","eventPhase","WebAnimationsPlayer","_initialized","previousStyles","currentSnapshot","_duration","_delay","allowPreviousPlayerStylesMerge","_preparePlayerBeforeStart","previousStyleProps","startingKeyframe_1","missingStyleProps_1","self_1","_loop_1","_computeStyle","_triggerWebAnimation","_finalKeyframe","_resetDomPlayerState","cancel","getComputedStyle","WebAnimationsDriver","playerOptions","fill","previousWebAnimationPlayers","supportsWebAnimations","configService","ref","selectedStation","configString","getAttribute","ElementRef","module","flash_messages_component_1","parentModule","FlashMessagesComponent","FlashMessageTypeToClass","__param","Optional","SkipSelf","typeToCssClass","transform","Pipe","onMouseEnter","onMouseExit","time_service_1","ElapsedTimePipe","format","getElapsedTimeString","last","endTimeMs","elapsedSeconds","elapsedMinutes","seconds","elapsedHours","pure","TimeService","FocusDirective","focusOn","focus","Directive","GenealogyNodeComponent","maxDepth","childMaxDepth","LogLevelToClassPipe","logLevels","info","warning","ObjectToSortedValuesPipe","object","sortBy","asArray","keys_1","StatusCategory","categoryToCssClass","unknownStatus","Symbol","statusToCategory","statusToText","StatusToClassPipe","StatusToTextPipe","relative","TimeAgoPipe","TooltipDirective","tooltipElement","innerHTML","firstChild","onMouseLeave","HostListener","TrimmedTextComponent","expanded","maxChars","onClick","animations_2","base_plug_1","PLUG_NAME","getPlugState","lastPromptId","convertedHtml","lastPromptHtml","focusSelf","default","setResponse","hasTextInput","hasImage","sendResponse","promptId","respond","animations","BasePlug","util_2","plugExists","Headers","Content-Type","RequestOptions","plugUrl","plugName","payload","mro","dashboard_service_1","station_list_component_1","attachments_component_1","history_component_1","logs_component_1","phase_list_component_1","phase_component_1","station_component_1","station_service_1","test_summary_component_1","StationListComponent","AttachmentsComponent","HistoryComponent","LogsComponent","PhaseComponent","PhaseListComponent","StationComponent","TestSummaryComponent","StationSelectedEvent","dashboard","onSelectStation","EventEmitter","retryCountdown","observable","currentMillis","remainingMs","isSubscribing","isReachable","manualRetry","manualReload","Output","linkForAttachment","attachment","toggleExpanded","history_item_model_1","TestSelectedEvent","onSelectTest","collapsedNumTests","history","historyFromDiskEnabled","isLoading","lastClickedItem","loadHistory","getHistory","isSelected","historyItem","selectedTest","loading","selectTest","retrieveFileName","loadItem","stack","refreshList","showMeasurements","toggleMeasurements","expand","StationDeselectedEvent","stationService","onDeselectStation","goBack","progress_bar_component_1","progressBar","completedPhases","completedPhaseCount","ViewChild","elapsed_time_pipe_1","focus_directive_1","genealogy_node_component_1","log_level_to_class_pipe_1","object_to_sorted_values_pipe_1","status_pipes_1","time_ago_pipe_1","tooltip_directive_1","trimmed_text_component_1","UPDATE_INTERVAL_MS","interval","publish","connect","critical","SockJS","cache","getCache","rawTestState","uniqueId","drawAttention","rawHistoryItems","stationHistory","rawItem","file_name","unloaded","rawHistoryItem"],"mappings":"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","file":"js/app.7b3b5f043d8771c748e0.js","sourcesContent":["/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The state of a test on a station.\n */\n\nimport { Attachment } from './attachment.model';\nimport { LogRecord } from './log-record.model';\nimport { Phase } from './phase.model';\nimport { Station } from './station.model';\n\n// Enum values must not overlap between any of the status enums.\n// See status-pipes.ts.\nexport enum TestStatus {\n waiting = 11, // Corresponds to WAITING_FOR_TEST_START.\n running,\n pass,\n fail,\n error,\n timeout,\n aborted,\n}\n\nexport class PlugDescriptor { mro: string[]; }\n\nexport class TestState {\n attachments: Attachment[];\n dutId: string;\n endTimeMillis: number|null;\n fileName: string|null; // This is null for tests *not* from the history.\n name: string;\n logs: LogRecord[];\n phases: Phase[];\n plugDescriptors: {[name: string]: PlugDescriptor};\n plugStates: {[name: string]: {}};\n startTimeMillis: number;\n station: Station;\n status: TestStatus;\n // This is the execution UID. It is null for tests retrieved from the history.\n testId: string|null;\n\n // Using the class as the interface for its own constructor allows us to call\n // the constructor in named-argument style.\n constructor(params: TestState) {\n Object.assign(this, params);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./node_modules/@angularclass/hmr-loader!./node_modules/tslint-loader!./src/app/shared/models/test-state.model.ts","import * as tslib_1 from \"tslib\";\n/**\n * @license Angular v4.4.6\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\nimport { Inject, Injectable, InjectionToken, NgModule, Optional, PLATFORM_ID } from '@angular/core';\nimport { of } from 'rxjs/observable/of';\nimport { concatMap } from 'rxjs/operator/concatMap';\nimport { filter } from 'rxjs/operator/filter';\nimport { map } from 'rxjs/operator/map';\nimport { DOCUMENT, ɵparseCookieValue } from '@angular/common';\nimport { Observable } from 'rxjs/Observable';\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * \\@experimental\n * @abstract\n */\nvar HttpHandler = (function () {\n function HttpHandler() {\n }\n /**\n * @abstract\n * @param {?} req\n * @return {?}\n */\n HttpHandler.prototype.handle = function (req) { };\n return HttpHandler;\n}());\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * \\@experimental\n * @abstract\n */\nvar HttpBackend = (function () {\n function HttpBackend() {\n }\n /**\n * @abstract\n * @param {?} req\n * @return {?}\n */\n HttpBackend.prototype.handle = function (req) { };\n return HttpBackend;\n}());\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * A `HttpParameterCodec` that uses `encodeURIComponent` and `decodeURIComponent` to\n * serialize and parse URL parameter keys and values.\n *\n * \\@experimental\n */\nvar HttpUrlEncodingCodec = (function () {\n function HttpUrlEncodingCodec() {\n }\n /**\n * @param {?} k\n * @return {?}\n */\n HttpUrlEncodingCodec.prototype.encodeKey = function (k) { return standardEncoding(k); };\n /**\n * @param {?} v\n * @return {?}\n */\n HttpUrlEncodingCodec.prototype.encodeValue = function (v) { return standardEncoding(v); };\n /**\n * @param {?} k\n * @return {?}\n */\n HttpUrlEncodingCodec.prototype.decodeKey = function (k) { return decodeURIComponent(k); };\n /**\n * @param {?} v\n * @return {?}\n */\n HttpUrlEncodingCodec.prototype.decodeValue = function (v) { return decodeURIComponent(v); };\n return HttpUrlEncodingCodec;\n}());\n/**\n * @param {?} rawParams\n * @param {?} codec\n * @return {?}\n */\nfunction paramParser(rawParams, codec) {\n var /** @type {?} */ map$$1 = new Map();\n if (rawParams.length > 0) {\n var /** @type {?} */ params = rawParams.split('&');\n params.forEach(function (param) {\n var /** @type {?} */ eqIdx = param.indexOf('=');\n var _a = eqIdx == -1 ?\n [codec.decodeKey(param), ''] :\n [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))], key = _a[0], val = _a[1];\n var /** @type {?} */ list = map$$1.get(key) || [];\n list.push(val);\n map$$1.set(key, list);\n });\n }\n return map$$1;\n}\n/**\n * @param {?} v\n * @return {?}\n */\nfunction standardEncoding(v) {\n return encodeURIComponent(v)\n .replace(/%40/gi, '@')\n .replace(/%3A/gi, ':')\n .replace(/%24/gi, '$')\n .replace(/%2C/gi, ',')\n .replace(/%3B/gi, ';')\n .replace(/%2B/gi, '+')\n .replace(/%3D/gi, '=')\n .replace(/%3F/gi, '?')\n .replace(/%2F/gi, '/');\n}\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immuatable - all mutation operations return a new instance.\n *\n * \\@experimental\n */\nvar HttpParams = (function () {\n /**\n * @param {?=} options\n */\n function HttpParams(options) {\n if (options === void 0) { options = {}; }\n this.updates = null;\n this.cloneFrom = null;\n this.encoder = options.encoder || new HttpUrlEncodingCodec();\n this.map = !!options.fromString ? paramParser(options.fromString, this.encoder) : null;\n }\n /**\n * Check whether the body has one or more values for the given parameter name.\n * @param {?} param\n * @return {?}\n */\n HttpParams.prototype.has = function (param) {\n this.init();\n return ((this.map)).has(param);\n };\n /**\n * Get the first value for the given parameter name, or `null` if it's not present.\n * @param {?} param\n * @return {?}\n */\n HttpParams.prototype.get = function (param) {\n this.init();\n var /** @type {?} */ res = ((this.map)).get(param);\n return !!res ? res[0] : null;\n };\n /**\n * Get all values for the given parameter name, or `null` if it's not present.\n * @param {?} param\n * @return {?}\n */\n HttpParams.prototype.getAll = function (param) {\n this.init();\n return ((this.map)).get(param) || null;\n };\n /**\n * Get all the parameter names for this body.\n * @return {?}\n */\n HttpParams.prototype.keys = function () {\n this.init();\n return Array.from(/** @type {?} */ ((this.map)).keys());\n };\n /**\n * Construct a new body with an appended value for the given parameter name.\n * @param {?} param\n * @param {?} value\n * @return {?}\n */\n HttpParams.prototype.append = function (param, value) { return this.clone({ param: param, value: value, op: 'a' }); };\n /**\n * Construct a new body with a new value for the given parameter name.\n * @param {?} param\n * @param {?} value\n * @return {?}\n */\n HttpParams.prototype.set = function (param, value) { return this.clone({ param: param, value: value, op: 's' }); };\n /**\n * Construct a new body with either the given value for the given parameter\n * removed, if a value is given, or all values for the given parameter removed\n * if not.\n * @param {?} param\n * @param {?=} value\n * @return {?}\n */\n HttpParams.prototype.delete = function (param, value) { return this.clone({ param: param, value: value, op: 'd' }); };\n /**\n * Serialize the body to an encoded string, where key-value pairs (separated by `=`) are\n * separated by `&`s.\n * @return {?}\n */\n HttpParams.prototype.toString = function () {\n var _this = this;\n this.init();\n return this.keys()\n .map(function (key) {\n var /** @type {?} */ eKey = _this.encoder.encodeKey(key);\n return ((((_this.map)).get(key))).map(function (value) { return eKey + '=' + _this.encoder.encodeValue(value); })\n .join('&');\n })\n .join('&');\n };\n /**\n * @param {?} update\n * @return {?}\n */\n HttpParams.prototype.clone = function (update) {\n var /** @type {?} */ clone = new HttpParams({ encoder: this.encoder });\n clone.cloneFrom = this.cloneFrom || this;\n clone.updates = (this.updates || []).concat([update]);\n return clone;\n };\n /**\n * @return {?}\n */\n HttpParams.prototype.init = function () {\n var _this = this;\n if (this.map === null) {\n this.map = new Map();\n }\n if (this.cloneFrom !== null) {\n this.cloneFrom.init();\n this.cloneFrom.keys().forEach(function (key) { return ((_this.map)).set(key, /** @type {?} */ ((((((_this.cloneFrom)).map)).get(key)))); }); /** @type {?} */\n ((this.updates)).forEach(function (update) {\n switch (update.op) {\n case 'a':\n case 's':\n var /** @type {?} */ base = (update.op === 'a' ? ((_this.map)).get(update.param) : undefined) || [];\n base.push(/** @type {?} */ ((update.value))); /** @type {?} */\n ((_this.map)).set(update.param, base);\n break;\n case 'd':\n if (update.value !== undefined) {\n var /** @type {?} */ base_1 = ((_this.map)).get(update.param) || [];\n var /** @type {?} */ idx = base_1.indexOf(update.value);\n if (idx !== -1) {\n base_1.splice(idx, 1);\n }\n if (base_1.length > 0) {\n ((_this.map)).set(update.param, base_1);\n }\n else {\n ((_this.map)).delete(update.param);\n }\n }\n else {\n ((_this.map)).delete(update.param);\n break;\n }\n }\n });\n this.cloneFrom = null;\n }\n };\n return HttpParams;\n}());\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Immutable set of Http headers, with lazy parsing.\n * \\@experimental\n */\nvar HttpHeaders = (function () {\n /**\n * @param {?=} headers\n */\n function HttpHeaders(headers) {\n var _this = this;\n /**\n * Internal map of lowercased header names to the normalized\n * form of the name (the form seen first).\n */\n this.normalizedNames = new Map();\n /**\n * Queued updates to be materialized the next initialization.\n */\n this.lazyUpdate = null;\n if (!headers) {\n this.headers = new Map();\n }\n else if (typeof headers === 'string') {\n this.lazyInit = function () {\n _this.headers = new Map();\n headers.split('\\n').forEach(function (line) {\n var index = line.indexOf(':');\n if (index > 0) {\n var name = line.slice(0, index);\n var key = name.toLowerCase();\n var value = line.slice(index + 1).trim();\n _this.maybeSetNormalizedName(name, key);\n if (_this.headers.has(key)) {\n _this.headers.get(key).push(value);\n }\n else {\n _this.headers.set(key, [value]);\n }\n }\n });\n };\n }\n else {\n this.lazyInit = function () {\n _this.headers = new Map();\n Object.keys(headers).forEach(function (name) {\n var values = headers[name];\n var key = name.toLowerCase();\n if (typeof values === 'string') {\n values = [values];\n }\n if (values.length > 0) {\n _this.headers.set(key, values);\n _this.maybeSetNormalizedName(name, key);\n }\n });\n };\n }\n }\n /**\n * Checks for existence of header by given name.\n * @param {?} name\n * @return {?}\n */\n HttpHeaders.prototype.has = function (name) {\n this.init();\n return this.headers.has(name.toLowerCase());\n };\n /**\n * Returns first header that matches given name.\n * @param {?} name\n * @return {?}\n */\n HttpHeaders.prototype.get = function (name) {\n this.init();\n var /** @type {?} */ values = this.headers.get(name.toLowerCase());\n return values && values.length > 0 ? values[0] : null;\n };\n /**\n * Returns the names of the headers\n * @return {?}\n */\n HttpHeaders.prototype.keys = function () {\n this.init();\n return Array.from(this.normalizedNames.values());\n };\n /**\n * Returns list of header values for a given name.\n * @param {?} name\n * @return {?}\n */\n HttpHeaders.prototype.getAll = function (name) {\n this.init();\n return this.headers.get(name.toLowerCase()) || null;\n };\n /**\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n HttpHeaders.prototype.append = function (name, value) {\n return this.clone({ name: name, value: value, op: 'a' });\n };\n /**\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n HttpHeaders.prototype.set = function (name, value) {\n return this.clone({ name: name, value: value, op: 's' });\n };\n /**\n * @param {?} name\n * @param {?=} value\n * @return {?}\n */\n HttpHeaders.prototype.delete = function (name, value) {\n return this.clone({ name: name, value: value, op: 'd' });\n };\n /**\n * @param {?} name\n * @param {?} lcName\n * @return {?}\n */\n HttpHeaders.prototype.maybeSetNormalizedName = function (name, lcName) {\n if (!this.normalizedNames.has(lcName)) {\n this.normalizedNames.set(lcName, name);\n }\n };\n /**\n * @return {?}\n */\n HttpHeaders.prototype.init = function () {\n var _this = this;\n if (!!this.lazyInit) {\n if (this.lazyInit instanceof HttpHeaders) {\n this.copyFrom(this.lazyInit);\n }\n else {\n this.lazyInit();\n }\n this.lazyInit = null;\n if (!!this.lazyUpdate) {\n this.lazyUpdate.forEach(function (update) { return _this.applyUpdate(update); });\n this.lazyUpdate = null;\n }\n }\n };\n /**\n * @param {?} other\n * @return {?}\n */\n HttpHeaders.prototype.copyFrom = function (other) {\n var _this = this;\n other.init();\n Array.from(other.headers.keys()).forEach(function (key) {\n _this.headers.set(key, /** @type {?} */ ((other.headers.get(key))));\n _this.normalizedNames.set(key, /** @type {?} */ ((other.normalizedNames.get(key))));\n });\n };\n /**\n * @param {?} update\n * @return {?}\n */\n HttpHeaders.prototype.clone = function (update) {\n var /** @type {?} */ clone = new HttpHeaders();\n clone.lazyInit =\n (!!this.lazyInit && this.lazyInit instanceof HttpHeaders) ? this.lazyInit : this;\n clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n return clone;\n };\n /**\n * @param {?} update\n * @return {?}\n */\n HttpHeaders.prototype.applyUpdate = function (update) {\n var /** @type {?} */ key = update.name.toLowerCase();\n switch (update.op) {\n case 'a':\n case 's':\n var /** @type {?} */ value = ((update.value));\n if (typeof value === 'string') {\n value = [value];\n }\n if (value.length === 0) {\n return;\n }\n this.maybeSetNormalizedName(update.name, key);\n var /** @type {?} */ base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n base.push.apply(base, value);\n this.headers.set(key, base);\n break;\n case 'd':\n var /** @type {?} */ toDelete_1 = (update.value);\n if (!toDelete_1) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n }\n else {\n var /** @type {?} */ existing = this.headers.get(key);\n if (!existing) {\n return;\n }\n existing = existing.filter(function (value) { return toDelete_1.indexOf(value) === -1; });\n if (existing.length === 0) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n }\n else {\n this.headers.set(key, existing);\n }\n }\n break;\n }\n };\n /**\n * \\@internal\n * @param {?} fn\n * @return {?}\n */\n HttpHeaders.prototype.forEach = function (fn) {\n var _this = this;\n this.init();\n Array.from(this.normalizedNames.keys())\n .forEach(function (key) { return fn(/** @type {?} */ ((_this.normalizedNames.get(key))), /** @type {?} */ ((_this.headers.get(key)))); });\n };\n return HttpHeaders;\n}());\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Determine whether the given HTTP method may include a body.\n * @param {?} method\n * @return {?}\n */\nfunction mightHaveBody(method) {\n switch (method) {\n case 'DELETE':\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n case 'JSONP':\n return false;\n default:\n return true;\n }\n}\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n * @param {?} value\n * @return {?}\n */\nfunction isArrayBuffer(value) {\n return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n * @param {?} value\n * @return {?}\n */\nfunction isBlob(value) {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n * @param {?} value\n * @return {?}\n */\nfunction isFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * \\@experimental\n */\nvar HttpRequest = (function () {\n /**\n * @param {?} method\n * @param {?} url\n * @param {?=} third\n * @param {?=} fourth\n */\n function HttpRequest(method, url, third, fourth) {\n this.url = url;\n /**\n * The request body, or `null` if one isn't set.\n *\n * Bodies are not enforced to be immutable, as they can include a reference to any\n * user-defined data type. However, interceptors should take care to preserve\n * idempotence by treating them as such.\n */\n this.body = null;\n /**\n * Whether this request should be made in a way that exposes progress events.\n *\n * Progress events are expensive (change detection runs on each event) and so\n * they should only be requested if the consumer intends to monitor them.\n */\n this.reportProgress = false;\n /**\n * Whether this request should be sent with outgoing credentials (cookies).\n */\n this.withCredentials = false;\n /**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\n this.responseType = 'json';\n this.method = method.toUpperCase();\n // Next, need to figure out which argument holds the HttpRequestInit\n // options, if any.\n var options;\n // Check whether a body argument is expected. The only valid way to omit\n // the body argument is to use a known no-body method like GET.\n if (mightHaveBody(this.method) || !!fourth) {\n // Body is the third argument, options are the fourth.\n this.body = third || null;\n options = fourth;\n }\n else {\n // No body required, options are the third argument. The body stays null.\n options = third;\n }\n // If options have been passed, interpret them.\n if (options) {\n // Normalize reportProgress and withCredentials.\n this.reportProgress = !!options.reportProgress;\n this.withCredentials = !!options.withCredentials;\n // Override default response type of 'json' if one is provided.\n if (!!options.responseType) {\n this.responseType = options.responseType;\n }\n // Override headers if they're provided.\n if (!!options.headers) {\n this.headers = options.headers;\n }\n if (!!options.params) {\n this.params = options.params;\n }\n }\n // If no headers have been passed in, construct a new HttpHeaders instance.\n if (!this.headers) {\n this.headers = new HttpHeaders();\n }\n // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n if (!this.params) {\n this.params = new HttpParams();\n this.urlWithParams = url;\n }\n else {\n // Encode the parameters to a string in preparation for inclusion in the URL.\n var params = this.params.toString();\n if (params.length === 0) {\n // No parameters, the visible URL is just the URL given at creation time.\n this.urlWithParams = url;\n }\n else {\n // Does the URL already have query parameters? Look for '?'.\n var qIdx = url.indexOf('?');\n // There are 3 cases to handle:\n // 1) No existing parameters -> append '?' followed by params.\n // 2) '?' exists and is followed by existing query string ->\n // append '&' followed by params.\n // 3) '?' exists at the end of the url -> append params directly.\n // This basically amounts to determining the character, if any, with\n // which to join the URL and parameters.\n var sep = qIdx === -1 ? '?' : (qIdx < url.length - 1 ? '&' : '');\n this.urlWithParams = url + sep + params;\n }\n }\n }\n /**\n * Transform the free-form body into a serialized format suitable for\n * transmission to the server.\n * @return {?}\n */\n HttpRequest.prototype.serializeBody = function () {\n // If no body is present, no need to serialize it.\n if (this.body === null) {\n return null;\n }\n // Check whether the body is already in a serialized form. If so,\n // it can just be returned directly.\n if (isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) ||\n typeof this.body === 'string') {\n return this.body;\n }\n // Check whether the body is an instance of HttpUrlEncodedParams.\n if (this.body instanceof HttpParams) {\n return this.body.toString();\n }\n // Check whether the body is an object or array, and serialize with JSON if so.\n if (typeof this.body === 'object' || typeof this.body === 'boolean' ||\n Array.isArray(this.body)) {\n return JSON.stringify(this.body);\n }\n // Fall back on toString() for everything else.\n return ((this.body)).toString();\n };\n /**\n * Examine the body and attempt to infer an appropriate MIME type\n * for it.\n *\n * If no such type can be inferred, this method will return `null`.\n * @return {?}\n */\n HttpRequest.prototype.detectContentTypeHeader = function () {\n // An empty body has no content type.\n if (this.body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (isFormData(this.body)) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (isBlob(this.body)) {\n return this.body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (isArrayBuffer(this.body)) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof this.body === 'string') {\n return 'text/plain';\n }\n // `HttpUrlEncodedParams` has its own content-type.\n if (this.body instanceof HttpParams) {\n return 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n // Arrays, objects, and numbers will be encoded as JSON.\n if (typeof this.body === 'object' || typeof this.body === 'number' ||\n Array.isArray(this.body)) {\n return 'application/json';\n }\n // No type could be inferred.\n return null;\n };\n /**\n * @param {?=} update\n * @return {?}\n */\n HttpRequest.prototype.clone = function (update) {\n if (update === void 0) { update = {}; }\n // For method, url, and responseType, take the current value unless\n // it is overridden in the update hash.\n var /** @type {?} */ method = update.method || this.method;\n var /** @type {?} */ url = update.url || this.url;\n var /** @type {?} */ responseType = update.responseType || this.responseType;\n // The body is somewhat special - a `null` value in update.body means\n // whatever current body is present is being overridden with an empty\n // body, whereas an `undefined` value in update.body implies no\n // override.\n var /** @type {?} */ body = (update.body !== undefined) ? update.body : this.body;\n // Carefully handle the boolean options to differentiate between\n // `false` and `undefined` in the update args.\n var /** @type {?} */ withCredentials = (update.withCredentials !== undefined) ? update.withCredentials : this.withCredentials;\n var /** @type {?} */ reportProgress = (update.reportProgress !== undefined) ? update.reportProgress : this.reportProgress;\n // Headers and params may be appended to if `setHeaders` or\n // `setParams` are used.\n var /** @type {?} */ headers = update.headers || this.headers;\n var /** @type {?} */ params = update.params || this.params;\n // Check whether the caller has asked to add headers.\n if (update.setHeaders !== undefined) {\n // Set every requested header.\n headers =\n Object.keys(update.setHeaders)\n .reduce(function (headers, name) { return headers.set(name, /** @type {?} */ ((update.setHeaders))[name]); }, headers);\n }\n // Check whether the caller has asked to set params.\n if (update.setParams) {\n // Set every requested param.\n params = Object.keys(update.setParams)\n .reduce(function (params, param) { return params.set(param, /** @type {?} */ ((update.setParams))[param]); }, params);\n }\n // Finally, construct the new HttpRequest using the pieces from above.\n return new HttpRequest(method, url, body, {\n params: params, headers: headers, reportProgress: reportProgress, responseType: responseType, withCredentials: withCredentials,\n });\n };\n return HttpRequest;\n}());\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nvar HttpEventType = {};\nHttpEventType.Sent = 0;\nHttpEventType.UploadProgress = 1;\nHttpEventType.ResponseHeader = 2;\nHttpEventType.DownloadProgress = 3;\nHttpEventType.Response = 4;\nHttpEventType.User = 5;\nHttpEventType[HttpEventType.Sent] = \"Sent\";\nHttpEventType[HttpEventType.UploadProgress] = \"UploadProgress\";\nHttpEventType[HttpEventType.ResponseHeader] = \"ResponseHeader\";\nHttpEventType[HttpEventType.DownloadProgress] = \"DownloadProgress\";\nHttpEventType[HttpEventType.Response] = \"Response\";\nHttpEventType[HttpEventType.User] = \"User\";\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * \\@experimental\n * @abstract\n */\nvar HttpResponseBase = (function () {\n /**\n * Super-constructor for all responses.\n *\n * The single parameter accepted is an initialization hash. Any properties\n * of the response passed there will override the default values.\n * @param {?} init\n * @param {?=} defaultStatus\n * @param {?=} defaultStatusText\n */\n function HttpResponseBase(init, defaultStatus, defaultStatusText) {\n if (defaultStatus === void 0) { defaultStatus = 200; }\n if (defaultStatusText === void 0) { defaultStatusText = 'OK'; }\n // If the hash has values passed, use them to initialize the response.\n // Otherwise use the default values.\n this.headers = init.headers || new HttpHeaders();\n this.status = init.status !== undefined ? init.status : defaultStatus;\n this.statusText = init.statusText || defaultStatusText;\n this.url = init.url || null;\n // Cache the ok value to avoid defining a getter.\n this.ok = this.status >= 200 && this.status < 300;\n }\n return HttpResponseBase;\n}());\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * \\@experimental\n */\nvar HttpHeaderResponse = (function (_super) {\n tslib_1.__extends(HttpHeaderResponse, _super);\n /**\n * Create a new `HttpHeaderResponse` with the given parameters.\n * @param {?=} init\n */\n function HttpHeaderResponse(init) {\n if (init === void 0) { init = {}; }\n var _this = _super.call(this, init) || this;\n _this.type = HttpEventType.ResponseHeader;\n return _this;\n }\n /**\n * Copy this `HttpHeaderResponse`, overriding its contents with the\n * given parameter hash.\n * @param {?=} update\n * @return {?}\n */\n HttpHeaderResponse.prototype.clone = function (update) {\n if (update === void 0) { update = {}; }\n // Perform a straightforward initialization of the new HttpHeaderResponse,\n // overriding the current parameters with new ones if given.\n return new HttpHeaderResponse({\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n };\n return HttpHeaderResponse;\n}(HttpResponseBase));\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * \\@experimental\n */\nvar HttpResponse = (function (_super) {\n tslib_1.__extends(HttpResponse, _super);\n /**\n * Construct a new `HttpResponse`.\n * @param {?=} init\n */\n function HttpResponse(init) {\n if (init === void 0) { init = {}; }\n var _this = _super.call(this, init) || this;\n _this.type = HttpEventType.Response;\n _this.body = init.body || null;\n return _this;\n }\n /**\n * @param {?=} update\n * @return {?}\n */\n HttpResponse.prototype.clone = function (update) {\n if (update === void 0) { update = {}; }\n return new HttpResponse({\n body: (update.body !== undefined) ? update.body : this.body,\n headers: update.headers || this.headers,\n status: (update.status !== undefined) ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n };\n return HttpResponse;\n}(HttpResponseBase));\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * \\@experimental\n */\nvar HttpErrorResponse = (function (_super) {\n tslib_1.__extends(HttpErrorResponse, _super);\n /**\n * @param {?} init\n */\n function HttpErrorResponse(init) {\n var _this = \n // Initialize with a default status of 0 / Unknown Error.\n _super.call(this, init, 0, 'Unknown Error') || this;\n _this.name = 'HttpErrorResponse';\n /**\n * Errors are never okay, even when the status code is in the 2xx success range.\n */\n _this.ok = false;\n // If the response was successful, then this was a parse error. Otherwise, it was\n // a protocol-level failure of some sort. Either the request failed in transit\n // or the server returned an unsuccessful status code.\n if (_this.status >= 200 && _this.status < 300) {\n _this.message = \"Http failure during parsing for \" + (init.url || '(unknown url)');\n }\n else {\n _this.message =\n \"Http failure response for \" + (init.url || '(unknown url)') + \": \" + init.status + \" \" + init.statusText;\n }\n _this.error = init.error || null;\n return _this;\n }\n return HttpErrorResponse;\n}(HttpResponseBase));\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Construct an instance of `HttpRequestOptions` from a source `HttpMethodOptions` and\n * the given `body`. Basically, this clones the object and adds the body.\n * @template T\n * @param {?} options\n * @param {?} body\n * @return {?}\n */\nfunction addBody(options, body) {\n return {\n body: body,\n headers: options.headers,\n observe: options.observe,\n params: options.params,\n reportProgress: options.reportProgress,\n responseType: options.responseType,\n withCredentials: options.withCredentials,\n };\n}\n/**\n * Perform HTTP requests.\n *\n * `HttpClient` is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies according to which\n * signature is called (mainly the values of `observe` and `responseType`).\n *\n * \\@experimental\n */\nvar HttpClient = (function () {\n /**\n * @param {?} handler\n */\n function HttpClient(handler) {\n this.handler = handler;\n }\n /**\n * Constructs an `Observable` for a particular HTTP request that, when subscribed,\n * fires the request through the chain of registered interceptors and on to the\n * server.\n *\n * This method can be called in one of two ways. Either an `HttpRequest`\n * instance can be passed directly as the only parameter, or a method can be\n * passed as the first parameter, a string URL as the second, and an\n * options hash as the third.\n *\n * If a `HttpRequest` object is passed directly, an `Observable` of the\n * raw `HttpEvent` stream will be returned.\n *\n * If a request is instead built by providing a URL, the options object\n * determines the return type of `request()`. In addition to configuring\n * request parameters such as the outgoing headers and/or the body, the options\n * hash specifies two key pieces of information about the request: the\n * `responseType` and what to `observe`.\n *\n * The `responseType` value determines how a successful response body will be\n * parsed. If `responseType` is the default `json`, a type interface for the\n * resulting object may be passed as a type parameter to `request()`.\n *\n * The `observe` value determines the return type of `request()`, based on what\n * the consumer is interested in observing. A value of `events` will return an\n * `Observable` representing the raw `HttpEvent` stream,\n * including progress events by default. A value of `response` will return an\n * `Observable>` where the `T` parameter of `HttpResponse`\n * depends on the `responseType` and any optionally provided type parameter.\n * A value of `body` will return an `Observable` with the same `T` body type.\n * @param {?} first\n * @param {?=} url\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.request = function (first, url, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n var /** @type {?} */ req;\n // Firstly, check whether the primary argument is an instance of `HttpRequest`.\n if (first instanceof HttpRequest) {\n // It is. The other arguments must be undefined (per the signatures) and can be\n // ignored.\n req = (first);\n }\n else {\n // It's a string, so it represents a URL. Construct a request based on it,\n // and incorporate the remaining arguments (assuming GET unless a method is\n // provided.\n req = new HttpRequest(first, /** @type {?} */ ((url)), options.body || null, {\n headers: options.headers,\n params: options.params,\n reportProgress: options.reportProgress,\n // By default, JSON is assumed to be returned for all calls.\n responseType: options.responseType || 'json',\n withCredentials: options.withCredentials,\n });\n }\n // Start with an Observable.of() the initial request, and run the handler (which\n // includes all interceptors) inside a concatMap(). This way, the handler runs\n // inside an Observable chain, which causes interceptors to be re-run on every\n // subscription (this also makes retries re-run the handler, including interceptors).\n var /** @type {?} */ events$ = concatMap.call(of(req), function (req) { return _this.handler.handle(req); });\n // If coming via the API signature which accepts a previously constructed HttpRequest,\n // the only option is to get the event stream. Otherwise, return the event stream if\n // that is what was requested.\n if (first instanceof HttpRequest || options.observe === 'events') {\n return events$;\n }\n // The requested stream contains either the full response or the body. In either\n // case, the first step is to filter the event stream to extract a stream of\n // responses(s).\n var /** @type {?} */ res$ = filter.call(events$, function (event) { return event instanceof HttpResponse; });\n // Decide which stream to return.\n switch (options.observe || 'body') {\n case 'body':\n // The requested stream is the body. Map the response stream to the response\n // body. This could be done more simply, but a misbehaving interceptor might\n // transform the response body into a different format and ignore the requested\n // responseType. Guard against this by validating that the response is of the\n // requested type.\n switch (req.responseType) {\n case 'arraybuffer':\n return map.call(res$, function (res) {\n // Validate that the body is an ArrayBuffer.\n if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n throw new Error('Response is not an ArrayBuffer.');\n }\n return res.body;\n });\n case 'blob':\n return map.call(res$, function (res) {\n // Validate that the body is a Blob.\n if (res.body !== null && !(res.body instanceof Blob)) {\n throw new Error('Response is not a Blob.');\n }\n return res.body;\n });\n case 'text':\n return map.call(res$, function (res) {\n // Validate that the body is a string.\n if (res.body !== null && typeof res.body !== 'string') {\n throw new Error('Response is not a string.');\n }\n return res.body;\n });\n case 'json':\n default:\n // No validation needed for JSON responses, as they can be of any type.\n return map.call(res$, function (res) { return res.body; });\n }\n case 'response':\n // The response stream was requested directly, so return it.\n return res$;\n default:\n // Guard against new future observe types being added.\n throw new Error(\"Unreachable: unhandled observe type \" + options.observe + \"}\");\n }\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * DELETE request to be executed on the server. See the individual overloads for\n * details of `delete()`'s return type based on the provided options.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.delete = function (url, options) {\n if (options === void 0) { options = {}; }\n return this.request('DELETE', url, /** @type {?} */ (options));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * GET request to be executed on the server. See the individual overloads for\n * details of `get()`'s return type based on the provided options.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.get = function (url, options) {\n if (options === void 0) { options = {}; }\n return this.request('GET', url, /** @type {?} */ (options));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * HEAD request to be executed on the server. See the individual overloads for\n * details of `head()`'s return type based on the provided options.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.head = function (url, options) {\n if (options === void 0) { options = {}; }\n return this.request('HEAD', url, /** @type {?} */ (options));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause a request\n * with the special method `JSONP` to be dispatched via the interceptor pipeline.\n *\n * A suitable interceptor must be installed (e.g. via the `HttpClientJsonpModule`).\n * If no such interceptor is reached, then the `JSONP` request will likely be\n * rejected by the configured backend.\n * @template T\n * @param {?} url\n * @param {?} callbackParam\n * @return {?}\n */\n HttpClient.prototype.jsonp = function (url, callbackParam) {\n return this.request('JSONP', url, {\n params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n observe: 'body',\n responseType: 'json',\n });\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * OPTIONS request to be executed on the server. See the individual overloads for\n * details of `options()`'s return type based on the provided options.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.options = function (url, options) {\n if (options === void 0) { options = {}; }\n return this.request('OPTIONS', url, /** @type {?} */ (options));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * PATCH request to be executed on the server. See the individual overloads for\n * details of `patch()`'s return type based on the provided options.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.patch = function (url, body, options) {\n if (options === void 0) { options = {}; }\n return this.request('PATCH', url, addBody(options, body));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * POST request to be executed on the server. See the individual overloads for\n * details of `post()`'s return type based on the provided options.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.post = function (url, body, options) {\n if (options === void 0) { options = {}; }\n return this.request('POST', url, addBody(options, body));\n };\n /**\n * Constructs an `Observable` which, when subscribed, will cause the configured\n * POST request to be executed on the server. See the individual overloads for\n * details of `post()`'s return type based on the provided options.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n HttpClient.prototype.put = function (url, body, options) {\n if (options === void 0) { options = {}; }\n return this.request('PUT', url, addBody(options, body));\n };\n return HttpClient;\n}());\nHttpClient.decorators = [\n { type: Injectable },\n];\n/**\n * @nocollapse\n */\nHttpClient.ctorParameters = function () { return [\n { type: HttpHandler, },\n]; };\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * `HttpHandler` which applies an `HttpInterceptor` to an `HttpRequest`.\n *\n * \\@experimental\n */\nvar HttpInterceptorHandler = (function () {\n /**\n * @param {?} next\n * @param {?} interceptor\n */\n function HttpInterceptorHandler(next, interceptor) {\n this.next = next;\n this.interceptor = interceptor;\n }\n /**\n * @param {?} req\n * @return {?}\n */\n HttpInterceptorHandler.prototype.handle = function (req) {\n return this.interceptor.intercept(req, this.next);\n };\n return HttpInterceptorHandler;\n}());\n/**\n * A multi-provider token which represents the array of `HttpInterceptor`s that\n * are registered.\n *\n * \\@experimental\n */\nvar HTTP_INTERCEPTORS = new InjectionToken('HTTP_INTERCEPTORS');\nvar NoopInterceptor = (function () {\n function NoopInterceptor() {\n }\n /**\n * @param {?} req\n * @param {?} next\n * @return {?}\n */\n NoopInterceptor.prototype.intercept = function (req, next) {\n return next.handle(req);\n };\n return NoopInterceptor;\n}());\nNoopInterceptor.decorators = [\n { type: Injectable },\n];\n/**\n * @nocollapse\n */\nNoopInterceptor.ctorParameters = function () { return []; };\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nvar nextRequestId = 0;\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nvar JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nvar JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nvar JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n * \\@experimental\n * @abstract\n */\nvar JsonpCallbackContext = (function () {\n function JsonpCallbackContext() {\n }\n return JsonpCallbackContext;\n}());\n/**\n * `HttpBackend` that only processes `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n *\n * \\@experimental\n */\nvar JsonpClientBackend = (function () {\n /**\n * @param {?} callbackMap\n * @param {?} document\n */\n function JsonpClientBackend(callbackMap, document) {\n this.callbackMap = callbackMap;\n this.document = document;\n }\n /**\n * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n * @return {?}\n */\n JsonpClientBackend.prototype.nextCallback = function () { return \"ng_jsonp_callback_\" + nextRequestId++; };\n /**\n * Process a JSONP request and return an event stream of the results.\n * @param {?} req\n * @return {?}\n */\n JsonpClientBackend.prototype.handle = function (req) {\n var _this = this;\n // Firstly, check both the method and response type. If either doesn't match\n // then the request was improperly routed here and cannot be handled.\n if (req.method !== 'JSONP') {\n throw new Error(JSONP_ERR_WRONG_METHOD);\n }\n else if (req.responseType !== 'json') {\n throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);\n }\n // Everything else happens inside the Observable boundary.\n return new Observable(function (observer) {\n // The first step to make a request is to generate the callback name, and replace the\n // callback placeholder in the URL with the name. Care has to be taken here to ensure\n // a trailing &, if matched, gets inserted back into the URL in the correct place.\n var /** @type {?} */ callback = _this.nextCallback();\n var /** @type {?} */ url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, \"=\" + callback + \"$1\");\n // Construct the