diff --git a/.codespellignore b/.codespellignorelines similarity index 90% rename from .codespellignore rename to .codespellignorelines index 3dc8d6b681..d295faf937 100644 --- a/.codespellignore +++ b/.codespellignorelines @@ -8,13 +8,15 @@ * Renamed protocol convertor(sic) to protocol converter in the RDM code (C++ * Renamed valiator(sic) to validator, incomming(sic) to incoming, mimimun(sic) to minimum and overiding(sic) to overriding, all of which may or may not + * Renamed RESONSE_INVALID_DESTINATION(sic) to RESPONSE_INVALID_DESTINATION in + * Rename CircularDepdendancyException(sic) to CircularDependencyException in + * Rename AppendMultipler(sic) to AppendMultiplier in the RDM messaging code /^(?:([0-9]{1,3})(?:\s(THRU)\s(?:([0-9]{1,3}))?)?(?:\s(@)\s(?:([0-9]{1,3}|FULL))?)?)/; * channel_range ::= "ALL" | "*" | channel "THRU" channel | channel > channel /(?:([0-9]{1,3})(?:\s+THRU\s+([0-9]{0,3}))?)\s+@\s+([0-9]{0,3})$/); /(?:([0-9]{1,3})(?:\s+THRU\s+([0-9]{0,3}))?)(?:\s+@\s+([0-9]{0,3}))?$/); str = str.replace('>', 'THRU'); ' THRU ' + ola.common.DmxConstants.MAX_CHANNEL_NUMBER); - ' THRU ' + ola.common.DmxConstants.MAX_CHANNEL_NUMBER); // If it's the T or > keys, autocomplete 'THRU' case 'U': // THRU var values = ['7', '8', '9', ' THRU ', '4', '5', '6', ' @ ', '1', '2', '3', @@ -115,9 +117,6 @@ class AsyncronousLibUsbAdaptor : public BaseLibUsbAdaptor { OLA_ASSERT_EQ(expected, JsonWriter::AsString(uint_value)); * Test the uint item " \"type\": \"uint\",\n" - " \"type\": \"uint\",\n" - " \"type\": \"uint\",\n" - " \"type\": \"uint\",\n" std::map m_uint_map_variables; if (message.uint_offset < MAX_UINT_FIELDS) { message.uint16_fields[message.uint_offset++] = field->Value(); @@ -128,10 +127,8 @@ class AsyncronousLibUsbAdaptor : public BaseLibUsbAdaptor { status_message() : uint_offset(0), int_offset(0), status_type(0), std::string Type() const { return "uint"; } if (items[i]['type'] == 'uint') { - if (items[i]['type'] == 'uint') { if (type == 'string' || type == 'uint' || type == 'hidden') { const char RDMHTTPModule::GENERIC_UINT_FIELD[] = "int"; - section.AddItem(new HiddenItem("1", GENERIC_UINT_FIELD)); section.AddItem(new HiddenItem("1", GENERIC_UINT_FIELD)); SelectItem *item = new SelectItem("Personality", GENERIC_UINT_FIELD); string personality_str = request->GetParameter(GENERIC_UINT_FIELD); @@ -182,3 +179,21 @@ function ok(a,b){for(var c=a.wa[b].data.items,d=c.length,g=N(a.wa[b].id),h="",i= import java.nio.ByteOrder; byte[] header = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(headerContent).array(); int headerValue = ByteBuffer.wrap(header).order(ByteOrder.nativeOrder()).getInt(); +# This is a very bodgy workaround to the fact that the pip install of the archive doesn't seem to work properly now on Travis + "uest\032\036.ola.rpc.STREAMING_NO_RESPONSEB\006\200\001" + s1 = "one\"two\\three/four\bfive\fsix\nseven\reight\tnine"; + string("one\\\"two\\\\three\\/four\\bfive\\fsix\\nseven\\reight\\tnine"), + s1 = "one\"two\\three/four\bfive\fsix\nseven\reight\tnine"; + string("one\\\"two\\\\three\\/four\\bfive\\fsix\\nseven\\reight\\tnine"), + self.assertEqual(rtf._EscapeData(u'caf\xe9'), "caf\\xe9") + self.assertEqual('%s' % rtf._EscapeData(u'caf\xe9'), "caf\\xe9") + self.assertEqual('%s' % rtf._EscapeData(['caf\xe9']), "['caf\\\\xe9']") + self.assertEqual('%s' % rtf._EscapeData({"a": "caf\xe9"}), + "{'a': 'caf\\\\xe9'}") +# self.assertEqual('%s' % rtf._EscapeData({"caf\xe9": "bar"}), +# "{'caf\xe9': 'bar'}") + self.assertEqual('caf\\xe9', StringEscape(u'caf\xe9')) + self.assertEqual('caf\\xe9', ("%s" % StringEscape(u'caf\xe9'))) + "forin": true, + dcmd mv ../*ges built/ + run: autopkgtest --output-dir=test-output built/*ges -- null diff --git a/.codespellignorewords b/.codespellignorewords new file mode 100644 index 0000000000..e32d26cb00 --- /dev/null +++ b/.codespellignorewords @@ -0,0 +1,5 @@ +acn +ACN +inflight +thead +wronly diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000000..2a82324b3e --- /dev/null +++ b/.flake8 @@ -0,0 +1,4 @@ +[flake8] +max-line-length = 80 +exclude = .svn,CVS,.bzr,.hg,.git,__pycache__,.tox,*_pb2.py +ignore = E111,E114,E121,E127,E129,W504 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..fd83b118ad --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +# See: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#about-the-dependabotyml-file +version: 2 + +updates: + # Configure check for outdated GitHub Actions actions in workflows. + # See: https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot + - package-ecosystem: github-actions + directory: / # Check the repository's workflows under /.github/workflows/ + schedule: + interval: daily diff --git a/.github/problem-matcher-build-verify-trees.json b/.github/problem-matcher-build-verify-trees.json new file mode 100644 index 0000000000..dc06df4c17 --- /dev/null +++ b/.github/problem-matcher-build-verify-trees.json @@ -0,0 +1,15 @@ +{ + "problemMatcher": [ + { + "owner": "build-verify-trees", + "severity": "error", + "pattern": [ + { + "regexp": "^(Missing from tarball)(\\s+)(.+)$", + "message": 1, + "file": 3 + } + ] + } + ] +} diff --git a/.github/problem-matcher-lint-check-licences.json b/.github/problem-matcher-lint-check-licences.json new file mode 100644 index 0000000000..33b3fcfb2f --- /dev/null +++ b/.github/problem-matcher-lint-check-licences.json @@ -0,0 +1,16 @@ +{ + "problemMatcher": [ + { + "owner": "lint-check-licences", + "pattern": [ + { + "regexp": "^(notice|error)(:(file|dir):([^:]+)(:lines? (\\d+)(-(\\d+))?)?)?: (.+)$", + "severity": 1, + "file": 4, + "line": 6, + "message": 9 + } + ] + } + ] +} diff --git a/.github/problem-matcher-lint-cpplint.json b/.github/problem-matcher-lint-cpplint.json new file mode 100644 index 0000000000..0ca1d6199c --- /dev/null +++ b/.github/problem-matcher-lint-cpplint.json @@ -0,0 +1,17 @@ +{ + "problemMatcher": [ + { + "owner": "lint-cpplint", + "severity": "error", + "pattern": [ + { + "regexp": "^(.+):(\\d+):\\s+((.+)\\s+\\[(.*)\\]\\s\\[(.*)\\])$", + "file": 1, + "line": 2, + "message": 3, + "code": 5 + } + ] + } + ] +} diff --git a/.github/problem-matcher-lint-generic-nolints.json b/.github/problem-matcher-lint-generic-nolints.json new file mode 100644 index 0000000000..114c9b1663 --- /dev/null +++ b/.github/problem-matcher-lint-generic-nolints.json @@ -0,0 +1,16 @@ +{ + "problemMatcher": [ + { + "owner": "lint-generic-nolints", + "pattern": [ + { + "regexp": "^(notice|error)(:(file|dir):([^:]+)(:lines? (\\d+)(-(\\d+))?)?)?: (.+)$", + "severity": 1, + "file": 4, + "line": 6, + "message": 9 + } + ] + } + ] +} diff --git a/.github/problem-matcher-lint-spellintian.json b/.github/problem-matcher-lint-spellintian.json new file mode 100644 index 0000000000..d53fdd5294 --- /dev/null +++ b/.github/problem-matcher-lint-spellintian.json @@ -0,0 +1,15 @@ +{ + "problemMatcher": [ + { + "owner": "lint-spellintian", + "severity": "warning", + "pattern": [ + { + "regexp": "^([^:]+):(\\s+)(.+)$", + "file": 1, + "message": 3 + } + ] + } + ] +} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000000..8408df474e --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,200 @@ +name: build +on: [push, pull_request] +jobs: + build: + name: "${{ matrix.id }}" + runs-on: ubuntu-latest + container: ${{ matrix.container }} + timeout-minutes: 360 + strategy: + fail-fast: false + matrix: + include: + - id: "coverage-debian-stable-amd64-gcc" + task: "coverage" + configure-args: "--enable-ja-rule --enable-e133 --enable-unittests --enable-gcov" + # TODO(Perry): Fix Debian 12 OOM issue on GitHub Actions + container: "debian:stable" + compiler: + CC: "/usr/bin/gcc" + CXX: "/usr/bin/g++" + pkg: "gcc g++" + - id: "distcheck-debian-stable-amd64-gcc" + task: "distcheck" + configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests" + # TODO(Perry): Fix Debian 12 OOM issue on GitHub Actions + container: "debian:stable" + compiler: + CC: "/usr/bin/gcc" + CXX: "/usr/bin/g++" + pkg: "gcc g++" + - id: "distcheck-debian-stable-amd64-clang" + task: "distcheck" + configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests" + # TODO(Perry): Fix Debian 12 OOM issue on GitHub Actions + container: "debian:stable" + compiler: + CC: "/usr/bin/clang" + CXX: "/usr/bin/clang++" + pkg: "clang" + env: + CC: "${{ matrix.compiler.CC }}" + CXX: "${{ matrix.compiler.CXX }}" + steps: + - name: Get number of CPU cores + id: num-cpu-cores + # TODO(Perry): Parallelization causes GH Actions to hang -j${{ steps.num-cpu-cores.outputs.NUM_CPU_CORES }} + # run: echo "NUM_CPU_CORES=$(grep -c processor /proc/cpuinfo)" >> $GITHUB_OUTPUT + run: echo "NUM_CPU_CORES=1" >> $GITHUB_OUTPUT + - name: Update package database + run: apt-get update -y + # See comments beginning at + # https://github.com/actions/runner/issues/763#issuecomment-1435474884 + # Without Git, actions/checkout@v4 will resort to REST and will not + # create a .git folder or .git.config. The Problem Matcher looks for + # .git/config to find where the root of the repo is, so it must be + # present. + - name: Install Git + run: apt-get -y install git + - uses: actions/checkout@v4 + - name: Install build tools + shell: bash + run: | + apt-get -y install adduser sudo pkg-config libtool autoconf \ + automake g++ bison flex make bash-completion dh-autoreconf \ + debhelper devscripts wget python3-full python3-pip + - name: Setup Python venv + shell: bash + run: | + python3 -m venv --system-site-packages ../venv + source ../venv/bin/activate + echo "PATH=$PATH" >> $GITHUB_ENV + - name: Install Python build tools + run: python3 -m pip install --no-input gcovr + - name: Install build dependencies + shell: bash + run: | + apt-get -y install libcppunit-dev uuid-dev libncurses5-dev \ + libmicrohttpd-dev protobuf-compiler python3-protobuf \ + libprotobuf-dev libprotoc-dev zlib1g-dev libftdi-dev \ + libusb-1.0-0-dev liblo-dev libavahi-client-dev python3-numpy \ + default-jdk-headless maven + - name: Install compiler + shell: bash + run: apt-get -y install ${{ matrix.compiler.pkg }} + - name: Set up build user # CredentialsTest cannot run as root + run: | + adduser --disabled-password --gecos "" builduser + chown -R builduser:builduser . + chown builduser:builduser .. + - name: Autoreconf + run: sudo --preserve-env -u builduser env "PATH=$PATH" autoreconf -i + - name: Set configure arguments + # Env var name DISTCHECK_CONFIGURE_FLAGS must be used, see #1881 and #1883 + run: | + echo "DISTCHECK_CONFIGURE_FLAGS=${{ matrix.configure-args }}" >> $GITHUB_ENV + - name: Set additional Linux configure arguments + if: runner.os == 'Linux' + # Silence all deprecated declarations on Linux due to auto_ptr making the build log too long + run: | + echo "DISTCHECK_CONFIGURE_FLAGS=$DISTCHECK_CONFIGURE_FLAGS CPPFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV + - name: Print configure command + run: echo "./configure $DISTCHECK_CONFIGURE_FLAGS" + - name: Configure + run: sudo --preserve-env -u builduser env "PATH=$PATH" ./configure $DISTCHECK_CONFIGURE_FLAGS + - name: ${{ matrix.task }} + run: sudo --preserve-env -u builduser env "PATH=$PATH" make ${{ matrix.task }} -j${{ steps.num-cpu-cores.outputs.NUM_CPU_CORES }} VERBOSE=1 + - name: Display structure of the built files + if: always() && env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Archive artifacts to speed up slow GH Actions upload/download + if: always() + shell: bash + # If the file does not exist when tar excludes it, then it will not + # actually exclude it, so it must first be touched + run: | + touch ola-${{ matrix.id }}-source-tree.tar.gz + tar --exclude=ola-${{ matrix.id }}-source-tree.tar.gz -cvzf ola-${{ matrix.id }}-source-tree.tar.gz . + - name: SHA256 artifact archives + if: always() + run: sha256sum ola-*.tar.gz + - name: Upload source tree artifact + uses: actions/upload-artifact@v3 + if: always() + with: + name: ola-${{ matrix.id }}-source-tree + path: ola-${{ matrix.id }}-source-tree.tar.gz + - name: Upload built artifact + if: matrix.task == 'distcheck' || matrix.task == 'dist' + uses: actions/upload-artifact@v3 + with: + name: ola-${{ matrix.id }}-dist + path: | + ola-*.tar.gz + !ola-${{ matrix.id }}-source-tree.tar.gz + - name: Install coverage tools + if: matrix.task == 'coverage' + run: apt-get -y install curl + - name: Upload coverage to Coveralls + if: matrix.task == 'coverage' + uses: coverallsapp/github-action@v2 + with: + # Coveralls GitHub action does not support its own format + # see: https://github.com/coverallsapp/github-action/issues/104 + # file: coverage/coverage.coveralls.json + file: coverage/coverage.cobertura.xml + format: cobertura + flag-name: ${{ matrix.id }} + - name: Upload coverage artifacts + if: always() && matrix.task == 'coverage' + uses: actions/upload-artifact@v3 + with: + name: ola-${{ matrix.id }}-coverage + path: coverage/ + verify-trees: + name: 'Verify trees for ${{ matrix.id }}' + needs: build + if: "always()" # Run if some builds fail but ensure they all complete first + container: debian:stable + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - id: "distcheck-debian-stable-amd64-gcc" + - id: "distcheck-debian-stable-amd64-clang" + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-${{ matrix.id }}-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-${{ matrix.id }}-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-${{ matrix.id }}-source-tree.tar.gz . + rm ola-${{ matrix.id }}-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install Python + run: apt-get -y install python3 python-is-python3 + # TODO(Perry): Disable problem matcher for now until verify trees is fixed + # - name: Enable Problem Matcher for GitHub annotations + # run: echo "::add-matcher::.github/problem-matcher-build-verify-trees.json" + - name: Find dist build tarball + run: | + echo "GH_OLA_VERIFY_TREES_TARBALL=$(ls -t --time=birth ola*.tar.gz| head -1)" >> $GITHUB_ENV + - name: Print dist build tarball name + run: echo "$GH_OLA_VERIFY_TREES_TARBALL" + - name: Extract dist build + run: tar -xvzf $GH_OLA_VERIFY_TREES_TARBALL + - name: Verify trees + shell: bash + # TODO(Perry): Always succeed for now until verify trees is fixed + # run: ./scripts/verify_trees.py ./ $(echo $GH_OLA_VERIFY_TREES_TARBALL | sed 's/.tar.gz$//') + run: "./scripts/verify_trees.py ./ $(echo $GH_OLA_VERIFY_TREES_TARBALL | sed 's/.tar.gz$//') || true" diff --git a/.github/workflows/debian.yml b/.github/workflows/debian.yml new file mode 100644 index 0000000000..0ae5317ba0 --- /dev/null +++ b/.github/workflows/debian.yml @@ -0,0 +1,92 @@ +# This action originally modeled off of the Debian build action: +# https://salsa.debian.org/wouter/ola/-/blob/a38a396f6994b2b1af8efec9e208aee4e67f77aa/.gitlab-ci.yml + +name: debian +on: [push, pull_request] +jobs: + debian-build: + name: 'Debian Build ${{ matrix.image_tag }} ${{ matrix.architecture }}' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + image_tag: [bullseye, bookworm, trixie, sid] + architecture: [amd64] + container: debian:${{ matrix.image_tag }} + steps: + - name: Get number of CPU cores + run: echo "NUM_CPU_CORES=$(grep -c processor /proc/cpuinfo)" >> $GITHUB_OUTPUT + id: num-cpu-cores + - name: Update package database + run: apt-get update -y + # See comments beginning at + # https://github.com/actions/runner/issues/763#issuecomment-1435474884 + # Without Git, actions/checkout@v4 will resort to REST and will not + # create a .git folder or .git.config. The Problem Matcher looks for + # .git/config to find where the root of the repo is, so it must be + # present. + - name: Install Git + run: apt-get -y install git + - uses: actions/checkout@v4 + - name: Install build tools + run: apt-get -y install devscripts adduser fakeroot sudo + - name: Install build dependencies + run: mk-build-deps -t "apt-get -y -o Debug::pkgProblemResolver=yes --no-install-recommends" -i -r + - name: Set up build user + run: | + adduser --disabled-password --gecos "" builduser + chown -R builduser:builduser . + chown builduser:builduser .. + - name: Build + run: sudo -u builduser dpkg-buildpackage -b -rfakeroot -j${{ steps.num-cpu-cores.outputs.NUM_CPU_CORES }} + - name: Move built files + if: always() + run: | + mkdir built + dcmd mv ../*ges built/ + - name: Display structure of built files + if: always() + run: ls -alR + working-directory: built + - name: SHA256 built files + if: always() + shell: bash + run: find . -type f -exec sha256sum {} \; + working-directory: built + - uses: actions/upload-artifact@v3 + if: always() + with: + name: ola-built-debian-${{ matrix.image_tag }}-${{ matrix.architecture }} + path: ./built + debian-test: + name: 'Debian Test ${{ matrix.image_tag }} ${{ matrix.architecture }}' + needs: debian-build + if: "always()" # Run if some builds fail but ensure they all complete first + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + image_tag: [bullseye, bookworm, trixie, sid] + architecture: [amd64] + container: debian:${{ matrix.image_tag }} + steps: + - uses: actions/checkout@master + - name: Download build artifact + uses: actions/download-artifact@v3 + with: + name: ola-built-debian-${{ matrix.image_tag }}-${{ matrix.architecture }} + path: built + - name: Display structure of artifact files + run: ls -alR + working-directory: built + - name: Update package database + run: apt-get update -y + - name: Install test tools + run: apt-get -y install autopkgtest + - name: Test + run: autopkgtest --output-dir=test-output built/*ges -- null + - uses: actions/upload-artifact@v3 + if: always() # Always upload the test output, even on failed tests + with: + name: ola-test-output-debian-${{ matrix.image_tag }}-${{ matrix.architecture }} + path: test-output diff --git a/.github/workflows/isort.yml b/.github/workflows/isort.yml new file mode 100644 index 0000000000..9aff6b16d1 --- /dev/null +++ b/.github/workflows/isort.yml @@ -0,0 +1,12 @@ +name: isort + +on: + - push + - pull_request + +jobs: + isort: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: isort/isort-action@v1 diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000000..0c49e768a0 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,275 @@ +name: lint +on: [push, pull_request] +jobs: + build: + name: Build for Lint Tasks + runs-on: ubuntu-latest + container: debian:stable + steps: + - name: Update package database + run: apt-get update -y + # See comments beginning at + # https://github.com/actions/runner/issues/763#issuecomment-1435474884 + # Without Git, actions/checkout@v4 will resort to REST and will not + # create a .git folder or .git.config. The Problem Matcher looks for + # .git/config to find where the root of the repo is, so it must be + # present. + - name: Install Git + run: apt-get -y install git + - uses: actions/checkout@v4 + - name: Install build tools + shell: bash + run: | + apt-get -y install pkg-config libtool autoconf \ + automake g++ bison flex make bash-completion dh-autoreconf \ + debhelper devscripts wget python3-full python3-pip + - name: Setup Python venv + shell: bash + run: | + python3 -m venv --system-site-packages ../venv + source ../venv/bin/activate + echo "PATH=$PATH" >> $GITHUB_ENV + - name: Install Python lint tools + run: python3 -m pip install --no-input cpplint flake8 + - name: Install build dependencies + shell: bash + run: | + apt-get -y install libcppunit-dev uuid-dev libncurses5-dev \ + libmicrohttpd-dev protobuf-compiler python3-protobuf \ + libprotobuf-dev libprotoc-dev zlib1g-dev libftdi-dev \ + libusb-1.0-0-dev liblo-dev libavahi-client-dev python3-numpy + - name: Autoreconf + run: autoreconf -i + - name: Configure + run: ./configure --enable-rdm-tests --enable-ja-rule --enable-e133 + - name: Build builtfiles + run: make builtfiles VERBOSE=1 + - name: Display structure of the built files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Archive artifacts to speed up slow GH Actions upload/download + shell: bash + # If the file does not exist when tar excludes it, then it will not + # actually exclude it, so it must first be touched + run: | + touch ola-debian-stable-built-source-tree.tar.gz + tar --exclude=ola-debian-stable-built-source-tree.tar.gz -cvzf ola-debian-stable-built-source-tree.tar.gz . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - uses: actions/upload-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: ola-debian-stable-built-source-tree.tar.gz + check-licences: + name: Check Licences + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install Python + run: apt-get -y install python3 python-is-python3 + - name: Enable Problem Matcher for GitHub annotations + run: echo "::add-matcher::.github/problem-matcher-lint-check-licences.json" + - name: Check licenses + shell: bash + run: ./scripts/enforce_licence.py + generic-nolints: + name: Count generic NOLINTs + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Enable Problem Matcher for GitHub annotations + run: echo "::add-matcher::.github/problem-matcher-lint-generic-nolints.json" + - name: Count the number of generic NOLINTs + shell: bash + run: ./scripts/count_generic_nolints.sh + cpplint: + name: cpplint + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install build tools + run: apt-get -y install make python3-full python3-pip + - name: Setup Python venv + shell: bash + run: | + python3 -m venv --system-site-packages ../venv + source ../venv/bin/activate + echo "PATH=$PATH" >> $GITHUB_ENV + - name: Install Python lint tools + run: python3 -m pip install --no-input cpplint + - name: Enable Problem Matcher for GitHub annotations + run: echo "::add-matcher::.github/problem-matcher-lint-cpplint.json" + - name: cpplint + run: make cpplint VERBOSE=1 + flake8: + name: flake8 + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install build tools + run: apt-get -y install make python3-full python3-pip + - name: Setup Python venv + shell: bash + run: | + python3 -m venv --system-site-packages ../venv + source ../venv/bin/activate + echo "PATH=$PATH" >> $GITHUB_ENV + - name: Install Python lint tools + run: python3 -m pip install --no-input flake8 + - name: Setup flake8 annotations + uses: rbialon/flake8-annotations@v1 + - name: flake8 + run: make flake8 VERBOSE=1 + spellintian: + name: spellintian + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install lint tools + run: apt-get -y install moreutils lintian + - name: Enable Problem Matcher for GitHub annotations + run: echo "::add-matcher::.github/problem-matcher-lint-spellintian.json" + - name: spellintian + run: ./scripts/spelling.sh spellintian + codespell: + name: codespell + runs-on: ubuntu-latest + container: debian:stable + needs: build + steps: + - name: Download built source tree archive + uses: actions/download-artifact@v3 + with: + name: ola-debian-stable-built-source-tree + path: . + - name: SHA256 artifact archive + run: sha256sum ola-debian-stable-built-source-tree.tar.gz + - name: Unarchive artifacts and delete archive + shell: bash + run: | + tar -xvzf ola-debian-stable-built-source-tree.tar.gz . + rm ola-debian-stable-built-source-tree.tar.gz + - name: Display structure of extracted files + if: env.ACTIONS_STEP_DEBUG == 'true' + run: ls -alR + - name: Update package database + run: apt-get update -y + - name: Install lint tools + run: apt-get -y install python3-full python3-pip git moreutils + - name: Setup Python venv + shell: bash + run: | + python3 -m venv --system-site-packages ../venv + source ../venv/bin/activate + echo "PATH=$PATH" >> $GITHUB_ENV + - name: Install Python lint tools + run: python3 -m pip install --no-input git+https://github.com/codespell-project/codespell.git + - name: Setup codespell annotations + uses: codespell-project/codespell-problem-matcher@v1 + - name: codespell + run: ./scripts/spelling.sh codespell + weblint: + name: weblint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js v18 + uses: actions/setup-node@v3 + with: + node-version: 18 # LTS + cache: 'npm' + cache-dependency-path: './javascript/new-src/package-lock.json' + - name: Install npm dependencies + run: npm ci + working-directory: ./javascript/new-src + - name: Run weblint + run: npm test + working-directory: ./javascript/new-src diff --git a/.gitignore b/.gitignore index aa21db4eeb..1fc667a291 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ config.h.in~ config.log config.status configure +coverage/ +cpplint.py doxygen_entrydb_*.tmp doxygen_objdb_*.tmp html/ @@ -174,6 +176,7 @@ libs/acn/e131_loadtest libs/acn/e131_loadtest.exe libs/acn/e131_transmit_test libs/acn/e131_transmit_test.exe +ola-*/ ola.spec olad/olad olad/olad.exe @@ -185,10 +188,17 @@ protoc/ola_protoc protoc/ola_protoc.exe protoc/ola_protoc_plugin protoc/ola_protoc_plugin.exe +python/PyCompileTest.sh python/examples/ola_rdm_set.py +python/ola/ClientWrapperTest.sh +python/ola/OlaClientTest.sh python/ola/PidStoreLocation.py +python/ola/PidStoreTest.sh +python/ola/RDMTest.sh python/ola/Version.py python/ola/rpc/SimpleRpcControllerTest.sh +python/ola/testing/ +python/ola/testing/__init__.py slp/slp_client slp/slp_client.exe slp/slp_server @@ -218,6 +228,11 @@ tools/ola_trigger/ola_trigger tools/ola_trigger/ola_trigger.exe tools/ola_trigger/FileValidateTest.sh tools/rdm/DataLocation.py +tools/rdm/ExpectedResultsTest.sh +tools/rdm/ResponderTestTest.sh +tools/rdm/TestHelpersTest.sh +tools/rdm/TestRunnerTest.sh +tools/rdm/TestStateTest.sh tools/rdmpro/rdmpro_sniffer tools/rdmpro/rdmpro_sniffer.exe tools/slp/slp_client diff --git a/.travis-ci.sh b/.travis-ci.sh index ff4d29fc64..f76f7b72e5 100755 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -10,7 +10,8 @@ CPP_LINT_URL="https://raw.githubusercontent.com/google/styleguide/gh-pages/cppli COVERITY_SCAN_BUILD_URL="https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" SPELLINGBLACKLIST=$(cat <<-BLACKLIST - -wholename "./.codespellignore" -or \ + -wholename "./.codespellignorewords" -or \ + -wholename "./.codespellignorelines" -or \ -wholename "./.git/*" -or \ -wholename "./aclocal.m4" -or \ -wholename "./config/config.guess" -or \ @@ -52,7 +53,7 @@ if [[ $TASK = 'lint' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for linting to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" # first check we've not got any generic NOLINTs # count the number of generic NOLINTs @@ -65,23 +66,8 @@ if [[ $TASK = 'lint' ]]; then else echo "Found $nolints generic NOLINTs" fi; - # then fetch and run the main cpplint tool - wget -O cpplint.py $CPP_LINT_URL; - chmod u+x cpplint.py; - ./cpplint.py \ - --filter=-legal/copyright,-readability/streams,-runtime/arrays \ - $(find ./ \( -name "*.h" -or -name "*.cpp" \) -and ! \( \ - -wholename "./common/protocol/Ola.pb.*" -or \ - -wholename "./common/rpc/Rpc.pb.*" -or \ - -wholename "./common/rpc/TestService.pb.*" -or \ - -wholename "./common/rdm/Pids.pb.*" -or \ - -wholename "./config.h" -or \ - -wholename "./plugins/*/messages/*ConfigMessages.pb.*" -or \ - -wholename "./tools/ola_trigger/config.tab.*" -or \ - -wholename "./tools/ola_trigger/lex.yy.cpp" \) | xargs) - if [[ $? -ne 0 ]]; then - exit 1; - fi; + # run the cpplint tool, fetching it if necessary + make cpplint VERBOSE=1 elif [[ $TASK = 'check-licences' ]]; then # check licences only if it is the requested task travis_fold start "autoreconf" @@ -93,7 +79,7 @@ elif [[ $TASK = 'check-licences' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for licence checking to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" ./scripts/enforce_licence.py if [[ $? -ne 0 ]]; then @@ -110,7 +96,7 @@ elif [[ $TASK = 'spellintian' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for spellintian to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" spellingfiles=$(eval "find ./ -type f -and ! \( \ $SPELLINGBLACKLIST \ @@ -136,7 +122,7 @@ elif [[ $TASK = 'spellintian-duplicates' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for spellintian to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" spellingfiles=$(eval "find ./ -type f -and ! \( \ $SPELLINGBLACKLIST \ @@ -162,16 +148,16 @@ elif [[ $TASK = 'codespell' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for codespell to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" spellingfiles=$(eval "find ./ -type f -and ! \( \ $SPELLINGBLACKLIST \ \) | xargs") # count the number of codespell errors - spellingerrors=$(zrun codespell --check-filenames --check-hidden --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignore $spellingfiles 2>&1 | wc -l) + spellingerrors=$(zrun codespell --check-filenames --check-hidden --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignorelines --ignore-words .codespellignorewords $spellingfiles 2>&1 | wc -l) if [[ $spellingerrors -ne 0 ]]; then - # print the output for info - zrun codespell --check-filenames --check-hidden --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignore $spellingfiles + # print the output for info, including the count + zrun codespell --count --check-filenames --check-hidden --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignorelines --ignore-words .codespellignorewords $spellingfiles echo "Found $spellingerrors spelling errors via codespell" exit 1; else @@ -189,13 +175,13 @@ elif [[ $TASK = 'doxygen' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for Doxygen to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" # count the number of warnings warnings=$(make doxygen-doc 2>&1 >/dev/null | wc -l) if [[ $warnings -ne 0 ]]; then # print the output for info - make doxygen-doc + make doxygen-doc VERBOSE=1 echo "Found $warnings doxygen warnings" exit 1; else @@ -214,7 +200,7 @@ elif [[ $TASK = 'coverage' ]]; then make; travis_fold end "make" travis_fold start "make_check" - make check; + make check VERBOSE=1; travis_fold end "make_check" elif [[ $TASK = 'coverity' ]]; then # Run Coverity Scan unless token is zero length @@ -241,11 +227,12 @@ elif [[ $TASK = 'flake8' ]]; then # the following is a bit of a hack to build the files normally built during # the build, so they are present for flake8 to run against travis_fold start "make_builtfiles" - make builtfiles; + make builtfiles VERBOSE=1; travis_fold end "make_builtfiles" - flake8 --max-line-length 80 --exclude *_pb2.py,.git,__pycache --ignore E111,E114,E121,E127,E129,W504 data/rdm include/ola python scripts tools/ola_mon tools/rdm + make flake8 else # Otherwise compile and check as normal + # Env var name DISTCHECK_CONFIGURE_FLAGS must be used, see #1881 and #1883 if [[ "$TRAVIS_OS_NAME" = "linux" ]]; then # Silence all deprecated declarations on Linux due to auto_ptr making the build log too long export DISTCHECK_CONFIGURE_FLAGS='--enable-rdm-tests --enable-ja-rule --enable-e133 CPPFLAGS=-Wno-deprecated-declarations' @@ -259,7 +246,7 @@ else ./configure $DISTCHECK_CONFIGURE_FLAGS; travis_fold end "configure" travis_fold start "make_distcheck" - make distcheck; + make distcheck VERBOSE=1; travis_fold end "make_distcheck" travis_fold start "make_dist" make dist; diff --git a/.travis.yml b/.travis.yml index de742d2b26..96fd12eb92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,4 @@ language: cpp -# Default to the fully visualised "sudo" GCE environments, as they are faster for longer running jobs. We don't actually need sudo -sudo: required # Use the latest Travis images since they are more up to date than the stable release. group: edge @@ -33,73 +31,195 @@ addons: - libavahi-glib1 - libncurses5-dev - libmicrohttpd-dev + packages: &core_build_clang_recent + - *core_build + - clang-10 packages: &core_build_gpp_latest - *core_build - - g++-8 + - g++-10 packages: &core_build_clang_latest - *core_build - - clang-6.0 + - clang-11 + packages: &bionic_build_extras + # To fix the build/add missing components + - libtool + - pkg-config + packages: &bionic_build_extras_python2 + - *bionic_build_extras + - python-protobuf + - python-numpy + - python-pip + packages: &bionic_build_extras_python3 + - *bionic_build_extras + # The apt packaged files don't seem to work with Bionic and Python 3, so do it via pip + # To compile numpy + - python3-dev +# - python3-protobuf +# - python3-numpy +# - python3-pip + homebrew: + packages: &mac_core_build + - ccache + # This is all the bits we need to enable all options on Mac + - bison + - flex + # Installing via the addon isn't currently working so do it the old fashioned way below + # - https://raw.githubusercontent.com/Homebrew/homebrew-core/024ca9a4730a1f26ceede43485fbf62ef6f41179%5E/Formula/protobuf@3.1.rb + - liblo + - libmicrohttpd + - ossp-uuid + # Looks like this is Python 3 only, so install via pip + # - numpy + - libusb + packages: &mac_cppunit_113 + # Installing via the addon isn't currently working so do it the old fashioned way below + # - https://raw.githubusercontent.com/Homebrew/homebrew-core/e6e43cf6a3^/Formula/cppunit.rb # install a slightly older cppunit, as latest needs C++11 support -matrix: +jobs: fast_finish: true include: - - os: osx - osx_image: xcode9.3 - compiler: clang - env: - - TASK='compile' - - CPPUNIT='1.13' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: clang + - os: linux + dist: bionic + arch: arm64 + env: TASK='doxygen' + addons: + apt: + packages: + - *core_build_gpp_latest + - *bionic_build_extras_python2 + - doxygen + - graphviz + sources: + - ubuntu-toolchain-r-test + - os: linux + dist: bionic + arch: arm64 + env: TASK='lint' + addons: + apt: + packages: + - *core_build + - *bionic_build_extras_python2 + - os: linux + dist: bionic + arch: arm64 env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: gcc + - TASK='check-licences' + - PYTHON='python3' + addons: + apt: + packages: + - *core_build + - *bionic_build_extras_python3 + - os: linux + dist: bionic + arch: arm64 env: - - TASK='compile' - - CPPUNIT='1.13' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: gcc + - TASK='codespell' + - PYTHON='python3' + addons: + apt: + packages: + - *core_build + - *bionic_build_extras_python3 + - moreutils + - os: linux + dist: bionic + arch: arm64 + env: TASK='jshint' + addons: + apt: + packages: + - os: linux + dist: bionic + arch: arm64 + env: TASK='flake8' + python: '2.7' + addons: + apt: + packages: + - *base_build + - *bionic_build_extras_python2 + - os: linux + dist: bionic + arch: arm64 env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 + - TASK='flake8' + - PYTHON='python3' + addons: + apt: + packages: + - *base_build + - *bionic_build_extras_python3 +# Only run Travis builds against the zero credit partner queue solution +# - os: linux +# dist: bionic +# arch: amd64 +# compiler: clang +# env: +# - TASK='compile' +# - PYTHON='python3' +# addons: +# apt: +# packages: +# - *core_build_clang_latest +# - *bionic_build_extras_python3 +# sources: +# - sourceline: "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" +# key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key" +# - sourceline: "ppa:ubuntu-toolchain-r/test" +# - os: linux +# dist: bionic +# arch: amd64 +# compiler: gcc +# env: TASK='compile' +# python: '2.7' +# addons: +# apt: +# packages: +# - *core_build_gpp_latest +# - *bionic_build_extras_python2 +# sources: +# - ubuntu-toolchain-r-test + - os: linux + dist: bionic + arch: arm64 compiler: clang env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='1' - - os: osx - osx_image: xcode9.3 + - TASK='compile' + - PYTHON='python3' + addons: + apt: + packages: + - *core_build_clang_recent + - *bionic_build_extras_python3 + - os: linux + dist: bionic + arch: arm64 compiler: gcc - env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='1' + env: TASK='compile' + python: '2.7' + addons: + apt: + packages: + - *core_build_gpp_latest + - *bionic_build_extras_python2 + sources: + - ubuntu-toolchain-r-test - os: linux - dist: xenial + dist: bionic + arch: s390x compiler: clang env: TASK='compile' python: '2.7' addons: apt: packages: - - *core_build_clang_latest - sources: - - sourceline: "ppa:ubuntu-toolchain-r/test" - - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-6.0 main" - key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key" + - *core_build_clang_recent + - *bionic_build_extras_python2 - os: linux - dist: xenial + dist: bionic + arch: s390x compiler: gcc env: TASK='compile' python: '2.7' @@ -107,10 +227,108 @@ matrix: apt: packages: - *core_build_gpp_latest + - *bionic_build_extras_python2 sources: - - sourceline: "ppa:ubuntu-toolchain-r/test" + - ubuntu-toolchain-r-test +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.13' +# - PROTOBUF='latest' +# - LIBFTDI='0' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - *mac_cppunit_113 +# - protobuf +# - libftdi0 +# update: false +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.13' +# - PROTOBUF='latest' +# - LIBFTDI='0' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - *mac_cppunit_113 +# - protobuf +# - libftdi0 +# update: false +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - PROTOBUF='latest' +# - LIBFTDI='0' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - cppunit +# - protobuf +# - libftdi0 +# update: false +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - PROTOBUF='latest' +# - LIBFTDI='0' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - cppunit +# - protobuf +# - libftdi0 +# update: false +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - PROTOBUF='latest' +# - LIBFTDI='1' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - cppunit +# - protobuf +# - libftdi # install the latest cppunit, which needs C++11 +# update: false +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - PROTOBUF='latest' +# - LIBFTDI='1' +# addons: +# homebrew: +# packages: +# - *mac_core_build +# - cppunit +# - protobuf +# - libftdi # install the latest cppunit, which needs C++11 +# update: false - os: linux - dist: xenial + dist: bionic + arch: arm64 compiler: gcc env: TASK='coverage' addons: @@ -121,6 +339,7 @@ matrix: - sourceline: "ppa:ubuntu-toolchain-r/test" - os: linux dist: xenial + arch: arm64 compiler: gcc env: TASK='coverity' addons: @@ -132,123 +351,103 @@ matrix: sources: - sourceline: "ppa:ubuntu-toolchain-r/test" - os: linux - dist: xenial - env: TASK='doxygen' - addons: - apt: - packages: - - *core_build_gpp_latest - - doxygen - - graphviz - sources: - - sourceline: "ppa:ubuntu-toolchain-r/test" - - os: linux - dist: xenial - env: TASK='lint' - addons: - apt: - packages: - - *core_build - - os: linux - dist: xenial - env: TASK='check-licences' - addons: - apt: - packages: - - *core_build - - os: linux - dist: xenial + dist: bionic + arch: arm64 env: TASK='spellintian' addons: apt: packages: - *core_build + - *bionic_build_extras_python2 + - lintian - moreutils - os: linux - dist: xenial + dist: bionic + arch: arm64 env: TASK='spellintian-duplicates' addons: apt: packages: - *core_build + - *bionic_build_extras_python2 + - lintian - moreutils - - os: linux - dist: xenial - env: TASK='codespell' - addons: - apt: - packages: - - *core_build - - moreutils - - os: linux - dist: xenial - env: TASK='jshint' - addons: - apt: - packages: - - os: linux - dist: xenial - env: TASK='flake8' - addons: - apt: - packages: - - *base_build allow_failures: +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.13' +# - LIBFTDI='0' +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - LIBFTDI='0' +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.13' +# - LIBFTDI='0' +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - LIBFTDI='0' +# - os: osx +# osx_image: xcode9.4 +# compiler: clang +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - LIBFTDI='1' +# - os: osx +# osx_image: xcode9.4 +# compiler: gcc +# env: +# - TASK='compile' +# - CPPUNIT='1.14' +# - LIBFTDI='1' - os: osx - osx_image: xcode9.3 - compiler: clang - env: - - TASK='compile' - - CPPUNIT='1.13' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: clang - env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: gcc - env: - - TASK='compile' - - CPPUNIT='1.13' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 - compiler: gcc - env: - - TASK='compile' - - CPPUNIT='1.14' - - LIBFTDI='0' - - os: osx - osx_image: xcode9.3 + osx_image: xcode9.4 compiler: clang env: - TASK='compile' - CPPUNIT='1.14' + - PROTOBUF='latest' - LIBFTDI='1' - os: osx - osx_image: xcode9.3 + osx_image: xcode9.4 compiler: gcc env: - TASK='compile' - CPPUNIT='1.14' + - PROTOBUF='latest' - LIBFTDI='1' - os: linux - dist: xenial + dist: bionic + arch: arm64 compiler: gcc env: TASK='coverage' - os: linux dist: xenial + arch: arm64 compiler: gcc env: TASK='coverity' - os: linux - dist: xenial + dist: bionic + arch: arm64 env: TASK='spellintian' - os: linux - dist: xenial + dist: bionic + arch: arm64 env: TASK='spellintian-duplicates' env: @@ -275,59 +474,85 @@ env: cache: apt: true + ccache: true + npm: true + pip: true directories: - - $HOME/.cache/pip # pip cache - - $HOME/.npm # npm cache - - $HOME/.ccache # ccache cache + - $HOME/Library/Caches/Homebrew # homebrew bottle cache before_cache: - rm -f $HOME/.cache/pip/log/debug.log # erase log + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew cleanup; fi # avoid caching old package versions - ccache -s # see how many hits ccache got -install: -# Match the version of protobuf being installed via apt - - pip install --user protobuf==3.1.0 -# We need to use pip rather than apt on Xenial - - if [ "$TRAVIS_OS_NAME" == "linux" ]; then pip install --user numpy; fi - - if [ "$TASK" = "coverage" ]; then pip install --user cpp-coveralls; fi - - if [ "$TASK" = "flake8" ]; then pip install --user flake8; fi - - if [ "$TASK" = "codespell" ]; then pip install --user git+https://github.com/codespell-project/codespell.git; fi - - if [ "$TASK" = "jshint" ]; then npm install -g grunt-cli; fi - before_install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi + - if [ "$PYTHON" == "python3" -a "$TRAVIS_CPU_ARCH" != "arm64" ]; then pyenv global 3.8.1; fi +#On arm64 (at least) pip is now pip3, so symlink it to pip2 unless we're using python3. + - if [ "$PYTHON" != "python3" ]; then sudo rm /usr/local/bin/pip && sudo ln -s /usr/local/bin/pip2 /usr/local/bin/pip; fi +#Switch node to version 16 LTS, as newer LTS ones don't work with Ubuntu 18.04 and some older ones are too old + - if [ "$TASK" = "jshint" ]; then nvm install 16 && nvm use 16; fi +#Fix permissions for unbound (and possibly others) + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then if [ ! -d /usr/local/sbin ]; then sudo mkdir -p /usr/local/sbin && sudo chown -R $(whoami) /usr/local/sbin; fi; fi +#Add a missing gnupg folder + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then if [ ! -d /usr/local/Cellar/gnupg2/2.2.5 ]; then sudo mkdir -p /usr/local/Cellar/gnupg2/2.2.5 && sudo chown -R $(whoami) /usr/local/Cellar/gnupg2/2.2.5; fi; fi +#We install packages via brew which pull in numpy, so try a reinstall over the pip numpy to avoid conflicts + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew reinstall numpy || brew link --overwrite numpy; fi #Fix a broken homebrew libtool install - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew reinstall libtool; fi +#Fix a broken homebrew gnupg install + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew uninstall --ignore-dependencies gnupg; fi #Fix a broken homebrew python upgrade - see https://github.com/Homebrew/homebrew-core/issues/26358 - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew upgrade python || true; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then if [ ! -d /usr/local/sbin ]; then sudo mkdir -p /usr/local/sbin && sudo chown -R $(whoami) /usr/local/sbin; fi; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ccache bison flex protobuf@3.1 liblo libmicrohttpd; fi # ossp-uuid, homebrew/python/numpy and libusb already present - - if [ "$TRAVIS_OS_NAME" == "osx" -a "$LIBFTDI" != "1" ]; then brew install libftdi0; fi # install libftdi0 - - if [ "$TRAVIS_OS_NAME" == "osx" -a "$LIBFTDI" == "1" ]; then brew install libftdi; fi # install the latest libftdi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew link -f protobuf@3.1; export PKG_CONFIG_PATH=/usr/local/opt/protobuf@3.1/lib/pkgconfig; brew install --build-from-source --ignore-dependencies --env=std protobuf-c; fi # While protobuf is not on the latest release +#Uninstall some homebrew packages which aren't required so we don't end up updating and rebuilding them. Force so it doesn't reinstall + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew uninstall --ignore-dependencies --force cgal liblwgeom libspatialite mercurial postgis postgres sfcgal; fi +#Having fixed everything up, update to the bleeding edge +#Skip updating for now as it seems to be breaking the build, also now done via the addon +# - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi + # This is no longer allowed, so build all Mac builds as protobuf latest + #- if [ "$TRAVIS_OS_NAME" == "osx" -a "$PROTOBUF" != "latest" ]; then brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/024ca9a4730a1f26ceede43485fbf62ef6f41179%5E/Formula/protobuf@3.1.rb; fi # install protobuf 3.1 as that's the latest we support everywhere + #- if [ "$TRAVIS_OS_NAME" == "osx" -a "$PROTOBUF" != "latest" ]; then brew link -f https://raw.githubusercontent.com/Homebrew/homebrew-core/024ca9a4730a1f26ceede43485fbf62ef6f41179%5E/Formula/protobuf@3.1.rb; export PKG_CONFIG_PATH=/usr/local/opt/protobuf@3.1/lib/pkgconfig; brew install --build-from-source --ignore-dependencies --env=std protobuf-c; fi # While protobuf is not on the latest release + - if [ "$TRAVIS_OS_NAME" == "osx" -a "$PROTOBUF" != "latest" ]; then brew install protobuf@3.6; fi + - if [ "$TRAVIS_OS_NAME" == "osx" -a "$PROTOBUF" != "latest" ]; then brew link -f protobuf@3.6; export PKG_CONFIG_PATH=/usr/local/opt/protobuf@3.6/lib/pkgconfig; brew install --build-from-source --ignore-dependencies --env=std protobuf-c; fi # When protobuf is not on the latest release - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mkdir -p ${HOME}/Library/Python/2.7/lib/python/site-packages; echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> ${HOME}/Library/Python/2.7/lib/python/site-packages/homebrew.pth; fi - if [ "$TRAVIS_OS_NAME" == "osx" -a "$CPPUNIT" != "1.14" ]; then brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/e6e43cf6a3%5E/Formula/cppunit.rb; fi # install a slightly older cppunit, as latest needs C++11 support - - if [ "$TRAVIS_OS_NAME" == "osx" -a "$CPPUNIT" == "1.14" ]; then brew install cppunit; fi # install the latest cppunit, which needs C++11 - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/ccache/libexec:$PATH; fi # Use ccache on Mac too +#Put back the old pip numpy we need to work + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then pip install --upgrade --no-deps --force-reinstall --user numpy; fi #Coverity doesn't work with g++ 5 or 6, so only upgrade to g++ 4.9 for that - - if [ "$TRAVIS_OS_NAME" == "linux" -a \( "$TASK" = "compile" -o "$TASK" = "coverage" -o "$TASK" = "doxygen" \) -a "$CXX" = "g++" ]; then export CXX="ccache g++-8" CC="ccache gcc-8"; fi + - if [ "$TRAVIS_OS_NAME" == "linux" -a \( "$TASK" = "compile" -o "$TASK" = "coverage" -o "$TASK" = "doxygen" \) -a "$CXX" = "g++" ]; then export CXX="ccache g++-10" CC="ccache gcc-10"; fi - if [ "$TASK" = "coverity" -a "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi -#Use the latest clang if we're compiling with clang - - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" = "clang++" ]; then export CXX="clang++-6.0" CC="clang-6.0"; fi +#Use the latest clang if we're compiling with clang, except on arm64 and s390x where it's not available + - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" = "clang++" -a "$TRAVIS_CPU_ARCH" != "arm64" -a "$TRAVIS_CPU_ARCH" != "s390x" ]; then export CXX="clang++-11" CC="clang-11"; fi +#Use a recent clang if we're compiling with clang on arm64 or s390x as the latest isn't available + - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" = "clang++" -a \( "$TRAVIS_CPU_ARCH" == "arm64" -o "$TRAVIS_CPU_ARCH" == "s390x" \) ]; then export CXX="clang++-10" CC="clang-10"; fi #Report the compiler version - $CXX --version - - if [ "$TASK" == "spellintian" -o "$TASK" == "spellintian-duplicates" ]; then wget "http://archive.ubuntu.com/ubuntu/pool/main/l/lintian/lintian_2.5.104_all.deb"; sudo dpkg -i lintian_*.deb; sudo apt-get install -f -y; fi # Install a later lintian + +install: +# Match the version of protobuf being installed via apt/Homebrew + - if [ "$PROTOBUF" == "latest" -a \( "$TRAVIS_DIST" != "bionic" -o "$PYTHON" == "python3" \) ]; then pip install --user protobuf; fi + - if [ "$PROTOBUF" != "latest" -a \( "$TRAVIS_DIST" != "bionic" -o "$PYTHON" == "python3" \) ]; then pip install --user protobuf==3.1.0; fi + # disable until can be added to all build variants + #- pip install --user timeout-decorator +# We sometimes need to use pip rather than apt on Bionic + - if [ "$TRAVIS_OS_NAME" == "linux" -a "$TRAVIS_DIST" == "bionic" -a "$TRAVIS_CPU_ARCH" != "arm64" ]; then pip install --user wheel; fi # Wheel only needed to fix a broken bionic build +# Install numpy via deb where it works, otherwise on OS X and non-bionic Python 2 Linux install via pip + - if [ "$TRAVIS_DIST" != "bionic" -o "$PYTHON" == "python3" ]; then pip install --user numpy; fi + - if [ "$TASK" = "coverage" ]; then pip install --user cpp-coveralls; fi + - if [ "$TASK" = "flake8" ]; then pip install --user flake8; fi + - if [ "$TASK" = "codespell" ]; then pip3 install --user codespell==2.2.1; fi + - if [ "$TASK" = "jshint" ]; then npm --verbose install -g grunt-cli; fi + - if [ "$TASK" = "jshint" ]; then grunt --version --verbose; fi +# Installing via the addon isn't currently working so do it the old fashioned way + - if [ "$TRAVIS_OS_NAME" == "osx" -a "$CPPUNIT" != "1.14" ]; then brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/e6e43cf6a3%5E/Formula/cppunit.rb; fi # install a slightly older cppunit, as latest needs C++11 support after_failure: -# Disabled as otherwise the logfile is too big -# - if [ -f ${TRAVIS_BUILD_DIR}/config.log ]; then cat ${TRAVIS_BUILD_DIR}/config.log; fi + - if [ -f ${TRAVIS_BUILD_DIR}/config.log ]; then cat ${TRAVIS_BUILD_DIR}/config.log; fi - if [ -f ${TRAVIS_BUILD_DIR}/ola-*/_build/config.log ]; then cat ${TRAVIS_BUILD_DIR}/ola-*/_build/config.log; fi - if [ -f ${TRAVIS_BUILD_DIR}/ola-*/_build/sub/config.log ]; then cat ${TRAVIS_BUILD_DIR}/ola-*/_build/sub/config.log; fi - - if [ -f ${TRAVIS_BUILD_DIR}/ola-*/_build/test-suite.log ]; then cat ${TRAVIS_BUILD_DIR}/ola-*/_build/test-suite.log; fi - - if [ -f ${TRAVIS_BUILD_DIR}/ola-*/_build/sub/test-suite.log ]; then cat ${TRAVIS_BUILD_DIR}/ola-*/_build/sub/test-suite.log; fi after_success: - - if [ "$TASK" = "coverage" ]; then coveralls --gcov /usr/bin/gcov-8 -b . -E '.*Test\.cpp$' -E '.*\.pb\.cc$' -E '.*\.pb\.cpp$' -E '.*\.pb\.h$' -E '.*\.yy\.cpp$' -E '.*\.tab\.cpp$' -E '.*\.tab\.h$' -E '.*/doxygen/examples.*$' --gcov-options '\-lp' > /dev/null; fi + - if [ "$TASK" = "coverage" ]; then coveralls --gcov /usr/bin/gcov-10 -b . -E '.*Test\.cpp$' -E '.*\.pb\.cc$' -E '.*\.pb\.cpp$' -E '.*\.pb\.h$' -E '.*\.yy\.cpp$' -E '.*\.tab\.cpp$' -E '.*\.tab\.h$' -E '.*/doxygen/examples.*$' --gcov-options '\-lp' > /dev/null; fi after_script: - if [ "$TASK" = "coverity" ]; then tail -n 10000 ${TRAVIS_BUILD_DIR}/cov-int/build-log.txt; cat ${TRAVIS_BUILD_DIR}/cov-int/scm_log.txt; fi diff --git a/AUTHORS b/AUTHORS index e04f78657b..6e370ab1a2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,18 +6,22 @@ Primary author: Contributors: Bastien Andrès, contributed to the dmx4linux plugin + Bruce Lowekamp, various fixes and python updates Carsten Presser, Karate USB plugin Dave Olsthoorn, working on a new web-ui E.S. Rosenberg, further work on ftdidmx plugin. Hakan Lindestaf, Renard plugin Harry F, for the Eurolite USB Pro code Heikki Junnila, bug fixes for the debian packaging files + Jannis Achstetter, compile fixes for newer dependencies and various fixes Laurent (Renzo), Debian packages, FreeBSD & RDM testing. Lukas Erlinghagen, win32 port. Johan Nilsson, Philips Hue trigger config Joshua Moyerman, ArtNet fixes. Masaki Muranaka, various patches Nicolas, for the win32 port of libartnet + Nils Van Zuijlen, typos and python lib small update + Perry Naseck, EPoll delay fix, GitHub Actions CI workflows, Debian pkg fixes Peter Newman, MilInst Plugin, Scanlime Fadecandy support and numerous fixes Ravindra Nath Kakarla, RDM Test Server (Google Summer of Code 2012) Rowan Maclachlan (hippy) for various changes @@ -25,3 +29,4 @@ Contributors: Sean Sill, various fixes. Stefan KrĂ¼ger, added APA102 support to the SPI Plugin Tobi Schäfer, for the MacPort files + Stefan S, improved timing with monotonic clock diff --git a/CONTRIBUTING b/CONTRIBUTING index 8c841e0ab3..f5ba30a3c6 100644 --- a/CONTRIBUTING +++ b/CONTRIBUTING @@ -8,8 +8,8 @@ If you’d like to contribute code (such as a new plugin, extending an existing feature or adding a brand new one), our preferred method is by forking us on GitHub, committing your code to there, then opening a pull request. We can then review and comment on your code if necessary and merge it in. It will also get -checked automatically by Travis Continuous Integration (you will see a message -within the pull request showing the status of the Travis tests); hence why we +checked automatically by GitHub Actions (you will see a message +within the pull request showing the status of the GitHub tests); hence why we prefer pull requests to other methods such as patch submissions. When writing code, please read the README.developer file which covers coding diff --git a/Makefile.am b/Makefile.am index e7f7840ce0..25d13bada7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -149,6 +149,9 @@ built_sources = # Test scripts are run if BUILD_TESTS is true. test_scripts = +# directories with python code that should be test compiled during the build +PYTHON_BUILD_DIRS = + # The includes # ----------------------------------------------------------------------------- @@ -172,6 +175,7 @@ include plugins/Makefile.mk include olad/Makefile.mk include protoc/Makefile.mk include python/Makefile.mk +include scripts/Makefile.mk include tools/Makefile.mk # ----------------------------------------------------------------------------- @@ -225,3 +229,66 @@ EXTRA_DIST += \ config/stl_hash.m4 \ mac_build.sh \ ola.spec + +# ----------------------------------------------------------------------------- + +# Create a linter target +.PHONY : lint +lint: flake8 cpplint + +# flake8 linter +.PHONY : flake8 +flake8: Makefile.am +if FOUND_FLAKE8 + flake8 --statistics --count +else + $(error flake8 not found. Install flake8 and re-run configure.) +endif + +# cpplint linter +CPP_LINT_FILTER = "-legal/copyright,-readability/streams,-runtime/arrays" +CPP_LINT_FILES = $(shell find . \( -name "*.h" -or -name "*.cpp" \) -and ! \( \ + -wholename "./common/protocol/Ola.pb.*" -or \ + -wholename "./common/rpc/Rpc.pb.*" -or \ + -wholename "./common/rpc/TestService.pb.*" -or \ + -wholename "./common/rdm/Pids.pb.*" -or \ + -wholename "./config.h" -or \ + -wholename "./plugins/*/messages/*ConfigMessages.pb.*" -or \ + -wholename "./tools/ola_trigger/config.tab.*" -or \ + -wholename "./tools/ola_trigger/lex.yy.cpp" \) | xargs) +.PHONY : cpplint +cpplint: Makefile.am +if FOUND_CPPLINT + cpplint --filter=$(CPP_LINT_FILTER) $(CPP_LINT_FILES) +else + $(error cpplint not found. Install the forked cpplint (e.g. via pip for the latest version) and re-run configure.) +endif + +# coverage +COVERAGE_OUTPUTS = --txt coverage/coverage.txt \ + --csv coverage/coverage.csv \ + --json coverage/coverage.json \ + --cobertura coverage/coverage.cobertura.xml \ + --html-details coverage/details.html/coverage.details.html \ + --coveralls coverage/coverage.coveralls.json +COVERAGE_GCOV_EXE=--gcov-executable /usr/bin/gcov +COVERAGE_FILTERS=-e '.*Test\.cpp$$' \ + -e '.*\.pb\.cc$$' \ + -e '.*\.pb\.cpp$$' \ + -e '.*\.pb\.h$$' \ + -e '.*\.yy\.cpp$$' \ + -e '.*\.tab\.cpp$$' \ + -e '.*\.tab\.h$$' \ + -e '.*/doxygen/examples.*$$' +.PHONY : coverage +coverage: Makefile.am check +if !BUILD_GCOV + $(error Generating coverage requires configuring with --enable-gcov) +else +if FOUND_GCOVR + mkdir -p coverage/details.html/ + gcovr --print-summary $(COVERAGE_OUTPUTS) $(COVERAGE_GCOV_EXE) --root . $(COVERAGE_FILTERS) +else + $(error gcovr not found. Install gcovr (e.g. via pip for the latest version) and re-run configure.) +endif +endif diff --git a/NEWS b/NEWS index 5cf8ef585a..2356125e35 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,76 @@ -x/y/2019 ola-0.10.8 +x/y/2023 ola-0.10.10 Features: - * Support DragonFly BSD + * API: * + RDM Tests: + * + + Bugs: + * + + Internal: + * + +26/2/2023 ola-0.10.9 + Features: + * Python 3 compatibility across the board (including the RDM Responder Tests)! + #1506 + * Support for the JMS USB2DMX PRO V2.1 device via the FTDI plugin #1728 + + API: + * Python: Add a fetch current DMX example. + + RDM Tests: + * Python 3 compatibility of the RDM Tests #1599 + * Fix a longstanding bug in the GetMaxPacketSize RDM test around timeouts + + Bugs: + * Fix some tests not working on Big Endian machines because our RPC is encoded + with native format and those tests used sample data from a Little Endian + machine + * Renamed EndpointNoticationEvent(sic) to EndpointNotificationEvent in the + E1.33 EndpointManager code + * Check if librt exists and add it to the build if required + * Ensure we can build on later Protobuf and C++ and silence deprecation + messages where required + * Fix the NetBSD build + * Clarify the usage of some of the various Enttec Open DMX USB plugins + * Relax the timing on the ClientWrapperTest so it doesn't fail occasionally + #1714 + * Correct the documentation of some existing limits in the E1.31 plugin + * Fix some undefined behaviour in TimeoutManager::ExecuteTimeouts #1726 + * Fix UARTs on Debian Bullseye #1749 + * Fix Python version detection for versions > 3.9 #1755, #1780 + * Update Angular and Angular-Route versions used by the new web UI and add + workaround to be compatible #1782 Debian #1016447 + * Significantly reduce the delay when using StreamingClient with EPoll and + multiple universes #1793 + + Internal: + * Add more debugging so we can tell why setting the baud rate failed + * Replace "currentThread" with "current_thread" in Python since the former has + been deprecated + * Fix lots more internal typos and grammar + * Add unit tests for more of the Python RDM Test classes + * Sort the Python imports with isort + +22/11/2020 ola-0.10.8 + Features: + * Support DragonFly BSD + * Add another Debian test + * Add the E1.33 NACK Reasons + * Add the E1.37-7 NACK Reasons + * Use clock_gettime's CLOCK_MONOTONIC if available + * Collect the PDL size in the model collector + + API: + * Deprecated Clock::CurrentTime and added Clock::CurrentMonotonicTime and + Clock::CurrentRealTime. Occurrences of Clock::CurrentTime have been + replaced with either variant as applicable. + RDM Tests: * Fix a bug in the RDM tests to ensure they can cope with 255 personalities #1508 @@ -20,8 +86,9 @@ x/y/2019 ola-0.10.8 * Clarify some of the man page options for olad * Fix some dead links in documentation * Properly close socket on destruction of Python OlaClient - * Fix some Python 3.2 compatibility + * Fix various Python 3 compatibility issues * Try and fetch index and type via sockaddr_dl struct for better *BSD support + * Backport some Debian changes * Use C++11 if required by random #1477 * Correct uartdmx plugin documentation for the example UART #1320 * Ensure we don't return unsuitable network indices via RDM #1478 @@ -30,9 +97,30 @@ x/y/2019 ola-0.10.8 * Fix an RDM discovery bug for how we handle phantom UIDs * Ensure _close_callback is assigned before we might need to run it in the Python API + * Fix a bug with the Python ola_rdm_get and PROXIED_DEVICES display + * Renamed RESONSE_INVALID_DESTINATION(sic) to RESPONSE_INVALID_DESTINATION in + the ArduinoWidget code + * Fix compatibility with GCC 9 #1553 Debian #925793 + * Ensure the GPIO plugin correctly writes to the last configured pin + * Fix compatibility with ncurses 6 + * Fix compatibility with Protobuf 3.7 and newer (tested with up to 3.12.2) + #1550, #1634 + * Rename CircularDepdendancyException(sic) to CircularDependencyException in + the Python RDM Test code, also the relevant comments + * Fix a minor longstanding logging bug with Avahi subtype registration errors + * Fix Enttec USB Pro Mk2 firmware >=4.15 RDM Discovery #1631 + * Fix compatibility with libmicrohttpd v0.9.71 and newer #1650 + * Fix some Doxygen escaping + * Rename AppendMultipler(sic) to AppendMultiplier in the RDM messaging code + * Fix a few edge cases in ola_trigger around whitespace in the config files + * Fix compatibility with clang 7 and newer (tested with up to 11) #1564 Internal: - * + * Replace "readdir_r" with "readdir" since the former has been deprecated + * Add a unit test for the functions that used readdir_r before + * Add a new 'make flake8' target #1619 + * Add a new 'make cpplint' target + * Add a new 'make lint' target which runs the flake8 and cpplint runs 13/7/2018 ola-0.10.7 Features: diff --git a/README b/README index a630edbc7b..b180fbeda4 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ [www.openlighting.org/ola](https://www.openlighting.org/ola) -[![Build Status](https://travis-ci.org/OpenLightingProject/ola.svg?branch=master)](https://travis-ci.org/OpenLightingProject/ola) [![Coverity Scan Status](https://scan.coverity.com/projects/3514/badge.svg)](https://scan.coverity.com/projects/3514) [![Coverage Status](https://coveralls.io/repos/OpenLightingProject/ola/badge.svg?branch=master)](https://coveralls.io/r/OpenLightingProject/ola?branch=master) +[![Build Status](https://github.com/OpenLightingProject/ola/actions/workflows/build.yaml/badge.svg?branch=master)](https://github.com/OpenLightingProject/ola/actions/workflows/build.yaml) [![Debian Build Status](https://github.com/OpenLightingProject/ola/actions/workflows/debian.yml/badge.svg?branch=master)](https://github.com/OpenLightingProject/ola/actions/workflows/debian.yml) [![Lint Status](https://github.com/OpenLightingProject/ola/actions/workflows/lint.yaml/badge.svg?branch=master)](https://github.com/OpenLightingProject/ola/actions/workflows/lint.yaml) [![Coverity Scan Status](https://scan.coverity.com/projects/3514/badge.svg)](https://scan.coverity.com/projects/3514) [![Coverage Status](https://coveralls.io/repos/github/OpenLightingProject/ola/badge.svg?branch=master)](https://coveralls.io/github/OpenLightingProject/ola?branch=master) The Open Lighting Architecture (OLA) is a framework for controlling entertainment lighting equipment. Within the entertainment lighting industry, diff --git a/README.debian b/README.debian index 59b1c191fc..07098472ea 100644 --- a/README.debian +++ b/README.debian @@ -7,7 +7,7 @@ in the top level directory to create a set of .debs If you're building from the git repo do the following: -$ autoreconf +$ autoreconf -i $ ./configure $ make dist $ cp ola-0.X.Y.tar.gz /tmp diff --git a/README.developer b/README.developer index 767afd7cd0..309ad07a92 100644 --- a/README.developer +++ b/README.developer @@ -55,7 +55,7 @@ The release lifecycle is: - New feature work occurs on the master branch. - Once the new features are considered stable or enough time has passed, a new minor release branch will be created, e.g. 0.10. -- The minor release branch will be stablized with bugfixes, these bug fixes +- The minor release branch will be stabilized with bugfixes, these bug fixes will also be merged back into master. - Once declared stable, a new patch branch 0 will be created e.g. 0.10.0 - Release specific changes like the version number, debian files etc. will be @@ -138,7 +138,7 @@ which isn't listed there please consider submitting the formatting configuration files. Please run the cpplint.py script on all files before requesting a review, -alternatively it will be run automatically by Travis CI on pull requests. +alternatively it will be run automatically by GitHub Actions on pull requests. cpplint.py can be downloaded here: https://github.com/google/styleguide/tree/gh-pages/cpplint @@ -239,10 +239,10 @@ it yourself or await the Travis CI results of your pull request. flake8 can be installed following the instructions here: https://gitlab.com/pycqa/flake8/ -Run it with: - --max-line-length 80 --exclude *_pb2.py,.git,__pycache \ - --ignore E111,E121,E127,E129 data/rdm include/ola python scripts \ - tools/ola_mon tools/rdm +Run it as: + flake8 + +It takes its config from the .flake8 file in the root of the repository. Build System =============================================================================== diff --git a/common/base/Init.cpp b/common/base/Init.cpp index e327f04ec1..e579068e6b 100644 --- a/common/base/Init.cpp +++ b/common/base/Init.cpp @@ -50,6 +50,7 @@ #endif // _WIN32 #include +#include #include #include #include @@ -60,6 +61,7 @@ #include #include +#include #include #include @@ -186,6 +188,7 @@ using std::endl; using std::string; bool ServerInit(int argc, char *argv[], ExportMap *export_map) { + ClockInit(); ola::math::InitRandom(); if (!InstallSEGVHandler()) { return false; @@ -219,6 +222,7 @@ bool AppInit(int *argc, char *argv[], const string &first_line, const string &description) { + ClockInit(); ola::math::InitRandom(); SetHelpString(first_line, description); ParseFlags(argc, argv); @@ -387,5 +391,18 @@ void Daemonise() { } #endif // _WIN32 } + +void ClockInit() { + Clock clock; + TimeStamp now_monotonic; + TimeStamp now_realtime; +#ifndef CLOCK_MONOTONIC + OLA_DEBUG << "Monotonic clock unavailable. Falling back to real time clock."; +#endif + clock.CurrentMonotonicTime(&now_monotonic); + clock.CurrentRealTime(&now_realtime); + OLA_DEBUG << "Monotonic clock: " << std::setw(18) << now_monotonic; + OLA_DEBUG << "Real clock : " << std::setw(18) << now_realtime; +} /**@}*/ } // namespace ola diff --git a/common/file/Util.cpp b/common/file/Util.cpp index 0164488c29..9756c898ac 100644 --- a/common/file/Util.cpp +++ b/common/file/Util.cpp @@ -129,15 +129,19 @@ bool FindMatchingFiles(const string &directory, FindClose(h_find); #else DIR *dp; - struct dirent dir_ent; struct dirent *dir_ent_p; if ((dp = opendir(directory.data())) == NULL) { OLA_WARN << "Could not open " << directory << ": " << strerror(errno); return false; } - if (readdir_r(dp, &dir_ent, &dir_ent_p)) { - OLA_WARN << "readdir_r(" << directory << "): " << strerror(errno); + // Explicitly set errno to 0 so we can reliably check the value after + // the call to readdir. It might have a undefined value otherwise since + // a successful call may but doesn't need to set a value. + errno = 0; + dir_ent_p = readdir(dp); + if ((dir_ent_p == NULL) && (errno != 0)) { + OLA_WARN << "readdir(" << directory << "): " << strerror(errno); closedir(dp); return false; } @@ -151,8 +155,12 @@ bool FindMatchingFiles(const string &directory, files->push_back(str.str()); } } - if (readdir_r(dp, &dir_ent, &dir_ent_p)) { - OLA_WARN << "readdir_r(" << directory << "): " << strerror(errno); + // Explicitly set errno to 0 so we can reliably check the value after + // the call. It might have an undefined value otherwise. + errno = 0; + dir_ent_p = readdir(dp); + if ((dir_ent_p == NULL) && (errno != 0)) { + OLA_WARN << "readdir(" << directory << "): " << strerror(errno); closedir(dp); return false; } diff --git a/common/file/UtilTest.cpp b/common/file/UtilTest.cpp index 5e54a5750b..906850ff0a 100644 --- a/common/file/UtilTest.cpp +++ b/common/file/UtilTest.cpp @@ -20,26 +20,31 @@ #include #include +#include +#include +#include "ola/StringUtils.h" #include "ola/file/Util.h" #include "ola/testing/TestUtils.h" - using ola::file::FilenameFromPath; using ola::file::FilenameFromPathOrDefault; using ola::file::FilenameFromPathOrPath; using ola::file::JoinPaths; +using ola::file::FindMatchingFiles; using std::string; class UtilTest: public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(UtilTest); CPPUNIT_TEST(testJoinPaths); CPPUNIT_TEST(testFilenameFromPath); + CPPUNIT_TEST(testFindMatchingFiles); CPPUNIT_TEST_SUITE_END(); public: void testFilenameFromPath(); void testJoinPaths(); + void testFindMatchingFiles(); }; @@ -90,3 +95,57 @@ void UtilTest::testFilenameFromPath() { OLA_ASSERT_EQ(string("baz"), FilenameFromPathOrPath("/foo/bar/baz")); } +/* + * Test the FindMatchingFiles function + */ +void UtilTest::testFindMatchingFiles() { + bool okay = false; + + std::vector files; + std::vector::iterator file; + + OLA_ASSERT_TRUE_MSG(ola::file::PATH_SEPARATOR == '/' || + ola::file::PATH_SEPARATOR == '\\', + "ola::file::PATH_SEPARATOR is neither / nor \\"); + + okay = FindMatchingFiles(std::string(TEST_SRC_DIR) + + ola::file::PATH_SEPARATOR + std::string("man"), + std::string("rdm_"), &files); + + OLA_ASSERT_TRUE_MSG(okay, "FindMatchingFiles returned false"); + + // At the time this test was written, there were 3 files in folder "man" + // starting with "rdm_". If this changed, please adapt the number below + // Or find something better to match against + OLA_ASSERT_EQ_MSG(3, (int)files.size(), + "Not exactly 3 files man/rdm_* returned"); + + bool rdm_model_collector_found = false; + bool rdm_responder_test_found = false; + bool rdm_test_server_found = false; + + // Iterate over all files that have been returned and check if the ones + // we expected are in that list + for (file = files.begin(); file < files.end(); file++) { + if (ola::StringEndsWith(*file, "rdm_model_collector.py.1")) { + // make sure it has not been reported as found before + OLA_ASSERT_FALSE(rdm_model_collector_found); + rdm_model_collector_found = true; + } else if (ola::StringEndsWith(*file, "rdm_responder_test.py.1")) { + // make sure it has not been reported as found before + OLA_ASSERT_FALSE(rdm_responder_test_found); + rdm_responder_test_found = true; + } else if (ola::StringEndsWith(*file, "rdm_test_server.py.1")) { + // make sure it has not been reported as found before + OLA_ASSERT_FALSE(rdm_test_server_found); + rdm_test_server_found = true; + } + } + + OLA_ASSERT_TRUE_MSG(rdm_model_collector_found, + "Result lacks rdm_model_collector.py.1"); + OLA_ASSERT_TRUE_MSG(rdm_responder_test_found, + "Result lacks rdm_responder_test.py.1"); + OLA_ASSERT_TRUE_MSG(rdm_test_server_found, + "Result lacks rdm_test_server.py.1"); +} diff --git a/common/http/HTTPServer.cpp b/common/http/HTTPServer.cpp index 455e52bdd9..c91ac769f4 100644 --- a/common/http/HTTPServer.cpp +++ b/common/http/HTTPServer.cpp @@ -88,8 +88,8 @@ const char HTTPServer::CONTENT_TYPE_OCT[] = "application/octet-stream"; * @param key the header name * @param value the header value */ -static int AddHeaders(void *cls, OLA_UNUSED enum MHD_ValueKind kind, - const char *key, const char *value) { +static MHD_RESULT AddHeaders(void *cls, OLA_UNUSED enum MHD_ValueKind kind, + const char *key, const char *value) { HTTPRequest *request = static_cast(cls); string key_string = key; string value_string = value; @@ -110,11 +110,12 @@ static int AddHeaders(void *cls, OLA_UNUSED enum MHD_ValueKind kind, * @param off the offset of the data * @param size the number of bytes available */ -int IteratePost(void *request_cls, OLA_UNUSED enum MHD_ValueKind kind, - const char *key, OLA_UNUSED const char *filename, - OLA_UNUSED const char *content_type, - OLA_UNUSED const char *transfer_encoding, const char *data, - OLA_UNUSED uint64_t off, OLA_UNUSED size_t size) { +MHD_RESULT IteratePost(void *request_cls, OLA_UNUSED enum MHD_ValueKind kind, + const char *key, OLA_UNUSED const char *filename, + OLA_UNUSED const char *content_type, + OLA_UNUSED const char *transfer_encoding, + const char *data, + OLA_UNUSED uint64_t off, OLA_UNUSED size_t size) { // libmicrohttpd has a bug where the size isn't set correctly. HTTPRequest *request = static_cast(request_cls); string value(data); @@ -129,22 +130,23 @@ int IteratePost(void *request_cls, OLA_UNUSED enum MHD_ValueKind kind, * This sets up HTTPRequest & HTTPResponse objects and then calls * DispatchRequest. */ -static int HandleRequest(void *http_server_ptr, - struct MHD_Connection *connection, - const char *url, - const char *method, - const char *version, - const char *upload_data, - size_t *upload_data_size, - void **ptr) { +static MHD_RESULT HandleRequest(void *http_server_ptr, + struct MHD_Connection *connection, + const char *url, + const char *method, + const char *version, + const char *upload_data, + size_t *upload_data_size, + void **ptr) { HTTPServer *http_server = static_cast(http_server_ptr); HTTPRequest *request; // on the first call ptr is null if (*ptr == NULL) { request = new HTTPRequest(url, method, version, connection); - if (!request) + if (!request) { return MHD_NO; + } if (!request->Init()) { delete request; @@ -156,14 +158,16 @@ static int HandleRequest(void *http_server_ptr, request = static_cast(*ptr); - if (request->InFlight()) + if (request->InFlight()) { // don't dispatch more than once return MHD_YES; + } if (request->Method() == MHD_HTTP_METHOD_GET) { HTTPResponse *response = new HTTPResponse(connection); request->SetInFlight(); - return http_server->DispatchRequest(request, response); + return static_cast( + http_server->DispatchRequest(request, response)); } else if (request->Method() == MHD_HTTP_METHOD_POST) { if (*upload_data_size != 0) { @@ -173,7 +177,8 @@ static int HandleRequest(void *http_server_ptr, } request->SetInFlight(); HTTPResponse *response = new HTTPResponse(connection); - return http_server->DispatchRequest(request, response); + return static_cast( + http_server->DispatchRequest(request, response)); } return MHD_NO; } @@ -188,8 +193,9 @@ void RequestCompleted(void*, struct MHD_Connection*, void **request_cls, enum MHD_RequestTerminationCode) { - if (!request_cls) + if (!request_cls) { return; + } delete static_cast(*request_cls); *request_cls = NULL; @@ -235,8 +241,9 @@ bool HTTPRequest::Init() { * @brief Cleanup this request object */ HTTPRequest::~HTTPRequest() { - if (m_processor) + if (m_processor) { MHD_destroy_post_processor(m_processor); + } } @@ -286,10 +293,11 @@ void HTTPRequest::ProcessPostData(const char *data, size_t *data_size) { const string HTTPRequest::GetHeader(const string &key) const { map::const_iterator iter = m_headers.find(key); - if (iter == m_headers.end()) + if (iter == m_headers.end()) { return ""; - else + } else { return iter->second; + } } @@ -302,10 +310,11 @@ const string HTTPRequest::GetParameter(const string &key) const { const char *value = MHD_lookup_connection_value(m_connection, MHD_GET_ARGUMENT_KIND, key.c_str()); - if (value) + if (value) { return string(value); - else + } else { return string(); + } } /** @@ -339,10 +348,11 @@ bool HTTPRequest::CheckParameterExists(const string &key) const { const string HTTPRequest::GetPostParameter(const string &key) const { map::const_iterator iter = m_post_params.find(key); - if (iter == m_post_params.end()) + if (iter == m_post_params.end()) { return ""; - else + } else { return iter->second; + } } @@ -386,10 +396,11 @@ int HTTPResponse::SendJson(const JsonValue &json) { static_cast(const_cast(output.data())), output.length()); HeadersMultiMap::const_iterator iter; - for (iter = m_headers.begin(); iter != m_headers.end(); ++iter) + for (iter = m_headers.begin(); iter != m_headers.end(); ++iter) { MHD_add_response_header(response, iter->first.c_str(), iter->second.c_str()); + } int ret = MHD_queue_response(m_connection, m_status_code, response); MHD_destroy_response(response); return ret; @@ -405,10 +416,11 @@ int HTTPResponse::Send() { struct MHD_Response *response = HTTPServer::BuildResponse( static_cast(const_cast(m_data.data())), m_data.length()); - for (iter = m_headers.begin(); iter != m_headers.end(); ++iter) + for (iter = m_headers.begin(); iter != m_headers.end(); ++iter) { MHD_add_response_header(response, iter->first.c_str(), iter->second.c_str()); + } int ret = MHD_queue_response(m_connection, m_status_code, response); MHD_destroy_response(response); return ret; @@ -443,8 +455,9 @@ HTTPServer::~HTTPServer() { MHD_stop_daemon(m_httpd); map::const_iterator iter; - for (iter = m_handlers.begin(); iter != m_handlers.end(); ++iter) + for (iter = m_handlers.begin(); iter != m_handlers.end(); ++iter) { delete iter->second; + } if (m_default_handler) { delete m_default_handler; @@ -617,17 +630,20 @@ int HTTPServer::DispatchRequest(const HTTPRequest *request, map::iterator iter = m_handlers.find(request->Url()); - if (iter != m_handlers.end()) + if (iter != m_handlers.end()) { return iter->second->Run(request, response); + } map::iterator file_iter = m_static_content.find(request->Url()); - if (file_iter != m_static_content.end()) + if (file_iter != m_static_content.end()) { return ServeStaticContent(&(file_iter->second), response); + } - if (m_default_handler) + if (m_default_handler) { return m_default_handler->Run(request, response); + } return ServeNotFound(response); } @@ -642,8 +658,9 @@ int HTTPServer::DispatchRequest(const HTTPRequest *request, bool HTTPServer::RegisterHandler(const string &path, BaseHTTPCallback *handler) { map::const_iterator iter = m_handlers.find(path); - if (iter != m_handlers.end()) + if (iter != m_handlers.end()) { return false; + } pair pair(path, handler); m_handlers.insert(pair); return true; @@ -678,8 +695,9 @@ bool HTTPServer::RegisterFile(const std::string &path, map::const_iterator file_iter = ( m_static_content.find(path)); - if (file_iter != m_static_content.end()) + if (file_iter != m_static_content.end()) { return false; + } static_file_info file_info; file_info.file_path = file; @@ -706,13 +724,15 @@ void HTTPServer::RegisterDefaultHandler(BaseHTTPCallback *handler) { */ void HTTPServer::Handlers(vector *handlers) const { map::const_iterator iter; - for (iter = m_handlers.begin(); iter != m_handlers.end(); ++iter) + for (iter = m_handlers.begin(); iter != m_handlers.end(); ++iter) { handlers->push_back(iter->first); + } map::const_iterator file_iter; for (file_iter = m_static_content.begin(); - file_iter != m_static_content.end(); ++file_iter) + file_iter != m_static_content.end(); ++file_iter) { handlers->push_back(file_iter->first); + } } /** @@ -806,10 +826,11 @@ int HTTPServer::ServeStaticContent(static_file_info *file_info, struct MHD_Response *mhd_response = BuildResponse(static_cast(data), length); - if (!file_info->content_type.empty()) + if (!file_info->content_type.empty()) { MHD_add_response_header(mhd_response, MHD_HTTP_HEADER_CONTENT_TYPE, file_info->content_type.c_str()); + } int ret = MHD_queue_response(response->Connection(), MHD_HTTP_OK, diff --git a/common/http/OlaHTTPServer.cpp b/common/http/OlaHTTPServer.cpp index 7b51449939..f8937c8415 100644 --- a/common/http/OlaHTTPServer.cpp +++ b/common/http/OlaHTTPServer.cpp @@ -52,7 +52,7 @@ OlaHTTPServer::OlaHTTPServer(const HTTPServer::HTTPServerOptions &options, StringVariable *data_dir_var = export_map->GetStringVar(K_DATA_DIR_VAR); data_dir_var->Set(m_server.DataDir()); - m_clock.CurrentTime(&m_start_time); + m_clock.CurrentMonotonicTime(&m_start_time); export_map->GetStringVar(K_UPTIME_VAR); } @@ -73,7 +73,7 @@ int OlaHTTPServer::DisplayDebug(const HTTPRequest*, HTTPResponse *raw_response) { auto_ptr response(raw_response); ola::TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); ola::TimeInterval diff = now - m_start_time; ostringstream str; str << diff.InMilliSeconds(); diff --git a/common/io/EPoller.cpp b/common/io/EPoller.cpp index f6b4e47214..cd6d282819 100644 --- a/common/io/EPoller.cpp +++ b/common/io/EPoller.cpp @@ -293,7 +293,7 @@ bool EPoller::Poll(TimeoutManager *timeout_manager, epoll_event events[MAX_EVENTS]; TimeInterval sleep_interval = poll_interval; TimeStamp now; - m_clock->CurrentTime(&now); + m_clock->CurrentMonotonicTime(&now); TimeInterval next_event_in = timeout_manager->ExecuteTimeouts(&now); if (!next_event_in.IsZero()) { @@ -311,11 +311,13 @@ bool EPoller::Poll(TimeoutManager *timeout_manager, } int ms_to_sleep = sleep_interval.InMilliSeconds(); + // If we haven't been asked to wait as part of the poll interval, then don't + // wait in the epoll to allow for fast streaming int ready = epoll_wait(m_epoll_fd, reinterpret_cast(&events), - MAX_EVENTS, ms_to_sleep ? ms_to_sleep : 1); + MAX_EVENTS, ms_to_sleep ? ms_to_sleep : 0); if (ready == 0) { - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); return true; } else if (ready == -1) { @@ -325,7 +327,7 @@ bool EPoller::Poll(TimeoutManager *timeout_manager, return false; } - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); for (int i = 0; i < ready; i++) { EPollData *descriptor = reinterpret_cast( @@ -346,7 +348,7 @@ bool EPoller::Poll(TimeoutManager *timeout_manager, } m_orphaned_descriptors.clear(); - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); return true; } diff --git a/common/io/ExtendedSerial.cpp b/common/io/ExtendedSerial.cpp index 9e05b3a4bf..edbfdae2d2 100644 --- a/common/io/ExtendedSerial.cpp +++ b/common/io/ExtendedSerial.cpp @@ -32,10 +32,26 @@ #ifdef HAVE_STROPTS_H // this provides ioctl() definition without conflicting with asm/termios.h #include +#else +// otherwise use the sys/ioctl.h version for newer Linux which has dropped the +// stropts.h version +// N.B. This will pull in the kernel definition of struct termios, which may +// conflict with the libc version, so we wouldn't be able to use both in the +// same file +#ifdef HAVE_SYS_IOCTL_H +#include +#endif // HAVE_SYS_IOCTL_H +#ifdef HAVE_ASM_TERMBITS_H +#include +#endif // HAVE_ASM_TERMBITS_H #endif // HAVE_STROPTS_H -#ifdef HAVE_ASM_TERMIOS_H -// use this not standard termios for custom baud rates +#if defined(HAVE_STROPTS_H) && defined(HAVE_ASM_TERMIOS_H) +// use this non-standard termios for custom baud rates +// +// On newer Linux, this duplicates winsize and termio as they're also defined +// in bits/ioctl-types.h, so only include this header if we also have the +// stropts.h sourced version of ioctl() // // On mips architectures, sets some cpp macros which cause // (included by , used by ) to not define @@ -52,12 +68,15 @@ namespace ola { namespace io { bool LinuxHelper::SetDmxBaud(int fd) { -#if defined(HAVE_STROPTS_H) && defined(HAVE_TERMIOS2) +#if (defined(HAVE_STROPTS_H) || \ + (defined(HAVE_SYS_IOCTL_H) && defined(HAVE_ASM_TERMBITS_H))) && \ + defined(HAVE_TERMIOS2) static const int rate = 250000; struct termios2 tio; // linux-specific terminal stuff if (ioctl(fd, TCGETS2, &tio) < 0) { + OLA_INFO << "Failed to get current serial port settings"; return false; } @@ -66,6 +85,7 @@ bool LinuxHelper::SetDmxBaud(int fd) { tio.c_ispeed = rate; tio.c_ospeed = rate; // set custom speed directly if (ioctl(fd, TCSETS2, &tio) < 0) { + OLA_INFO << "Failed to update serial port settings"; return false; } @@ -79,9 +99,19 @@ bool LinuxHelper::SetDmxBaud(int fd) { } return true; #else + OLA_INFO << "Failed to set baud rate, due to missing " +#if !defined(HAVE_STROPTS_H) + << "stropts.h or " +#endif +#if !(defined(HAVE_SYS_IOCTL_H) && defined(HAVE_ASM_TERMBITS_H)) + << "sys/ioctl.h or asm/termbits.h or " +#endif + << "termios2"; return false; (void) fd; -#endif // defined(HAVE_STROPTS_H) && defined(HAVE_TERMIOS2) +#endif // (defined(HAVE_STROPTS_H) || +// (defined(HAVE_SYS_IOCTL_H) && defined(HAVE_ASM_TERMBITS_H))) && +// defined(HAVE_TERMIOS2) } } // namespace io } // namespace ola diff --git a/common/io/IOStackTest.cpp b/common/io/IOStackTest.cpp index c2ce9935b0..8563f9892a 100644 --- a/common/io/IOStackTest.cpp +++ b/common/io/IOStackTest.cpp @@ -207,7 +207,7 @@ void IOStackTest::testAppendToQueue() { } /** - * Confirm we re-use blocks + * Confirm we reuse blocks */ void IOStackTest::testBlockReuse() { MemoryBlockPool pool(4); diff --git a/common/io/KQueuePoller.cpp b/common/io/KQueuePoller.cpp index ded9cbf0aa..cdf496153d 100644 --- a/common/io/KQueuePoller.cpp +++ b/common/io/KQueuePoller.cpp @@ -233,7 +233,7 @@ bool KQueuePoller::Poll(TimeoutManager *timeout_manager, TimeInterval sleep_interval = poll_interval; TimeStamp now; - m_clock->CurrentTime(&now); + m_clock->CurrentMonotonicTime(&now); TimeInterval next_event_in = timeout_manager->ExecuteTimeouts(&now); if (!next_event_in.IsZero()) { @@ -261,7 +261,7 @@ bool KQueuePoller::Poll(TimeoutManager *timeout_manager, m_next_change_entry = 0; if (ready == 0) { - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); return true; } else if (ready == -1) { @@ -271,7 +271,7 @@ bool KQueuePoller::Poll(TimeoutManager *timeout_manager, return false; } - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); for (int i = 0; i < ready; i++) { if (events[i].flags & EV_ERROR) { @@ -295,7 +295,7 @@ bool KQueuePoller::Poll(TimeoutManager *timeout_manager, } m_orphaned_descriptors.clear(); - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); return true; } diff --git a/common/io/PollerInterface.h b/common/io/PollerInterface.h index 003106f3b3..cde0f2c39b 100644 --- a/common/io/PollerInterface.h +++ b/common/io/PollerInterface.h @@ -51,7 +51,7 @@ namespace io { * reentrant. Calling any of the read / write / close actions may in turn add / * remove descriptors, including the descriptor the method was itself called * on. There are tests in SelectServerTest.cpp to exercise some of these cases - * but implementors need to be careful. + * but implementers need to be careful. * * @warning * For example, if Poll() iterates over a set of Descriptors and calls diff --git a/common/io/SelectPoller.cpp b/common/io/SelectPoller.cpp index 89274e15ea..971e01067c 100644 --- a/common/io/SelectPoller.cpp +++ b/common/io/SelectPoller.cpp @@ -210,7 +210,7 @@ bool SelectPoller::Poll(TimeoutManager *timeout_manager, maxsd = 0; FD_ZERO(&r_fds); FD_ZERO(&w_fds); - m_clock->CurrentTime(&now); + m_clock->CurrentMonotonicTime(&now); TimeInterval next_event_in = timeout_manager->ExecuteTimeouts(&now); if (!next_event_in.IsZero()) { @@ -241,7 +241,7 @@ bool SelectPoller::Poll(TimeoutManager *timeout_manager, switch (select(maxsd + 1, &r_fds, &w_fds, NULL, &tv)) { case 0: // timeout - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); if (closed_descriptors) { @@ -258,9 +258,9 @@ bool SelectPoller::Poll(TimeoutManager *timeout_manager, OLA_WARN << "select() error, " << strerror(errno); return false; default: - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); CheckDescriptors(&r_fds, &w_fds); - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); } diff --git a/common/io/SelectServerTest.cpp b/common/io/SelectServerTest.cpp index 0361b0ff6b..6e905c2acc 100644 --- a/common/io/SelectServerTest.cpp +++ b/common/io/SelectServerTest.cpp @@ -66,7 +66,7 @@ class CustomMockClock: public ola::Clock { : m_timestamp(timestamp) { } - void CurrentTime(TimeStamp *timestamp) const { + void CurrentMonotonicTime(TimeStamp *timestamp) const { *timestamp = *m_timestamp; } @@ -632,7 +632,7 @@ void SelectServerTest::testTimeout() { void SelectServerTest::testOffByOneTimeout() { TimeStamp now; ola::Clock actual_clock; - actual_clock.CurrentTime(&now); + actual_clock.CurrentMonotonicTime(&now); CustomMockClock clock(&now); SelectServer ss(NULL, &clock); diff --git a/common/io/TimeoutManager.cpp b/common/io/TimeoutManager.cpp index 535d3c0d0f..968cfd25e8 100644 --- a/common/io/TimeoutManager.cpp +++ b/common/io/TimeoutManager.cpp @@ -97,8 +97,8 @@ TimeInterval TimeoutManager::ExecuteTimeouts(TimeStamp *now) { if (m_events.empty()) return TimeInterval(); - for (e = m_events.top(); !m_events.empty() && (e->NextTime() <= *now); - e = m_events.top()) { + // make sure we only try to access m_events.top() if m_events isn't empty + while (!m_events.empty() && ((e = m_events.top())->NextTime() <= *now)) { m_events.pop(); // if this was removed, skip it @@ -118,7 +118,7 @@ TimeInterval TimeoutManager::ExecuteTimeouts(TimeStamp *now) { if (m_export_map) (*m_export_map->GetIntegerVar(K_TIMER_VAR))--; } - m_clock->CurrentTime(now); + m_clock->CurrentMonotonicTime(now); } if (m_events.empty()) diff --git a/common/io/TimeoutManager.h b/common/io/TimeoutManager.h index c63ae57647..46ae15e3ff 100644 --- a/common/io/TimeoutManager.h +++ b/common/io/TimeoutManager.h @@ -108,7 +108,7 @@ class TimeoutManager { explicit Event(const TimeInterval &interval, const Clock *clock) : m_interval(interval) { TimeStamp now; - clock->CurrentTime(&now); + clock->CurrentMonotonicTime(&now); m_next = now + m_interval; } virtual ~Event() {} diff --git a/common/io/TimeoutManagerTest.cpp b/common/io/TimeoutManagerTest.cpp index 0a66cd5542..24bd88013c 100644 --- a/common/io/TimeoutManagerTest.cpp +++ b/common/io/TimeoutManagerTest.cpp @@ -97,19 +97,19 @@ void TimeoutManagerTest::testSingleTimeouts() { TimeStamp last_checked_time; clock.AdvanceTime(0, 1); // Small offset to work around timer precision - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); TimeInterval next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(0u, GetEventCounter(1)); OLA_ASSERT_LT(next, timeout_interval); clock.AdvanceTime(0, 500000); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(0u, GetEventCounter(1)); OLA_ASSERT_LT(next, TimeInterval(0, 500000)); clock.AdvanceTime(0, 500000); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_TRUE(next.IsZero()); OLA_ASSERT_EQ(1u, GetEventCounter(1)); @@ -127,7 +127,7 @@ void TimeoutManagerTest::testSingleTimeouts() { timeout_manager.CancelTimeout(id2); clock.AdvanceTime(1, 0); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_FALSE(timeout_manager.EventsPending()); OLA_ASSERT_EQ(0u, GetEventCounter(2)); @@ -151,19 +151,19 @@ void TimeoutManagerTest::testRepeatingTimeouts() { TimeStamp last_checked_time; clock.AdvanceTime(0, 1); // Small offset to work around timer precision - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); TimeInterval next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(0u, GetEventCounter(1)); OLA_ASSERT_LT(next, timeout_interval); clock.AdvanceTime(0, 500000); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(0u, GetEventCounter(1)); OLA_ASSERT_LT(next, TimeInterval(0, 500000)); clock.AdvanceTime(0, 500000); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_LTE(next, timeout_interval); OLA_ASSERT_EQ(1u, GetEventCounter(1)); @@ -172,7 +172,7 @@ void TimeoutManagerTest::testRepeatingTimeouts() { // fire the event again clock.AdvanceTime(1, 0); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_LTE(next, timeout_interval); OLA_ASSERT_EQ(2u, GetEventCounter(1)); @@ -180,7 +180,7 @@ void TimeoutManagerTest::testRepeatingTimeouts() { // cancel the event timeout_manager.CancelTimeout(id1); clock.AdvanceTime(1, 0); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); next = timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_TRUE(next.IsZero()); OLA_ASSERT_EQ(2u, GetEventCounter(1)); @@ -206,12 +206,12 @@ void TimeoutManagerTest::testAbortedRepeatingTimeouts() { clock.AdvanceTime(0, 1); // Small offset to work around timer precision clock.AdvanceTime(1, 0); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(1u, GetEventCounter(1)); clock.AdvanceTime(1, 0); - clock.CurrentTime(&last_checked_time); + clock.CurrentMonotonicTime(&last_checked_time); timeout_manager.ExecuteTimeouts(&last_checked_time); OLA_ASSERT_EQ(2u, GetEventCounter(1)); diff --git a/common/io/WindowsPoller.cpp b/common/io/WindowsPoller.cpp index 884e9d5a85..632048d594 100644 --- a/common/io/WindowsPoller.cpp +++ b/common/io/WindowsPoller.cpp @@ -288,7 +288,7 @@ bool WindowsPoller::Poll(TimeoutManager *timeout_manager, const TimeInterval &poll_interval) { TimeInterval sleep_interval = poll_interval; TimeStamp now; - m_clock->CurrentTime(&now); + m_clock->CurrentMonotonicTime(&now); TimeInterval next_event_in = timeout_manager->ExecuteTimeouts(&now); if (!next_event_in.IsZero()) { @@ -473,7 +473,7 @@ bool WindowsPoller::Poll(TimeoutManager *timeout_manager, CancelIOs(&data); if (result == WAIT_TIMEOUT) { - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); // We can't return here since any of the cancelled IO calls still might // have succeeded. @@ -509,7 +509,7 @@ bool WindowsPoller::Poll(TimeoutManager *timeout_manager, CancelIOs(&data); } - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); FinalCheckIOs(data); @@ -535,7 +535,7 @@ bool WindowsPoller::Poll(TimeoutManager *timeout_manager, STLDeleteElements(&data); STLDeleteElements(&event_holders); - m_clock->CurrentTime(&m_wake_up_time); + m_clock->CurrentMonotonicTime(&m_wake_up_time); timeout_manager->ExecuteTimeouts(&m_wake_up_time); return return_value; } diff --git a/common/math/Random.cpp b/common/math/Random.cpp index 595a9db351..f6ac43d547 100644 --- a/common/math/Random.cpp +++ b/common/math/Random.cpp @@ -44,7 +44,9 @@ std::default_random_engine generator_; void InitRandom() { Clock clock; TimeStamp now; - clock.CurrentTime(&now); + // The clock type here should not matter because only the microseconds field + // is being used to seed the random number generator. + clock.CurrentRealTime(&now); uint64_t seed = (static_cast(now.MicroSeconds()) << 32) + static_cast(getpid()); diff --git a/common/messaging/MessagePrinter.cpp b/common/messaging/MessagePrinter.cpp index b921870bbd..07226b96fe 100644 --- a/common/messaging/MessagePrinter.cpp +++ b/common/messaging/MessagePrinter.cpp @@ -150,11 +150,11 @@ void GenericMessagePrinter::PostVisit(const GroupMessageField *message) { void GenericMessagePrinter::AppendUInt(const string &name, unsigned int value, const string &label, - int8_t multipler) { + int8_t multiplier) { Stream() << string(m_indent, ' ') << TransformLabel(name) << ": "; if (label.empty()) { Stream() << value; - AppendMultipler(multipler); + AppendMultiplier(multiplier); } else { Stream() << label; } @@ -165,11 +165,11 @@ void GenericMessagePrinter::AppendUInt(const string &name, void GenericMessagePrinter::AppendInt(const string &name, int value, const string &label, - int8_t multipler) { + int8_t multiplier) { Stream() << string(m_indent, ' ') << TransformLabel(name) << ": "; if (label.empty()) { Stream() << value; - AppendMultipler(multipler); + AppendMultiplier(multiplier); } else { Stream() << label; } @@ -177,9 +177,9 @@ void GenericMessagePrinter::AppendInt(const string &name, } -void GenericMessagePrinter::AppendMultipler(int8_t multipler) { - if (multipler) - Stream() << " x 10 ^ " << static_cast(multipler); +void GenericMessagePrinter::AppendMultiplier(int8_t multiplier) { + if (multiplier) + Stream() << " x 10 ^ " << static_cast(multiplier); } } // namespace messaging } // namespace ola diff --git a/common/network/NetworkUtils.cpp b/common/network/NetworkUtils.cpp index a62a992d40..4815c6c8f6 100644 --- a/common/network/NetworkUtils.cpp +++ b/common/network/NetworkUtils.cpp @@ -91,7 +91,8 @@ using ola::network::Interface; namespace { inline bool IsBigEndian() { -#ifdef HAVE_ENDIAN_H +// Some versions of NetBSD have endian.h but not __BIG_ENDIAN +#if defined(HAVE_ENDIAN_H) && defined(__BIG_ENDIAN) return BYTE_ORDER == __BIG_ENDIAN; #else #ifdef _WIN32 @@ -102,7 +103,7 @@ inline bool IsBigEndian() { #else return BYTE_ORDER == BIG_ENDIAN; #endif // _WIN32 -#endif // HAVE_ENDIAN_H +#endif // defined(HAVE_ENDIAN_H) && defined(__BIG_ENDIAN) } inline uint32_t ByteSwap32(uint32_t value) { diff --git a/common/rdm/AckTimerResponder.cpp b/common/rdm/AckTimerResponder.cpp index 89a47b3b7b..605dc995ce 100644 --- a/common/rdm/AckTimerResponder.cpp +++ b/common/rdm/AckTimerResponder.cpp @@ -188,7 +188,7 @@ uint8_t AckTimerResponder::QueuedMessageCount() const { */ void AckTimerResponder::QueueAnyNewMessages() { TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); PendingResponses::iterator iter = m_upcoming_queued_messages.begin(); while (iter != m_upcoming_queued_messages.end()) { if ((*iter)->IsValid(now)) { @@ -336,7 +336,7 @@ RDMResponse *AckTimerResponder::SetDmxStartAddress(const RDMRequest *request) { m_start_address = address; TimeStamp valid_after; - m_clock.CurrentTime(&valid_after); + m_clock.CurrentMonotonicTime(&valid_after); valid_after += TimeInterval(0, ACK_TIMER_MS * 1000); QueuedResponse *our_response = new QueuedResponse( @@ -379,7 +379,7 @@ RDMResponse *AckTimerResponder::SetIdentify(const RDMRequest *request) { } TimeStamp valid_after; - m_clock.CurrentTime(&valid_after); + m_clock.CurrentMonotonicTime(&valid_after); valid_after += TimeInterval(0, ACK_TIMER_MS * 1000); QueuedResponse *our_response = new QueuedResponse( diff --git a/common/rdm/PidStoreLoader.cpp b/common/rdm/PidStoreLoader.cpp index b8f77aeb24..c0959e9a35 100644 --- a/common/rdm/PidStoreLoader.cpp +++ b/common/rdm/PidStoreLoader.cpp @@ -494,16 +494,16 @@ const FieldDescriptor *PidStoreLoader::IntegerFieldToFieldDescriptor( } } - int8_t multipler = 0; + int8_t multiplier = 0; if (field.has_multiplier()) - multipler = field.multiplier(); + multiplier = field.multiplier(); return new descriptor_class( field.name(), intervals, labels, false, - multipler); + multiplier); } /* diff --git a/common/rdm/PidStoreTest.cpp b/common/rdm/PidStoreTest.cpp index 6ff1184221..e7f5fae2c8 100644 --- a/common/rdm/PidStoreTest.cpp +++ b/common/rdm/PidStoreTest.cpp @@ -409,7 +409,7 @@ void PidStoreTest::testPidStoreDirectoryLoad() { vector all_pids; esta_store->AllPids(&all_pids); - OLA_ASSERT_EQ(static_cast(4), all_pids.size()); + OLA_ASSERT_EQ(static_cast(6), all_pids.size()); // check manufacturer pids const PidStore *open_lighting_store = diff --git a/common/rdm/RDMCommand.cpp b/common/rdm/RDMCommand.cpp index eb5ab0dfab..2f6874edfa 100644 --- a/common/rdm/RDMCommand.cpp +++ b/common/rdm/RDMCommand.cpp @@ -207,7 +207,7 @@ RDMStatusCode RDMCommand::VerifyData(const uint8_t *data, sizeof(*command_header)); if (command_header->sub_start_code != SUB_START_CODE) { - OLA_WARN << "Sub start code mis match, was 0x" << std::hex << + OLA_WARN << "Sub start code mismatch, was 0x" << std::hex << static_cast(command_header->sub_start_code) << ", required 0x" << static_cast(SUB_START_CODE); return RDM_WRONG_SUB_START_CODE; diff --git a/common/rdm/RDMHelper.cpp b/common/rdm/RDMHelper.cpp index 2dc775ea7b..01c6ace54e 100644 --- a/common/rdm/RDMHelper.cpp +++ b/common/rdm/RDMHelper.cpp @@ -196,7 +196,21 @@ string NackReasonToString(uint16_t reason) { case NR_ACTION_NOT_SUPPORTED: return "Action not supported"; case NR_ENDPOINT_NUMBER_INVALID: - return "Invalid endpoint"; + return "Endpoint number invalid"; + case NR_INVALID_ENDPOINT_MODE: + return "Invalid endpoint mode"; + case NR_UNKNOWN_UID: + return "Unknown UID"; + case NR_UNKNOWN_SCOPE: + return "Unknown scope"; + case NR_INVALID_STATIC_CONFIG_TYPE: + return "Invalid static config type"; + case NR_INVALID_IPV4_ADDRESS: + return "Invalid IPv4 address"; + case NR_INVALID_IPV6_ADDRESS: + return "Invalid IPv6 address"; + case NR_INVALID_PORT: + return "Invalid port"; default: ostringstream str; str << "Unknown, was " << reason; @@ -786,7 +800,7 @@ string SlotInfoToString(uint8_t slot_type, uint16_t slot_label) { case SD_COLOR_SCROLL: return "Primary, scroll"; case SD_COLOR_SEMAPHORE: - return "Primary, color semaphone"; + return "Primary, color semaphore"; case SD_COLOR_ADD_AMBER: return "Primary, additive amber"; case SD_COLOR_ADD_WHITE: diff --git a/common/rdm/testdata/pids/pids1.proto b/common/rdm/testdata/pids/pids1.proto index 905bf9f8b0..ae07aedc9e 100644 --- a/common/rdm/testdata/pids/pids1.proto +++ b/common/rdm/testdata/pids/pids1.proto @@ -36,6 +36,59 @@ pid { } get_sub_device_range: ROOT_DEVICE } +pid { + name: "DEVICE_INFO" + value: 96 + get_request { + } + get_response { + field { + type: UINT8 + name: "protocol_major" + } + field { + type: UINT8 + name: "protocol_minor" + } + field { + type: UINT16 + name: "device_model" + } + field { + type: UINT16 + name: "product_category" + } + field { + type: UINT32 + name: "software_version" + } + field { + type: UINT16 + name: "dmx_footprint" + } + field { + type: UINT8 + name: "current_personality" + } + field { + type: UINT8 + name: "personality_count" + } + field { + type: UINT16 + name: "dmx_start_address" + } + field { + type: UINT16 + name: "sub_device_count" + } + field { + type: UINT8 + name: "sensor_count" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE +} manufacturer { manufacturer_id: 31344 manufacturer_name: "Open Lighting" diff --git a/common/rdm/testdata/pids/pids2.proto b/common/rdm/testdata/pids/pids2.proto index dff08cbff9..e3943837a6 100644 --- a/common/rdm/testdata/pids/pids2.proto +++ b/common/rdm/testdata/pids/pids2.proto @@ -53,6 +53,23 @@ pid { } get_sub_device_range: ROOT_DEVICE } +pid { + name: "SUPPORTED_PARAMETERS" + value: 80 + get_request { + } + get_response { + field { + type: GROUP + name: "params" + field { + type: UINT16 + name: "param_id" + } + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE +} manufacturer { manufacturer_id: 161 manufacturer_name: "Creative Lighting And Sound Systems Pty Ltd." diff --git a/common/rdm/testdata/test_pids.proto b/common/rdm/testdata/test_pids.proto index bc0d01487f..2a2e613dcb 100644 --- a/common/rdm/testdata/test_pids.proto +++ b/common/rdm/testdata/test_pids.proto @@ -2263,7 +2263,7 @@ pid { } field { type: STRING - name: "modulation_frequence_description" + name: "modulation_frequency_description" max_size: 32 } } diff --git a/common/thread/Mutex.cpp b/common/thread/Mutex.cpp index 2d0cd1ea2c..a2ac0d9b63 100644 --- a/common/thread/Mutex.cpp +++ b/common/thread/Mutex.cpp @@ -117,7 +117,8 @@ void ConditionVariable::Wait(Mutex *mutex) { /** * Timed Wait * @param mutex the mutex that is locked - * @param wake_up_time the time to wait up. + * @param wake_up_time the time to wake up. This must be an absolute i.e. real + * time. * @returns true if we received a signal, false if the timeout expired. */ bool ConditionVariable::TimedWait(Mutex *mutex, const TimeStamp &wake_up_time) { diff --git a/common/thread/PeriodicThread.cpp b/common/thread/PeriodicThread.cpp index f538d81e56..78f9a06240 100644 --- a/common/thread/PeriodicThread.cpp +++ b/common/thread/PeriodicThread.cpp @@ -53,7 +53,9 @@ void *PeriodicThread::Run() { Clock clock; TimeStamp last_run_at; - clock.CurrentTime(&last_run_at); + // Real time is used here because it gets passed into pthread_cond_timedwait + // which expects an absolute time + clock.CurrentRealTime(&last_run_at); if (!m_callback->Run()) { return NULL; } @@ -72,7 +74,9 @@ void *PeriodicThread::Run() { continue; } } - clock.CurrentTime(&last_run_at); + // Real time is used here again to maintain clock consistency with the + // previous call to CurrentRealTime() + clock.CurrentRealTime(&last_run_at); if (!m_callback->Run()) { return NULL; } diff --git a/common/utils/Clock.cpp b/common/utils/Clock.cpp index bc1544905a..936d81e572 100644 --- a/common/utils/Clock.cpp +++ b/common/utils/Clock.cpp @@ -27,6 +27,7 @@ */ #include +#include #include #include @@ -60,6 +61,11 @@ BaseTimeVal& BaseTimeVal::operator=(const struct timeval &tv) { return *this; } +BaseTimeVal& BaseTimeVal::operator=(const struct timespec &ts) { + Set(ts); + return *this; +} + bool BaseTimeVal::operator==(const BaseTimeVal &other) const { return timercmp(&m_tv, &other.m_tv, ==); } @@ -175,6 +181,11 @@ void BaseTimeVal::Set(int64_t interval_useconds) { #endif // HAVE_SUSECONDS_T } +void BaseTimeVal::Set(const struct timespec& ts) { + m_tv.tv_sec = ts.tv_sec; + m_tv.tv_usec = ts.tv_nsec / ONE_THOUSAND; +} + TimeInterval& TimeInterval::operator=(const TimeInterval& other) { if (this != &other) { m_interval = other.m_interval; @@ -229,6 +240,11 @@ TimeStamp& TimeStamp::operator=(const struct timeval &tv) { return *this; } +TimeStamp& TimeStamp::operator=(const struct timespec &ts) { + m_tv = ts; + return *this; +} + TimeStamp &TimeStamp::operator+=(const TimeInterval &interval) { m_tv += interval.m_interval; return *this; @@ -251,12 +267,26 @@ const TimeStamp TimeStamp::operator-(const TimeInterval &interval) const { return TimeStamp(m_tv - interval.m_interval); } -void Clock::CurrentTime(TimeStamp *timestamp) const { +void Clock::CurrentMonotonicTime(TimeStamp *timestamp) const { +#ifdef CLOCK_MONOTONIC + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + *timestamp = ts; +#else + CurrentRealTime(timestamp); +#endif +} + +void Clock::CurrentRealTime(TimeStamp *timestamp) const { struct timeval tv; gettimeofday(&tv, NULL); *timestamp = tv; } +void Clock::CurrentTime(TimeStamp *timestamp) const { + CurrentRealTime(timestamp); +} + void MockClock::AdvanceTime(const TimeInterval &interval) { m_offset += interval; } @@ -266,10 +296,26 @@ void MockClock::AdvanceTime(int32_t sec, int32_t usec) { m_offset += interval; } -void MockClock::CurrentTime(TimeStamp *timestamp) const { +void MockClock::CurrentMonotonicTime(TimeStamp* timestamp) const { +#ifdef CLOCK_MONOTONIC + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + *timestamp = ts; + *timestamp += m_offset; +#else + OLA_DEBUG << "Monotonic clock unavailable. Falling back to CurrentRealTime."; + CurrentRealTime(timestamp); +#endif +} + +void MockClock::CurrentRealTime(TimeStamp* timestamp) const { struct timeval tv; gettimeofday(&tv, NULL); *timestamp = tv; *timestamp += m_offset; } + +void MockClock::CurrentTime(TimeStamp* timestamp) const { + CurrentMonotonicTime(timestamp); +} } // namespace ola diff --git a/common/utils/ClockTest.cpp b/common/utils/ClockTest.cpp index 8429844d9e..e808e08916 100644 --- a/common/utils/ClockTest.cpp +++ b/common/utils/ClockTest.cpp @@ -35,17 +35,25 @@ class ClockTest: public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ClockTest); CPPUNIT_TEST(testTimeStamp); CPPUNIT_TEST(testTimeInterval); - CPPUNIT_TEST(testTimeIntervalMutliplication); - CPPUNIT_TEST(testClock); - CPPUNIT_TEST(testMockClock); + CPPUNIT_TEST(testTimeIntervalMultiplication); + CPPUNIT_TEST(testClockMonotonic); + CPPUNIT_TEST(testClockRealTime); + CPPUNIT_TEST(testClockCurrentTime); + CPPUNIT_TEST(testMockClockMonotonic); + CPPUNIT_TEST(testMockClockRealTime); + CPPUNIT_TEST(testMockClockCurrentTime); CPPUNIT_TEST_SUITE_END(); public: void testTimeStamp(); void testTimeInterval(); - void testTimeIntervalMutliplication(); - void testClock(); - void testMockClock(); + void testTimeIntervalMultiplication(); + void testClockMonotonic(); + void testClockRealTime(); + void testClockCurrentTime(); + void testMockClockMonotonic(); + void testMockClockRealTime(); + void testMockClockCurrentTime(); }; @@ -57,7 +65,6 @@ using ola::TimeStamp; using ola::TimeInterval; using std::string; - /* * Test the TimeStamp class */ @@ -68,7 +75,7 @@ void ClockTest::testTimeStamp() { OLA_ASSERT_FALSE(timestamp2.IsSet()); // test assignment & copy constructor - clock.CurrentTime(×tamp); + clock.CurrentMonotonicTime(×tamp); OLA_ASSERT_TRUE(timestamp.IsSet()); timestamp2 = timestamp; OLA_ASSERT_TRUE(timestamp2.IsSet()); @@ -77,11 +84,43 @@ void ClockTest::testTimeStamp() { OLA_ASSERT_EQ(timestamp, timestamp2); OLA_ASSERT_EQ(timestamp, timestamp3); + // test timespec assignment + TimeStamp timestamp4; + struct timespec ts1; + const time_t test_secs = 1604140280; + const int test_nsecs = 42000; + ts1.tv_sec = test_secs; + ts1.tv_nsec = test_nsecs; + timestamp4 = ts1; + OLA_ASSERT_TRUE(timestamp4.IsSet()); + OLA_ASSERT_EQ(test_secs, timestamp4.Seconds()); + OLA_ASSERT_EQ(test_nsecs/1000, timestamp4.MicroSeconds()); + // test timeval assignment + TimeStamp timestamp5; + struct timeval tv1; + tv1.tv_sec = test_secs; + tv1.tv_usec = test_nsecs/1000; + timestamp5 = tv1; + OLA_ASSERT_TRUE(timestamp5.IsSet()); + OLA_ASSERT_EQ(test_secs, timestamp5.Seconds()); + OLA_ASSERT_EQ(test_nsecs/1000, timestamp5.MicroSeconds()); + // test timespec copy constructor + TimeStamp timestamp6(ts1); + OLA_ASSERT_TRUE(timestamp6.IsSet()); + OLA_ASSERT_EQ(test_secs, timestamp6.Seconds()); + OLA_ASSERT_EQ(test_nsecs/1000, timestamp6.MicroSeconds()); + // test timeval copy constructor + TimeStamp timestamp7(tv1); + OLA_ASSERT_TRUE(timestamp7.IsSet()); + OLA_ASSERT_EQ(test_secs, timestamp7.Seconds()); + OLA_ASSERT_EQ(test_nsecs/1000, timestamp7.MicroSeconds()); + + // test equalities // Windows only seems to have ms resolution, to make the tests pass we need // to sleep here; XP only has 16ms resolution, so sleep a bit longer usleep(20000); - clock.CurrentTime(×tamp3); + clock.CurrentMonotonicTime(×tamp3); OLA_ASSERT_NE(timestamp3, timestamp); OLA_ASSERT_GT(timestamp3, timestamp); OLA_ASSERT_LT(timestamp, timestamp3); @@ -128,7 +167,7 @@ void ClockTest::testTimeInterval() { /* * Test multiplication of TimeIntervals. */ -void ClockTest::testTimeIntervalMutliplication() { +void ClockTest::testTimeIntervalMultiplication() { TimeInterval half_second(500000); // 0.5s TimeInterval zero_seconds = half_second * 0; OLA_ASSERT_EQ((int64_t) 0, zero_seconds.InMilliSeconds()); @@ -143,11 +182,46 @@ void ClockTest::testTimeIntervalMutliplication() { OLA_ASSERT_EQ((int64_t) 20000, twenty_seconds.InMilliSeconds()); } +/** + * @brief Test the monotonic clock + */ +void ClockTest::testClockMonotonic() { + Clock clock; + TimeStamp first; + clock.CurrentMonotonicTime(&first); +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif // _WIN32 + + TimeStamp second; + clock.CurrentMonotonicTime(&second); + OLA_ASSERT_LT(first, second); +} + +/** + * @brief Test the real time clock + */ +void ClockTest::testClockRealTime() { + Clock clock; + TimeStamp first; + clock.CurrentRealTime(&first); +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif // _WIN32 + + TimeStamp second; + clock.CurrentRealTime(&second); + OLA_ASSERT_LT(first, second); +} /** - * test the clock + * @brief Test the CurrentTime wrapper method */ -void ClockTest::testClock() { +void ClockTest::testClockCurrentTime() { Clock clock; TimeStamp first; clock.CurrentTime(&first); @@ -162,11 +236,71 @@ void ClockTest::testClock() { OLA_ASSERT_LT(first, second); } +/** + * @brief Test the mock monotonic clock + */ +void ClockTest::testMockClockMonotonic() { + MockClock clock; + + TimeStamp first; + clock.CurrentMonotonicTime(&first); + + TimeInterval one_second(1, 0); + clock.AdvanceTime(one_second); + + TimeStamp second; + clock.CurrentMonotonicTime(&second); + OLA_ASSERT_LT(first, second); + OLA_ASSERT_TRUE_MSG( + one_second <= (second - first), + "This test should not have failed. Was the time changed?"); + + TimeInterval ten_point_five_seconds(10, 500000); + clock.AdvanceTime(10, 500000); + + TimeStamp third; + clock.CurrentMonotonicTime(&third); + OLA_ASSERT_LT(second, third); + OLA_ASSERT_TRUE_MSG( + ten_point_five_seconds <= (third - second), + "This test should not have failed. Was the time changed?"); +} + +/** + * @brief Test the mock real time clock + * + */ +void ClockTest::testMockClockRealTime() { + MockClock clock; + + TimeStamp first; + clock.CurrentRealTime(&first); + + TimeInterval one_second(1, 0); + clock.AdvanceTime(one_second); + + TimeStamp second; + clock.CurrentRealTime(&second); + OLA_ASSERT_LT(first, second); + OLA_ASSERT_TRUE_MSG( + one_second <= (second - first), + "This test should not have failed. Was the time changed?"); + + TimeInterval ten_point_five_seconds(10, 500000); + clock.AdvanceTime(10, 500000); + + TimeStamp third; + clock.CurrentRealTime(&third); + OLA_ASSERT_LT(second, third); + OLA_ASSERT_TRUE_MSG( + ten_point_five_seconds <= (third - second), + "This test should not have failed. Was the time changed?"); +} /** - * test the Mock Clock + * @brief Test the mock CurrentTime wrapper method */ -void ClockTest::testMockClock() { +void ClockTest::testMockClockCurrentTime() { MockClock clock; TimeStamp first; @@ -188,3 +322,4 @@ void ClockTest::testMockClock() { OLA_ASSERT_LT(second, third); OLA_ASSERT_TRUE(ten_point_five_seconds <= (third - second)); } + diff --git a/common/utils/DmxBufferTest.cpp b/common/utils/DmxBufferTest.cpp index ece8985522..33e1f97345 100644 --- a/common/utils/DmxBufferTest.cpp +++ b/common/utils/DmxBufferTest.cpp @@ -194,14 +194,21 @@ void DmxBufferTest::testAssign() { DmxBuffer assignment_buffer2; // assigning to ourself does nothing - buffer = buffer; + // Clang 7 onwards complain about this, the *& suppresses that warning + buffer = *&buffer; + // validate the data hasn't changed + unsigned int size = result_length; + buffer.Get(result, &size); + OLA_ASSERT_EQ((unsigned int) sizeof(TEST_DATA), buffer.Size()); + OLA_ASSERT_EQ((unsigned int) sizeof(TEST_DATA), size); + OLA_ASSERT_EQ(0, memcmp(TEST_DATA, result, size)); // assigning to a previously init'ed buffer - unsigned int size = result_length; + size = result_length; assignment_buffer = buffer; assignment_buffer.Get(result, &size); OLA_ASSERT_EQ((unsigned int) sizeof(TEST_DATA), - assignment_buffer.Size()); + assignment_buffer.Size()); OLA_ASSERT_EQ((unsigned int) sizeof(TEST_DATA), size); OLA_ASSERT_EQ(0, memcmp(TEST_DATA, result, size)); OLA_ASSERT_TRUE(assignment_buffer == buffer); diff --git a/common/utils/StringUtils.cpp b/common/utils/StringUtils.cpp index 2f8ea81ea9..4eaca7684e 100644 --- a/common/utils/StringUtils.cpp +++ b/common/utils/StringUtils.cpp @@ -435,13 +435,16 @@ void CapitalizeLabel(string *s) { } void CustomCapitalizeLabel(string *s) { + // Remember to update the Doxygen in include/ola/StringUtils.h too static const char* const transforms[] = { "dhcp", "dmx", "dns", "ip", "ipv4", // Should really be IPv4 probably, but better than nothing + "ipv6", // Should really be IPv6 probably, but better than nothing "led", + "mdmx", // City Theatrical, should really be mDMX, but better than nothing "rdm", "uid", NULL diff --git a/common/utils/TokenBucketTest.cpp b/common/utils/TokenBucketTest.cpp index d86f6586a8..338ba4e4aa 100644 --- a/common/utils/TokenBucketTest.cpp +++ b/common/utils/TokenBucketTest.cpp @@ -57,7 +57,7 @@ void TokenBucketTest::testTokenBucket() { TimeInterval ten_ms(10000); TimeInterval one_hundred_ms(100000); TimeInterval one_second(1000000); - clock.CurrentTime(&now); + clock.CurrentMonotonicTime(&now); TokenBucket bucket(0, 10, 10, now); // one every 100ms OLA_ASSERT_EQ(0u, bucket.Count(now)); @@ -86,7 +86,7 @@ void TokenBucketTest::testTokenBucketTwo() { TimeInterval one_hundred_ms(100000); TimeInterval one_second(1000000); TimeInterval five_minutes(5 * 60 * 1000000); - clock.CurrentTime(&now); + clock.CurrentMonotonicTime(&now); TokenBucket bucket(0, 40, 40, now); // one every 25ms OLA_ASSERT_EQ(0u, bucket.Count(now)); diff --git a/common/web/SchemaParser.h b/common/web/SchemaParser.h index dfbd34f44a..ba49dba29e 100644 --- a/common/web/SchemaParser.h +++ b/common/web/SchemaParser.h @@ -91,7 +91,7 @@ class SchemaParser : public JsonParserInterface { /** * @brief Claim the RootValidator that was created by parsing the schema. * @returns A new Validator, or NULL if the schema wasn't valid. Ownership of - * the validtor is transferred to the caller. + * the validator is transferred to the caller. */ ValidatorInterface* ClaimRootValidator(); diff --git a/common/web/SchemaParserTest.cpp b/common/web/SchemaParserTest.cpp index 7df76b27f5..12d4a0c12f 100644 --- a/common/web/SchemaParserTest.cpp +++ b/common/web/SchemaParserTest.cpp @@ -159,6 +159,8 @@ void JsonSchemaParserTest::ReadTestCases(const string& filename, const string comment_prefix = "//"; string line; while (getline(in, line)) { + // erase trailing \r for source trees from windows docker host + line.erase(line.find_last_not_of("\r")+1); if (line.compare(0, comment_prefix.size(), comment_prefix) == 0) { continue; } else if (line == "--------") { diff --git a/config/ac_python_devel.m4 b/config/ac_python_devel.m4 index e1bd238f66..a6f5f4eda4 100644 --- a/config/ac_python_devel.m4 +++ b/config/ac_python_devel.m4 @@ -172,7 +172,7 @@ $ac_distutils_result]) py_version=`$PYTHON -c "from distutils.sysconfig import *; \ from string import join; \ print join(get_config_vars('VERSION'))"` - if test "$py_version" == "[None]"; then + if test "$py_version" = "[None]"; then if test -n "$PYTHON_VERSION"; then py_version=$PYTHON_VERSION else diff --git a/config/ac_saleae.m4 b/config/ac_saleae.m4 index 0cd799e54c..4e3a7932a3 100644 --- a/config/ac_saleae.m4 +++ b/config/ac_saleae.m4 @@ -42,7 +42,7 @@ AC_DEFUN([SALEAE_DEVICE], [have_saleae=yes], [have_saleae=no]) LIBS=$old_libs - AS_IF([test "x$have_saleae" == xno], + AS_IF([test "x$have_saleae" = xno], [AC_MSG_WARN([SaleaeDevice library is not usable.])]) AM_CONDITIONAL(HAVE_SALEAE_LOGIC, test "${have_saleae}" = "yes") diff --git a/config/ola.m4 b/config/ola.m4 index 6080932e9a..eacee5d94f 100644 --- a/config/ola.m4 +++ b/config/ola.m4 @@ -24,9 +24,6 @@ AC_DEFUN([PROTOBUF_SUPPORT], AC_REQUIRE_CPP() PKG_CHECK_MODULES(libprotobuf, [protobuf >= $1]) -PKG_CHECK_MODULES(libprotobuf2, [protobuf < 3.2], [], - [AC_MSG_ERROR([OLA currently requires protobuf < 3.2, see issue 1192])]) - AC_SUBST([libprotobuf_CFLAGS]) AC_ARG_WITH([protoc], @@ -47,7 +44,14 @@ if test -z "$PROTOC" ; then AC_MSG_ERROR([cannot find 'protoc' program]); elif test -n "$1" ; then AC_MSG_CHECKING([protoc version]) - [protoc_version=`$PROTOC --version 2>&1 | grep 'libprotoc' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] + # Since v20.x we only get effectively the minor and patch versions out of protoc. + # Treat them as major and minor and everything should keep working indefinitely. + # See https://protobuf.dev/support/version-support/ + # So we've got either of these: + # libprotoc 2.4.1 + # libprotoc 23.3 + # The first sed ensures all versions have major, minor, patch, by adding a .0 on the end of ones missing it + [protoc_version=`$PROTOC --version 2>&1 | grep 'libprotoc' | sed 's/\([^\.0-9][0-9][0-9]*\.[0-9][0-9]*\)$/\1\.0/g' | sed 's/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] [required=$1] [required_major=`echo $required | sed 's/[^0-9].*//'`] [required_minor=`echo $required | sed 's/[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*/\1/'`] @@ -96,7 +100,7 @@ else LIBS=$SAVED_LIBS fi AC_SUBST([OLA_PROTOC]) -AM_CONDITIONAL(BUILD_OLA_PROTOC_PLUGIN, test "${with_ola_protoc_plugin}" == "no") +AM_CONDITIONAL(BUILD_OLA_PROTOC_PLUGIN, test "${with_ola_protoc_plugin}" = "no") ]) @@ -147,7 +151,7 @@ AC_DEFUN([PLUGIN_SUPPORT], fi # If dependencies are not met... - if test "$3" == "no"; then + if test "$3" = "no"; then # ...and the user has explicitly requested this plugin to be enabled, # error out. if test "${enable_plugin}" = "yes"; then diff --git a/config/ola_version.m4 b/config/ola_version.m4 index 592880fc4a..15f6fde7dc 100644 --- a/config/ola_version.m4 +++ b/config/ola_version.m4 @@ -19,7 +19,7 @@ # ----------------------------------------------------------------------------- m4_define([ola_major_version], [0]) m4_define([ola_minor_version], [10]) -m4_define([ola_revision_version], [7]) +m4_define([ola_revision_version], [9]) m4_define([ola_version], [ola_major_version.ola_minor_version.ola_revision_version]) diff --git a/configure.ac b/configure.ac index 9a9e07e062..d78ac24a2f 100644 --- a/configure.ac +++ b/configure.ac @@ -103,23 +103,29 @@ AS_IF([test "x$ac_cv_gnu_plus_plus_11" = xyes], # force us into gnu++98 mode if necessary # If gnu++11 and gnu++98 then # If random works with gnu++98 -# If no unit tests, force to gnu++98 -# If unittests and cppunit < 1.14.0, force to gnu++98 -# Else turn off deprecation messages for std::auto_ptr and run gnu++11 -# Else run gnu++11 +# If protobuf < 3.6 +# If no unit tests, force to gnu++98 +# Else we have unit tests +# If cppunit < 1.14.0, force to gnu++98 +# Else turn off deprecation messages for std::auto_ptr and run gnu++11 +# Else assume we have protobuf >= 3.6 (later checks will confirm that for certain), turn off deprecation messages for std::auto_ptr and run gnu++11 +# Else turn off deprecation messages for std::auto_ptr and run gnu++11 require_gnu_plus_plus_11="no" AS_IF([test "x$ac_cv_gnu_plus_plus_11" = xyes], [AS_IF([test "x$ac_cv_gnu_plus_plus_98" = xyes], [AS_IF([test "x$ac_cv_header_random_98" = xyes], - [AS_IF([test "x$enable_unittests" = xno], - [CXXFLAGS="$CXXFLAGS -std=gnu++98"], - [PKG_CHECK_MODULES([CPPUNIT1], [cppunit < 1.14.0], + [PKG_CHECK_MODULES([PROTOBUF1], [protobuf < 3.6], + [AS_IF([test "x$enable_unittests" = xno], [CXXFLAGS="$CXXFLAGS -std=gnu++98"], - [PKG_CHECK_MODULES([CPPUNIT2], [cppunit >= 1.14.0], - [require_gnu_plus_plus_11="yes"], - [AC_MSG_WARN([OLA requires std::auto_ptr support.])]) + [PKG_CHECK_MODULES([CPPUNIT1], [cppunit < 1.14.0], + [CXXFLAGS="$CXXFLAGS -std=gnu++98"], + [PKG_CHECK_MODULES([CPPUNIT2], [cppunit >= 1.14.0], + [require_gnu_plus_plus_11="yes"], + [AC_MSG_WARN([OLA requires std::auto_ptr support.])]) + ]) ]) - ]) + ], + [require_gnu_plus_plus_11="yes"]) ], [require_gnu_plus_plus_11="yes"]) ]) @@ -139,9 +145,10 @@ AC_CHECK_HEADERS([arpa/inet.h bits/sockaddr.h fcntl.h float.h limits.h \ malloc.h netinet/in.h stdint.h stdlib.h string.h strings.h \ sys/file.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h \ syslog.h termios.h unistd.h]) -AC_CHECK_HEADERS([asm/termios.h assert.h dlfcn.h endian.h execinfo.h \ - linux/if_packet.h math.h net/ethernet.h stropts.h \ - sys/param.h sys/types.h sys/uio.h sysexits.h]) +AC_CHECK_HEADERS([asm/termbits.h asm/termios.h assert.h dlfcn.h endian.h \ + execinfo.h linux/if_packet.h math.h net/ethernet.h \ + stropts.h sys/ioctl.h sys/param.h sys/types.h sys/uio.h \ + sysexits.h]) AC_CHECK_HEADERS([winsock2.h winerror.h]) AC_CHECK_HEADERS([random]) @@ -226,30 +233,7 @@ AC_FUNC_VPRINTF AC_CHECK_FUNCS([bzero gettimeofday memmove memset mkdir strdup strrchr \ if_nametoindex inet_ntoa inet_ntop inet_aton inet_pton select \ socket strerror getifaddrs getloadavg getpwnam_r getpwuid_r \ - getgrnam_r getgrgid_r secure_getenv]) - -AC_MSG_CHECKING(for readdir_r deprecation) -old_cxxflags=$CXXFLAGS -CXXFLAGS="${CXXFLAGS} -Werror=deprecated-declarations" -AC_CACHE_VAL(ac_cv_readdir_r_deprecation, - AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([[#include -#include ]],[[ - const char* arg = "/"; - DIR * dir; - struct dirent *buf, *de; - dir = opendir(arg); - readdir_r(dir,buf,&de); -]])], - [ac_cv_readdir_r_deprecation=no], - [ac_cv_readdir_r_deprecation=yes]) -) -CXXFLAGS=$old_cxxflags -AC_MSG_RESULT($ac_cv_readdir_r_deprecation) - -AS_IF([test "x$ac_cv_readdir_r_deprecation" = xyes], - [CXXFLAGS="$CXXFLAGS -Wno-error=deprecated-declarations"], - []) + getgrnam_r getgrgid_r secure_getenv clock_gettime]) LT_INIT([win32-dll]) @@ -418,12 +402,16 @@ AC_CHECK_HEADER([dmx/dmxioctl.h], [], [have_dmx4linux="no"]) AS_IF([test "x$have_dmx4linux" = xyes], [AC_DEFINE([HAVE_DMX4LINUX], [1], [define if dmx4linux is installed])]) +# librt - may be separate or part of libc +AC_SEARCH_LIBS([clock_gettime], [rt]) + # libexecinfo # FreeBSD required -lexecinfo to call backtrace - checking for presence of # header execinfo.h isn't enough AC_CHECK_LIB([execinfo], [backtrace], [use_lexecinfo="yes"]) +# TODO(Peter): This should really be AC_COMPILE_IFELSE and AC_LANG_PROGRAM case "${host_os}" in - *freebsd* | *dragonfly*) + *freebsd* | *netbsd* | *dragonfly*) LIBS="$LIBS -lexecinfo" ;; esac @@ -437,6 +425,14 @@ AM_CONDITIONAL([HAVE_LIBFTD2XX], [test "x$have_libftd2xx" = xyes]) AC_CHECK_HEADERS([curses.h ncurses/curses.h]) AC_CHECK_LIB([ncurses], [initscr], [have_ncurses="yes"]) AM_CONDITIONAL([HAVE_NCURSES], [test "x$have_ncurses" = xyes]) +# Defines libncurses_LIBS that we can use to link against ncurses +# Needed since >=ncurses-6 where -ltinfo is needed in addition to -lncurses +PKG_CHECK_MODULES(libncurses, + [ncurses >= 5], + [have_ncurses_pkgconfig="yes"], + [have_ncurses_pkgconfig="no"]) +AM_CONDITIONAL([HAVE_NCURSES_PKGCONFIG], + [test "x$have_ncurses_pkgconfig" = xyes]) # pthread ACX_PTHREAD([ @@ -612,6 +608,7 @@ AS_IF([test "x$enable_gcov" = xyes], [CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage" CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage" LIBS="$LIBS -lgcov"]) +AM_CONDITIONAL([BUILD_GCOV], [test "x$enable_gcov" = xyes]) # Enable HTTP support. This requires libmicrohttpd. AC_ARG_ENABLE( @@ -842,6 +839,10 @@ AS_IF([test "${enable_rdm_tests}" = "yes"], eval ac_cv_have_pymod_numpy=\$AS_TR_CPP([HAVE_PYMOD_numpy])]) ]) +# Check if the flake8 python linter is available +AC_CHECK_PROG([flake8],[flake8],[yes],[no]) +AM_CONDITIONAL([FOUND_FLAKE8], [test "x$flake8" = xyes]) + # Libraries, that depend on the feature args above. ##################################################### @@ -850,6 +851,9 @@ AS_IF([test "${enable_rdm_tests}" = "yes"], AS_IF([test "x$build_java_libs" = xyes], [PROTOBUF_SUPPORT([2.4.0])], [PROTOBUF_SUPPORT([2.3.0])]) +# Version 3.7 and above of protoc require some additional includes +AC_CHECK_HEADERS([google/protobuf/io/strtod.h google/protobuf/stubs/logging.h \ + google/protobuf/stubs/stl_util.h]) # Doxygen @@ -924,7 +928,7 @@ fi AC_SUBST(PLUGIN_LIBS) AC_SUBST(OLA_SERVER_LIBS) -# html & data directories +# HTML & data directories ola_datadir=$datadir/olad www_datadir=$ola_datadir/www piddatadir=$datadir/ola/pids @@ -953,6 +957,16 @@ if test "x$enable_ja_rule" = xyes; then BUILDING_JA_RULE='yes' fi +# Linters +AC_CHECK_PROG([flake8],[flake8],[yes],[no]) +AM_CONDITIONAL([FOUND_FLAKE8], [test "x$flake8" = xyes]) +AC_CHECK_PROG([cpplint],[cpplint],[yes],[no]) +AM_CONDITIONAL([FOUND_CPPLINT], [test "x$cpplint" = xyes]) + +# Coverage +AC_CHECK_PROG([gcovr],[gcovr],[yes],[no]) +AM_CONDITIONAL([FOUND_GCOVR], [test "x$gcovr" = xyes]) + # Output ##################################################### # Hack alert! @@ -962,11 +976,31 @@ fi # the non-generated files $srcdir/python/ols/PidStore.py). To get the tests # to pass we symlink the files we need for the tests from the builddir to the # srcdir and set PYTHONPATH=${top_builddir}/python in data/rdm/Makefile.am -AC_CONFIG_LINKS([python/ola/PidStore.py:python/ola/PidStore.py +AC_CONFIG_LINKS([python/ola/__init__.py:python/ola/__init__.py + python/ola/ClientWrapper.py:python/ola/ClientWrapper.py + python/ola/DMXConstants.py:python/ola/DMXConstants.py + python/ola/DUBDecoder.py:python/ola/DUBDecoder.py python/ola/MACAddress.py:python/ola/MACAddress.py + python/ola/OlaClient.py:python/ola/OlaClient.py + python/ola/PidStore.py:python/ola/PidStore.py + python/ola/RDMAPI.py:python/ola/RDMAPI.py python/ola/RDMConstants.py:python/ola/RDMConstants.py + python/ola/StringUtils.py:python/ola/StringUtils.py + python/ola/TestUtils.py:python/ola/TestUtils.py python/ola/UID.py:python/ola/UID.py - python/ola/__init__.py:python/ola/__init__.py]) + python/ola/rpc/__init__.py:python/ola/rpc/__init__.py + python/ola/rpc/SimpleRpcController.py:python/ola/rpc/SimpleRpcController.py + python/ola/rpc/StreamRpcChannel.py:python/ola/rpc/StreamRpcChannel.py + tools/rdm/__init__.py:tools/rdm/__init__.py + tools/rdm/ExpectedResults.py:tools/rdm/ExpectedResults.py + tools/rdm/ResponderTest.py:tools/rdm/ResponderTest.py + tools/rdm/TestCategory.py:tools/rdm/TestCategory.py + tools/rdm/TestDefinitions.py:tools/rdm/TestDefinitions.py + tools/rdm/TestHelpers.py:tools/rdm/TestHelpers.py + tools/rdm/TestMixins.py:tools/rdm/TestMixins.py + tools/rdm/TestRunner.py:tools/rdm/TestRunner.py + tools/rdm/TestState.py:tools/rdm/TestState.py + tools/rdm/TimingStats.py:tools/rdm/TimingStats.py]) # Non-makefile generated files. AC_CONFIG_FILES([include/ola/base/Version.h @@ -1005,5 +1039,7 @@ Now type 'make @<:@@:>@' where the optional is: all - build everything check - run the tests - doxygen-doc - generate the html documentation + coverage - build tests and generate coverage + doxygen-doc - generate the HTML documentation + lint - run the linters -------------------------------------------------------" diff --git a/data/Makefile.mk b/data/Makefile.mk index cc6afb63f3..fae7e38891 100644 --- a/data/Makefile.mk +++ b/data/Makefile.mk @@ -1 +1,3 @@ include data/rdm/Makefile.mk + +PYTHON_BUILD_DIRS += data diff --git a/data/rdm/Makefile.mk b/data/rdm/Makefile.mk index 8e0b28d031..264c778d99 100644 --- a/data/rdm/Makefile.mk +++ b/data/rdm/Makefile.mk @@ -30,4 +30,7 @@ data_rdm_PidDataTester_SOURCES = data/rdm/PidDataTest.cpp data_rdm_PidDataTester_CXXFLAGS = $(COMMON_TESTING_FLAGS) -DDATADIR=\"$(srcdir)/data/rdm\" data_rdm_PidDataTester_LDADD = $(COMMON_TESTING_LIBS) -CLEANFILES += data/rdm/PidDataTest.sh +CLEANFILES += \ + data/rdm/*.pyc \ + data/rdm/PidDataTest.sh \ + data/rdm/__pycache__/* diff --git a/data/rdm/PidDataTest.py b/data/rdm/PidDataTest.py index 5268286719..f92a53f029 100755 --- a/data/rdm/PidDataTest.py +++ b/data/rdm/PidDataTest.py @@ -20,6 +20,7 @@ import os import unittest + from ola import PidStore __author__ = 'nomis52@gmail.com (Simon Newton)' diff --git a/data/rdm/draft_pids.proto b/data/rdm/draft_pids.proto index 69a87d8e2a..c2e40fb995 100644 --- a/data/rdm/draft_pids.proto +++ b/data/rdm/draft_pids.proto @@ -1,852 +1 @@ -pid { - name: "BACKGROUND_QUEUED_STATUS_POLICY" - value: 32720 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "current_policy_setting" - } - field { - type: UINT8 - name: "num_policy_settings" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "policy" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION" - value: 32721 - get_request { - field { - type: UINT8 - name: "policy_setting" - } - } - get_response { - field { - type: UINT8 - name: "policy_setting" - } - field { - type: STRING - name: "description" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_STATUS_TYPE" - value: 32722 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "status_type" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "QUEUED_STATUS_ENDPOINT_COLLECTION" - value: 32723 - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "QUEUED_STATUS_UID_COLLECTION" - value: 32724 - set_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UID - name: "target_uid" - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LIST" - value: 32736 - get_request { - } - get_response { - field { - type: UINT32 - name: "list_change_number" - } - field { - type: GROUP - name: "endpoints" - field { - type: UINT16 - name: "endpoint_id" - } - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TO_UNIVERSE" - value: 32737 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - } - field { - type: UINT16 - name: "universe" - label { - value: 65535 - label: "Composite" - } - range { - min: 1 - max: 65535 - } - } - field { - type: BOOL - name: "physical" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT16 - name: "universe" - label { - value: 65535 - label: "Composite" - } - range { - min: 1 - max: 63999 - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "RDM_TRAFFIC_ENABLE" - value: 32738 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "rdm_enabled" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "rdm_enabled" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_MODE" - value: 32739 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "endpoint_function" - label { - value: 0 - label: "Disabled" - } - label { - value: 1 - label: "Input" - } - label { - value: 2 - label: "Output" - } - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "endpoint_function" - label { - value: 0 - label: "Disabled" - } - label { - value: 1 - label: "Input" - } - label { - value: 2 - label: "Output" - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LABEL" - value: 32740 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: STRING - name: "endpoint_label" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: STRING - name: "endpoint_label" - max_size: 32 - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "DISCOVERY_STATE" - value: 32741 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT16 - name: "device_count" - label { - value: 65535 - label: "Not Supported" - } - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "discovery_state" - label { - value: 0 - label: "Not Run" - } - label { - value: 1 - label: "Completed" - } - label { - value: 2 - label: "Incremental" - } - label { - value: 3 - label: "Full" - } - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "discovery_state" - label { - value: 0 - label: "Not Run" - } - label { - value: 1 - label: "Completed" - } - label { - value: 2 - label: "Incremental" - } - label { - value: 3 - label: "Full" - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TIMING" - value: 32742 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "current_setting" - } - field { - type: UINT8 - name: "number_of_settings" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "timing_setting" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TIMING_DESCRIPTION" - value: 32743 - get_request { - field { - type: UINT8 - name: "timing_setting" - } - } - get_response { - field { - type: UINT8 - name: "timing_setting" - } - field { - type: STRING - name: "description" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "BINDING_CONTROL_FIELDS" - value: 32744 - get_request { - field { - type: UID - name: "uid" - } - } - get_response { - field { - type: UID - name: "uid" - } - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT16 - name: "control_bits" - } - field { - type: UID - name: "binding_uid" - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_IDENTIFY" - value: 32745 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "identify_state" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "identify_state" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_DISCOVERY" - value: 32746 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "background_discovery" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "background_discovery" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_DEVICE_LIST_CHANGE" - value: 32747 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT32 - name: "list_change_number" - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_DEVICES" - value: 32748 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT32 - name: "list_change_number" - } - field { - type: GROUP - name: "uids" - field { - type: UID - name: "uid" - } - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "TCP_COMMS_STATUS" - value: 32749 - get_request { - } - get_response { - field { - type: IPV4 - name: "controller_ip" - label { - value: 0 - label: "No Connection" - } - } - field { - type: UINT16 - name: "unhealthy_events" - } - field { - type: UINT16 - name: "connection_events" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LIST_CHANGE" - value: 32750 - get_request { - } - get_response { - field { - type: UINT32 - name: "list_change_number" - } - } - get_sub_device_range: ROOT_DEVICE -} -version: 1438559429 +version: 1605848134 diff --git a/data/rdm/manufacturer_pids.proto b/data/rdm/manufacturer_pids.proto index b9169a2ab8..2bc8001f35 100644 --- a/data/rdm/manufacturer_pids.proto +++ b/data/rdm/manufacturer_pids.proto @@ -2559,6 +2559,132 @@ manufacturer { } set_sub_device_range: ROOT_DEVICE } + pid { + name: "AUTO_MODE" + value: 34559 + get_request { + } + get_response { + field { + type: UINT8 + name: "program" + label { + value: 0 + label: "Disabled" + } + label { + value: 6 + label: "1 colour chase, 4 chans" + } + label { + value: 7 + label: "2 colour chase, 4 chans" + } + label { + value: 8 + label: "1 colour chase, 3 chans FW>=1.2" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "speed" + label { + value: 0 + label: "Fastest" + } + label { + value: 9 + label: "Slowest" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "delay" + label { + value: 0 + label: "Shortest" + } + label { + value: 9 + label: "Longest" + } + range { + min: 0 + max: 9 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT8 + name: "program" + label { + value: 0 + label: "Disabled" + } + label { + value: 6 + label: "1 colour chase, 4 chans" + } + label { + value: 7 + label: "2 colour chase, 4 chans" + } + label { + value: 8 + label: "1 colour chase, 3 chans FW>=1.2" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "speed" + label { + value: 0 + label: "Fastest" + } + label { + value: 9 + label: "Slowest" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "delay" + label { + value: 0 + label: "Shortest" + } + label { + value: 9 + label: "Longest" + } + range { + min: 0 + max: 9 + } + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE + } } manufacturer { manufacturer_id: 18501 @@ -3213,14 +3339,14 @@ manufacturer { get_response { field { type: UINT16 - name: "enabled" + name: "fixture_id" } } get_sub_device_range: ROOT_DEVICE set_request { field { type: UINT16 - name: "enabled" + name: "fixture_id" } } set_response { @@ -6793,6 +6919,72 @@ manufacturer { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } + pid { + name: "PT_FEEDBACK" + value: 40960 + get_request { + } + get_response { + field { + type: BOOL + name: "Pan Tilt Feedback" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "Pan Tilt Feedback" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } + pid { + name: "OUTPUT_UNIFORMITY" + value: 40969 + get_request { + } + get_response { + field { + type: BOOL + name: "Output Uniformity" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "Output Uniformity" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } + pid { + name: "DL_COMPATIBLE_MODE" + value: 40973 + get_request { + } + get_response { + field { + type: BOOL + name: "DL Compatible Mode" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "DL Compatible Mode" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } pid { name: "TOUCHSCREEN_LOCK" value: 40975 @@ -7341,6 +7533,32 @@ manufacturer { set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } } +manufacturer { + manufacturer_id: 21367 + manufacturer_name: "SWISSON AG" + pid { + name: "SWPID_AUTO_UNIVERSE_NUMBER" + value: 32898 + get_request { + } + get_response { + field { + type: UINT16 + name: "universe_number" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "universe_number" + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE + } +} manufacturer { manufacturer_id: 22355 manufacturer_name: "Wireless Solution Sweden AB" @@ -9164,4 +9382,4 @@ manufacturer { set_sub_device_range: ROOT_DEVICE } } -version: 1528709287 +version: 1605848134 diff --git a/data/rdm/pids.proto b/data/rdm/pids.proto index 47b3c77dce..cebb8ef20e 100644 --- a/data/rdm/pids.proto +++ b/data/rdm/pids.proto @@ -4010,6 +4010,1079 @@ pid { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } +pid { + name: "SEARCH_DOMAIN" + value: 2049 + get_request { + } + get_response { + field { + type: STRING + name: "search_domain" + min_size: 0 + max_size: 231 + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: STRING + name: "search_domain" + min_size: 0 + max_size: 231 + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "BROKER_STATUS" + value: 2051 + get_request { + } + get_response { + field { + type: BOOL + name: "set_allowed" + } + field { + type: UINT8 + name: "broker_state" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Active" + } + label { + value: 2 + label: "Standby" + } + range { + min: 0 + max: 2 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT8 + name: "broker_state" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Active" + } + range { + min: 0 + max: 1 + } + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LIST" + value: 2304 + get_request { + } + get_response { + field { + type: UINT32 + name: "list_change_number" + } + field { + type: GROUP + name: "endpoints" + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "endpoint_type" + label { + value: 0 + label: "Virtual Endpoint" + } + label { + value: 1 + label: "Physical Endpoint" + } + range { + min: 0 + max: 1 + } + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LIST_CHANGE" + value: 2305 + get_request { + } + get_response { + field { + type: UINT32 + name: "list_change_number" + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "IDENTIFY_ENDPOINT" + value: 2306 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "identify_state" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "identify_state" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TO_UNIVERSE" + value: 2307 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT16 + name: "universe" + label { + value: 0 + label: "Unpatched" + } + label { + value: 65535 + label: "Composite" + } + range { + min: 0 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT16 + name: "universe" + label { + value: 0 + label: "Unpatch" + } + range { + min: 0 + max: 63999 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_MODE" + value: 2308 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "endpoint_mode" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Input" + } + label { + value: 2 + label: "Output" + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "endpoint_mode" + label { + value: 0 + label: "Disable" + } + label { + value: 1 + label: "Input" + } + label { + value: 2 + label: "Output" + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LABEL" + value: 2309 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: STRING + name: "endpoint_label" + max_size: 32 + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: STRING + name: "endpoint_label" + max_size: 32 + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "RDM_TRAFFIC_ENABLE" + value: 2310 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "rdm_enabled" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "rdm_enabled" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "DISCOVERY_STATE" + value: 2311 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT16 + name: "device_count" + label { + value: 0 + label: "Incomplete" + } + label { + value: 65535 + label: "Unknown" + } + range { + min: 0 + max: 65535 + } + } + field { + type: UINT8 + name: "discovery_state" + label { + value: 0 + label: "Incomplete" + } + label { + value: 1 + label: "Incremental" + } + label { + value: 2 + label: "Full" + } + label { + value: 4 + label: "Completed" + } + range { + min: 0 + max: 2 + } + range { + min: 4 + max: 4 + } + range { + min: 128 + max: 223 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "discovery_state" + label { + value: 1 + label: "Incremental" + } + label { + value: 2 + label: "Full" + } + label { + value: 4 + label: "Stop" + } + range { + min: 1 + max: 2 + } + range { + min: 4 + max: 4 + } + range { + min: 128 + max: 223 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "BACKGROUND_DISCOVERY" + value: 2312 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "background_discovery" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "background_discovery" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TIMING" + value: 2313 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "current_setting" + range { + min: 1 + max: 255 + } + } + field { + type: UINT8 + name: "number_of_settings" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TIMING_DESCRIPTION" + value: 2314 + get_request { + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + } + get_response { + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + field { + type: STRING + name: "description" + max_size: 32 + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_RESPONDERS" + value: 2315 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT32 + name: "list_change_number" + } + field { + type: GROUP + name: "uids" + field { + type: UID + name: "uid" + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_RESPONDER_LIST_CHANGE" + value: 2316 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT32 + name: "list_change_number" + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "BINDING_CONTROL_FIELDS" + value: 2317 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UID + name: "uid" + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UID + name: "uid" + } + field { + type: UINT16 + name: "control_bits" + } + field { + type: UID + name: "binding_uid" + label { + value: 0 + label: "No Information Present" + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "BACKGROUND_QUEUED_STATUS_POLICY" + value: 2318 + get_request { + } + get_response { + field { + type: UINT8 + name: "current_policy_setting" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + field { + type: UINT8 + name: "num_policy_settings" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: UINT8 + name: "policy" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE +} +pid { + name: "BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION" + value: 2319 + get_request { + field { + type: UINT8 + name: "policy_setting" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + } + get_response { + field { + type: UINT8 + name: "policy_setting" + } + field { + type: STRING + name: "description" + max_size: 32 + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE +} pid { name: "IDENTIFY_DEVICE" value: 4096 @@ -4548,4 +5621,4 @@ pid { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } -version: 1521301591 +version: 1605848134 diff --git a/debian/changelog b/debian/changelog index fbaab91ea2..c205fcd1b3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,25 @@ +ola (0.10.9-2) UNRELEASED; urgency=medium + + * Fix ola-rdm-tests Debian package by patching python shebangs to python3 + with dh_python3. + * Reorder build command line in autopkgtest; Closes: Debian #913704. + * This change pulled from Debian by Perry Naseck + https://salsa.debian.org/wouter/ola/-/commit/223f9ddaf9d4001dfc908734f0641315edbf9ea2 + + -- Wouter Verhelst Wed, 14 Nov 2018 23:44:42 +0100 + +ola (0.10.9-1) unstable; urgency=low + + * New upstream release + + -- Peter Newman Sun, 26 Feb 2023 01:15:00 +0000 + +ola (0.10.8-1) unstable; urgency=low + + * New upstream release + + -- Peter Newman Fri, 22 Nov 2020 10:54:00 +0100 + ola (0.10.7-1) unstable; urgency=low * New upstream release diff --git a/debian/control b/debian/control index 765ea3f194..0fed249b90 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: ola Priority: optional Maintainer: Wouter Verhelst Uploaders: RenZO -Build-Depends: debhelper (>= 9), autotools-dev, dh-autoreconf, bash-completion, libcppunit-dev, bison, flex, pkg-config, uuid-dev, python, python-protobuf, libprotobuf-dev, protobuf-compiler, libprotoc-dev, libusb-1.0-0-dev, libftdi1-dev, liblo-dev, libmicrohttpd-dev, libncurses5-dev, libavahi-client-dev, python-numpy +Build-Depends: debhelper (>= 13), autotools-dev, dh-autoreconf, dh-python, bash-completion, libcppunit-dev, bison, flex, pkg-config, uuid-dev, python3, python3-protobuf, libprotobuf-dev, protobuf-compiler, libprotoc-dev, libusb-1.0-0-dev, libftdi1-dev, liblo-dev, libmicrohttpd-dev, libncurses5-dev, libavahi-client-dev, python3-numpy Standards-Version: 3.9.8 Section: libs Vcs-Git: https://github.com/OpenLightingProject/ola.git @@ -28,7 +28,7 @@ Description: Open Lighting Architecture - development libraries Package: ola-python Section: libs Architecture: all -Depends: ola (>= ${source:Version}), ola (<< ${source:Version}.~), ${python:Depends}, ${misc:Depends}, python-protobuf +Depends: ola (>= ${source:Version}), ola (<< ${source:Version}.~), ${python3:Depends}, ${misc:Depends}, python3-protobuf Description: Open Lighting Architecture - Python Classes The DMX512 standard for Digital MultipleX is used for digital communication networks commonly used to control stage lighting and @@ -42,7 +42,7 @@ Description: Open Lighting Architecture - Python Classes Package: ola-rdm-tests Section: libs Architecture: all -Depends: ola (>= ${source:Version}), ola (<< ${source:Version}.~), ola-python (= ${binary:Version}), ${python:Depends}, ${misc:Depends}, python-numpy, libjs-jquery, libjs-jquery-ui, lsb-base +Depends: ola (>= ${source:Version}), ola (<< ${source:Version}.~), ola-python (= ${binary:Version}), ${python3:Depends}, ${misc:Depends}, python3-numpy, libjs-jquery, libjs-jquery-ui, lsb-base Suggests: bash-completion Description: Open Lighting Architecture - RDM Responder Tests The DMX512 standard for Digital MultipleX is used for digital diff --git a/debian/ola-python.install b/debian/ola-python.install index 101c36fe15..552bc9ac93 100644 --- a/debian/ola-python.install +++ b/debian/ola-python.install @@ -1,2 +1,2 @@ -usr/lib/python*/dist-packages/ola/*.py -usr/lib/python*/dist-packages/ola/rpc/*.py +usr/lib/python*/*-packages/ola/*.py +usr/lib/python*/*-packages/ola/rpc/*.py diff --git a/debian/ola-rdm-tests.install b/debian/ola-rdm-tests.install index 2a2ec91734..f5981a7fa1 100644 --- a/debian/ola-rdm-tests.install +++ b/debian/ola-rdm-tests.install @@ -1,6 +1,6 @@ usr/bin/*.py -usr/lib/python*/dist-packages/ola/testing/*.py -usr/lib/python*/dist-packages/ola/testing/rdm/*.py +usr/lib/python*/*-packages/ola/testing/*.py +usr/lib/python*/*-packages/ola/testing/rdm/*.py usr/share/man/man1/rdm_* usr/share/ola/rdm-server/* usr/share/ola/rdm-server/images/* diff --git a/debian/rules b/debian/rules index a1a969229b..0089ad1080 100755 --- a/debian/rules +++ b/debian/rules @@ -11,10 +11,10 @@ export VERBOSE=1 %: - dh $@ --parallel --with autotools_dev,autoreconf,bash_completion,python2 + dh $@ --parallel --with autotools_dev,autoreconf,bash_completion,python3 override_dh_auto_configure: - dh_auto_configure -- --enable-python-libs --enable-rdm-tests + dh_auto_configure -- --enable-python-libs --enable-rdm-tests CXXFLAGS='-Wno-error=deprecated-declarations -Wno-error=unused-parameter' pythondir='/usr/lib/python3/dist-packages' override_dh_installinit: dh_installinit -p ola --name=olad @@ -22,3 +22,6 @@ override_dh_installinit: override_dh_makeshlibs: dh_makeshlibs -V + +override_dh_python3: + dh_python3 --shebang=/usr/bin/python3 diff --git a/debian/tests/control b/debian/tests/control index 2b2e99c4da..56b6a839f9 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -4,15 +4,15 @@ Depends: ola Test-Command: ola_rdm_get --list-pids Depends: ola -Test-Command: rdm_responder_test.py --help +Test-Command: set -e ; for py in $(py3versions -s 2>/dev/null) ; do echo "Testing with $py:" ; $py $(which rdm_responder_test.py) --help ; done Depends: ola-rdm-tests -Test-Command: set -e ; for py in $(pyversions -s 2>/dev/null) ; do cd "$ADTTMP" ; echo "Testing with $py:" ; $py -c "from ola.ClientWrapper import ClientWrapper; print(ClientWrapper)" ; done -Depends: python-all, ola, ola-python +Test-Command: set -e ; for py in $(py3versions -s 2>/dev/null) ; do cd "$ADTTMP" ; echo "Testing with $py:" ; $py -c "from ola.ClientWrapper import ClientWrapper; print(ClientWrapper)" ; done +Depends: python3-all, ola, ola-python Test-Command: pkg-config --cflags --libs libola Depends: libola-dev, pkg-config -Test-Command: set -e; g++ -o linktest $(pkg-config --cflags --libs libola) debian/tests/hw.cc; ./linktest +Test-Command: set -e; g++ -o linktest debian/tests/hw.cc $(pkg-config --cflags --libs libola); ./linktest Depends: libola-dev, g++, pkg-config Restrictions: rw-build-tree diff --git a/doxygen/rpc.dox b/doxygen/rpc.dox index 93dee8fb2f..81e740bbc9 100644 --- a/doxygen/rpc.dox +++ b/doxygen/rpc.dox @@ -186,7 +186,6 @@ required Type type = 1; optional uint32 id = 2; optional string name = 3; - optional string name = 3; optional bytes buffer = 4; } ~~~~~~~~~~~~~~~~~~~~~ diff --git a/examples/Makefile.mk b/examples/Makefile.mk index a707fd21db..cc54a99148 100644 --- a/examples/Makefile.mk +++ b/examples/Makefile.mk @@ -91,10 +91,16 @@ examples_ola_uni_stats_LDADD = $(EXAMPLE_COMMON_LIBS) if HAVE_NCURSES bin_PROGRAMS += examples/ola_dmxconsole examples/ola_dmxmonitor examples_ola_dmxconsole_SOURCES = examples/ola-dmxconsole.cpp -examples_ola_dmxconsole_LDADD = $(EXAMPLE_COMMON_LIBS) -lncurses examples_ola_dmxmonitor_SOURCES = examples/ola-dmxmonitor.cpp +if HAVE_NCURSES_PKGCONFIG +examples_ola_dmxconsole_LDADD = $(EXAMPLE_COMMON_LIBS) $(libncurses_LIBS) +examples_ola_dmxmonitor_LDADD = $(EXAMPLE_COMMON_LIBS) $(libncurses_LIBS) +else +# Fallback when pkg-config didn't know about ncurses +examples_ola_dmxconsole_LDADD = $(EXAMPLE_COMMON_LIBS) -lncurses examples_ola_dmxmonitor_LDADD = $(EXAMPLE_COMMON_LIBS) -lncurses endif +endif noinst_PROGRAMS += examples/ola_throughput examples/ola_latency examples_ola_throughput_SOURCES = examples/ola-throughput.cpp diff --git a/examples/ShowRecorder.cpp b/examples/ShowRecorder.cpp index 64301b126c..3221ffc444 100644 --- a/examples/ShowRecorder.cpp +++ b/examples/ShowRecorder.cpp @@ -109,7 +109,7 @@ void ShowRecorder::Stop() { void ShowRecorder::NewFrame(const ola::client::DMXMetadata &meta, const ola::DmxBuffer &data) { ola::TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); m_saver.NewFrame(now, meta.universe, data); m_frame_count++; } diff --git a/examples/ola-dmxmonitor.cpp b/examples/ola-dmxmonitor.cpp index 8669475f33..45de3ac98a 100644 --- a/examples/ola-dmxmonitor.cpp +++ b/examples/ola-dmxmonitor.cpp @@ -241,7 +241,7 @@ void DmxMonitor::NewDmx(OLA_UNUSED const ola::client::DMXMetadata &meta, m_counter++; Clock clock; - clock.CurrentTime(&m_last_data); + clock.CurrentMonotonicTime(&m_last_data); Values(); refresh(); } @@ -369,7 +369,7 @@ bool DmxMonitor::CheckDataLoss() { if (m_last_data.IsSet()) { TimeStamp now; Clock clock; - clock.CurrentTime(&now); + clock.CurrentMonotonicTime(&now); TimeInterval diff = now - m_last_data; if (diff > TimeInterval(2, 5000000)) { // loss of data diff --git a/examples/ola-latency.cpp b/examples/ola-latency.cpp index 8be90748c0..cd9da75c9e 100644 --- a/examples/ola-latency.cpp +++ b/examples/ola-latency.cpp @@ -109,7 +109,7 @@ void Tracker::SendComplete(const string &) { } void Tracker::SendRequest() { - m_clock.CurrentTime(&m_send_time); + m_clock.CurrentMonotonicTime(&m_send_time); if (FLAGS_send_dmx) { m_wrapper.GetClient()->SendDmx( FLAGS_universe, @@ -125,7 +125,7 @@ void Tracker::SendRequest() { void Tracker::LogTime() { TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); TimeInterval delta = now - m_send_time; if (delta > m_max) { m_max = delta; diff --git a/examples/ola-uni-stats.cpp b/examples/ola-uni-stats.cpp index c0226f3d5f..b796eeae3a 100644 --- a/examples/ola-uni-stats.cpp +++ b/examples/ola-uni-stats.cpp @@ -124,7 +124,7 @@ UniverseTracker::UniverseTracker(OlaCallbackClientWrapper *wrapper, bool UniverseTracker::Run() { - m_clock.CurrentTime(&m_start_time); + m_clock.CurrentMonotonicTime(&m_start_time); m_wrapper->GetSelectServer()->Run(); return true; } @@ -133,7 +133,7 @@ bool UniverseTracker::Run() { void UniverseTracker::PrintStats() { UniverseStatsMap::iterator iter = m_stats.begin(); TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); TimeInterval interval = now - m_start_time; OLA_INFO << "Time delta was " << interval; @@ -166,7 +166,7 @@ void UniverseTracker::PrintStats() { void UniverseTracker::ResetStats() { - m_clock.CurrentTime(&m_start_time); + m_clock.CurrentMonotonicTime(&m_start_time); UniverseStatsMap::iterator iter = m_stats.begin(); for (; iter != m_stats.end(); ++iter) { diff --git a/include/Makefile.mk b/include/Makefile.mk index c42383c800..58d164cdf7 100644 --- a/include/Makefile.mk +++ b/include/Makefile.mk @@ -1,2 +1,5 @@ include include/ola/Makefile.mk include include/olad/Makefile.mk + +PYTHON_BUILD_DIRS += include + diff --git a/include/ola/Clock.h b/include/ola/Clock.h index 02363ae457..7472e9b8cf 100644 --- a/include/ola/Clock.h +++ b/include/ola/Clock.h @@ -54,6 +54,7 @@ class BaseTimeVal { BaseTimeVal(int32_t sec, int32_t usec); explicit BaseTimeVal(const struct timeval ×tamp) { m_tv = timestamp; } + explicit BaseTimeVal(const struct timespec ×tamp) { Set(timestamp); } explicit BaseTimeVal(int64_t interval_useconds) { Set(interval_useconds); } BaseTimeVal(const BaseTimeVal &other) : m_tv(other.m_tv) {} @@ -61,6 +62,7 @@ class BaseTimeVal { // Assignable BaseTimeVal& operator=(const BaseTimeVal& other); BaseTimeVal& operator=(const struct timeval &tv); + BaseTimeVal& operator=(const struct timespec &ts); // Comparables bool operator==(const BaseTimeVal &other) const; @@ -110,6 +112,12 @@ class BaseTimeVal { struct timeval *result) const; void Set(int64_t interval_useconds); + + /** + * @brief Sets the value with a timespec + * @param ts A reference to struct timespec + */ + void Set(const struct timespec &ts); }; /* @@ -173,12 +181,14 @@ class TimeStamp { // Constructors TimeStamp() {} explicit TimeStamp(const struct timeval ×tamp) : m_tv(timestamp) {} + explicit TimeStamp(const struct timespec ×tamp) : m_tv(timestamp) {} TimeStamp(const TimeStamp &other) : m_tv(other.m_tv) {} // Assignable TimeStamp& operator=(const TimeStamp& other); TimeStamp& operator=(const struct timeval &tv); + TimeStamp& operator=(const struct timespec &ts); // Comparables bool operator==(const TimeStamp &other) const { return m_tv == other.m_tv; } @@ -214,7 +224,6 @@ class TimeStamp { explicit TimeStamp(const BaseTimeVal &time_val) : m_tv(time_val) {} }; - /** * @brief Used to get the current time. */ @@ -222,13 +231,50 @@ class Clock { public: Clock() {} virtual ~Clock() {} - virtual void CurrentTime(TimeStamp *timestamp) const; + /** + * @brief Sets timestamp to the current monotonic time. + * + * The timestamp parameter will be set to the current monotonic time only if + * the system has a monotonic clock available. If a monotonic clock is + * unavailable, this method will fallback to CurrentRealTime. + * + * The system's monotonic clock is not subject to discontinuous jumps due to + * administrative action, but may be affected by incremental adjustment due to + * time synchronization protocol e.g. NTP. The monotonic clock does not + * advance while the system is suspended. An appropriate use of this method is + * to measure elapsed time. + * @sa Clock::CurrentRealTime + * @param[out] timestamp A TimeStamp pointer + */ + virtual void CurrentMonotonicTime(TimeStamp* timestamp) const; + + /** + * @brief Sets timestamp to the current real time. + * + * The timestamp parameter will be set to the current real i.e. wall-clock + * time. + * + * The system's realtime clock is subject to discontinuous and incremental + * adjustment due to administrative action or time synchronization protocol + * e.g. NTP. An appropriate use of this method is to display a user-facing + * timestamp. + * @sa Clock::CurrentMonotonicTime + * @param[out] timestamp A TimeStamp pointer + */ + virtual void CurrentRealTime(TimeStamp* timestamp) const; + + /** + * @brief Wrapper around CurrentRealime. + * @param[out] timestamp A TimeStamp pointer + * @deprecated Please use either Clock::CurrentMonotonicTime or + * Clock::CurrentRealTime as appropriate (25 Oct 2020). + */ + virtual void CurrentTime(TimeStamp* timestamp) const; private: DISALLOW_COPY_AND_ASSIGN(Clock); }; - /** * A Mock Clock used for testing. */ @@ -240,6 +286,8 @@ class MockClock: public Clock { void AdvanceTime(const TimeInterval &interval); void AdvanceTime(int32_t sec, int32_t usec); + void CurrentMonotonicTime(TimeStamp *timestamp) const; + void CurrentRealTime(TimeStamp *timestamp) const; void CurrentTime(TimeStamp *timestamp) const; private: diff --git a/include/ola/Logging.h b/include/ola/Logging.h index c66d477ed0..a7fac6d514 100644 --- a/include/ola/Logging.h +++ b/include/ola/Logging.h @@ -73,7 +73,7 @@ #define OLA_WARN OLA_LOG(ola::OLA_LOG_WARN) /** - * Provide a stream to log an infomational message. + * Provide a stream to log an informational message. * @code * OLA_INFO << "Reading configs from " << config_dir; * @endcode diff --git a/include/ola/Makefile.mk b/include/ola/Makefile.mk index e112a03eb3..0f544b15cd 100644 --- a/include/ola/Makefile.mk +++ b/include/ola/Makefile.mk @@ -46,3 +46,7 @@ built_sources += include/ola/plugin_id.h include/ola/plugin_id.h: include/ola/Makefile.mk include/ola/make_plugin_id.sh common/protocol/Ola.proto mkdir -p $(top_builddir)/include/ola sh $(top_srcdir)/include/ola/make_plugin_id.sh $(top_srcdir)/common/protocol/Ola.proto > $(top_builddir)/include/ola/plugin_id.h + +CLEANFILES += \ + include/ola/*.pyc \ + include/ola/__pycache__/* diff --git a/include/ola/MultiCallback.h b/include/ola/MultiCallback.h index f463246f43..f819ebdb6d 100644 --- a/include/ola/MultiCallback.h +++ b/include/ola/MultiCallback.h @@ -14,7 +14,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * MultiCallback.h - * A callback which can be exectuted multiple times. When a pre-defined limit + * A callback which can be executed multiple times. When a pre-defined limit * is reached, then the underlying callback is executed. * Copyright (C) 2011 Simon Newton */ @@ -66,7 +66,7 @@ namespace ola { * * @note MultiCallback is NOT thread safe. * - * @note If limit is 0, the callback is exectuted immediately. + * @note If limit is 0, the callback is executed immediately. */ class MultiCallback: public BaseCallback0 { public: diff --git a/include/ola/StringUtils.h b/include/ola/StringUtils.h index ff88dbdca8..3ae2d4b504 100644 --- a/include/ola/StringUtils.h +++ b/include/ola/StringUtils.h @@ -441,8 +441,16 @@ void CapitalizeLabel(std::string *s); * * @param s a string to transform. * The following are capitalized: - * - ip + * - dhcp * - dmx + * - dns + * - ip + * - ipv4 + * - ipv6 + * - led + * - mdmx + * - rdm + * - uid */ void CustomCapitalizeLabel(std::string *s); diff --git a/include/ola/acn/ACNVectors.h b/include/ola/acn/ACNVectors.h index 26c94da543..b45e1c0e76 100644 --- a/include/ola/acn/ACNVectors.h +++ b/include/ola/acn/ACNVectors.h @@ -61,7 +61,7 @@ enum DMPVector { * @brief Vectors used at the E1.31 layer. */ enum E131Vector { - VECTOR_E131_DATA = 2, /**< DMP data (DATA_PACKET_VECTOR( */ + VECTOR_E131_DATA = 2, /**< DMP data (DATA_PACKET_VECTOR) */ VECTOR_E131_SYNC = 3, /**< Sync data (SYNC_PACKET_VECTOR) */ VECTOR_E131_DISCOVERY = 4, /**< Discovery data (DISCOVERY_PACKET_VECTOR) */ }; @@ -86,10 +86,11 @@ enum E133ControllerVector { VECTOR_CONTROLLER_DEVICE_RELEASED = 4, /**< Device released message */ VECTOR_CONTROLLER_EXPECT_MASTER = 5, /**< Expect master message */ }; -} // namespace acn -} // namespace ola /** * @} */ +} // namespace acn +} // namespace ola + #endif // INCLUDE_OLA_ACN_ACNVECTORS_H_ diff --git a/include/ola/acn/CID.h b/include/ola/acn/CID.h index 9114f2b468..91c403a5f4 100644 --- a/include/ola/acn/CID.h +++ b/include/ola/acn/CID.h @@ -15,7 +15,7 @@ * * CID.h * The CID class, this just wraps a CIDImpl so we don't need to include all the - * UID headers. + * UUID headers. * Copyright (C) 2007 Simon Newton */ diff --git a/include/ola/base/Flags.h b/include/ola/base/Flags.h index b83ebfd672..59293defff 100644 --- a/include/ola/base/Flags.h +++ b/include/ola/base/Flags.h @@ -28,7 +28,7 @@ * Features: * - bool, uint8, uint16, uint32, int8, int16, int32 & string types. * - short options (e.g. -x). - * - inverted bools, e.g. --no-foo + * - inverted bools, e.g. \--no-foo * * @note * - Setting flags is not thread safe @@ -44,7 +44,7 @@ * --name is simon * --baz (-b) is 0 * @endcode - * Compare with ./flags --foo --name bob -b 10 --nobar + * Compare with ./flags \--foo \--name bob -b 10 \--no-bar * @code * --foo is 1 * --bar is 0 diff --git a/include/ola/base/FlagsPrivate.h b/include/ola/base/FlagsPrivate.h index 87ee61a469..8ec198f184 100644 --- a/include/ola/base/FlagsPrivate.h +++ b/include/ola/base/FlagsPrivate.h @@ -307,7 +307,7 @@ bool Flag::SetValue(const std::string &input) { /** - * @brief This class holds all the flags, and is responsbile for parsing the + * @brief This class holds all the flags, and is responsible for parsing the * command line. */ class FlagRegistry { diff --git a/include/ola/base/Init.h b/include/ola/base/Init.h index 0449ff467d..acac5282f8 100644 --- a/include/ola/base/Init.h +++ b/include/ola/base/Init.h @@ -161,6 +161,11 @@ void InitExportMap(int argc, char* argv[], ExportMap *export_map); * @sa @ref logging */ void Daemonise(); + +/** + * @brief Logs status of clock capabilities + */ +void ClockInit(); /**@}*/ } // namespace ola #endif // INCLUDE_OLA_BASE_INIT_H_ diff --git a/include/ola/client/Module.h b/include/ola/client/Module.h index 0c81d2fd8a..7b72d5bce4 100644 --- a/include/ola/client/Module.h +++ b/include/ola/client/Module.h @@ -24,7 +24,7 @@ * Sometimes it's useful for client applications to avoid linking against * libola, say for instance if they install separately from OLA. By deferring * the linking and using libola as a plugin, clients can use OLA if it's - * installed on the system or if not, take some other action like displaing a + * installed on the system or if not, take some other action like displaying a * message or using another output mechanism. * * This file provides plugin interfaces so that a client code can load diff --git a/include/ola/gen_callbacks.py b/include/ola/gen_callbacks.py index 9061b9a8c7..18f149df89 100755 --- a/include/ola/gen_callbacks.py +++ b/include/ola/gen_callbacks.py @@ -17,6 +17,8 @@ # Copyright (C) 2010 Simon Newton +from __future__ import print_function + import textwrap @@ -24,11 +26,11 @@ def PrintLongLine(line): optional_nolint = '' if len(line) > 80: optional_nolint = ' // NOLINT(whitespace/line_length)' - print ('%s%s' % (line, optional_nolint)) + print('%s%s' % (line, optional_nolint)) def Header(): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -143,16 +145,16 @@ def Header(): * @addtogroup callbacks * @{ */ - """) + """)) def Footer(): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @} */ } // namespace ola - #endif // INCLUDE_OLA_CALLBACK_H_""") + #endif // INCLUDE_OLA_CALLBACK_H_""")) def GenerateBase(number_of_args): @@ -162,86 +164,86 @@ def GenerateBase(number_of_args): if number_of_args > 0: optional_comma = ', ' - typenames = ', '.join('typename Arg%d' % i for i in xrange(number_of_args)) - arg_list = ', '.join('Arg%d arg%d' % (i, i) for i in xrange(number_of_args)) - args = ', '.join('arg%d' % i for i in xrange(number_of_args)) + typenames = ', '.join('typename Arg%d' % i for i in range(number_of_args)) + arg_list = ', '.join('Arg%d arg%d' % (i, i) for i in range(number_of_args)) + args = ', '.join('arg%d' % i for i in range(number_of_args)) - arg_types = ', '.join('Arg%d' % i for i in xrange(number_of_args)) + arg_types = ', '.join('Arg%d' % i for i in range(number_of_args)) # generate the base callback class - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief The base class for all %d argument callbacks. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) - print 'class BaseCallback%d {' % number_of_args - print ' public:' - print ' virtual ~BaseCallback%d() {}' % number_of_args + print('class BaseCallback%d {' % number_of_args) + print(' public:') + print(' virtual ~BaseCallback%d() {}' % number_of_args) PrintLongLine(' virtual ReturnType Run(%s) = 0;' % arg_list) - print '};' - print '' + print('};') + print('') # generate the multi-use version of the callback - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d argument callback which can be called multiple times. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) - print ('class Callback%d: public BaseCallback%d {' % - (number_of_args, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~Callback%d() {}' % number_of_args + print('class Callback%d: public BaseCallback%d {' % + (number_of_args, number_of_args, optional_comma, arg_types)) + print(' public:') + print(' virtual ~Callback%d() {}' % number_of_args) PrintLongLine(' ReturnType Run(%s) { return this->DoRun(%s); }' % (arg_list, args)) - print ' private:' - print ' virtual ReturnType DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' private:') + print(' virtual ReturnType DoRun(%s) = 0;' % arg_list) + print('};') + print('') # generate the single-use version of the callback - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d argument callback which deletes itself after it's run. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) PrintLongLine("class SingleUseCallback%d: public BaseCallback%d<" "ReturnType%s%s> {" % (number_of_args, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~SingleUseCallback%d() {}' % number_of_args - print ' ReturnType Run(%s) {' % arg_list - print ' ReturnType ret = this->DoRun(%s);' % args - print ' delete this;' - print ' return ret;' - print ' }' - print ' private:' - print ' virtual ReturnType DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' public:') + print(' virtual ~SingleUseCallback%d() {}' % number_of_args) + print(' ReturnType Run(%s) {' % arg_list) + print(' ReturnType ret = this->DoRun(%s);' % args) + print(' delete this;') + print(' return ret;') + print(' }') + print(' private:') + print(' virtual ReturnType DoRun(%s) = 0;' % arg_list) + print('};') + print('') # the void specialization - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d arg, single use callback that returns void. - */""" % number_of_args) - print 'template <%s>' % typenames + */""" % number_of_args)) + print('template <%s>' % typenames) PrintLongLine("class SingleUseCallback%d: public BaseCallback%d<" "void%s%s> {" % (number_of_args, optional_comma, arg_types, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~SingleUseCallback%d() {}' % number_of_args - print ' void Run(%s) {' % arg_list - print ' this->DoRun(%s);' % args - print ' delete this;' - print ' }' - print ' private:' - print ' virtual void DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' public:') + print(' virtual ~SingleUseCallback%d() {}' % number_of_args) + print(' void Run(%s) {' % arg_list) + print(' this->DoRun(%s);' % args) + print(' delete this;') + print(' }') + print(' private:') + print(' virtual void DoRun(%s) = 0;' % arg_list) + print('};') + print('') def GenerateHelperFunction(bind_count, @@ -263,10 +265,10 @@ def GenerateHelperFunction(bind_count, if bind_count > 0 or exec_count > 0: optional_comma = ', ' - typenames = (['typename A%d' % i for i in xrange(bind_count)] + - ['typename Arg%d' % i for i in xrange(exec_count)]) - bind_types = ['A%d' % i for i in xrange(bind_count)] - exec_types = ['Arg%d' % i for i in xrange(exec_count)] + typenames = (['typename A%d' % i for i in range(bind_count)] + + ['typename Arg%d' % i for i in range(exec_count)]) + bind_types = ['A%d' % i for i in range(bind_count)] + exec_types = ['Arg%d' % i for i in range(exec_count)] method_types = ', '.join(bind_types + exec_types) if exec_count > 0: exec_types = [''] + exec_types @@ -277,85 +279,85 @@ def GenerateHelperFunction(bind_count, 'typename Class, ', 'method', 'Class::*method') # The single use helper function - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A helper function to create a new %s with %d * create-time arguments and %d execution time arguments.""" % - (parent_class, bind_count, exec_count)) + (parent_class, bind_count, exec_count))) if is_method: - print " * @tparam Class the class with the member function." - print " * @tparam ReturnType the return type of the callback." - for i in xrange(bind_count): - print " * @tparam A%d a create-time argument type." % i - for i in xrange(exec_count): - print " * @tparam Arg%d an exec-time argument type." % i + print(" * @tparam Class the class with the member function.") + print(" * @tparam ReturnType the return type of the callback.") + for i in range(bind_count): + print(" * @tparam A%d a create-time argument type." % i) + for i in range(exec_count): + print(" * @tparam Arg%d an exec-time argument type." % i) if is_method: - print " * @param object the object to call the member function on." - print (" * @param method the member function pointer to use when executing " - "the callback.") + print(" * @param object the object to call the member function on.") + print(" * @param method the member function pointer to use when executing " + "the callback.") else: - print (" * @param callback the function pointer to use when executing the " - "callback.") - for i in xrange(bind_count): - print " * @param a%d a create-time argument." % i + print(" * @param callback the function pointer to use when executing the " + "callback.") + for i in range(bind_count): + print(" * @param a%d a create-time argument." % i) if is_method: - print " * @returns The same return value as the member function." + print(" * @returns The same return value as the member function.") else: - print " * @returns The same return value as the function." - print " */" + print(" * @returns The same return value as the function.") + print(" */") PrintLongLine('template <%stypename ReturnType%s%s>' % (optional_class, optional_comma, ', '.join(typenames))) PrintLongLine('inline %s%d* %s(' % (parent_class, exec_count, exec_type_str, function_name)) if is_method: - print ' Class* object,' + print(' Class* object,') if bind_count: - print ' ReturnType (%s)(%s),' % (signature, method_types) - for i in xrange(bind_count): + print(' ReturnType (%s)(%s),' % (signature, method_types)) + for i in range(bind_count): suffix = ',' if i == bind_count - 1: suffix = ') {' - print ' A%d a%d%s' % (i, i, suffix) + print(' A%d a%d%s' % (i, i, suffix)) else: - print ' ReturnType (%s)(%s)) {' % (signature, method_types) + print(' ReturnType (%s)(%s)) {' % (signature, method_types)) padding = '' if is_method: - print ' return new MethodCallback%d_%d,' % (padding, parent_class, exec_count, exec_type_str)) if bind_count > 0 or exec_count > 0: - print ' %sReturnType,' % padding + print(' %sReturnType,' % padding) else: - print ' %sReturnType>(' % padding - for i in xrange(bind_count): + print(' %sReturnType>(' % padding) + for i in range(bind_count): if i == bind_count - 1 and exec_count == 0: suffix = '>(' else: suffix = ',' - print ' %sA%d%s' % (padding, i, suffix) - for i in xrange(exec_count): + print(' %sA%d%s' % (padding, i, suffix)) + for i in range(exec_count): suffix = ',' if i == exec_count - 1: suffix = '>(' - print ' %sArg%d%s' % (padding, i, suffix) + print(' %sArg%d%s' % (padding, i, suffix)) if is_method: - print ' object,' + print(' object,') if bind_count: - print ' %s,' % ptr_name + print(' %s,' % ptr_name) else: - print ' %s);' % ptr_name - for i in xrange(bind_count): + print(' %s);' % ptr_name) + for i in range(bind_count): suffix = ',' if i == bind_count - 1: suffix = ');' - print ' a%d%s' % (i, suffix) - print '}' - print '' - print '' + print(' a%d%s' % (i, suffix)) + print('}') + print('') + print('') def GenerateMethodCallback(bind_count, @@ -371,18 +373,18 @@ def GenerateMethodCallback(bind_count, if bind_count > 0 or exec_count > 0: optional_comma = ', ' - typenames = (['typename A%d' % i for i in xrange(bind_count)] + - ['typename Arg%d' % i for i in xrange(exec_count)]) + typenames = (['typename A%d' % i for i in range(bind_count)] + + ['typename Arg%d' % i for i in range(exec_count)]) - bind_types = ['A%d' % i for i in xrange(bind_count)] - exec_types = ['Arg%d' % i for i in xrange(exec_count)] + bind_types = ['A%d' % i for i in range(bind_count)] + exec_types = ['Arg%d' % i for i in range(exec_count)] method_types = ', '.join(bind_types + exec_types) - method_args = (['m_a%d' % i for i in xrange(bind_count)] + - ['arg%d' % i for i in xrange(exec_count)]) + method_args = (['m_a%d' % i for i in range(bind_count)] + + ['arg%d' % i for i in range(exec_count)]) - exec_args = ', '.join(['Arg%d arg%d' % (i, i) for i in xrange(exec_count)]) - bind_args = ', '.join(['A%d a%d' % (i, i) for i in xrange(bind_count)]) + exec_args = ', '.join(['Arg%d arg%d' % (i, i) for i in range(exec_count)]) + bind_args = ', '.join(['A%d a%d' % (i, i) for i in range(bind_count)]) optional_class, method_or_function, class_name = ( '', 'Function', 'FunctionCallback') @@ -392,19 +394,19 @@ def GenerateMethodCallback(bind_count, 'typename Class, ', 'Method', 'MethodCallback') class_param, signature = 'Class *object, ', 'Class::*Method' - print ("""\ + print("""\ /** * @brief A %s callback with %d create-time args and %d exec time args */""" % (method_or_function, bind_count, exec_count)) PrintLongLine('template <%stypename Parent, typename ReturnType%s%s>' % (optional_class, optional_comma, ', '.join(typenames))) - print 'class %s%d_%d: public Parent {' % (class_name, bind_count, exec_count) - print ' public:' + print('class %s%d_%d: public Parent {' % (class_name, bind_count, exec_count)) + print(' public:') if is_method: - print ' typedef ReturnType (%s)(%s);' % (signature, method_types) + print(' typedef ReturnType (%s)(%s);' % (signature, method_types)) else: - print ' typedef ReturnType (*Function)(%s);' % (method_types) + print(' typedef ReturnType (*Function)(%s);' % (method_types)) if bind_count: PrintLongLine(' %s%d_%d(%s%s callback, %s):' % @@ -417,35 +419,35 @@ def GenerateMethodCallback(bind_count, PrintLongLine(' %s%s%d_%d(%s%s callback):' % (optional_explicit, class_name, bind_count, exec_count, class_param, method_or_function)) - print ' Parent(),' + print(' Parent(),') if is_method: - print ' m_object(object),' + print(' m_object(object),') if bind_count: - print ' m_callback(callback),' - for i in xrange(bind_count): + print(' m_callback(callback),') + for i in range(bind_count): suffix = ',' if i == bind_count - 1: suffix = ' {}' - print ' m_a%d(a%d)%s' % (i, i, suffix) + print(' m_a%d(a%d)%s' % (i, i, suffix)) else: - print ' m_callback(callback) {}' - print ' ReturnType DoRun(%s) {' % exec_args + print(' m_callback(callback) {}') + print(' ReturnType DoRun(%s) {' % exec_args) if is_method: PrintLongLine(' return (m_object->*m_callback)(%s);' % ', '.join(method_args)) else: - print ' return m_callback(%s);' % ', '.join(method_args) - print ' }' + print(' return m_callback(%s);' % ', '.join(method_args)) + print(' }') - print ' private:' + print(' private:') if is_method: - print ' Class *m_object;' - print ' %s m_callback;' % method_or_function - for i in xrange(bind_count): - print ' A%d m_a%d;' % (i, i) - print '};' - print '' - print '' + print(' Class *m_object;') + print(' %s m_callback;' % method_or_function) + for i in range(bind_count): + print(' A%d m_a%d;' % (i, i)) + print('};') + print('') + print('') # generate the helper methods GenerateHelperFunction(bind_count, diff --git a/include/ola/http/HTTPServer.h b/include/ola/http/HTTPServer.h index 0ec37e3a55..560d30ca2b 100644 --- a/include/ola/http/HTTPServer.h +++ b/include/ola/http/HTTPServer.h @@ -45,6 +45,17 @@ #include #include +// Beginning with v0.9.71, libmicrohttpd changed the return type of most +// functions from int to enum MHD_Result +// https://git.gnunet.org/gnunet.git/tree/src/include/gnunet_mhd_compat.h +// proposes to define a constant for the return type so it works well +// with all versions of libmicrohttpd +#if MHD_VERSION >= 0x00097002 +#define MHD_RESULT enum MHD_Result +#else +#define MHD_RESULT int +#endif + namespace ola { namespace http { diff --git a/include/ola/io/BigEndianStream.h b/include/ola/io/BigEndianStream.h index 098b8ef571..aa595a8460 100644 --- a/include/ola/io/BigEndianStream.h +++ b/include/ola/io/BigEndianStream.h @@ -164,7 +164,7 @@ class BigEndianOutputStreamAdaptor: public BigEndianOutputStreamInterface { /** - * A Big Endian Input stream that wraps an OutputBufferInterface + * A Big Endian Output stream that wraps an OutputBufferInterface */ class BigEndianOutputStream: public BigEndianOutputStreamInterface { public: diff --git a/include/ola/io/MemoryBlock.h b/include/ola/io/MemoryBlock.h index 464fdfd77b..2a053d52bb 100644 --- a/include/ola/io/MemoryBlock.h +++ b/include/ola/io/MemoryBlock.h @@ -63,7 +63,7 @@ class MemoryBlock { /** * @brief Move the insertation point to the end of the block. - * This is useful if you want to use the block in pre-pend mode. + * This is useful if you want to use the block in prepend mode. */ void SeekBack() { m_first = m_data_end; diff --git a/include/ola/io/SelectServer.h b/include/ola/io/SelectServer.h index 58cb269cba..1d07c7a047 100644 --- a/include/ola/io/SelectServer.h +++ b/include/ola/io/SelectServer.h @@ -52,7 +52,7 @@ namespace io { * @snippet udp_server.cpp UDP Server * * The SelectServer has a number of different implementations depending on the - * platform. On systems with epoll, the flag --no-use-epoll will disable the + * platform. On systems with epoll, the flag \--no-use-epoll will disable the * use of epoll(), reverting to select(). The PollerInterface defines the * contract between the SelectServer and the lower level, platform dependent * Poller classes. diff --git a/include/ola/messaging/Descriptor.h b/include/ola/messaging/Descriptor.h index ac59790859..cff4b1b50d 100644 --- a/include/ola/messaging/Descriptor.h +++ b/include/ola/messaging/Descriptor.h @@ -198,7 +198,7 @@ class IntegerFieldDescriptor: public FieldDescriptor { int8_t multiplier = 0) : FieldDescriptor(name), m_little_endian(little_endian), - m_multipler(multiplier) { + m_multiplier(multiplier) { } IntegerFieldDescriptor(const std::string &name, @@ -208,7 +208,7 @@ class IntegerFieldDescriptor: public FieldDescriptor { int8_t multiplier = 0) : FieldDescriptor(name), m_little_endian(little_endian), - m_multipler(multiplier), + m_multiplier(multiplier), m_intervals(intervals), m_labels(labels) { } @@ -216,7 +216,7 @@ class IntegerFieldDescriptor: public FieldDescriptor { bool FixedSize() const { return true; } bool LimitedSize() const { return true; } unsigned int MaxSize() const { return sizeof(type); } - int8_t Multiplier() const { return m_multipler; } + int8_t Multiplier() const { return m_multiplier; } bool IsLittleEndian() const { return m_little_endian; } const IntervalVector &Intervals() const { return m_intervals; } @@ -258,7 +258,7 @@ class IntegerFieldDescriptor: public FieldDescriptor { private: bool m_little_endian; - int8_t m_multipler; + int8_t m_multiplier; IntervalVector m_intervals; LabeledValues m_labels; }; diff --git a/include/ola/messaging/MessagePrinter.h b/include/ola/messaging/MessagePrinter.h index 01b3050d0f..0053d16618 100644 --- a/include/ola/messaging/MessagePrinter.h +++ b/include/ola/messaging/MessagePrinter.h @@ -98,12 +98,12 @@ class GenericMessagePrinter: public MessagePrinter { void AppendUInt(const std::string &name, unsigned int value, const std::string &label, - int8_t multipler); + int8_t multiplier); void AppendInt(const std::string &name, int value, const std::string &label, - int8_t multipler); - void AppendMultipler(int8_t multipler); + int8_t multiplier); + void AppendMultiplier(int8_t multiplier); }; } // namespace messaging } // namespace ola diff --git a/include/ola/network/HealthCheckedConnection.h b/include/ola/network/HealthCheckedConnection.h index a4311f51eb..cbbe33e351 100644 --- a/include/ola/network/HealthCheckedConnection.h +++ b/include/ola/network/HealthCheckedConnection.h @@ -75,7 +75,7 @@ class HealthCheckedConnection { /** * Call this when a heartbeat is piggybacked on another message. This - * prevents sending heatbeats unless necessary. + * prevents sending heartbeats unless necessary. */ void HeartbeatSent(); diff --git a/include/ola/network/SocketAddress.h b/include/ola/network/SocketAddress.h index 0bca7d3214..9cc78b4d65 100644 --- a/include/ola/network/SocketAddress.h +++ b/include/ola/network/SocketAddress.h @@ -173,6 +173,10 @@ class GenericSocketAddress: public SocketAddress { memset(reinterpret_cast(&m_addr), 0, sizeof(m_addr)); } + GenericSocketAddress(const GenericSocketAddress& other) { + memcpy(&m_addr, &(other.m_addr), sizeof(m_addr)); + } + bool IsValid() const; uint16_t Family() const { diff --git a/include/ola/rdm/RDMAPIImplInterface.h b/include/ola/rdm/RDMAPIImplInterface.h index 8d7d18fd6f..3ded9102bb 100644 --- a/include/ola/rdm/RDMAPIImplInterface.h +++ b/include/ola/rdm/RDMAPIImplInterface.h @@ -43,7 +43,7 @@ namespace rdm { * @brief Represents the state of a response and/or any error codes. * * RDM Handlers should first check for error being non-empty as this - * represents an underlying transport error. Then the resonse_code + * represents an underlying transport error. Then the response_code * should be checked to catch invalid responses, timeouts etc. Finally, the * value of response_type should be checked against the rdm_response_type * codes. diff --git a/include/ola/rdm/RDMCommand.h b/include/ola/rdm/RDMCommand.h index 2062be6064..81eddcd35e 100644 --- a/include/ola/rdm/RDMCommand.h +++ b/include/ola/rdm/RDMCommand.h @@ -514,7 +514,7 @@ class RDMResponse: public RDMCommand { /** * @brief The Response Type. - * @returns The Response Typpe (ACK, NACK, etc.) + * @returns The Response Type (ACK, NACK, etc.) */ uint8_t ResponseType() const { return m_port_id; } diff --git a/include/ola/rdm/RDMCommandSerializer.h b/include/ola/rdm/RDMCommandSerializer.h index 1e077d00b3..95623d19ac 100644 --- a/include/ola/rdm/RDMCommandSerializer.h +++ b/include/ola/rdm/RDMCommandSerializer.h @@ -78,7 +78,7 @@ class RDMCommandSerializer { /** * @brief Serialize a RDMCommand to an array of bytes. * @param command the RDMCommand to serialize. - * @param buffer The memory location to serailize to. + * @param buffer The memory location to serialize to. * @param[in,out] size The size of the memory location. * @returns True if the command was serialized correctly, false otherwise. * diff --git a/include/ola/rdm/RDMControllerInterface.h b/include/ola/rdm/RDMControllerInterface.h index 8ddff1e049..564c20ea88 100644 --- a/include/ola/rdm/RDMControllerInterface.h +++ b/include/ola/rdm/RDMControllerInterface.h @@ -79,12 +79,12 @@ class RDMControllerInterface { * @param request the RDMRequest, ownership is transferred. * @param on_complete The callback to run when the request completes. * - * Implementors much ensure that the callback is always run at some point. + * Implementers much ensure that the callback is always run at some point. * In other words, there must be no way that a request can be dropped in such * a way that the callback is never run. Doing so will either block all * subsequent requests, or leak memory depending on the implementation. * - * Also the implementor of this class may want to re-write the transaction #, + * Also the implementer of this class may want to re-write the transaction #, * and possibly the UID (changing src UIDs isn't addressed by the RDM * spec). * diff --git a/include/ola/rdm/RDMEnums.h b/include/ola/rdm/RDMEnums.h index 945de77e27..c57e8f7e97 100644 --- a/include/ola/rdm/RDMEnums.h +++ b/include/ola/rdm/RDMEnums.h @@ -326,6 +326,11 @@ typedef enum { } rdm_data_type; +// Remember to update the other places when adding new NACK codes: +// common/rdm/RDMHelper.cpp +// plugins/usbpro/DmxTriWidget.cpp +// plugins/usbpro/DmxTriWidget.h +// python/ola/OlaClient.py typedef enum { NR_UNKNOWN_PID = 0x0000, NR_FORMAT_ERROR = 0x0001, @@ -339,7 +344,14 @@ typedef enum { NR_SUB_DEVICE_OUT_OF_RANGE = 0x0009, NR_PROXY_BUFFER_FULL = 0x000A, NR_ACTION_NOT_SUPPORTED = 0x000B, - NR_ENDPOINT_NUMBER_INVALID = 0x0011 + NR_ENDPOINT_NUMBER_INVALID = 0x000C, + NR_INVALID_ENDPOINT_MODE = 0x000D, + NR_UNKNOWN_UID = 0x000E, + NR_UNKNOWN_SCOPE = 0x000F, + NR_INVALID_STATIC_CONFIG_TYPE = 0x0010, + NR_INVALID_IPV4_ADDRESS = 0x0011, + NR_INVALID_IPV6_ADDRESS = 0x0012, + NR_INVALID_PORT = 0x0013 } rdm_nack_reason; diff --git a/include/ola/rdm/StringMessageBuilder.h b/include/ola/rdm/StringMessageBuilder.h index 4f08afc85e..f66187e682 100644 --- a/include/ola/rdm/StringMessageBuilder.h +++ b/include/ola/rdm/StringMessageBuilder.h @@ -22,7 +22,7 @@ * @addtogroup rdm_helpers * @{ * @file include/ola/rdm/StringMessageBuilder.h - * @brief Builds a Messagse object from a list of strings and a Descriptor. + * @brief Builds a Message object from a list of strings and a Descriptor. * @} */ diff --git a/include/ola/web/JsonSections.h b/include/ola/web/JsonSections.h index 394d56929f..fe4e3f80bb 100644 --- a/include/ola/web/JsonSections.h +++ b/include/ola/web/JsonSections.h @@ -34,7 +34,7 @@ namespace web { * This is the base item class. Items are composed into sections. * Each item has the following: * - A text description - * - A type, which controls how the item is renders + * - A type, which controls how the item is rendered * - The value. * - Optional id. A non-empty id makes this item editable * - Optional button text. Non-empty means this item gets it own button. diff --git a/include/ola/web/JsonTypes.h b/include/ola/web/JsonTypes.h index 2477fbecdd..b05fd0e1f9 100644 --- a/include/ola/web/JsonTypes.h +++ b/include/ola/web/JsonTypes.h @@ -23,7 +23,7 @@ * @addtogroup json * @{ * @file JsonTypes.h - * @brief Enums used to identfy JSON types. + * @brief Enums used to identify JSON types. * @} */ diff --git a/javascript/new-src/Gruntfile.js b/javascript/new-src/Gruntfile.js index fbb5f61ffa..2be1781768 100644 --- a/javascript/new-src/Gruntfile.js +++ b/javascript/new-src/Gruntfile.js @@ -89,8 +89,7 @@ module.exports = function(grunt) { 'src/filters/start_form.js' ], options: { - config: true, - verbose: true + config: true } }, watch: { diff --git a/javascript/new-src/README.md b/javascript/new-src/README.md index 6b3772fa1d..ebe31622d4 100644 --- a/javascript/new-src/README.md +++ b/javascript/new-src/README.md @@ -1,5 +1,5 @@ # web-interface -the web interface for ola is build using +the web interface for ola is built using - [angularjs](http://angularjs.com) - [bootstrap](http://getbootstrap.com) - [jquery](http://jquery.com) diff --git a/javascript/new-src/bower.json b/javascript/new-src/bower.json index e405267f84..0181acb955 100644 --- a/javascript/new-src/bower.json +++ b/javascript/new-src/bower.json @@ -7,9 +7,9 @@ "license": "GPL", "private": true, "dependencies": { - "angular": "~1.3.14", + "angular": "~1.8.3", "bootstrap": "~3.3.1", - "angular-route": "~1.3.14" + "angular-route": "~1.8.3" }, "exportsOverride": { "angular": { diff --git a/javascript/new-src/package-lock.json b/javascript/new-src/package-lock.json new file mode 100644 index 0000000000..32df7de018 --- /dev/null +++ b/javascript/new-src/package-lock.json @@ -0,0 +1,3211 @@ +{ + "name": "OLA", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "OLA", + "license": "GPL-2.0+", + "devDependencies": { + "grunt": "~1.6.1", + "grunt-bower-task": "^0.6.2", + "grunt-contrib-cssmin": "^4.0.0", + "grunt-contrib-jshint": "^3.2.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-jscs": "^3.0.1", + "olp-javascript-style": "OpenLightingProject/javascript-style" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "node_modules/bower": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz", + "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==", + "dev": true, + "bin": { + "bower": "bin/bower" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-json": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.8.4.tgz", + "integrity": "sha512-mMKghvq9ivbuzSsY5nrOLnDtZIJMUCpysqbGaGW3mj88JAcuSi8ZAzIt34vNZjohy0aR9VXLwgPTZGnBX2Vpjg==", + "dev": true, + "dependencies": { + "deep-extend": "^0.5.1", + "ends-with": "^0.2.0", + "ext-list": "^2.0.0", + "graceful-fs": "^4.1.3", + "intersect": "^1.0.1", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/comment-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.2.tgz", + "integrity": "sha512-589emAvz7K/5YfZom/6i96vbx6IapXJJ9HzAuqR1qskxeYdJeyId0KQCgXrSh3R1x8tVWW62Wl6T1uRGC9S51Q==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.4" + } + }, + "node_modules/comment-parser/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/comment-parser/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/comment-parser/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/comment-parser/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cst": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/cst/-/cst-0.4.10.tgz", + "integrity": "sha512-U5ETe1IOjq2h56ZcBE3oe9rT7XryCH6IKgPMv0L7sSk6w29yR3p5egCK0T3BDNHHV95OoUBgXsqiVG+3a900Ag==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.9.2", + "babylon": "^6.8.1", + "source-map-support": "^0.4.0" + } + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/deep-equal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/ends-with": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz", + "integrity": "sha512-lRppY4dK3VkqBdR242sKcAJeYc8Gf/DhoX9AWvWI2RzccmLnqBQfwm2k4oSDv5MPDjUqawCauXhZkyWxkVhRsg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "dev": true, + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha512-9ztMtDZtSKC78V8mev+k31qaTabbmuH5jatdvPBMikrFHvw5BqlYnQIn/WGK3WHeRooSTkRvLa2IPlaHjPq5Sg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "dependencies": { + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/grunt-bower-task": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/grunt-bower-task/-/grunt-bower-task-0.6.2.tgz", + "integrity": "sha512-l8WIomFvkzqL6Wj195mOwuFmqFeJf+PibPguT3LJyZDd6GxveM/i0z5lHd3TeIoxwltgHa4lY1ymw8wf8MZsUA==", + "dev": true, + "dependencies": { + "async": "^2.3.0", + "bower": "^1.7.9", + "bower-json": "^0.8.1", + "colors": "1.4.0", + "fs-extra": "^2.1.2", + "lodash": "^4.17.21", + "rimraf": "^2.6.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt-contrib-cssmin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", + "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "clean-css": "^5.0.1", + "maxmin": "^3.0.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/grunt-contrib-jshint": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz", + "integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==", + "dev": true, + "dependencies": { + "chalk": "~4.1.2", + "hooker": "^0.2.3", + "jshint": "~2.13.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-contrib-uglify": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", + "integrity": "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "maxmin": "^3.0.0", + "uglify-js": "^3.16.1", + "uri-path": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-jscs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-3.0.1.tgz", + "integrity": "sha512-LKHSLWYAq1JlhJdTHvKnMOc7haOen2sK3LSwnS/MFRK7ay64WpIkdcstsNK/sWsICEOlFCbpaTT+jqxossaM7Q==", + "dev": true, + "dependencies": { + "hooker": "~0.2.3", + "jscs": "~3.0.5", + "lodash": "~4.6.1", + "vow": "~0.4.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-jscs/node_modules/lodash": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz", + "integrity": "sha512-85DFrB4TYPwVZbZw/HCGnmRUdDQOxGJuDmSfZ9OQEESdFJ1NxlYLoQObfHJGr+UsWwmVQhwG2iPmUCi6+eKzUg==", + "dev": true + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-log/node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherit": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.7.tgz", + "integrity": "sha512-dxJmC1j0Q32NFAjvbd6g3lXYLZ49HgzotgbSMwMkoiTXGhC9412Oc24g7A7M9cPPkw/vDsF2cSII+2zJwocUtQ==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "node_modules/intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", + "integrity": "sha512-qsc720yevCO+4NydrJWgEWKccAQwTOvj2m73O/VBA6iUL2HGZJ9XqBiyraNrBXX/W1IAjdpXdRZk24sq8TzBRg==", + "dev": true + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jscs": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/jscs/-/jscs-3.0.7.tgz", + "integrity": "sha512-9MFXDDnpP/3evfdnrDFfeVfBYU9w6kb/76HpjFeYJXjE8/0sPurPRKXj2bmHghx3fR/y5fy/xmtzIdjAfa850w==", + "deprecated": "JSCS has merged with ESLint! See - https://medium.com/@markelog/jscs-end-of-the-line-bc9bf0b3fdb2", + "dev": true, + "dependencies": { + "chalk": "~1.1.0", + "cli-table": "~0.3.1", + "commander": "~2.9.0", + "cst": "^0.4.3", + "estraverse": "^4.1.0", + "exit": "~0.1.2", + "glob": "^5.0.1", + "htmlparser2": "3.8.3", + "js-yaml": "~3.4.0", + "jscs-jsdoc": "^2.0.0", + "jscs-preset-wikimedia": "~1.0.0", + "jsonlint": "~1.6.2", + "lodash": "~3.10.0", + "minimatch": "~3.0.0", + "natural-compare": "~1.2.2", + "pathval": "~0.1.1", + "prompt": "~0.2.14", + "reserved-words": "^0.1.1", + "resolve": "^1.1.6", + "strip-bom": "^2.0.0", + "strip-json-comments": "~1.0.2", + "to-double-quotes": "^2.0.0", + "to-single-quotes": "^2.0.0", + "vow": "~0.4.8", + "vow-fs": "~0.3.4", + "xmlbuilder": "^3.1.0" + }, + "bin": { + "jscs": "bin/jscs" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/jscs-jsdoc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-2.0.0.tgz", + "integrity": "sha512-bmR28JIx4K+64AbvoCxk7AGHsFuoUU/HbPdmt4Tf9884AqYbTFdZpD61i4fSNJ+x/gSQGQv3gSYupklGWemh8w==", + "dev": true, + "dependencies": { + "comment-parser": "^0.3.1", + "jsdoctypeparser": "~1.2.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/jscs-preset-wikimedia": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.1.tgz", + "integrity": "sha512-RWqu6IYSUlnYuCRCF0obCOHjJV0vhpLcvKbauwxmLQoZ0PiXDTWBYlfpsEfdhg7pmREAEwrARfDRz5qWD6qknA==", + "deprecated": "No longer maintained. We recomment migrating to ESLint with eslint-config-wikimedia.", + "dev": true + }, + "node_modules/jscs/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscs/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscs/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscs/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jscs/node_modules/js-yaml": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", + "integrity": "sha512-k9JCHDD9Hefc/S1BhsZTHO93mgZ6Z6VrGrZnGLf1pm1KAFhKjERum6v/4Exk8q9MkQyTRKIqlF+IM0BAPxLduw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.2", + "esprima": "^2.6.0", + "inherit": "^2.2.2" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jscs/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/jscs/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/jsdoctypeparser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", + "integrity": "sha512-osXm4Fr1o/Jc0YwUM7DHUliYtaunLQxh4ynZgtN02mTUN1VsNbMy75DFSkKRne8xE8jiGRV9NKVhYYYa8ZIHXQ==", + "dev": true, + "dependencies": { + "lodash": "^3.7.0" + } + }, + "node_modules/jsdoctypeparser/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/jshint": { + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", + "dev": true, + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonlint": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", + "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", + "dev": true, + "dependencies": { + "JSV": "^4.0.x", + "nomnom": "^1.5.x" + }, + "bin": { + "jsonlint": "lib/cli.js" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha512-ZJ6wx9xaKJ3yFUhq5/sk82PJMuUyLk277I8mQeyDgCTjGdjWJIvPfaU5LIXaMuaN2UO1X3kZH4+lgphublZUHw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", + "integrity": "sha512-0RFYWi+nj7ljSRvWvY29EW63ytmlg0zP7PkpscsffMcqkrD9ZgFQlzX4VFqzijXErXKJ217VbDlIi6nIGnWcOw==", + "dev": true + }, + "node_modules/ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", + "dev": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==", + "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "dev": true, + "dependencies": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + } + }, + "node_modules/nomnom/node_modules/ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nomnom/node_modules/chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "dependencies": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nomnom/node_modules/strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/olp-javascript-style": { + "version": "0.0.2", + "resolved": "git+ssh://git@github.com/OpenLightingProject/javascript-style.git#e76515b867073536c312b8b82ccd8d7f82058ef7", + "dev": true, + "license": "GPL-3.0" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pathval": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", + "integrity": "sha512-2AJyCGXy4VsZ2wa0TmMoL93KtWshxWQAMuuAG+7/Q3kth9uRDV38cMZTaSCsrTDJEwV8QbIHad+3E673s1ZY0A==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prompt": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", + "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==", + "dev": true, + "dependencies": { + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.2.x", + "winston": "0.8.x" + }, + "engines": { + "node": ">= 0.6.6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "dependencies": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } + }, + "node_modules/to-double-quotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", + "integrity": "sha512-p1wPjPRAERjhuUJyXqbqu6jDpzkkkV6ORWjGiHJbg5eOYsTVW2vIOIXaQGyb55T9pI1aWVicnStSatxzwiD7Yw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-single-quotes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz", + "integrity": "sha512-SGsqWAWCttVpbDgHPHrJNr3qnCu/HObqE3GzlstAvgtyOsQXy+lhn840SoyfPV+2JpJk46MTcn5kMyaqG377MA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==", + "dev": true + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utile": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==", + "dev": true, + "dependencies": { + "async": "~0.2.9", + "deep-equal": "*", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "0.4.x", + "rimraf": "2.x.x" + }, + "engines": { + "node": ">= 0.6.4" + } + }, + "node_modules/utile/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vow": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", + "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vow-fs": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", + "integrity": "sha512-oK9rtqJSHy7ZQAhAtVU0HiF/oVhm0A4Qx2l2DyyFBUsXbTXUg258EsQGLLIXYZnE5MYaInZLgA6l/10je/EamA==", + "dev": true, + "dependencies": { + "glob": "^7.0.5", + "uuid": "^2.0.2", + "vow": "^0.4.7", + "vow-queue": "^0.4.1" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/vow-queue": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", + "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", + "dev": true, + "dependencies": { + "vow": "^0.4.17" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/winston": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", + "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", + "dev": true, + "dependencies": { + "async": "0.2.x", + "colors": "0.6.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/winston/node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/winston/node_modules/pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", + "integrity": "sha512-O1jgZBjfTh7BkSel+8d0v1ecsT4RFYI26QTARKsRZrd9TRw4FFYOT/wHG7m3cDRla0jUPKhGXnhtygarYky1bA==", + "dev": true, + "dependencies": { + "lodash": "^3.5.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/xmlbuilder/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + } + } +} diff --git a/javascript/new-src/package.json b/javascript/new-src/package.json index 84c2d7cd61..3333a529d9 100644 --- a/javascript/new-src/package.json +++ b/javascript/new-src/package.json @@ -3,13 +3,16 @@ "license": "GPL-2.0+", "repository": "OpenLightingProject/ola", "devDependencies": { - "olp-javascript-style": "OpenLightingProject/javascript-style", - "grunt": "~0.4.5", - "grunt-bower-task": "^0.4.0", - "grunt-contrib-cssmin": "^0.11.0", - "grunt-contrib-jshint": "^1.1.0", - "grunt-contrib-uglify": "^0.7.0", - "grunt-contrib-watch": "^0.6.1", - "grunt-jscs": "^1.8.0" + "grunt": "~1.6.1", + "grunt-bower-task": "^0.6.2", + "grunt-contrib-cssmin": "^4.0.0", + "grunt-contrib-jshint": "^3.2.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-jscs": "^3.0.1", + "olp-javascript-style": "OpenLightingProject/javascript-style" + }, + "scripts": { + "test": "grunt -v -d --stack test" } } diff --git a/javascript/new-src/src/app.js b/javascript/new-src/src/app.js index 5a019f8b31..ec20f2a235 100644 --- a/javascript/new-src/src/app.js +++ b/javascript/new-src/src/app.js @@ -20,6 +20,15 @@ /* global angular */ var ola = angular.module('olaApp', ['ngRoute']); +// AngularJS 1.6 now uses an '!' as the default hashPrefix, breaking +// our routes. Following lines revert the default to the previous empty +// string. +// See https://docs.angularjs.org/guide/migration#commit-aa077e8 +ola.config(['$locationProvider', function($locationProvider) { + 'use strict'; + $locationProvider.hashPrefix(''); +}]); + ola.config(['$routeProvider', function($routeProvider) { 'use strict'; diff --git a/javascript/ola/full/dmx_console_tab.js b/javascript/ola/full/dmx_console_tab.js index f02d131537..11e03a9ccc 100644 --- a/javascript/ola/full/dmx_console_tab.js +++ b/javascript/ola/full/dmx_console_tab.js @@ -66,7 +66,7 @@ ola.DmxConsoleTab.prototype.setUniverse = function(universe_id) { /** - * Called when the tab changes visibiliy. + * Called when the tab changes visibility. */ ola.DmxConsoleTab.prototype.setActive = function(state) { ola.DmxConsoleTab.superClass_.setActive.call(this, state); diff --git a/javascript/ola/full/dmx_monitor_tab.js b/javascript/ola/full/dmx_monitor_tab.js index 6cf00fb0d9..d0d05209e4 100644 --- a/javascript/ola/full/dmx_monitor_tab.js +++ b/javascript/ola/full/dmx_monitor_tab.js @@ -38,7 +38,7 @@ goog.inherits(ola.DmxMonitorTab, ola.common.BaseUniverseTab); /** - * Called when the tab changes visibiliy. + * Called when the tab changes visibility. */ ola.DmxMonitorTab.prototype.setActive = function(state) { ola.DmxMonitorTab.superClass_.setActive.call(this, state); diff --git a/libs/acn/DMPE131Inflator.cpp b/libs/acn/DMPE131Inflator.cpp index 2c84a64ab4..3e11c3e4b2 100644 --- a/libs/acn/DMPE131Inflator.cpp +++ b/libs/acn/DMPE131Inflator.cpp @@ -247,7 +247,7 @@ bool DMPE131Inflator::TrackSourceIfRequired( *buffer = NULL; // default the buffer to NULL ola::TimeStamp now; - m_clock.CurrentTime(&now); + m_clock.CurrentMonotonicTime(&now); const E131Header &e131_header = headers.GetE131Header(); uint8_t priority = e131_header.Priority(); vector &sources = universe_data->sources; diff --git a/libs/acn/TransportHeader.h b/libs/acn/TransportHeader.h index d3154bf521..2db5525e63 100644 --- a/libs/acn/TransportHeader.h +++ b/libs/acn/TransportHeader.h @@ -41,6 +41,11 @@ class TransportHeader { }; TransportHeader() : m_transport_type(UNDEFINED) {} + + TransportHeader(const TransportHeader& other) + : m_source(other.m_source), + m_transport_type(other.m_transport_type) {} + TransportHeader(const ola::network::IPV4SocketAddress &source, TransportType type) : m_source(source), diff --git a/libs/acn/e131_transmit_test.cpp b/libs/acn/e131_transmit_test.cpp index 342d5c21c5..7ff99a268e 100644 --- a/libs/acn/e131_transmit_test.cpp +++ b/libs/acn/e131_transmit_test.cpp @@ -14,7 +14,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * e131_transmit_test.cpp - * The sends custom E1.31 packets in order to test the implementation of a + * This sends custom E1.31 packets in order to test the implementation of a * remote node. * Copyright (C) 2010 Simon Newton * diff --git a/libs/usb/JaRuleWidgetPort.cpp b/libs/usb/JaRuleWidgetPort.cpp index b5abece605..c130732f82 100644 --- a/libs/usb/JaRuleWidgetPort.cpp +++ b/libs/usb/JaRuleWidgetPort.cpp @@ -273,7 +273,7 @@ void JaRuleWidgetPort::_InTransferComplete() { PendingCommandMap::iterator iter = m_pending_commands.begin(); TimeStamp time_limit; - m_clock.CurrentTime(&time_limit); + m_clock.CurrentMonotonicTime(&time_limit); time_limit -= TimeInterval(1, 0); while (iter != m_pending_commands.end()) { PendingCommand *command = iter->second; @@ -320,7 +320,7 @@ void JaRuleWidgetPort::MaybeSendCommand() { return; } - m_clock.CurrentTime(&command->out_time); + m_clock.CurrentMonotonicTime(&command->out_time); std::pair p = m_pending_commands.insert( PendingCommandMap::value_type(token, command)); if (!p.second) { diff --git a/libs/usb/LibUsbAdaptor.h b/libs/usb/LibUsbAdaptor.h index dff68882dd..cf5cc000a6 100644 --- a/libs/usb/LibUsbAdaptor.h +++ b/libs/usb/LibUsbAdaptor.h @@ -320,7 +320,7 @@ class LibUsbAdaptor { * output (depending on direction bits within bmRequestType) * @param wLength the length field for the setup packet. The data buffer * should be at least this size. - * @param timeout timeout (in millseconds) that this function should wait + * @param timeout timeout (in milliseconds) that this function should wait * before giving up due to no response being received. For an unlimited * timeout, use value 0. * @returns on success, the number of bytes actually transferred diff --git a/man/generate-html.sh b/man/generate-html.sh index e84929157b..5b3b06fb89 100755 --- a/man/generate-html.sh +++ b/man/generate-html.sh @@ -35,7 +35,7 @@ for man_file in *.1; do output_file=$output_dir/man1/$man_file.html; man2html -r $man_file -M ../index.html | sed 1,2d > $output_file; chmod a+r $output_file; - echo "
  • $man_file
  • " >> $index_file + echo "
  • $man_file - `grep "\.SH NAME" $man_file -A 1 | tail -n 1 | sed -e 's/\\\-/-/g'`
  • " >> $index_file done cat << 'EOF' >> $index_file diff --git a/olad/AvahiDiscoveryAgent.cpp b/olad/AvahiDiscoveryAgent.cpp index 8bfe5bc42f..abddd3063c 100644 --- a/olad/AvahiDiscoveryAgent.cpp +++ b/olad/AvahiDiscoveryAgent.cpp @@ -262,7 +262,7 @@ void AvahiDiscoveryAgent::GroupStateChanged(const string &service_key, break; case AVAHI_ENTRY_GROUP_FAILURE: OLA_WARN << "Failed to register " << service_key - << " " << avahi_strerror(avahi_client_errno(m_client)); + << ": " << avahi_strerror(avahi_client_errno(m_client)); break; case AVAHI_ENTRY_GROUP_UNCOMMITED: case AVAHI_ENTRY_GROUP_REGISTERING: @@ -338,8 +338,8 @@ bool AvahiDiscoveryAgent::InternalRegisterService(ServiceEntry *service) { AVAHI_PROTO_INET, static_cast(0), service->actual_service_name.c_str(), service->type().c_str(), NULL, sub_type.c_str()); - if (!r) { - OLA_WARN << "Failed to add " << sub_type; + if (r) { + OLA_WARN << "Failed to add " << sub_type << ": " << avahi_strerror(r); } } } @@ -368,7 +368,7 @@ void AvahiDiscoveryAgent::CreateNewClient() { if (m_client) { m_backoff.Reset(); } else { - OLA_WARN << "Failed to create Avahi client " << avahi_strerror(error); + OLA_WARN << "Failed to create Avahi client: " << avahi_strerror(error); SetUpReconnectTimeout(); } } diff --git a/olad/BonjourDiscoveryAgent.cpp b/olad/BonjourDiscoveryAgent.cpp index 298852edad..808b4c0e93 100644 --- a/olad/BonjourDiscoveryAgent.cpp +++ b/olad/BonjourDiscoveryAgent.cpp @@ -160,7 +160,7 @@ string BonjourDiscoveryAgent::BuildTxtRecord( unsigned int pair_size = iter->first.size() + iter->second.size() + 1; if (pair_size > UINT8_MAX) { OLA_WARN << "Discovery data of " << iter->first << ": " << iter->second - << " exceeed " << static_cast(UINT8_MAX) + << " exceed " << static_cast(UINT8_MAX) << " bytes. Data skipped"; continue; } diff --git a/olad/OlaServerServiceImplTest.cpp b/olad/OlaServerServiceImplTest.cpp index 7cd5df0248..00794cebbf 100644 --- a/olad/OlaServerServiceImplTest.cpp +++ b/olad/OlaServerServiceImplTest.cpp @@ -366,14 +366,14 @@ void OlaServerServiceImplTest::testUpdateDmxData() { DmxBuffer dmx_data2("different data hmm"); // Update a universe that doesn't exist - m_clock.CurrentTime(&time1); + m_clock.CurrentMonotonicTime(&time1); CallUpdateDmxData(&service, &client1, universe_id, dmx_data, &missing_universe_check); Universe *universe = store.GetUniverse(universe_id); OLA_ASSERT_FALSE(universe); // Update a universe that exists - m_clock.CurrentTime(&time1); + m_clock.CurrentMonotonicTime(&time1); universe = store.GetUniverseOrCreate(universe_id); CallUpdateDmxData(&service, &client1, universe_id, dmx_data, &ack_check); OLA_ASSERT_EQ(dmx_data, universe->GetDMX()); @@ -388,7 +388,7 @@ void OlaServerServiceImplTest::testUpdateDmxData() { OLA_ASSERT_EQ(dmx_data, universe->GetDMX()); // Now send a new update - m_clock.CurrentTime(&time1); + m_clock.CurrentMonotonicTime(&time1); CallUpdateDmxData(&service, &client2, universe_id, dmx_data2, &ack_check); OLA_ASSERT_EQ(dmx_data2, universe->GetDMX()); } diff --git a/olad/OladHTTPServer.cpp b/olad/OladHTTPServer.cpp index 2071315062..59098247d7 100644 --- a/olad/OladHTTPServer.cpp +++ b/olad/OladHTTPServer.cpp @@ -880,7 +880,7 @@ void OladHTTPServer::HandlePortsForUniverse( * @brief Handle the list of candidate ports * @param response the HTTPResponse that is associated with the request. * @param result the result of the API call - * @param devices the possbile devices & ports + * @param devices the possible devices & ports */ void OladHTTPServer::HandleCandidatePorts( HTTPResponse *response, diff --git a/olad/plugin_api/ClientTest.cpp b/olad/plugin_api/ClientTest.cpp index b912ee3430..15c52cf775 100644 --- a/olad/plugin_api/ClientTest.cpp +++ b/olad/plugin_api/ClientTest.cpp @@ -111,7 +111,7 @@ void ClientTest::testGetSetDMX() { Client client(NULL, m_test_uid); ola::TimeStamp timestamp; - m_clock.CurrentTime(×tamp); + m_clock.CurrentMonotonicTime(×tamp); ola::DmxSource source(buffer, timestamp, 100); // check get/set works diff --git a/olad/plugin_api/DmxSourceTest.cpp b/olad/plugin_api/DmxSourceTest.cpp index 3663e63c4e..4bb90f8bb2 100644 --- a/olad/plugin_api/DmxSourceTest.cpp +++ b/olad/plugin_api/DmxSourceTest.cpp @@ -59,7 +59,7 @@ using ola::TimeStamp; void DmxSourceTest::testDmxSource() { DmxBuffer buffer("123456789"); TimeStamp timestamp; - m_clock.CurrentTime(×tamp); + m_clock.CurrentMonotonicTime(×tamp); DmxSource source(buffer, timestamp, 100); OLA_ASSERT(source.IsSet()); @@ -69,7 +69,7 @@ void DmxSourceTest::testDmxSource() { DmxBuffer buffer2("987654321"); TimeStamp timestamp2; - m_clock.CurrentTime(×tamp2); + m_clock.CurrentMonotonicTime(×tamp2); OLA_ASSERT_TRUE(timestamp <= timestamp2); source.UpdateData(buffer2, timestamp2, 120); @@ -88,7 +88,7 @@ void DmxSourceTest::testDmxSource() { void DmxSourceTest::testIsActive() { DmxBuffer buffer("123456789"); TimeStamp timestamp; - m_clock.CurrentTime(×tamp); + m_clock.CurrentMonotonicTime(×tamp); DmxSource source(buffer, timestamp, 100); OLA_ASSERT(source.IsSet()); diff --git a/olad/plugin_api/PortTest.cpp b/olad/plugin_api/PortTest.cpp index c97217f17a..f7379507c5 100644 --- a/olad/plugin_api/PortTest.cpp +++ b/olad/plugin_api/PortTest.cpp @@ -97,7 +97,7 @@ void PortTest::testInputPortPriorities() { port_manager.PatchPort(&input_port, universe_id); ola::DmxBuffer buffer("foo bar baz"); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port.WriteDMX(buffer); input_port.DmxChanged(); @@ -110,7 +110,7 @@ void PortTest::testInputPortPriorities() { uint8_t new_priority = 120; port_manager.SetPriorityStatic(&input_port, new_priority); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port.WriteDMX(buffer); input_port.DmxChanged(); OLA_ASSERT_EQ(new_priority, universe->ActivePriority()); @@ -118,7 +118,7 @@ void PortTest::testInputPortPriorities() { new_priority = 0; port_manager.SetPriorityStatic(&input_port, new_priority); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port.WriteDMX(buffer); input_port.DmxChanged(); OLA_ASSERT_EQ(new_priority, universe->ActivePriority()); @@ -131,13 +131,13 @@ void PortTest::testInputPortPriorities() { // the default mode is static, lets change it to inherit input_port2.SetPriorityMode(ola::PRIORITY_MODE_INHERIT); input_port2.SetInheritedPriority(99); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port2.WriteDMX(buffer); input_port2.DmxChanged(); OLA_ASSERT_EQ((uint8_t) 99, universe->ActivePriority()); input_port2.SetInheritedPriority(123); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port2.WriteDMX(buffer); input_port2.DmxChanged(); OLA_ASSERT_EQ((uint8_t) 123, universe->ActivePriority()); @@ -145,7 +145,7 @@ void PortTest::testInputPortPriorities() { // now try static mode new_priority = 108; port_manager.SetPriorityStatic(&input_port2, new_priority); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); input_port2.WriteDMX(buffer); input_port2.DmxChanged(); OLA_ASSERT_EQ(new_priority, universe->ActivePriority()); diff --git a/olad/plugin_api/Universe.cpp b/olad/plugin_api/Universe.cpp index 8df09fedcd..460c7a84a2 100644 --- a/olad/plugin_api/Universe.cpp +++ b/olad/plugin_api/Universe.cpp @@ -125,7 +125,7 @@ Universe::Universe(unsigned int universe_id, UniverseStore *store, // We set the last discovery time to now, since most ports will trigger // discovery when they are patched. - clock->CurrentTime(&m_last_discovery_time); + clock->CurrentMonotonicTime(&m_last_discovery_time); } @@ -526,7 +526,7 @@ void Universe::RunRDMDiscovery(RDMDiscoveryCallback *on_complete, bool full) { << m_universe_id; } - m_clock->CurrentTime(&m_last_discovery_time); + m_clock->CurrentMonotonicTime(&m_last_discovery_time); // we need to make a copy of the ports first, because the callback may run at // any time so we need to guard against the port list changing. @@ -710,7 +710,7 @@ bool Universe::MergeAll(const InputPort *port, const Client *client) { m_active_priority = ola::dmx::SOURCE_PRIORITY_MIN; TimeStamp now; - m_clock->CurrentTime(&now); + m_clock->CurrentMonotonicTime(&now); bool changed_source_is_active = false; // Find the highest active ports diff --git a/olad/plugin_api/UniverseTest.cpp b/olad/plugin_api/UniverseTest.cpp index faedd01bb4..23f0f025f9 100644 --- a/olad/plugin_api/UniverseTest.cpp +++ b/olad/plugin_api/UniverseTest.cpp @@ -256,7 +256,7 @@ void UniverseTest::testReceiveDmx() { // Setup the port with some data, and check that signalling the universe // works. - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port.WriteDMX(m_buffer); port.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -385,7 +385,7 @@ void UniverseTest::testLtpMerging() { // Setup the ports with some data, and check that signalling the universe // works. - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port.WriteDMX(buffer1); port.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -393,7 +393,7 @@ void UniverseTest::testLtpMerging() { OLA_ASSERT(buffer1 == universe->GetDMX()); // Now the second port gets data - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port2.WriteDMX(buffer2); port2.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -401,7 +401,7 @@ void UniverseTest::testLtpMerging() { OLA_ASSERT(buffer2 == universe->GetDMX()); // now resend the first port - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port.WriteDMX(buffer1); port.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -411,7 +411,7 @@ void UniverseTest::testLtpMerging() { // now check a client DmxBuffer client_buffer; client_buffer.SetFromString("255,0,0,255,10"); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); ola::DmxSource source(client_buffer, time_stamp, ola::dmx::SOURCE_PRIORITY_DEFAULT); MockClient input_client; @@ -465,7 +465,7 @@ void UniverseTest::testHtpMerging() { // Setup the ports with some data, and check that signalling the universe // works. - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port.WriteDMX(buffer1); port.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -473,7 +473,7 @@ void UniverseTest::testHtpMerging() { OLA_ASSERT(buffer1 == universe->GetDMX()); // Now the second port gets data - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port2.WriteDMX(buffer2); port2.DmxChanged(); OLA_ASSERT_EQ(ola::dmx::SOURCE_PRIORITY_DEFAULT, universe->ActivePriority()); @@ -483,7 +483,7 @@ void UniverseTest::testHtpMerging() { // now raise the priority of the second port uint8_t new_priority = 120; port2.SetPriority(new_priority); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port2.DmxChanged(); OLA_ASSERT_EQ(new_priority, universe->ActivePriority()); OLA_ASSERT_EQ(buffer2.Size(), universe->GetDMX().Size()); @@ -491,7 +491,7 @@ void UniverseTest::testHtpMerging() { // raise the priority of the first port port.SetPriority(new_priority); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); port.DmxChanged(); OLA_ASSERT_EQ(new_priority, universe->ActivePriority()); OLA_ASSERT_EQ(htp_buffer.Size(), universe->GetDMX().Size()); @@ -500,7 +500,7 @@ void UniverseTest::testHtpMerging() { // now check a client DmxBuffer client_buffer; client_buffer.SetFromString("255,0,0,255,10"); - m_clock.CurrentTime(&time_stamp); + m_clock.CurrentMonotonicTime(&time_stamp); ola::DmxSource source(client_buffer, time_stamp, new_priority); MockClient input_client; input_client.DMXReceived(TEST_UNIVERSE, source); diff --git a/olad/www/mobile.html b/olad/www/mobile.html index 04523c3e8e..10659b63ca 100644 --- a/olad/www/mobile.html +++ b/olad/www/mobile.html @@ -459,7 +459,7 @@ diff --git a/olad/www/new/css/style.min.css b/olad/www/new/css/style.min.css index 9f1eebd4ef..29f09474a3 100644 --- a/olad/www/new/css/style.min.css +++ b/olad/www/new/css/style.min.css @@ -1 +1 @@ -.fader-group,.faders,.keypad{text-align:center}.keypad{width:300px;right:0;left:0;margin-left:auto;margin-right:auto;margin-top:5px}.backspace.btn{width:50px;margin:2px}.keypad-keys{margin-right:7%;margin-left:7%;margin-bottom:7%;width:86%}.keypad-field.static-fake{display:inline-block;vertical-align:middle;padding-top:5%;width:190px;height:50px;margin:2px}.fader-group,.value-span{margin:1px;display:inline-block}.keypad-keys .btn{width:100%}.btn-keypad{color:#333;background-color:#fff;border-color:#ccc;height:50px}.fader-fader{writing-mode:vertical-rl;-webkit-appearance:slider-vertical}.fader-group{border:1px solid #67a7e3;border-radius:4px}.off,.on,button.col-xs-3,button.col-xs-3:active,button.col-xs-3:focus{color:#fff;background-color:#67a7e3;border-color:transparent}.left-col,.value-span{border-bottom-left-radius:4px}.right-col,.value-span{border-bottom-right-radius:4px;border-top-right-radius:4px}.faders{padding:1px}.col-xs-2.ng-binding{text-align:center;color:#fff;background-color:#67a7e3;height:26px;line-height:2;font-weight:700}.left-col{border-top-left-radius:4px}.navigate{padding-left:0;padding-right:0;padding-bottom:15px;height:41px}.row,.status{padding:5px;text-align:center}.navigate>.col-xs-2,.navigate>.col-xs-3{height:100%;outline:0!important}.value-div{display:inline-block}.value-span{font-size:11px;border-bottom:1px solid #67a7e3;border-right:1px solid #67a7e3;width:20px;text-align:center}.index,.value{text-align:center;width:100%;height:50%}.channel{width:30px;font-size:10px;text-align:center;display:inline-block;border:1px solid #337ab7;border-radius:4px}.status{border:1px solid #000}.status-light{width:20px}.status,.status-light{display:inline-block;border-radius:20px}th.top-table,tr.special-mouse>td{text-align:center;padding:8px}.plugin-table{text-align:center;width:100%;margin-bottom:10px}.round-corners{border:1px solid #000;border-radius:10px}.top-table{border-bottom:solid #000 1px}tr.striped-table:nth-of-type(even){background-color:#F8F8F8;border-top:solid #d3d3d3 1px;border-bottom:solid #d3d3d3 1px}.special-mouse{cursor:pointer}.navbar-info{margin-top:8px;margin-bottom:8px;font-size:12px;text-align:center}.navbar-desktop{float:right!important}@media (min-width:768px){.navbar-mobile{display:none}.number{width:50px!important}}@media (max-width:768px){.navbar-desktop{display:none}.save-settings{width:100%}}div.checkbox-tr{text-align:center;vertical-align:middle}table.info>tbody>tr>td{border-bottom:solid grey 1px;padding-left:5px;padding-right:5px}.settings-table,table.table>tbody>tr>td.left-table{text-align:left}.settings-table>table{width:100%}input.priority{width:70px}select.priority{width:90px;display:inline}.caption-overview{width:49%;display:inline-block}.button-caption{text-align:right}.btn-grey{background-color:#d3d3d3;color:#333;border-color:#BABABA}td.align{text-align:left}.plugin-icon{color:#898989}div#header-universe{padding-bottom:10px}div#header-universe>h4{display:inline;padding-right:10px}div#header-universe>div{color:#d3d3d3;display:inline}.static-fake{height:34px;padding:6px 12px;background-color:#eee;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:3px}.number{cursor:text!important}.input-group,.save-settings,.settings{margin-top:5px}input.form-control[type=checkbox]{display:none}input.form-control[type=checkbox]+label span.glyphicon:before{width:20px;height:20px;border-radius:4px;border:1px solid #ccc;content:"\e014";color:#d9534f;background-color:#fff;cursor:pointer}input.form-control[type=checkbox]:checked+label span.glyphicon:before{content:"\e013";color:#5cb85c}input.form-control[type=checkbox][disabled]+label span.glyphicon:before{color:#a9a9a9}label.fake-check{margin-top:5px;margin-bottom:0}.nav-tabs{overflow-x:auto;overflow-y:hidden;display:-webkit-box;display:-moz-box}.nav-tabs>li{float:none}.nav-tabs::-webkit-scrollbar{-webkit-appearance:none}.nav-tabs::-webkit-scrollbar:vertical{width:12px}.nav-tabs::-webkit-scrollbar:horizontal{height:12px}.nav-tabs::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.5);border-radius:10px;border:2px solid #fff}.nav-tabs::-webkit-scrollbar-track{border-radius:10px;background-color:#fff} \ No newline at end of file +.keypad{width:300px;text-align:center;right:0;left:0;margin-left:auto;margin-right:auto;margin-top:5px}.backspace.btn{width:50px;margin:2px}.keypad-keys{margin-right:7%;margin-left:7%;margin-bottom:7%;width:86%}.keypad-field.static-fake{display:inline-block;vertical-align:middle;padding-top:5%;width:190px;height:50px;margin:2px}.keypad-keys .btn{width:100%}.btn-keypad{color:#333;background-color:#fff;border-color:#ccc;height:50px}.fader-fader{writing-mode:vertical-rl;-webkit-appearance:slider-vertical}.fader-group{display:inline-block;text-align:center;border:solid #67a7e3 1px;border-radius:4px;margin:1px}.faders{text-align:center;padding:1px}button.col-xs-3,button.col-xs-3:active,button.col-xs-3:focus{color:#fff;background-color:#67a7e3;border-color:transparent}.col-xs-2.ng-binding{text-align:center;color:#fff;background-color:#67a7e3;height:26px;line-height:2;font-weight:700}.off,.on{color:#fff;background-color:#67a7e3;border-color:transparent}.right-col{border-bottom-right-radius:4px;border-top-right-radius:4px}.left-col{border-bottom-left-radius:4px;border-top-left-radius:4px}.navigate{padding-left:0;padding-right:0;padding-bottom:15px;height:41px}.navigate>.col-xs-2,.navigate>.col-xs-3{height:100%;outline:0!important}.value-div{display:inline-block}.value-span{display:inline-block;font-size:11px;border-bottom:1px solid #67a7e3;border-right:1px solid #67a7e3;width:20px;text-align:center;margin:1px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:4px}.row{padding:5px;text-align:center}.index,.value{text-align:center;width:100%;height:50%}.channel{width:30px;font-size:10px;text-align:center;display:inline-block;border:1px solid #337ab7;border-radius:4px}.status{padding:5px;text-align:center;border:solid #000 1px}.status-light{width:20px}.status,.status-light{display:inline-block;border-radius:20px}th.top-table,tr.special-mouse>td{text-align:center;padding:8px}.plugin-table{text-align:center;width:100%;margin-bottom:10px}.round-corners{border:solid #000 1px;border-radius:10px}.top-table{border-bottom:solid #000 1px}tr.striped-table:nth-of-type(2n){background-color:#f8f8f8;border-top:solid #d3d3d3 1px;border-bottom:solid #d3d3d3 1px}.special-mouse{cursor:pointer}.navbar-info{margin-top:8px;margin-bottom:8px;font-size:12px;text-align:center}.navbar-desktop{float:right!important}@media (min-width:768px){.navbar-mobile{display:none}.number{width:50px!important}}@media (max-width:768px){.navbar-desktop{display:none}.save-settings{width:100%}}div.checkbox-tr{text-align:center;vertical-align:middle}table.info>tbody>tr>td{border-bottom:solid grey 1px;padding-left:5px;padding-right:5px}table.table>tbody>tr>td.left-table{text-align:left}.settings-table{text-align:left}.settings-table>table{width:100%}input.priority{width:70px}select.priority{width:90px;display:inline}.caption-overview{width:49%;display:inline-block}.button-caption{text-align:right}.btn-grey{background-color:#d3d3d3;color:#333;border-color:#bababa}td.align{text-align:left}.plugin-icon{color:#898989}div#header-universe{padding-bottom:10px}div#header-universe>h4{display:inline;padding-right:10px}div#header-universe>div{color:#d3d3d3;display:inline}.static-fake{height:34px;padding:6px 12px;background-color:#eee;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:3px}.number{cursor:text!important}.input-group,.save-settings,.settings{margin-top:5px}input.form-control[type=checkbox]{display:none}input.form-control[type=checkbox]+label span.glyphicon:before{width:20px;height:20px;border-radius:4px;border:solid #ccc 1px;content:"\e014";color:#d9534f;background-color:#fff;cursor:pointer}input.form-control[type=checkbox]:checked+label span.glyphicon:before{content:"\e013";color:#5cb85c}input.form-control[type=checkbox][disabled]+label span.glyphicon:before{color:#a9a9a9}label.fake-check{margin-top:5px;margin-bottom:0}.nav-tabs{overflow-x:auto;overflow-y:hidden;display:-webkit-box;display:-moz-box}.nav-tabs>li{float:none}.nav-tabs::-webkit-scrollbar{-webkit-appearance:none}.nav-tabs::-webkit-scrollbar:vertical{width:12px}.nav-tabs::-webkit-scrollbar:horizontal{height:12px}.nav-tabs::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.5);border-radius:10px;border:2px solid #fff}.nav-tabs::-webkit-scrollbar-track{border-radius:10px;background-color:#fff} \ No newline at end of file diff --git a/olad/www/new/js/app.min.js b/olad/www/new/js/app.min.js index f78397414c..3625b17411 100644 --- a/olad/www/new/js/app.min.js +++ b/olad/www/new/js/app.min.js @@ -1,2 +1,2 @@ -var ola=angular.module("olaApp",["ngRoute"]);ola.config(["$routeProvider",function(a){"use strict";a.when("/",{templateUrl:"/new/views/overview.html",controller:"overviewCtrl"}).when("/universes/",{templateUrl:"/new/views/universes.html",controller:"overviewCtrl"}).when("/universe/add",{templateUrl:"/new/views/universe-add.html",controller:"addUniverseCtrl"}).when("/universe/:id",{templateUrl:"/new/views/universe-overview.html",controller:"universeCtrl"}).when("/universe/:id/keypad",{templateUrl:"/new/views/universe-keypad.html",controller:"keypadUniverseCtrl"}).when("/universe/:id/faders",{templateUrl:"/new/views/universe-faders.html",controller:"faderUniverseCtrl"}).when("/universe/:id/rdm",{templateUrl:"/new/views/universe-rdm.html",controller:"rdmUniverseCtrl"}).when("/universe/:id/patch",{templateUrl:"/new/views/universe-patch.html",controller:"patchUniverseCtrl"}).when("/universe/:id/settings",{templateUrl:"/new/views/universe-settings.html",controller:"settingUniverseCtrl"}).when("/plugins",{templateUrl:"/new/views/plugins.html",controller:"pluginsCtrl"}).when("/plugin/:id",{templateUrl:"/new/views/plugin-info.html",controller:"pluginInfoCtrl"}).otherwise({redirectTo:"/"})}]),ola.controller("menuCtrl",["$scope","$ola","$interval","$location",function(a,b,c,d){"use strict";a.Items={},a.Info={},a.goTo=function(a){d.path(a)};var e=function(){b.get.ItemList().then(function(b){a.Items=b}),b.get.ServerInfo().then(function(b){a.Info=b,document.title=b.instance_name+" - "+b.ip})};e(),c(e,1e4)}]),ola.controller("patchUniverseCtrl",["$scope","$ola","$routeParams",function(a,b,c){"use strict";a.Universe=c.id}]),ola.controller("rdmUniverseCtrl",["$scope","$ola","$routeParams",function(a,b,c){"use strict";a.Universe=c.id}]),ola.controller("universeCtrl",["$scope","$ola","$routeParams","$interval","OLA",function(a,b,c,d,e){"use strict";a.dmx=[],a.Universe=c.id;var f=d(function(){b.get.Dmx(a.Universe).then(function(b){for(var c=0;c140?"black":"white"}}]),ola.controller("faderUniverseCtrl",["$scope","$ola","$routeParams","$window","$interval","OLA",function(a,b,c,d,e,f){"use strict";a.get=[],a.list=[],a.last=0,a.offset=0,a.send=!1,a.OLA=f,a.Universe=c.id;for(var g=0;g140?"black":"white"},a.ceil=function(a){return d.Math.ceil(a)},a.change=function(){b.post.Dmx(a.Universe,a.get)},a.page=function(b){if(1===b){var c=d.Math.ceil(f.MAX_CHANNEL_NUMBER/a.limit);a.offset+1!==c&&a.offset++}else b===f.MIN_CHANNEL_VALUE&&a.offset!==f.MIN_CHANNEL_VALUE&&a.offset--},a.getWidth=function(){var b=d.Math.floor(.99*d.innerWidth/a.limit),c=b-52/a.limit;return c+"px"},a.getLimit=function(){var a=.99*d.innerWidth/66;return d.Math.floor(a)},a.limit=a.getLimit(),a.width={width:a.getWidth()},d.$(d).resize(function(){a.$apply(function(){a.limit=a.getLimit(),a.width={width:a.getWidth()}})}),a.$on("$destroy",function(){e.cancel(h)})}]),ola.controller("keypadUniverseCtrl",["$scope","$ola","$routeParams","OLA",function(a,b,c,d){"use strict";a.Universe=c.id;var e;e=/^(?:([0-9]{1,3})(?:\s(THRU)\s(?:([0-9]{1,3}))?)?(?:\s(@)\s(?:([0-9]{1,3}|FULL))?)?)/;var f={channelValue:function(a){return d.MIN_CHANNEL_VALUE<=a&&a<=d.MAX_CHANNEL_VALUE},channelNumber:function(a){return d.MIN_CHANNEL_NUMBER<=a&&a<=d.MAX_CHANNEL_NUMBER},regexGroups:function(a){if(void 0!==a[1]){var b=this.channelNumber(parseInt(a[1],10));if(!b)return!1}if(void 0!==a[3]){var c=this.channelNumber(parseInt(a[3],10));if(!c)return!1}if(void 0!==a[5]&&"FULL"!==a[5]){var d=this.channelValue(parseInt(a[5],10));if(!d)return!1}return!0}};a.field="",a.input=function(b){var c;c="backspace"===b?a.field.substr(0,a.field.length-1):a.field+b;var d=e.exec(c);null===d?a.field="":f.regexGroups(d)&&(a.field=d[0])},a.submit=function(){var c=[],g=a.field,h=e.exec(g);if(null!==h&&f.regexGroups(h)){var i=parseInt(h[1],10),j=h[3]?parseInt(h[3],10):parseInt(h[1],10),k="FULL"===h[5]?d.MAX_CHANNEL_VALUE:parseInt(h[5],10);return j>=i&&f.channelValue(k)?(b.get.Dmx(a.Universe).then(function(e){for(var f=0;f=g;g++)c[g-1]=k;b.post.Dmx(a.Universe,c),a.field=""}),!0):!1}return!1}}]),ola.controller("pluginsCtrl",["$scope","$ola","$location",function(a,b,c){"use strict";a.Items={},a.active=[],a.enabled=[],a.getInfo=function(){b.get.ItemList().then(function(b){a.Items=b})},a.getInfo(),a.Reload=function(){b.action.Reload(),a.getInfo()},a.go=function(a){c.path("/plugin/"+a)},a.changeStatus=function(c,d){b.post.PluginState(c,d),a.getInfo()},a.getStyle=function(a){return a?{"background-color":"green"}:{"background-color":"red"}}}]),ola.controller("addUniverseCtrl",["$scope","$ola","$window","$location",function(a,b,c,d){"use strict";a.Ports={},a.addPorts=[],a.Universes=[],a.Class="",a.Data={id:0,name:"",add_ports:""},b.get.ItemList().then(function(b){for(var c in b.universes)b.universes.hasOwnProperty(c)&&(a.Data.id===parseInt(b.universes[c].id,10)&&a.Data.id++,a.Universes.push(parseInt(b.universes[c].id,10)))}),a.Submit=function(){"number"==typeof a.Data.id&&""!==a.Data.add_ports&&-1===a.Universes.indexOf(a.Data.id)?((void 0===a.Data.name||""===a.Data.name)&&(a.Data.name="Universe "+a.Data.id),b.post.AddUniverse(a.Data),d.path("/universe/"+a.Data.id)):-1!==a.Universes.indexOf(a.Data.id)?b.error.modal("Universe ID already exists."):(void 0===a.Data.add_ports||""===a.Data.add_ports)&&b.error.modal("There are no ports selected for the universe. This is required.")},b.get.Ports().then(function(b){a.Ports=b}),a.getDirection=function(a){return a?"Output":"Input"},a.updateId=function(){-1!==a.Universes.indexOf(a.Data.id)?a.Class="has-error":a.Class=""},a.TogglePort=function(){a.Data.add_ports=c.$.grep(a.addPorts,Boolean).join(",")}}]),ola.controller("pluginInfoCtrl",["$scope","$routeParams","$ola",function(a,b,c){"use strict";c.get.InfoPlugin(b.id).then(function(b){a.active=b.active,a.enabled=b.enabled,a.name=b.name;var c=document.getElementById("description");c.textContent=b.description,c.innerHTML=c.innerHTML.replace(/\\n/g,"
    ")}),a.stateColor=function(a){return a?{"background-color":"green"}:{"background-color":"red"}}}]),ola.controller("settingUniverseCtrl",["$scope","$ola","$routeParams",function(a,b,c){"use strict";a.loadData=function(){a.Data={old:{},model:{},Remove:[],Add:[]},a.Data.old.id=a.Data.model.id=c.id,b.get.PortsId(c.id).then(function(b){a.DeactivePorts=b}),b.get.UniverseInfo(c.id).then(function(b){a.Data.old.name=a.Data.model.name=b.name,a.Data.old.merge_mode=b.merge_mode,a.Data.model.merge_mode=b.merge_mode,a.ActivePorts=b.output_ports.concat(b.input_ports),a.Data.old.ActivePorts=b.output_ports.concat(b.input_ports);for(var c=0;cc.MAX_CHANNEL_VALUE&&(a=c.MAX_CHANNEL_VALUE),a},f=function(a){for(var b=!0,d=[],f=c.MAX_CHANNEL_NUMBER;f>=c.MIN_CHANNEL_NUMBER;f--){var g=e(a[f-1]);(g>c.MIN_CHANNEL_VALUE||!b||f===c.MIN_CHANNEL_NUMBER)&&(d[f-1]=g,b=!1)}return d.join(",")};return{get:{ItemList:function(){return a.get("/json/universe_plugin_list").then(function(a){return a.data})},ServerInfo:function(){return a.get("/json/server_stats").then(function(a){return a.data})},Ports:function(){return a.get("/json/get_ports").then(function(a){return a.data})},PortsId:function(b){return a({method:"GET",url:"/json/get_ports",params:{id:b}}).then(function(a){return a.data})},InfoPlugin:function(b){return a({method:"GET",url:"/json/plugin_info",params:{id:b}}).then(function(a){return a.data})},Dmx:function(b){return a({method:"GET",url:"/get_dmx",params:{u:b}}).then(function(a){return a.data})},UniverseInfo:function(b){return a({method:"GET",url:"/json/universe_info",params:{id:b}}).then(function(a){return a.data})}},post:{ModifyUniverse:function(b){return a({method:"POST",url:"/modify_universe",data:d(b),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(a){return a.data})},AddUniverse:function(b){return a({method:"POST",url:"/new_universe",data:d(b),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(a){return a.data})},Dmx:function(b,c){var e={u:b,d:f(c)};return a({method:"POST",url:"/set_dmx",data:d(e),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(a){return a.data})},PluginState:function(b,c){var e={state:c,plugin_id:b};return a({method:"POST",url:"/set_plugin_state",data:d(e),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(a){return a.data})}},action:{Shutdown:function(){return a.get("/quit").then(function(a){return a.data})},Reload:function(){return a.get("/reload").then(function(a){return a.data})},ReloadPids:function(){return a.get("/reload_pids").then(function(a){return a.data})}},rdm:{GetSectionInfo:function(b,c,d){return a({method:"GET",url:"/json/rdm/section_info",params:{id:b,uid:c,section:d}}).then(function(a){return a.data})},SetSection:function(b,c,d,e,f){return a({method:"GET",url:"/json/rdm/set_section_info",params:{id:b,uid:c,section:d,hint:e,"int":f}}).then(function(a){return a.data})},GetSupportedPids:function(b,c){return a({method:"GET",url:"/json/rdm/supported_pids",params:{id:b,uid:c}}).then(function(a){return a.data})},GetSupportedSections:function(b,c){return a({method:"GET",url:"/json/rdm/supported_sections",params:{id:b,uid:c}}).then(function(a){return a.data})},UidIdentifyDevice:function(b,c){return a({method:"GET",url:"/json/rdm/uid_identify_device",params:{id:b,uid:c}}).then(function(a){return a.data})},UidInfo:function(b,c){return a({method:"GET",url:"/json/rdm/uid_info",params:{id:b,uid:c}}).then(function(a){return a.data})},UidPersonalities:function(b,c){return a({method:"GET",url:"/json/rdm/uid_personalities",params:{id:b,uid:c}}).then(function(a){return a.data})},Uids:function(b){return a({method:"GET",url:"/json/rdm/uids",params:{id:b}}).then(function(a){return a.data})},RunDiscovery:function(b,c){return a({method:"GET",url:"/rdm/run_discovery",params:{id:b,incremental:c}}).then(function(a){return a.data})}},error:{modal:function(a,b){"undefined"!=typeof a?$("#errorModalBody").text(a):$("#errorModalBody").text("There has been an error"),"undefined"!=typeof b?$("#errorModalLabel").text(b):$("#errorModalLabel").text("Error"),$("#errorModal").modal("show")}}}}]),ola.filter("startFrom",function(){"use strict";return function(a,b){return b=parseInt(b,10),a.slice(b)}}); +var ola=angular.module("olaApp",["ngRoute"]);ola.config(["$locationProvider",function(e){"use strict";e.hashPrefix("")}]),ola.config(["$routeProvider",function(e){"use strict";e.when("/",{templateUrl:"/new/views/overview.html",controller:"overviewCtrl"}).when("/universes/",{templateUrl:"/new/views/universes.html",controller:"overviewCtrl"}).when("/universe/add",{templateUrl:"/new/views/universe-add.html",controller:"addUniverseCtrl"}).when("/universe/:id",{templateUrl:"/new/views/universe-overview.html",controller:"universeCtrl"}).when("/universe/:id/keypad",{templateUrl:"/new/views/universe-keypad.html",controller:"keypadUniverseCtrl"}).when("/universe/:id/faders",{templateUrl:"/new/views/universe-faders.html",controller:"faderUniverseCtrl"}).when("/universe/:id/rdm",{templateUrl:"/new/views/universe-rdm.html",controller:"rdmUniverseCtrl"}).when("/universe/:id/patch",{templateUrl:"/new/views/universe-patch.html",controller:"patchUniverseCtrl"}).when("/universe/:id/settings",{templateUrl:"/new/views/universe-settings.html",controller:"settingUniverseCtrl"}).when("/plugins",{templateUrl:"/new/views/plugins.html",controller:"pluginsCtrl"}).when("/plugin/:id",{templateUrl:"/new/views/plugin-info.html",controller:"pluginInfoCtrl"}).otherwise({redirectTo:"/"})}]),ola.controller("menuCtrl",["$scope","$ola","$interval","$location",function(t,e,n,r){"use strict";t.Items={},t.Info={},t.goTo=function(e){r.path(e)};function o(){e.get.ItemList().then(function(e){t.Items=e}),e.get.ServerInfo().then(function(e){t.Info=e,document.title=e.instance_name+" - "+e.ip})}o(),n(o,1e4)}]),ola.controller("patchUniverseCtrl",["$scope","$ola","$routeParams",function(e,t,n){"use strict";e.Universe=n.id}]),ola.controller("rdmUniverseCtrl",["$scope","$ola","$routeParams",function(e,t,n){"use strict";e.Universe=n.id}]),ola.controller("universeCtrl",["$scope","$ola","$routeParams","$interval","OLA",function(n,e,t,r,o){"use strict";n.dmx=[],n.Universe=t.id;var i=r(function(){e.get.Dmx(n.Universe).then(function(e){for(var t=0;t")}),n.stateColor=function(e){return e?{"background-color":"green"}:{"background-color":"red"}}}]),ola.controller("settingUniverseCtrl",["$scope","$ola","$routeParams",function(i,e,t){"use strict";i.loadData=function(){i.Data={old:{},model:{},Remove:[],Add:[]},i.Data.old.id=i.Data.model.id=t.id,e.get.PortsId(t.id).then(function(e){i.DeactivePorts=e}),e.get.UniverseInfo(t.id).then(function(e){i.Data.old.name=i.Data.model.name=e.name,i.Data.old.merge_mode=e.merge_mode,i.Data.model.merge_mode=e.merge_mode,i.ActivePorts=e.output_ports.concat(e.input_ports),i.Data.old.ActivePorts=e.output_ports.concat(e.input_ports);for(var t=0;t=a.MIN_CHANNEL_NUMBER;o--){t=e[o-1],(t=parseInt(t,10))a.MAX_CHANNEL_VALUE&&(t=a.MAX_CHANNEL_VALUE);(t>a.MIN_CHANNEL_VALUE||!n||o===a.MIN_CHANNEL_NUMBER)&&(r[o-1]=t,n=!1)}return r.join(",")}return{get:{ItemList:function(){return i.get("/json/universe_plugin_list").then(function(e){return e.data})},ServerInfo:function(){return i.get("/json/server_stats").then(function(e){return e.data})},Ports:function(){return i.get("/json/get_ports").then(function(e){return e.data})},PortsId:function(e){return i({method:"GET",url:"/json/get_ports",params:{id:e}}).then(function(e){return e.data})},InfoPlugin:function(e){return i({method:"GET",url:"/json/plugin_info",params:{id:e}}).then(function(e){return e.data})},Dmx:function(e){return i({method:"GET",url:"/get_dmx",params:{u:e}}).then(function(e){return e.data})},UniverseInfo:function(e){return i({method:"GET",url:"/json/universe_info",params:{id:e}}).then(function(e){return e.data})}},post:{ModifyUniverse:function(e){return i({method:"POST",url:"/modify_universe",data:n(e),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(e){return e.data})},AddUniverse:function(e){return i({method:"POST",url:"/new_universe",data:n(e),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(e){return e.data})},Dmx:function(e,t){e={u:e,d:r(t)};return i({method:"POST",url:"/set_dmx",data:n(e),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(e){return e.data})},PluginState:function(e,t){return i({method:"POST",url:"/set_plugin_state",data:n({state:t,plugin_id:e}),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(e){return e.data})}},action:{Shutdown:function(){return i.get("/quit").then(function(e){return e.data})},Reload:function(){return i.get("/reload").then(function(e){return e.data})},ReloadPids:function(){return i.get("/reload_pids").then(function(e){return e.data})}},rdm:{GetSectionInfo:function(e,t,n){return i({method:"GET",url:"/json/rdm/section_info",params:{id:e,uid:t,section:n}}).then(function(e){return e.data})},SetSection:function(e,t,n,r,o){return i({method:"GET",url:"/json/rdm/set_section_info",params:{id:e,uid:t,section:n,hint:r,int:o}}).then(function(e){return e.data})},GetSupportedPids:function(e,t){return i({method:"GET",url:"/json/rdm/supported_pids",params:{id:e,uid:t}}).then(function(e){return e.data})},GetSupportedSections:function(e,t){return i({method:"GET",url:"/json/rdm/supported_sections",params:{id:e,uid:t}}).then(function(e){return e.data})},UidIdentifyDevice:function(e,t){return i({method:"GET",url:"/json/rdm/uid_identify_device",params:{id:e,uid:t}}).then(function(e){return e.data})},UidInfo:function(e,t){return i({method:"GET",url:"/json/rdm/uid_info",params:{id:e,uid:t}}).then(function(e){return e.data})},UidPersonalities:function(e,t){return i({method:"GET",url:"/json/rdm/uid_personalities",params:{id:e,uid:t}}).then(function(e){return e.data})},Uids:function(e){return i({method:"GET",url:"/json/rdm/uids",params:{id:e}}).then(function(e){return e.data})},RunDiscovery:function(e,t){return i({method:"GET",url:"/rdm/run_discovery",params:{id:e,incremental:t}}).then(function(e){return e.data})}},error:{modal:function(e,t){void 0!==e?$("#errorModalBody").text(e):$("#errorModalBody").text("There has been an error"),void 0!==t?$("#errorModalLabel").text(t):$("#errorModalLabel").text("Error"),$("#errorModal").modal("show")}}}}]),ola.filter("startFrom",function(){"use strict";return function(e,t){return t=parseInt(t,10),e.slice(t)}}); //# sourceMappingURL=app.min.js.map \ No newline at end of file diff --git a/olad/www/new/js/app.min.js.map b/olad/www/new/js/app.min.js.map index 7aae361ae9..9a0e65af77 100644 --- a/olad/www/new/js/app.min.js.map +++ b/olad/www/new/js/app.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../javascript/new-src/src/app.js","../../../../javascript/new-src/src/controllers/menu.js","../../../../javascript/new-src/src/controllers/patch_universe.js","../../../../javascript/new-src/src/controllers/rdm_universe.js","../../../../javascript/new-src/src/controllers/universe.js","../../../../javascript/new-src/src/controllers/fader_universe.js","../../../../javascript/new-src/src/controllers/keypad_universe.js","../../../../javascript/new-src/src/controllers/plugins.js","../../../../javascript/new-src/src/controllers/add_universe.js","../../../../javascript/new-src/src/controllers/plugin_info.js","../../../../javascript/new-src/src/controllers/setting_universe.js","../../../../javascript/new-src/src/controllers/header.js","../../../../javascript/new-src/src/controllers/overview.js","../../../../javascript/new-src/src/constants.js","../../../../javascript/new-src/src/factories/ola.js","../../../../javascript/new-src/src/filters/start_form.js"],"names":["ola","angular","module","config","$routeProvider","when","templateUrl","controller","otherwise","redirectTo","$scope","$ola","$interval","$location","Items","Info","goTo","url","path","getData","get","ItemList","then","data","ServerInfo","document","title","instance_name","ip","$routeParams","Universe","id","OLA","dmx","interval","Dmx","i","MAX_CHANNEL_NUMBER","MIN_CHANNEL_VALUE","$on","cancel","getColor","$window","list","last","offset","send","light","j","change","dmxGet","length","ceil","Math","post","page","d","offsetLimit","limit","getWidth","width","floor","innerWidth","amount","getLimit","$","resize","$apply","regexkeypad","check","channelValue","value","MAX_CHANNEL_VALUE","channelNumber","MIN_CHANNEL_NUMBER","regexGroups","result","undefined","check1","this","parseInt","check2","check3","field","input","tmpField","substr","fields","exec","submit","begin","end","active","enabled","getInfo","Reload","action","go","changeStatus","current","PluginState","getStyle","style","background-color","Ports","addPorts","Universes","Class","Data","name","add_ports","u","universes","hasOwnProperty","push","Submit","indexOf","AddUniverse","error","modal","getDirection","direction","updateId","TogglePort","grep","Boolean","join","InfoPlugin","description","getElementById","textContent","innerHTML","replace","stateColor","val","loadData","old","model","Remove","Add","PortsId","DeactivePorts","UniverseInfo","merge_mode","ActivePorts","output_ports","concat","input_ports","Save","a","remove_ports","modified","forEach","element","index","port","port_old","priority","current_mode","modify_ports","ModifyUniverse","header","tab","hash","location","Shutdown","goUniverse","constant","factory","$http","postEncode","PostData","key","encodeURIComponent","channelValueCheck","dmxConvert","strip","integers","response","method","params","headers","Content-Type","universe","pluginId","state","plugin_id","ReloadPids","rdm","GetSectionInfo","uid","section","SetSection","hint","option","int","GetSupportedPids","GetSupportedSections","UidIdentifyDevice","UidInfo","UidPersonalities","Uids","RunDiscovery","incremental","body","text","filter","start","slice"],"mappings":"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","file":"app.min.js"} \ No newline at end of file +{"version":3,"file":"app.min.js","sources":["../../../../javascript/new-src/src/app.js","../../../../javascript/new-src/src/controllers/menu.js","../../../../javascript/new-src/src/controllers/patch_universe.js","../../../../javascript/new-src/src/controllers/rdm_universe.js","../../../../javascript/new-src/src/controllers/universe.js","../../../../javascript/new-src/src/controllers/fader_universe.js","../../../../javascript/new-src/src/controllers/keypad_universe.js","../../../../javascript/new-src/src/controllers/plugins.js","../../../../javascript/new-src/src/controllers/add_universe.js","../../../../javascript/new-src/src/controllers/plugin_info.js","../../../../javascript/new-src/src/controllers/setting_universe.js","../../../../javascript/new-src/src/controllers/header.js","../../../../javascript/new-src/src/controllers/overview.js","../../../../javascript/new-src/src/constants.js","../../../../javascript/new-src/src/factories/ola.js","../../../../javascript/new-src/src/filters/start_form.js"],"names":["ola","angular","module","config","$locationProvider","hashPrefix","$routeProvider","when","templateUrl","controller","otherwise","redirectTo","$scope","$ola","$interval","$location","Items","Info","goTo","url","path","getData","get","ItemList","then","data","ServerInfo","document","title","instance_name","ip","$routeParams","Universe","id","OLA","dmx","interval","Dmx","i","MAX_CHANNEL_NUMBER","MIN_CHANNEL_VALUE","$on","cancel","getColor","$window","list","last","offset","send","light","j","change","dmxGet","length","ceil","Math","post","page","d","offsetLimit","limit","getWidth","floor","innerWidth","getLimit","width","$","resize","$apply","regexkeypad","check","channelValue","value","MAX_CHANNEL_VALUE","channelNumber","MIN_CHANNEL_NUMBER","regexGroups","result","undefined","this","parseInt","field","input","tmpField","substr","fields","exec","submit","begin","end","active","enabled","getInfo","Reload","action","go","changeStatus","current","PluginState","getStyle","style","background-color","Ports","addPorts","Universes","Class","Data","name","add_ports","u","universes","hasOwnProperty","push","Submit","indexOf","AddUniverse","error","modal","getDirection","direction","updateId","TogglePort","grep","Boolean","join","InfoPlugin","description","getElementById","textContent","innerHTML","replace","stateColor","val","loadData","old","model","Remove","Add","PortsId","DeactivePorts","UniverseInfo","merge_mode","ActivePorts","output_ports","concat","input_ports","Save","a","modified","remove_ports","forEach","element","index","port","port_old","priority","current_mode","modify_ports","ModifyUniverse","header","tab","hash","location","Shutdown","goUniverse","constant","factory","$http","postEncode","key","PostData","encodeURIComponent","dmxConvert","strip","integers","response","method","params","headers","Content-Type","universe","pluginId","state","plugin_id","ReloadPids","rdm","GetSectionInfo","uid","section","SetSection","hint","option","int","GetSupportedPids","GetSupportedSections","UidIdentifyDevice","UidInfo","UidPersonalities","Uids","RunDiscovery","incremental","body","text","filter","start","slice"],"mappings":"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"} \ No newline at end of file diff --git a/olad/www/new/libs/angular-route/js/angular-route.min.js b/olad/www/new/libs/angular-route/js/angular-route.min.js index 837ac32f31..754e16c57f 100644 --- a/olad/www/new/libs/angular-route/js/angular-route.min.js +++ b/olad/www/new/libs/angular-route/js/angular-route.min.js @@ -1,15 +1,17 @@ /* - AngularJS v1.3.14 - (c) 2010-2014 Google, Inc. http://angularjs.org + AngularJS v1.8.3 + (c) 2010-2020 Google LLC. http://angularjs.org License: MIT */ -(function(q,d,C){'use strict';function v(r,k,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,f,b,c,y){function z(){l&&(h.cancel(l),l=null);m&&(m.$destroy(),m=null);n&&(l=h.leave(n),l.then(function(){l=null}),n=null)}function x(){var b=r.current&&r.current.locals;if(d.isDefined(b&&b.$template)){var b=a.$new(),c=r.current;n=y(b,function(b){h.enter(b,null,n||f).then(function(){!d.isDefined(t)||t&&!a.$eval(t)||k()});z()});m=c.scope=b;m.$emit("$viewContentLoaded"); -m.$eval(w)}else z()}var m,n,l,t=b.autoscroll,w=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(d,k,h){return{restrict:"ECA",priority:-400,link:function(a,f){var b=h.current,c=b.locals;f.html(c.$template);var y=d(f.contents());b.controller&&(c.$scope=a,c=k(b.controller,c),b.controllerAs&&(a[b.controllerAs]=c),f.data("$ngControllerController",c),f.children().data("$ngControllerController",c));y(a)}}}q=d.module("ngRoute",["ng"]).provider("$route",function(){function r(a,f){return d.extend(Object.create(a), -f)}function k(a,d){var b=d.caseInsensitiveMatch,c={originalPath:a,regexp:a},h=c.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,d,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});d=d||"";return""+(a?"":d)+"(?:"+(a?d:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");c.regexp=new RegExp("^"+a+"$",b?"i":"");return c}var h={};this.when=function(a,f){var b=d.copy(f);d.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0); -d.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);h[a]=d.extend(b,a&&k(a,b));if(a){var c="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[c]=d.extend({redirectTo:a},k(c,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,f,b,c,k,q,x){function m(b){var e=s.current; -(v=(p=l())&&e&&p.$$route===e.$$route&&d.equals(p.pathParams,e.pathParams)&&!p.reloadOnSearch&&!w)||!e&&!p||a.$broadcast("$routeChangeStart",p,e).defaultPrevented&&b&&b.preventDefault()}function n(){var u=s.current,e=p;if(v)u.params=e.params,d.copy(u.params,b),a.$broadcast("$routeUpdate",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(d.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),c.when(e).then(function(){if(e){var a= -d.extend({},e.resolve),b,g;d.forEach(a,function(b,e){a[e]=d.isString(b)?k.get(b):k.invoke(b,null,null,e)});d.isDefined(b=e.template)?d.isFunction(b)&&(b=b(e.params)):d.isDefined(g=e.templateUrl)&&(d.isFunction(g)&&(g=g(e.params)),g=x.getTrustedResourceUrl(g),d.isDefined(g)&&(e.loadedTemplateUrl=g,b=q(g)));d.isDefined(b)&&(a.$template=b);return c.all(a)}}).then(function(c){e==s.current&&(e&&(e.locals=c,d.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",e,u))},function(b){e==s.current&&a.$broadcast("$routeChangeError", -e,u,b)})}function l(){var a,b;d.forEach(h,function(c,h){var g;if(g=!b){var k=f.path();g=c.keys;var m={};if(c.regexp)if(k=c.regexp.exec(k)){for(var l=1,n=k.length;l").append(b).html();try{return b[0].nodeType===qb?R(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+R(b)})}catch(d){return R(c)}}function qc(b){try{return decodeURIComponent(b)}catch(a){}}function rc(b){var a= -{},c,d;s((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=qc(c[0]),y(d)&&(b=y(c[1])?qc(c[1]):!0,sc.call(a,d)?E(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Qb(b){var a=[];s(b,function(b,d){E(b)?s(b,function(b){a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))}):a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))});return a.length?a.join("&"):""}function rb(b){return Fa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Fa(b,a){return encodeURIComponent(b).replace(/%40/gi, -"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Id(b,a){var c,d,e=sb.length;b=C(b);for(d=0;d/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=ab(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector", -d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;P&&e.test(P.name)&&(c.debugInfoEnabled=!0,P.name=P.name.replace(e,""));if(P&&!f.test(P.name))return d();P.name=P.name.replace(f,"");aa.resumeBootstrap=function(b){s(b,function(b){a.push(b)});return d()};G(aa.resumeDeferredBootstrap)&&aa.resumeDeferredBootstrap()}function Kd(){P.name="NG_ENABLE_DEBUG_INFO!"+P.name;P.location.reload()}function Ld(b){b=aa.element(b).injector();if(!b)throw Ka("test");return b.get("$$testability")} -function uc(b,a){a=a||"_";return b.replace(Md,function(b,d){return(d?a:"")+b.toLowerCase()})}function Nd(){var b;vc||((ra=P.jQuery)&&ra.fn.on?(C=ra,w(ra.fn,{scope:La.scope,isolateScope:La.isolateScope,controller:La.controller,injector:La.injector,inheritedData:La.inheritedData}),b=ra.cleanData,ra.cleanData=function(a){var c;if(Rb)Rb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ra._data(e,"events"))&&c.$destroy&&ra(e).triggerHandler("$destroy");b(a)}):C=Q,aa.element=C,vc=!0)}function Sb(b,a,c){if(!b)throw Ka("areq", -a||"?",c||"required");return b}function tb(b,a,c){c&&E(b)&&(b=b[b.length-1]);Sb(G(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ma(b,a){if("hasOwnProperty"===b)throw Ka("badname",a);}function wc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g")+d[2];for(d=d[0];d--;)c=c.lastChild;f=Ya(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";s(f,function(a){e.appendChild(a)}); -return e}function Q(b){if(b instanceof Q)return b;var a;x(b)&&(b=T(b),a=!0);if(!(this instanceof Q)){if(a&&"<"!=b.charAt(0))throw Ub("nosel");return new Q(b)}if(a){a=X;var c;b=(c=gf.exec(b))?[a.createElement(c[1])]:(c=Gc(b,a))?c.childNodes:[]}Hc(this,b)}function Vb(b){return b.cloneNode(!0)}function xb(b,a){a||yb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d 4096 bytes)!"));else{if(p.cookie!==y)for(y=p.cookie,d=y.split("; "),wa={},f=0;fk&&this.remove(q.key),b},get:function(a){if(k").parent()[0])});var f=ba(a,b,a,c,d,e);F.$$addScopeClass(a);var g=null;return function(b, -c,d){Sb(b,"scope");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?C(Xb(g,C("
    ").append(a).html())):c?La.clone.call(a):a;if(h)for(var l in h)d.data("$"+l+"Controller",h[l].instance);F.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function ba(a,b,c,d,e,f){function g(a,c,d,e){var f,l,k,q,p,r,D;if(n)for(D= -Array(c.length),q=0;qL.priority)break;if(U=L.scope)L.templateUrl||(J(U)?(Oa("new/isolated scope",I||N,L,w),I=L):Oa("new/isolated scope",I,L,w)),N=N||L;ca=L.name;!L.templateUrl&&L.controller&&(U=L.controller,H=H||{},Oa("'"+ca+"' controller",H[ca],L,w),H[ca]=L);if(U=L.transclude)ha=!0,L.$$tlb||(Oa("transclusion",wa,L,w),wa=L),"element"==U?(B=!0,v=L.priority,U=w,w=e.$$element=C(X.createComment(" "+ca+": "+e[ca]+" ")),d=w[0],V(g,Za.call(U, -0),d),R=F(U,f,v,l&&l.name,{nonTlbTranscludeDirective:wa})):(U=C(Vb(d)).contents(),w.empty(),R=F(U,f));if(L.template)if(fb=!0,Oa("template",ja,L,w),ja=L,U=G(L.template)?L.template(w,e):L.template,U=Tc(U),L.replace){l=L;U=Tb.test(U)?Uc(Xb(L.templateNamespace,T(U))):[];d=U[0];if(1!=U.length||d.nodeType!==na)throw ia("tplrt",ca,"");V(g,w,d);Aa={$attr:{}};U=W(d,[],Aa);var of=a.splice(Q+1,a.length-(Q+1));I&&z(U);a=a.concat(U).concat(of);Rc(e,Aa);Aa=a.length}else w.html(U);if(L.templateUrl)fb=!0,Oa("template", -ja,L,w),ja=L,L.replace&&(l=L),A=M(a.splice(Q,a.length-Q),w,e,g,ha&&R,k,p,{controllerDirectives:H,newIsolateScopeDirective:I,templateDirective:ja,nonTlbTranscludeDirective:wa}),Aa=a.length;else if(L.compile)try{P=L.compile(w,e,R),G(P)?r(null,P,Pa,$):P&&r(P.pre,P.post,Pa,$)}catch(aa){c(aa,ua(w))}L.terminal&&(A.terminal=!0,v=Math.max(v,L.priority))}A.scope=N&&!0===N.scope;A.transcludeOnThisElement=ha;A.elementTranscludeOnThisElement=B;A.templateOnThisElement=fb;A.transclude=R;n.hasElementTranscludeDirective= -B;return A}function z(a){for(var b=0,c=a.length;bq.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Pb(q,{$$start:l,$$end:k})),b.push(q),h=q)}catch(D){c(D)}}return h}function fb(b){if(d.hasOwnProperty(b))for(var c=a.get(b+"Directive"),e=0,f=c.length;e"+b+"";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if("srcdoc"== -b)return H.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return H.RESOURCE_URL}function Aa(a,c,d,e,f){var h=Q(a,e);f=g[e]||f;var k=b(d,!0,h,f);if(k){if("multiple"===e&&"select"===ta(a))throw ia("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers={});if(l.test(e))throw ia("nodomevents");var n=g[e];n!==d&&(k=n&&b(n,!0,h,f),d=n);k&&(g[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope|| -a).$watch(k,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function V(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=a)return b;for(;a--;)8===b[a].nodeType&&pf.call(b,a,1);return b}function Fe(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ma(a,"controller");J(a)?w(b,a):b[a]=c};this.allowGlobals=function(){a= -!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!J(a.$scope))throw M("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,h,l,k){var m,p,q;l=!0===l;k&&x(k)&&(q=k);if(x(g)){k=g.match(c);if(!k)throw qf("ctrlfmt",g);p=k[1];q=q||k[3];g=b.hasOwnProperty(p)?b[p]:wc(h.$scope,p,!0)||(a?wc(e,p,!0):u);tb(g,p,!0)}if(l)return l=(E(g)?g[g.length-1]:g).prototype,m=Object.create(l||null),q&&f(h,q,m,p||g.name),w(function(){d.invoke(g,m,h,p);return m},{instance:m,identifier:q}); -m=d.instantiate(g,h,p);q&&f(h,q,m,p||g.name);return m}}]}function Ge(){this.$get=["$window",function(b){return C(b.document)}]}function He(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Zb(b,a){if(x(b)){var c=b.replace(rf,"").trim();if(c){var d=a("Content-Type");(d=d&&0===d.indexOf(Wc))||(d=(d=c.match(sf))&&tf[d[0]].test(c));d&&(b=pc(c))}}return b}function Xc(b){var a=fa(),c,d,e;if(!b)return a;s(b.split("\n"),function(b){e=b.indexOf(":");c=R(T(b.substr(0, -e)));d=T(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Yc(b){var a=J(b)?b:u;return function(c){a||(a=Xc(b));return c?(c=a[R(c)],void 0===c&&(c=null),c):a}}function Zc(b,a,c,d){if(G(d))return d(b,a,c);s(d,function(d){b=d(b,a,c)});return b}function Ke(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return J(a)&&"[object File]"!==Da.call(a)&&"[object Blob]"!==Da.call(a)&&"[object FormData]"!==Da.call(a)?$a(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"}, -post:qa($b),put:qa($b),patch:qa($b)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},a=!1;this.useApplyAsync=function(b){return y(b)?(a=!!b,this):a};var c=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(d,e,f,g,h,l){function k(a){function c(a){var b=w({},a);b.data=a.data?Zc(a.data,a.headers,a.status,e.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:h.reject(b)}function d(a){var b,c={};s(a,function(a,d){G(a)?(b= -a(),null!=b&&(c[d]=b)):c[d]=a});return c}if(!aa.isObject(a))throw M("$http")("badreq",a);var e=w({method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse},a);e.headers=function(a){var c=b.headers,e=w({},a.headers),f,g,c=w({},c.common,c[R(a.method)]);a:for(f in c){a=R(f);for(g in e)if(R(g)===a)continue a;e[f]=c[f]}return d(e)}(a);e.method=vb(e.method);var f=[function(a){var d=a.headers,e=Zc(a.data,Yc(d),u,a.transformRequest);z(e)&&s(d,function(a,b){"content-type"===R(b)&& -delete d[b]});z(a.withCredentials)&&!z(b.withCredentials)&&(a.withCredentials=b.withCredentials);return m(a,e).then(c,c)},u],g=h.when(e);for(s(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var l=f.shift(),g=g.then(a,l)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,e)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,e)}); -return g};return g}function m(c,f){function l(b,c,d,e){function f(){n(c,b,d,e)}N&&(200<=b&&300>b?N.put(I,[b,c,Xc(d),e]):N.remove(I));a?g.$applyAsync(f):(f(),g.$$phase||g.$apply())}function n(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?v.resolve:v.reject)({data:a,status:b,headers:Yc(d),config:c,statusText:e})}function m(a){n(a.data,a.status,qa(a.headers()),a.statusText)}function t(){var a=k.pendingRequests.indexOf(c);-1!==a&&k.pendingRequests.splice(a,1)}var v=h.defer(),A=v.promise,N,F,s=c.headers,I=p(c.url, -c.params);k.pendingRequests.push(c);A.then(t,t);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(N=J(c.cache)?c.cache:J(b.cache)?b.cache:q);N&&(F=N.get(I),y(F)?F&&G(F.then)?F.then(m,m):E(F)?n(F[1],F[0],qa(F[2]),F[3]):n(F,200,{},"OK"):N.put(I,A));z(F)&&((F=$c(c.url)?e.cookies()[c.xsrfCookieName||b.xsrfCookieName]:u)&&(s[c.xsrfHeaderName||b.xsrfHeaderName]=F),d(c.method,I,f,l,s,c.timeout,c.withCredentials,c.responseType));return A}function p(a,b){if(!b)return a;var c=[];Ed(b, -function(a,b){null===a||z(a)||(E(a)||(a=[a]),s(a,function(a){J(a)&&(a=pa(a)?a.toISOString():$a(a));c.push(Fa(b)+"="+Fa(a))}))});0=l&&(r.resolve(q),p(S.$$intervalId),delete f[S.$$intervalId]);t||b.$apply()},h);f[S.$$intervalId]=r;return S}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]} -function Rd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), -DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function bc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=rb(b[a]);return b.join("/")}function ad(b,a){var c=Ba(b);a.$$protocol= -c.protocol;a.$$host=c.hostname;a.$$port=$(c.port)||wf[c.protocol]||null}function bd(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=Ba(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=rc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function za(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ha(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Gb(b){return b.replace(/(#.+)|#$/, -"$1")}function cc(b){return b.substr(0,Ha(b).lastIndexOf("/")+1)}function dc(b,a){this.$$html5=!0;a=a||"";var c=cc(b);ad(b,this);this.$$parse=function(a){var b=za(c,a);if(!x(b))throw Hb("ipthprfx",a,c);bd(b,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),b=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)), -!0;var f,g;(f=za(b,d))!==u?(g=f,g=(f=za(a,f))!==u?c+(za("/",f)||f):b+g):(f=za(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function ec(b,a){var c=cc(b);ad(b,this);this.$$parse=function(d){d=za(b,d)||za(c,d);var e;"#"===d.charAt(0)?(e=za(a,d),z(e)&&(e=d)):e=this.$$html5?d:"";bd(e,this);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash? -"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Ha(b)==Ha(a)?(this.$$parse(a),!0):!1}}function cd(b,a){this.$$html5=!0;ec.apply(this,arguments);var c=cc(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Ha(d)?f=d:(g=za(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash): -"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function Ib(b){return function(){return this[b]}}function dd(b,a){return function(c){if(z(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Me(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return y(a)?(b=a,this):b};this.html5Mode=function(b){return Wa(b)?(a.enabled=b,this):J(b)?(Wa(b.enabled)&&(a.enabled=b.enabled),Wa(b.requireBase)&&(a.requireBase=b.requireBase),Wa(b.rewriteLinks)&& -(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c,d,e,f,g){function h(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a,b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,m;m=d.baseHref();var p=d.url(),q;if(a.enabled){if(!m&&a.requireBase)throw Hb("nobase");q=p.substring(0,p.indexOf("/",p.indexOf("//")+2))+(m||"/");m=e.history?dc:cd}else q= -Ha(p),m=ec;k=new m(q,"#"+b);k.$$parseLinkUrl(p,p);k.$$state=d.state();var t=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e=C(b.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),l=e.attr("href")||e.attr("xlink:href");J(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Ba(h.animVal).href);t.test(h)||!h||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(h, -l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});Gb(k.absUrl())!=Gb(p)&&d.url(k.absUrl(),!0);var r=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,h(d,!1,e)):(r=!1,l(d,e)))});c.$$phase||c.$digest()});c.$watch(function(){var a=Gb(d.url()),b=Gb(k.absUrl()),f=d.state(),g=k.$$replace, -q=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(r||q)r=!1,c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state=f):(q&&h(b,g,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function Ne(){var b=!0,a=this;this.debugEnabled=function(a){return y(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)? -"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];s(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function sa(b,a){if("__defineGetter__"=== -b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ka("isecfld",a);return b}function la(b,a){if(b){if(b.constructor===b)throw ka("isecfn",a);if(b.window===b)throw ka("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ka("isecdom",a);if(b===Object)throw ka("isecobj",a);}return b}function fc(b){return b.constant}function hb(b,a,c,d,e){la(b,e);la(a,e);c=c.split(".");for(var f,g=0;1h?ed(g[0],g[1],g[2],g[3],g[4],c,d):function(a,b){var e=0,f;do f=ed(g[e++],g[e++],g[e++],g[e++],g[e++],c,d)(a,b),b=u,a=f;while(e=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;fa)for(b in k++,f)e.hasOwnProperty(b)||(t--,delete f[b])}else f!==e&&(f=e,k++);return k}}c.$stateful=!0;var d=this,e,f,h,l=1s&&(y=4-s,W[y]||(W[y]=[]),W[y].push({msg:G(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,newVal:g,oldVal:l}));else if(e===c){t=!1;break a}}catch(C){f(C)}if(!(m=I.$$childHead||I!==this&&I.$$nextSibling))for(;I!==this&&!(m=I.$$nextSibling);)I=I.$parent}while(I=m);if((t||S.length)&&!s--)throw r.$$phase=null,a("infdig",b,W);}while(t||S.length); -for(r.$$phase=null;u.length;)try{u.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(this!==r){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling); -this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=B;this.$on=this.$watch=this.$watchGroup=function(){return B};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){r.$$phase||S.length||h.defer(function(){S.length&&r.$digest()});S.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){u.push(a)},$apply:function(a){try{return k("$apply"), -this.$eval(a)}catch(b){f(b)}finally{r.$$phase=null;try{r.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&n.push(b);t()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e, -stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},l=Ya([h],arguments,1),k,m;do{d=e.$$listeners[a]||c;h.currentScope=e;k=0;for(m=d.length;kRa)throw Ca("iequirks");var d=qa(ma);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=oa);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,g=d.trustAs;s(ma,function(a,b){var c=R(b);d[db("parse_as_"+c)]=function(b){return e(a, -b)};d[db("get_trusted_"+c)]=function(b){return f(a,b)};d[db("trust_as_"+c)]=function(b){return g(a,b)}});return d}]}function Ue(){this.$get=["$window","$document",function(b,a){var c={},d=$((/android (\d+)/.exec(R((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,m=!1;if(l){for(var p in l)if(k=h.exec(p)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in l&&"webkit"); -k=!!("transition"in l||g+"Transition"in l);m=!!("animation"in l||g+"Animation"in l);!d||k&&m||(k=x(f.body.style.webkitTransition),m=x(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Ra)return!1;if(z(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:bb(),vendorPrefix:g,transitions:k,animations:m,android:d}}]}function We(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){d.totalPendingRequests++; -var g=a.defaults&&a.defaults.transformResponse;E(g)?g=g.filter(function(a){return a!==Zb}):g===Zb&&(g=null);return a.get(e,{cache:b,transformResponse:g}).finally(function(){d.totalPendingRequests--}).then(function(a){return a.data},function(a){if(!f)throw ia("tpload",e);return c.reject(a)})}d.totalPendingRequests=0;return d}]}function Xe(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];s(a,function(a){var d= -aa.element(a).data("$binding");d&&s(d,function(d){c?(new RegExp("(^|\\s)"+gd(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;hb;b=Math.abs(b);var g=b+"",h="",l=[],k=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?b=0:(h=g,k=!0)}if(k)0b&&(h=b.toFixed(e),b=parseFloat(h));else{g=(g.split(od)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var g=(""+b).split(od),k=g[0],g=g[1]||"",p=0,q=a.lgSize,t=a.gSize;if(k.length>=q+t)for(p=k.length-q,m=0;mb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Jb(e,a,d)}}function Kb(b,a){return function(c,d){var e=c["get"+b](),f=vb(a?"SHORT"+b:b);return d[f][e]}} -function pd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function qd(b){return function(a){var c=pd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Jb(a,b)}}function kd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=$(b[9]+b[10]),g=$(b[9]+b[11]));h.call(a,$(b[1]),$(b[2])-1,$(b[3]));f=$(b[4]||0)-f;g=$(b[5]|| -0)-g;h=$(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",h=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;x(c)&&(c=Jf.test(c)?$(c):a(c));V(c)&&(c=new Date(c));if(!pa(c))return c;for(;e;)(k=Kf.exec(e))?(h=Ya(h,k,1),e=h.pop()):(h.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset())); -s(h,function(a){l=Lf[a];g+=l?l(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ef(){return function(b,a){z(a)&&(a=2);return $a(b,a)}}function Ff(){return function(b,a){V(b)&&(b=b.toString());return E(b)||x(b)?(a=Infinity===Math.abs(Number(a))?Number(a):$(a))?0b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}} -function Nb(b,a){return function(c,d){var e,f;if(pa(c))return c;if(x(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(Mf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},s(e,function(b,c){c=s};g.$observe("min",function(a){s=q(a);h.$validate()})}if(y(g.max)||g.ngMax){var K;h.$validators.max=function(a){return!p(a)||z(K)||c(a)<=K};g.$observe("max",function(a){K=q(a);h.$validate()})}}}function td(b,a,c,d){(d.$$hasNativeValidators=J(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{}; -return c.badInput&&!c.typeMismatch?u:b})}function ud(b,a,c,d,e){if(y(d)){b=b(d);if(!b.constant)throw M("ngModel")("constexpr",c,d);return b(a)}return e}function jc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,ef=/<([\w:]+)/,ff=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, -ga={option:[1,'"],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ga.optgroup=ga.option;ga.tbody=ga.tfoot=ga.colgroup=ga.caption=ga.thead;ga.th=ga.td;var La=Q.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),Q(P).on("load",a))}, -toString:function(){var b=[];s(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?C(this[b]):C(this[this.length+b])},length:0,push:Of,sort:[].sort,splice:[].splice},Fb={};s("multiple selected checked disabled readOnly required open".split(" "),function(b){Fb[R(b)]=b});var Nc={};s("input select option textarea button form details".split(" "),function(b){Nc[b]=!0});var Oc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"}; -s({data:Wb,removeData:yb},function(b,a){Q[a]=b});s({data:Wb,inheritedData:Eb,scope:function(b){return C.data(b,"$scope")||Eb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return C.data(b,"$isolateScope")||C.data(b,"$isolateScopeNoTemplate")},controller:Jc,injector:function(b){return Eb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Bb,css:function(b,a,c){a=db(a);if(y(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=R(a);if(Fb[d])if(y(c))c? -(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:u;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(z(b)){var d=a.nodeType;return d===na||d===qb?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(z(a)){if(b.multiple&&"select"===ta(b)){var c=[];s(b.options,function(a){a.selected&& -c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;xb(b,!0);b.innerHTML=a},empty:Kc},function(b,a){Q.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Kc&&(2==b.length&&b!==Bb&&b!==Jc?a:d)===u){if(J(a)){for(e=0;e":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a, -c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Yf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},hc=function(a){this.options=a};hc.prototype={constructor:hc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=y(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ka("lexerr",a,c,this.text); -},readNumber:function(){for(var a="",c=this.index;this.indexa){a=this.tokens[a];var g=a.text;if(g===c||g===d||g===e||g=== -f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){if(0===this.tokens.length)throw ka("ueoe",this.text);var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},unaryFn:function(a,c){var d=nb[a];return w(function(a,f){return d(a,f,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,c,d,e){var f=nb[c];return w(function(c,e){return f(c,e,a,d)},{constant:a.constant&& -d.constant,inputs:!e&&[a,d]})},identifier:function(){for(var a=this.consume().text;this.peek(".")&&this.peekAhead(1).identifier&&!this.peekAhead(2,"(");)a+=this.consume().text+this.consume().text;return yf(a,this.options,this.text)},constant:function(){var a=this.consume().value;return w(function(){return a},{constant:!0,literal:!0})},statements:function(){for(var a=[];;)if(0","<=",">=");)a=this.binaryFn(a,c.text, -this.additive());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(ib.ZERO,a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c= -this.identifier();return w(function(d,e,f){d=f||a(d,e);return null==d?u:c(d)},{assign:function(d,e,f){var g=a(d,f);g||a.assign(d,g={},f);return c.assign(g,e)}})},objectIndex:function(a){var c=this.text,d=this.expression();this.consume("]");return w(function(e,f){var g=a(e,f),h=d(e,f);sa(h,c);return g?la(g[h],c):u},{assign:function(e,f,g){var h=sa(d(e,g),c),l=la(a(e,g),c);l||a.assign(e,l={},g);return l[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression()); -while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var l=c?c(g,h):y(c)?u:g,k=a(g,h,l)||B;if(f)for(var m=d.length;m--;)f[m]=la(d[m](g,h),e);la(l,e);if(k){if(k.constructor===k)throw ka("isecfn",e);if(k===Vf||k===Wf||k===Xf)throw ka("isecff",e);}l=k.apply?k.apply(l,f):k(f[0],f[1],f[2],f[3],f[4]);f&&(f.length=0);return la(l,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(",")) -}this.consume("]");return w(function(c,d){for(var e=[],f=0,g=a.length;fa.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Jb(Math[0=h};d.$observe("min",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));h=V(a)&&!isNaN(a)?a:u;e.$validate()})}if(y(d.max)|| -d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||z(l)||a<=l};d.$observe("max",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Zf.test(d)}},email:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||$f.test(d)}},radio:function(a,c, -d,e){z(d.name)&&c.attr("name",++ob);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=ud(l,a,"ngTrueValue",d.ngTrueValue,!0),m=ud(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ea(a, -k)});e.$parsers.push(function(a){return a?k:m})},hidden:B,button:B,submit:B,reset:B,file:B},yc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Dd[R(h.type)]||Dd.text)(f,g,h,l[0],c,a,d,e)}}}}],bg=/^(true|false|\d+)$/,ye=function(){return{restrict:"A",priority:100,compile:function(a,c){return bg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value", -a)})}}}},Zd=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],ae=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],$d=["$sce", -"$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],xe=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),be=jc("",!0),de=jc("Odd",0),ce=jc("Even",1),ee=Ja({compile:function(a,c){c.$set("ngCloak", -u);a.removeClass("ng-cloak")}}),fe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Dc={},cg={blur:!0,focus:!0};s("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Dc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})}; -cg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var ie=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=X.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=ub(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],je=["$templateRequest","$anchorScroll", -"$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:aa.noop,compile:function(f,g){var h=g.ngInclude||g.src,l=g.onload||"",k=g.autoscroll;return function(f,g,q,s,r){var u=0,w,n,D,H=function(){n&&(n.remove(),n=null);w&&(w.$destroy(),w=null);D&&(d.leave(D).then(function(){n=null}),n=D,D=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!y(k)||k&&!f.$eval(k)||c()},n=++u;e?(a(e,!0).then(function(a){if(n===u){var c=f.$new(); -s.template=a;a=r(c,function(a){H();d.enter(a,null,g).then(h)});w=c;D=a;w.$emit("$includeContentLoaded",e);f.$eval(l)}},function(){n===u&&(H(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(H(),s.template=null)})}}}}],Ae=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Gc(f.template,X).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}], -ke=Ja({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),we=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?T(f):f;e.$parsers.push(function(a){if(!z(a)){var c=[];a&&s(a.split(h),function(a){a&&c.push(g?T(a):a)});return c}});e.$formatters.push(function(a){return E(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},lb="ng-valid",vd="ng-invalid",Sa="ng-pristine", -Mb="ng-dirty",xd="ng-pending",Ob=new M("ngModel"),dg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success= -{};this.$pending=u;this.$name=m(d.name||"",!1)(a);var p=f(d.ngModel),q=p.assign,t=p,r=q,w=null,C,n=this;this.$$setOptions=function(a){if((n.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");t=function(a){var d=p(a);G(d)&&(d=c(a));return d};r=function(a,c){G(p(a))?g(a,{$$$p:n.$modelValue}):q(a,n.$modelValue)}}else if(!p.assign)throw Ob("nonassign",d.ngModel,ua(e));};this.$render=B;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var D=e.inheritedData("$formController")|| -Lb,H=0;sd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:D,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Mb);g.addClass(e,Sa)};this.$setDirty=function(){n.$dirty=!0;n.$pristine=!1;g.removeClass(e,Sa);g.addClass(e,Mb);D.$setDirty()};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched", -"ng-untouched")};this.$rollbackViewValue=function(){h.cancel(w);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){if(!V(n.$modelValue)||!isNaN(n.$modelValue)){var a=n.$$rawModelValue,c=n.$valid,d=n.$modelValue,e=n.$options&&n.$options.allowInvalid;n.$$runValidators(a,n.$$lastCommittedViewValue,function(f){e||c===f||(n.$modelValue=f?a:u,n.$modelValue!==d&&n.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d){function e(){var d=!0;s(n.$validators,function(e, -f){var h=e(a,c);d=d&&h;g(f,h)});return d?!0:(s(n.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;s(n.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!G(k.then))throw Ob("$asyncValidators",k);g(h,u);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},B):h(!0)}function g(a,c){l===H&&n.$setValidity(a,c)}function h(a){l===H&&d(a)}H++;var l=H;(function(){var a=n.$$parserName||"parse";if(C===u)g(a,null);else return C||(s(n.$validators, -function(a,c){g(c,null)}),s(n.$asyncValidators,function(a,c){g(c,null)})),g(a,C),C;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=n.$viewValue;h.cancel(w);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=n.$$lastCommittedViewValue;if(C=z(c)?u:!0)for(var d=0;dA;)d=u.pop(),m(O,d.label,!1),d.element.remove()}for(;P.length> -x;){l=P.pop();for(A=1;Aa&&q.removeOption(c)})}var v;if(!(v=r.match(d)))throw fg("iexp",r,ua(f));var C=c(v[2]||v[1]),B=v[4]||v[6],x=/ as /.test(v[0])&&v[1],z=x?c(x):null,G=v[5],J=c(v[3]||""),A=c(v[2]?v[1]:B),N=c(v[7]),K=v[8]?c(v[8]):null,Q={},P=[[{element:f,label:""}]],R={};w&&(a(w)(e),w.removeClass("ng-scope"),w.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=N(e)||[],c;if(t)c=[],s(f.val(), -function(d){d=K?Q[d]:d;c.push("?"===d?u:""===d?null:h(z?z:A,d,a[d]))});else{var d=K?Q[f.val()]:f.val();c="?"===d?u:""===d?null:h(z?z:A,d,a[d])}g.$setViewValue(c);p()})});g.$render=p;e.$watchCollection(N,l);e.$watchCollection(function(){var a=N(e),c;if(a&&E(a)){c=Array(a.length);for(var d=0,f=a.length;df||e.$isEmpty(c)||c.length<=f}}}}},Bc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=$(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};P.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(Nd(),Pd(aa),C(X).ready(function(){Jd(X,tc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend(''); -//# sourceMappingURL=https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js.map +(function(z){'use strict';function ve(a){if(D(a))w(a.objectMaxDepth)&&(Xb.objectMaxDepth=Yb(a.objectMaxDepth)?a.objectMaxDepth:NaN),w(a.urlErrorParamsEnabled)&&Ga(a.urlErrorParamsEnabled)&&(Xb.urlErrorParamsEnabled=a.urlErrorParamsEnabled);else return Xb}function Yb(a){return X(a)&&0c)return"...";var d=b.$$hashKey,f;if(H(a)){f=0;for(var g=a.length;f
    ").append(a).html();try{return a[0].nodeType===Pa?K(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+K(b)})}catch(d){return K(b)}}function Vc(a){try{return decodeURIComponent(a)}catch(b){}}function hc(a){var b={};r((a||"").split("&"), +function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Vc(e),w(e)&&(f=w(f)?Vc(f):!0,ta.call(b,e)?H(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Ce(a){var b=[];r(a,function(a,c){H(a)?r(a,function(a){b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))}):b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))});return b.length?b.join("&"):""}function ic(a){return ba(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ba(a, +b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function De(a,b){var d,c,e=Qa.length;for(c=0;c protocol indicates an extension, document.location.href does not match."))}function Wc(a,b,d){D(d)||(d={});d=S({strictDi:!1},d);var c=function(){a=x(a);if(a.injector()){var c=a[0]===z.document?"document":Aa(a);throw oa("btstrpd",c.replace(//,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider", +function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;z&&e.test(z.name)&&(d.debugInfoEnabled=!0,z.name=z.name.replace(e,""));if(z&&!f.test(z.name))return c();z.name=z.name.replace(f,"");ca.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};B(ca.resumeDeferredBootstrap)&& +ca.resumeDeferredBootstrap()}function Ge(){z.name="NG_ENABLE_DEBUG_INFO!"+z.name;z.location.reload()}function He(a){a=ca.element(a).injector();if(!a)throw oa("test");return a.get("$$testability")}function Xc(a,b){b=b||"_";return a.replace(Ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function Je(){var a;if(!Yc){var b=rb();(sb=A(b)?z.jQuery:b?z[b]:void 0)&&sb.fn.on?(x=sb,S(sb.fn,{scope:Wa.scope,isolateScope:Wa.isolateScope,controller:Wa.controller,injector:Wa.injector,inheritedData:Wa.inheritedData})): +x=U;a=x.cleanData;x.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=(x._data(f)||{}).events)&&c.$destroy&&x(f).triggerHandler("$destroy");a(b)};ca.element=x;Yc=!0}}function Ke(){U.legacyXHTMLReplacement=!0}function gb(a,b,d){if(!a)throw oa("areq",b||"?",d||"required");return a}function tb(a,b,d){d&&H(a)&&(a=a[a.length-1]);gb(B(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ja(a,b){if("hasOwnProperty"===a)throw oa("badname", +b);}function Le(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g"):a;if(10>wa)for(c=hb[c]||hb._default,d.innerHTML=c[1]+e+c[2],k=c[0];k--;)d=d.firstChild;else{c=qa[c]||[];for(k=c.length;-1<--k;)d.appendChild(z.document.createElement(c[k])),d=d.firstChild;d.innerHTML=e}g=db(g,d.childNodes);d=f.firstChild;d.textContent=""}else g.push(b.createTextNode(a)); +f.textContent="";f.innerHTML="";r(g,function(a){f.appendChild(a)});return f}function U(a){if(a instanceof U)return a;var b;C(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!==a.charAt(0))throw oc("nosel");return new U(a)}if(b){b=z.document;var d;a=(d=tg.exec(a))?[b.createElement(d[1])]:(d=gd(a,b))?d.childNodes:[];pc(this,a)}else B(a)?hd(a):pc(this,a)}function qc(a){return a.cloneNode(!0)}function zb(a,b){!b&&mc(a)&&x.cleanData([a]);a.querySelectorAll&&x.cleanData(a.querySelectorAll("*"))}function id(a){for(var b in a)return!1; +return!0}function jd(a){var b=a.ng339,d=b&&Ka[b],c=d&&d.events,d=d&&d.data;d&&!id(d)||c&&!id(c)||(delete Ka[b],a.ng339=void 0)}function kd(a,b,d,c){if(w(c))throw oc("offargs");var e=(c=Ab(a))&&c.events,f=c&&c.handle;if(f){if(b){var g=function(b){var c=e[b];w(d)&&cb(c||[],d);w(d)&&c&&0l&&this.remove(n.key);return b}},get:function(a){if(l";b=Fa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function sa(a,b){try{a.addClass(b)}catch(c){}}function da(a,b,c,d,e){a instanceof x||(a=x(a));var f=Xa(a,b,a,c,d,e);da.$$addScopeClass(a);var g=null;return function(b,c,d){if(!a)throw $("multilink");gb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement; +h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ua(d)&&la.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==g?x(ja(g,x("
    ").append(a).html())):c?Wa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);da.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);c||(a=f=null);return d}}function Xa(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,I,t;if(n)for(t=Array(c.length),m=0;mu.priority)break;if(O=u.scope)u.templateUrl||(D(O)?(ba("new/isolated scope",s||t,u,y),s=u):ba("new/isolated scope",s,u,y)),t=t||u;Q=u.name;if(!ma&&(u.replace&&(u.templateUrl||u.template)||u.transclude&& +!u.$$tlb)){for(O=sa+1;ma=a[O++];)if(ma.transclude&&!ma.$$tlb||ma.replace&&(ma.templateUrl||ma.template)){Jb=!0;break}ma=!0}!u.templateUrl&&u.controller&&(J=J||T(),ba("'"+Q+"' controller",J[Q],u,y),J[Q]=u);if(O=u.transclude)if(G=!0,u.$$tlb||(ba("transclusion",L,u,y),L=u),"element"===O)N=!0,n=u.priority,M=y,y=d.$$element=x(da.$$createComment(Q,d[Q])),b=y[0],oa(f,Ha.call(M,0),b),R=Z(Jb,M,e,n,g&&g.name,{nonTlbTranscludeDirective:L});else{var ka=T();if(D(O)){M=z.document.createDocumentFragment();var Xa= +T(),F=T();r(O,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Xa[a]=b;ka[b]=null;F[b]=c});r(y.contents(),function(a){var b=Xa[xa(ua(a))];b?(F[b]=!0,ka[b]=ka[b]||z.document.createDocumentFragment(),ka[b].appendChild(a)):M.appendChild(a)});r(F,function(a,b){if(!a)throw $("reqslot",b);});for(var K in ka)ka[K]&&(R=x(ka[K].childNodes),ka[K]=Z(Jb,R,e));M=x(M.childNodes)}else M=x(qc(b)).contents();y.empty();R=Z(Jb,M,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});R.$$slots=ka}if(u.template)if(P= +!0,ba("template",v,u,y),v=u,O=B(u.template)?u.template(y,d):u.template,O=Na(O),u.replace){g=u;M=nc.test(O)?td(ja(u.templateNamespace,V(O))):[];b=M[0];if(1!==M.length||1!==b.nodeType)throw $("tplrt",Q,"");oa(f,y,b);C={$attr:{}};O=tc(b,[],C);var Ig=a.splice(sa+1,a.length-(sa+1));(s||t)&&fa(O,s,t);a=a.concat(O).concat(Ig);ga(d,C);C=a.length}else y.html(O);if(u.templateUrl)P=!0,ba("template",v,u,y),v=u,u.replace&&(g=u),p=ha(a.splice(sa,a.length-sa),y,d,f,G&&R,h,k,{controllerDirectives:J,newScopeDirective:t!== +u&&t,newIsolateScopeDirective:s,templateDirective:v,nonTlbTranscludeDirective:L}),C=a.length;else if(u.compile)try{q=u.compile(y,d,R);var Y=u.$$originalDirective||u;B(q)?m(null,Va(Y,q),E,jb):q&&m(Va(Y,q.pre),Va(Y,q.post),E,jb)}catch(ca){c(ca,Aa(y))}u.terminal&&(p.terminal=!0,n=Math.max(n,u.priority))}p.scope=t&&!0===t.scope;p.transcludeOnThisElement=G;p.templateOnThisElement=P;p.transclude=R;l.hasElementTranscludeDirective=N;return p}function X(a,b,c,d){var e;if(C(b)){var f=b.match(l);b=b.substring(f[0].length); +var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e="^^"===g&&c[0]&&9===c[0].nodeType?null:g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw $("ctreq",b,a);}else if(H(b))for(e=[],g=0,f=b.length;gc.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=bc(c,{$$start:k,$$end:l}));if(!c.$$bindings){var I=m=c,t=c.name,u={isolateScope:null,bindToController:null}; +D(I.scope)&&(!0===I.bindToController?(u.bindToController=d(I.scope,t,!0),u.isolateScope={}):u.isolateScope=d(I.scope,t,!1));D(I.bindToController)&&(u.bindToController=d(I.bindToController,t,!0));if(u.bindToController&&!I.controller)throw $("noctrl",t);m=m.$$bindings=u;D(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function ca(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function qa(a,b){if("srcdoc"=== +b)return u.HTML;if("src"===b||"ngSrc"===b)return-1===["img","video","audio","source","track"].indexOf(a)?u.RESOURCE_URL:u.MEDIA_URL;if("xlinkHref"===b)return"image"===a?u.MEDIA_URL:"a"===a?u.URL:u.RESOURCE_URL;if("form"===a&&"action"===b||"base"===a&&"href"===b||"link"===a&&"href"===b)return u.RESOURCE_URL;if("a"===a&&("href"===b||"ngHref"===b))return u.URL}function ya(a,b){var c=b.toLowerCase();return v[a+"|"+c]||v["*|"+c]}function za(a){return ma(u.valueOf(a),"ng-prop-srcset")}function Ea(a,b,c, +d){if(m.test(d))throw $("nodomevents");a=ua(a);var e=ya(a,d),f=Ta;"srcset"!==d||"img"!==a&&"source"!==a?e&&(f=u.getTrusted.bind(u,e)):f=za;b.push({priority:100,compile:function(a,b){var e=p(b[c]),g=p(b[c],function(a){return u.valueOf(a)});return{pre:function(a,b){function c(){var g=e(a);b[0][d]=f(g)}c();a.$watch(g,c)}}}})}function Ia(a,c,d,e,f){var g=ua(a),k=qa(g,e),l=h[e]||f,p=b(d,!f,k,l);if(p){if("multiple"===e&&"select"===g)throw $("selmulti",Aa(a));if(m.test(e))throw $("nodomevents");c.push({priority:100, +compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=T());var g=f[e];g!==d&&(p=g&&b(g,!0,k,l),d=g);p&&(f[e]=p(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(p,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function oa(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Pa&&""===d.nodeValue.trim())&&Kg.call(a,b,1)}return a} +function Gg(a,b){if(b&&C(b))return b;if(C(a)){var d=wd.exec(a);if(d)return d[3]}}function Kf(){var a={};this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,d){Ja(b,"controller");D(b)?S(a,b):a[b]=d};this.$get=["$injector",function(b){function d(a,b,d,g){if(!a||!D(a.$scope))throw F("$controller")("noscp",g,b);a.$scope[b]=d}return function(c,e,f,g){var k,h,l;f=!0===f;g&&C(g)&&(l=g);if(C(c)){g=c.match(wd);if(!g)throw xd("ctrlfmt",c);h=g[1];l=l||g[3];c=a.hasOwnProperty(h)?a[h]:Le(e.$scope, +h,!0);if(!c)throw xd("ctrlreg",h);tb(c,h,!0)}if(f)return f=(H(c)?c[c.length-1]:c).prototype,k=Object.create(f||null),l&&d(e,l,k,h||c.name),S(function(){var a=b.invoke(c,k,e,h);a!==k&&(D(a)||B(a))&&(k=a,l&&d(e,l,k,h||c.name));return k},{instance:k,identifier:l});k=b.instantiate(c,e,h);l&&d(e,l,k,h||c.name);return k}}]}function Lf(){this.$get=["$window",function(a){return x(a.document)}]}function Mf(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden; +a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]}function Nf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function vc(a){return D(a)?ha(a)?a.toISOString():eb(a):a}function Tf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Qc(a,function(a,c){null===a||A(a)||B(a)||(H(a)?r(a,function(a){b.push(ba(c)+"="+ba(vc(a)))}):b.push(ba(c)+"="+ba(vc(a))))});return b.join("&")}}}function Uf(){this.$get= +function(){return function(a){function b(a,e,f){H(a)?r(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!ha(a)?Qc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):(B(a)&&(a=a()),d.push(ba(e)+"="+(null==a?"":ba(vc(a)))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function wc(a,b){if(C(a)){var d=a.replace(Lg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(yd),e;(e=c)||(e=(e=d.match(Mg))&&Ng[e[0]].test(d));if(e)try{a=Tc(d)}catch(f){if(!c)return a;throw Lb("baddata",a,f);}}}return a} +function zd(a){var b=T(),d;C(a)?r(a.split("\n"),function(a){d=a.indexOf(":");var e=K(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&r(a,function(a,d){var f=K(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function Ad(a){var b;return function(d){b||(b=zd(a));return d?(d=b[K(d)],void 0===d&&(d=null),d):b}}function Bd(a,b,d,c){if(B(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function Sf(){var a=this.defaults={transformResponse:[wc],transformRequest:[function(a){return D(a)&& +"[object File]"!==la.call(a)&&"[object Blob]"!==la.call(a)&&"[object FormData]"!==la.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja(xc),put:ja(xc),patch:ja(xc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=this.interceptors=[],c=this.xsrfTrustedOrigins=[];Object.defineProperty(this,"xsrfWhitelistedOrigins", +{get:function(){return this.xsrfTrustedOrigins},set:function(a){this.xsrfTrustedOrigins=a}});this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(e,f,g,k,h,l,m,p){function n(b){function c(a,b){for(var d=0,e=b.length;da?b:l.reject(b)}if(!D(b))throw F("$http")("badreq",b);if(!C(p.valueOf(b.url)))throw F("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,jsonpCallbackParam:a.jsonpCallbackParam},b);g.headers=function(b){var c=a.headers,e=S({},b.headers),f,g,h,c=S({},c.common,c[K(b.method)]);a:for(f in c){g=K(f);for(h in e)if(K(h)===g)continue a;e[f]=c[f]}return d(e,ja(b))}(b);g.method= +vb(g.method);g.paramSerializer=C(g.paramSerializer)?m.get(g.paramSerializer):g.paramSerializer;e.$$incOutstandingRequestCount("$http");var h=[],k=[];b=l.resolve(g);r(v,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&k.push(a.response,a.responseError)});b=c(b,h);b=b.then(function(b){var c=b.headers,d=Bd(b.data,Ad(c),void 0,b.transformRequest);A(d)&&r(c,function(a,b){"content-type"===K(b)&&delete c[b]});A(b.withCredentials)&&!A(a.withCredentials)&& +(b.withCredentials=a.withCredentials);return s(b,d).then(f,f)});b=c(b,k);return b=b.finally(function(){e.$$completeOutstandingRequest(E,"$http")})}function s(c,d){function e(a){if(a){var c={};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function k(a,c,d,e,f){function g(){m(c,a,d,e,f)}R&&(200<=a&&300>a?R.put(O,[a,c,zd(d),e,f]):R.remove(O));b?h.$applyAsync(g):(g(),h.$$phase||h.$apply())}function m(a,b,d,e,f){b=-1<=b?b:0;(200<=b&&300> +b?L.resolve:L.reject)({data:a,status:b,headers:Ad(d),config:c,statusText:e,xhrStatus:f})}function s(a){m(a.data,a.status,ja(a.headers()),a.statusText,a.xhrStatus)}function v(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var L=l.defer(),u=L.promise,R,q,ma=c.headers,x="jsonp"===K(c.method),O=c.url;x?O=p.getTrustedResourceUrl(O):C(O)||(O=p.valueOf(O));O=G(O,c.paramSerializer(c.params));x&&(O=t(O,c.jsonpCallbackParam));n.pendingRequests.push(c);u.then(v,v);!c.cache&&!a.cache|| +!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(R=D(c.cache)?c.cache:D(a.cache)?a.cache:N);R&&(q=R.get(O),w(q)?q&&B(q.then)?q.then(s,s):H(q)?m(q[1],q[0],ja(q[2]),q[3],q[4]):m(q,200,{},"OK","complete"):R.put(O,u));A(q)&&((q=kc(c.url)?g()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(ma[c.xsrfHeaderName||a.xsrfHeaderName]=q),f(c.method,O,d,k,ma,c.timeout,c.withCredentials,c.responseType,e(c.eventHandlers),e(c.uploadEventHandlers)));return u}function G(a,b){0=h&&(t.resolve(s),f(r.$$intervalId));G||c.$apply()},k,t,G);return r}}}]}function Cd(a,b){var d=ga(a);b.$$protocol=d.protocol;b.$$host= +d.hostname;b.$$port=fa(d.port)||Rg[d.protocol]||null}function Dd(a,b,d){if(Sg.test(a))throw kb("badpath",a);var c="/"!==a.charAt(0);c&&(a="/"+a);a=ga(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=hc(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function yc(a,b){return a.slice(0, +b.length)===b}function ya(a,b){if(yc(b,a))return b.substr(a.length)}function Da(a){var b=a.indexOf("#");return-1===b?a:a.substr(0,b)}function zc(a,b,d){this.$$html5=!0;d=d||"";Cd(a,this);this.$$parse=function(a){var d=ya(b,a);if(!C(d))throw kb("ipthprfx",a,b);Dd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$normalizeUrl=function(a){return b+a.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;w(f=ya(a,c))?(g=f,g=d&&w(f=ya(d,f))? +b+(ya("/",f)||f):a+g):w(f=ya(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function Ac(a,b,d){Cd(a,this);this.$$parse=function(c){var e=ya(a,c)||ya(b,c),f;A(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",A(e)&&(a=c,this.replace())):(f=ya(d,e),A(f)&&(f=e));Dd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;yc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$normalizeUrl=function(b){return a+(b?d+b:"")};this.$$parseLinkUrl=function(b, +d){return Da(a)===Da(b)?(this.$$parse(b),!0):!1}}function Ed(a,b,d){this.$$html5=!0;Ac.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===Da(c)?f=c:(g=ya(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$normalizeUrl=function(b){return a+d+b}}function Mb(a){return function(){return this[a]}}function Fd(a,b){return function(d){if(A(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Yf(){var a="!", +b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a};this.html5Mode=function(a){if(Ga(a))return b.enabled=a,this;if(D(a)){Ga(a.enabled)&&(b.enabled=a.enabled);Ga(a.requireBase)&&(b.requireBase=a.requireBase);if(Ga(a.rewriteLinks)||C(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function k(a,b){return a===b||ga(a).href===ga(b).href}function h(a, +b,d){var e=m.url(),f=m.$$state;try{c.url(a,b,d),m.$$state=c.state()}catch(g){throw m.url(e),m.$$state=f,g;}}function l(a,b){d.$broadcast("$locationChangeSuccess",m.absUrl(),a,m.$$state,b)}var m,p;p=c.baseHref();var n=c.url(),s;if(b.enabled){if(!p&&b.requireBase)throw kb("nobase");s=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(p||"/");p=e.history?zc:Ed}else s=Da(n),p=Ac;var r=s.substr(0,Da(s).lastIndexOf("/")+1);m=new p(s,r,"#"+a);m.$$parseLinkUrl(n,n);m.$$state=c.state();var t=/^\s*(javascript|mailto):/i; +f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var g=x(a.target);"a"!==ua(g[0]);)if(g[0]===f[0]||!(g=g.parent())[0])return;if(!C(e)||!A(g.attr(e))){var e=g.prop("href"),h=g.attr("href")||g.attr("xlink:href");D(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ga(e.animVal).href);t.test(e)||!e||g.attr("target")||a.isDefaultPrevented()||!m.$$parseLinkUrl(e,h)||(a.preventDefault(),m.absUrl()!==c.url()&&d.$apply())}}});m.absUrl()!== +n&&c.url(m.absUrl(),!0);var N=!0;c.onUrlChange(function(a,b){yc(a,r)?(d.$evalAsync(function(){var c=m.absUrl(),e=m.$$state,f;m.$$parse(a);m.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;m.absUrl()===a&&(f?(m.$$parse(c),m.$$state=e,h(c,!1,e)):(N=!1,l(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(N||m.$$urlUpdatedByLocation){m.$$urlUpdatedByLocation=!1;var a=c.url(),b=m.absUrl(),f=c.state(),g=m.$$replace,n=!k(a,b)||m.$$html5&&e.history&&f!== +m.$$state;if(N||n)N=!1,d.$evalAsync(function(){var b=m.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,m.$$state,f).defaultPrevented;m.absUrl()===b&&(c?(m.$$parse(a),m.$$state=f):(n&&h(b,g,f===m.$$state?null:m.$$state),l(a,f)))})}m.$$replace=!1});return m}]}function Zf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){dc(a)&&(a.stack&&f?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&& +(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||E;return function(){var a=[];r(arguments,function(b){a.push(c(b))});return Function.prototype.apply.call(e,b,a)}}var f=wa||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Tg(a){return a+""}function Ug(a,b){return"undefined"!==typeof a?a: +b}function Gd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Vg(a,b){switch(a.type){case q.MemberExpression:if(a.computed)return!1;break;case q.UnaryExpression:return 1;case q.BinaryExpression:return"+"!==a.operator?1:!1;case q.CallExpression:return!1}return void 0===b?Hd:b}function Z(a,b,d){var c,e,f=a.isPure=Vg(a,d);switch(a.type){case q.Program:c=!0;r(a.body,function(a){Z(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case q.Literal:a.constant=!0;a.toWatch= +[];break;case q.UnaryExpression:Z(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case q.BinaryExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:Z(a.test,b,f);Z(a.alternate,b,f);Z(a.consequent,b,f);a.constant=a.test.constant&& +a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=[a];break;case q.MemberExpression:Z(a.object,b,f);a.computed&&Z(a.property,b,f);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case q.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];r(a.arguments,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case q.AssignmentExpression:Z(a.left, +b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case q.ArrayExpression:c=!0;e=[];r(a.elements,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=e;break;case q.ObjectExpression:c=!0;e=[];r(a.properties,function(a){Z(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(Z(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case q.ThisExpression:a.constant= +!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Id(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Jd(a){return a.type===q.Identifier||a.type===q.MemberExpression}function Kd(a){if(1===a.body.length&&Jd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function Ld(a){this.$filter=a}function Md(a){this.$filter=a}function Nb(a,b,d){this.ast= +new q(a,d);this.astCompiler=d.csp?new Md(b):new Ld(b)}function Bc(a){return B(a.valueOf)?a.valueOf():Wg.call(a)}function $f(){var a=T(),b={"true":!0,"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral=function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(b,c){var d,f;switch(typeof b){case "string":return f=b=b.trim(),d=a[f],d||(d=new Ob(G),d=(new Nb(d,e,G)).parse(b),a[f]=p(d)),s(d,c);case "function":return s(b,c);default:return s(E, +c)}}function g(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=Bc(a),"object"!==typeof a||c)?a===b||a!==a&&b!==b:!1}function k(a,b,c,d,e){var f=d.inputs,h;if(1===f.length){var k=g,f=f[0];return a.$watch(function(a){var b=f(a);g(b,k,f.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&Bc(b));return h},b,c,e)}for(var l=[],m=[],n=0,p=f.length;n=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,f=0,g=e.length;fa)for(b in l++, +f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$$pure=g(a).literal;c.$stateful=!c.$$pure;var d=this,e,f,h,k=1r&&(A=4-r,N[A]||(N[A]=[]),N[A].push({msg:B(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:h}));else if(a===c){s= +!1;break a}}catch(E){f(E)}if(!(n=!q.$$suspended&&q.$$watchersCount&&q.$$childHead||q!==y&&q.$$nextSibling))for(;q!==y&&!(n=q.$$nextSibling);)q=q.$parent}while(q=n);if((s||w.length)&&!r--)throw v.$$phase=null,d("infdig",b,N);}while(s||w.length);for(v.$$phase=null;Jwa)throw Ea("iequirks");var c=ja(W);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ta);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(W, +function(a,b){var d=K(b);c[("parse_as_"+d).replace(Dc,xb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Dc,xb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Dc,xb)]=function(b){return g(a,b)}});return c}]}function fg(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=fa((/android (\d+)/.exec(K((a.navigator||{}).userAgent))|| +[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},k=g.body&&g.body.style,h=!1,l=!1;k&&(h=!!("transition"in k||"webkitTransition"in k),l=!!("animation"in k||"webkitAnimation"in k));return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===a&&wa)return!1;if(A(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),transitions:h,animations:l,android:e}}]}function gg(){this.$get=ia(function(a){return new Yg(a)})}function Yg(a){function b(){var a=e.pop();return a&& +a.cb}function d(a){for(var b=e.length-1;0<=b;--b){var c=e[b];if(c.type===a)return e.splice(b,1),c.cb}}var c={},e=[],f=this.ALL_TASKS_TYPE="$$all$$",g=this.DEFAULT_TASK_TYPE="$$default$$";this.completeTask=function(e,h){h=h||g;try{e()}finally{var l;l=h||g;c[l]&&(c[l]--,c[f]--);l=c[h];var m=c[f];if(!m||!l)for(l=m?d:b;m=l(h);)try{m()}catch(p){a.error(p)}}};this.incTaskCount=function(a){a=a||g;c[a]=(c[a]||0)+1;c[f]=(c[f]||0)+1};this.notifyWhenNoPendingTasks=function(a,b){b=b||f;c[b]?e.push({type:b,cb:a}): +a()}}function ig(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(k,h){g.totalPendingRequests++;if(!C(k)||A(d.get(k)))k=f.getTrustedResourceUrl(k);var l=c.defaults&&c.defaults.transformResponse;H(l)?l=l.filter(function(a){return a!==wc}):l===wc&&(l=null);return c.get(k,S({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){return d.put(k,a.data)}, +function(a){h||(a=Zg("tpload",k,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function jg(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var c=ca.element(a).data("$binding");c&&r(c,function(c){d?(new RegExp("(^|\\s)"+Od(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-", +"data-ng-","ng\\:"],k=0;kc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Fc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Fc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Yd&&(d=d.splice(0,Yd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ih(a, +b,d,c){var e=a.d,f=e.length-a.i;b=A(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fk;)h.unshift(0),k++;0=b.lgSize&&k.unshift(h.splice(-b.lgSize,h.length).join(""));h.length>b.gSize;)k.unshift(h.splice(-b.gSize,h.length).join(""));h.length&&k.unshift(h.join(""));h=k.join(d);f.length&&(h+=c+f.join(""));e&&(h+="e+"+e)}return 0>a&&!g?b.negPre+h+b.negSuf:b.posPre+ +h+b.posSuf}function Pb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length-d)f+=d;0===f&&-12===d&&(f=12);return Pb(f,b,c,e)}}function lb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Zd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function $d(a){return function(b){var d= +Zd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Pb(b,a)}}function Gc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Td(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=fa(b[9]+b[10]),g=fa(b[9]+b[11]));k.call(a,fa(b[1]),fa(b[2])-1,fa(b[3]));f=fa(b[4]||0)-f;g=fa(b[5]||0)-g;k=fa(b[6]||0);b=Math.round(1E3*parseFloat("0."+ +(b[7]||0)));h.call(a,f,g,k,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",k=[],h,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;C(c)&&(c=jh.test(c)?fa(c):b(c));X(c)&&(c=new Date(c));if(!ha(c)||!isFinite(c.getTime()))return c;for(;d;)(l=kh.exec(d))?(k=db(k,l,1),d=k.pop()):(k.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=fc(f,m),c=gc(c,f,!0));r(k,function(b){h=lh[b];g+=h?h(c,a.DATETIME_FORMATS, +m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ch(){return function(a,b){A(b)&&(b=2);return eb(a,b)}}function dh(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):fa(b);if(Y(b))return a;X(a)&&(a=a.toString());if(!za(a))return a;d=!d||isNaN(d)?0:fa(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Hc(a,d,d+b):0===d?Hc(a,b,a.length):Hc(a,Math.max(0,d+b),d)}}function Hc(a,b,d){return C(a)?a.slice(b,d):Ha.call(a,b,d)}function Vd(a){function b(b){return b.map(function(b){var c= +1,d=Ta;if(B(b))d=b;else if(C(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e=d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,h=b.type;if(d===h){var h=a.value,l=b.value;"string"===d?(h=h.toLowerCase(),l=l.toLowerCase()):"object"===d&&(D(h)&&(h=a.index),D(l)&&(l=b.index));h!==l&&(c= +hb||37<=b&&40>=b|| +m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut drop",m)}b.on("change",l);if(ee[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!h){var b=this.validity,c=b.badInput,d=b.typeMismatch;h=f.defer(function(){h=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Rb(a,b){return function(d,c){var e,f;if(ha(d))return d;if(C(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length- +1)&&(d=d.substring(1,d.length-1));if(mh.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(a,c){cf.yyyy&&e.setFullYear(f.yyyy),e}return NaN}}function ob(a,b,d,c){return function(e,f,g,k,h,l,m, +p){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return w(a)&&!ha(a)?r(a)||void 0:a}function r(a,b){var c=k.$options.getOption("timezone");v&&v!==c&&(b=Uc(b,fc(v)));var e=d(a,b);!isNaN(e)&&c&&(e=gc(e,c));return e}Jc(e,f,g,k,a);Sa(e,f,g,k,h,l);var t="time"===a||"datetimelocal"===a,q,v;k.$parsers.push(function(c){if(k.$isEmpty(c))return null;if(b.test(c))return r(c,q);k.$$parserName=a});k.$formatters.push(function(a){if(a&&!ha(a))throw pb("datefmt",a);if(n(a)){q=a;var b= +k.$options.getOption("timezone");b&&(v=b,q=gc(q,b,!0));var d=c;t&&C(k.$options.getOption("timeSecondsFormat"))&&(d=c.replace("ss.sss",k.$options.getOption("timeSecondsFormat")).replace(/:$/,""));a=m("date")(a,d,b);t&&k.$options.getOption("timeStripZeroSeconds")&&(a=a.replace(/(?::00)?(?:\.000)?$/,""));return a}v=q=null;return""});if(w(g.min)||g.ngMin){var x=g.min||p(g.ngMin)(e),z=s(x);k.$validators.min=function(a){return!n(a)||A(z)||d(a)>=z};g.$observe("min",function(a){a!==x&&(z=s(a),x=a,k.$validate())})}if(w(g.max)|| +g.ngMax){var y=g.max||p(g.ngMax)(e),J=s(y);k.$validators.max=function(a){return!n(a)||A(J)||d(a)<=J};g.$observe("max",function(a){a!==y&&(J=s(a),y=a,k.$validate())})}}}function Jc(a,b,d,c,e){(c.$$hasNativeValidators=D(b[0].validity))&&c.$parsers.push(function(a){var d=b.prop("validity")||{};if(d.badInput||d.typeMismatch)c.$$parserName=e;else return a})}function fe(a){a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(nh.test(b))return parseFloat(b);a.$$parserName="number"});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!X(b))throw pb("numfmt", +b);b=b.toString()}return b})}function na(a){w(a)&&!X(a)&&(a=parseFloat(a));return Y(a)?void 0:a}function Kc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ge(a,b,d){a=Number(a);var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Kc(a):0,k=e?Kc(b):0,h=f?Kc(d):0,g=Math.max(g,k,h),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function he(a,b,d,c,e){if(w(c)){a= +a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return e}function Lc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d(?:<\/\1>|)$/,nc=/<|&#?\w+;/,rg=/<([\w:-]+)/,sg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,qa={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr", +"tbody","table"]};qa.tbody=qa.tfoot=qa.colgroup=qa.caption=qa.thead;qa.th=qa.td;var hb={option:[1,'"],_default:[0,"",""]},Nc;for(Nc in qa){var le=qa[Nc],me=le.slice().reverse();hb[Nc]=[me.length,"<"+me.join("><")+">",""]}hb.optgroup=hb.option;var zg=z.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Wa=U.prototype={ready:hd,toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+ +"]"},eq:function(a){return 0<=a?x(this[a]):x(this[this.length+a])},length:0,push:ph,sort:[].sort,splice:[].splice},Hb={};r("multiple selected checked disabled readOnly required open".split(" "),function(a){Hb[K(a)]=a});var od={};r("input select option textarea button form details".split(" "),function(a){od[a]=!0});var vd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:sc,removeData:rc,hasData:function(a){for(var b in Ka[a.ng339])return!0; +return!1},cleanData:function(a){for(var b=0,d=a.length;b/,Cg=/^[^(]*\(\s*([^)]*)\)/m,sh=/,/,th=/^\s*(_?)(\S+?)\1\s*$/,Ag=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ca=F("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw C(d)&&d||(d=a.name||Dg(a)),Ca("strictdi",d);b=qd(a);r(b[1].split(sh),function(a){a.replace(th,function(a,b,d){c.push(d)})})}a.$inject=c}}else H(a)?(b=a.length-1,tb(a[b],"fn"),c=a.slice(0,b)):tb(a,"fn",!0);return c};var ne=F("$animate"), +Ef=function(){this.$get=E},Ff=function(){var a=new Ib,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=C(b)?b.split(" "):H(b)?b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=Eg(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Eb(a,e);f&&Db(a,f)});a.delete(b)}});b.length=0}return{enabled:E,on:E,off:E,pin:E,push:function(g, +k,h,l){l&&l();h=h||{};h.from&&g.css(h.from);h.to&&g.css(h.to);if(h.addClass||h.removeClass)if(k=h.addClass,l=h.removeClass,h=a.get(g)||{},k=e(h,k,!0),l=e(h,l,!1),k||l)a.set(g,h),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Cf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw ne("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g, +d)};this.customFilter=function(a){1===arguments.length&&(c=B(a)?a:null);return c};this.classNameFilter=function(a){if(1===arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,ne("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e <= >= && || ! = |".split(" "),function(a){Vb[a]= +!0});var wh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ob=function(a){this.options=a};Ob.prototype={constructor:Ob,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"=== +typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)}, +isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b= +w(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Ya("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:q.BinaryExpression,operator:b.text, +left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()}, +primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=Ia(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:q.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression", +this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression()); +return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]"); +return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:q.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"), +b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw Ya("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Ya("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Ya("ueoe", +this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:q.ThisExpression},$locals:{type:q.LocalsExpression}}};var Hd=2;Ld.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[], +body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};Z(a,b.$filter);var d="",c;this.stage="assign";if(c=Kd(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Id(a.body);b.stage="inputs";r(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d;var k=b.nextId();b.recurse(a,k);b.return_(k);b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage= +"main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Tg,Ug,Gd);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;r(b,function(b){a.push("var "+b.name+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+ +";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")}, +recurse:function(a,b,d,c,e,f){var g,k,h=this,l,m,p;c=c||E;if(!f&&w(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case q.Program:r(a.body,function(b,c){h.recurse(b.expression,void 0,void 0,function(a){k=a});c!==a.body.length-1?h.current().body.push(k,";"):h.return_(k)});break;case q.Literal:m=this.escape(a.value);this.assign(b,m);c(b||m);break;case q.UnaryExpression:this.recurse(a.argument,void 0, +void 0,function(a){k=a});m=a.operator+"("+this.ifDefined(k,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){k=a});m="+"===a.operator?this.plus(g,k):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(k,0):"("+g+")"+a.operator+"("+k+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId();h.recurse(a.left,b);h.if_("&&"===a.operator?b:h.not(b),h.lazyRecurse(a.right, +b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();h.recurse(a.test,b);h.if_(b,h.lazyRecurse(a.alternate,b),h.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",a.name)),function(){h.if_("inputs"===h.stage||"s",function(){e&&1!==e&&h.if_(h.isNull(h.nonComputedMember("s",a.name)), +h.lazyAssign(h.nonComputedMember("s",a.name),"{}"));h.assign(b,h.nonComputedMember("s",a.name))})},b&&h.lazyAssign(b,h.nonComputedMember("l",a.name)));c(b);break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();h.recurse(a.object,g,void 0,function(){h.if_(h.notNull(g),function(){a.computed?(k=h.nextId(),h.recurse(a.property,k),h.getStringValue(k),e&&1!==e&&h.if_(h.not(h.computedMember(g,k)),h.lazyAssign(h.computedMember(g,k),"{}")),m=h.computedMember(g,k),h.assign(b, +m),d&&(d.computed=!0,d.name=k)):(e&&1!==e&&h.if_(h.isNull(h.nonComputedMember(g,a.property.name)),h.lazyAssign(h.nonComputedMember(g,a.property.name),"{}")),m=h.nonComputedMember(g,a.property.name),h.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){h.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(k=h.filter(a.callee.name),l=[],r(a.arguments,function(a){var b=h.nextId();h.recurse(a,b);l.push(b)}),m=k+"("+l.join(",")+")",h.assign(b,m),c(b)): +(k=h.nextId(),g={},l=[],h.recurse(a.callee,k,g,function(){h.if_(h.notNull(k),function(){r(a.arguments,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m=g.name?h.member(g.context,g.name,g.computed)+"("+l.join(",")+")":k+"("+l.join(",")+")";h.assign(b,m)},function(){h.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:k=this.nextId();g={};this.recurse(a.left,void 0,g,function(){h.if_(h.notNull(g.context),function(){h.recurse(a.right,k);m=h.member(g.context, +g.name,g.computed)+a.operator+k;h.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];r(a.elements,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case q.ObjectExpression:l=[];p=!1;r(a.properties,function(a){a.computed&&(p=!0)});p?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed?(g=h.nextId(),h.recurse(a.key,g)):g=a.key.type===q.Identifier?a.key.name:""+a.key.value;k=h.nextId(); +h.recurse(a.value,k);h.assign(h.member(b,g,a.computed),k)})):(r(a.properties,function(b){h.recurse(b.value,a.constant?void 0:h.nextId(),void 0,function(a){l.push(h.escape(b.key.type===q.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case q.ThisExpression:this.assign(b,"s");c(b||"s");break;case q.LocalsExpression:this.assign(b,"l");c(b||"l");break;case q.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+ +b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a, +b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a, +b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(C(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(X(a))return a.toString();if(!0===a)return"true";if(!1=== +a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Ya("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Md.prototype={compile:function(a){var b=this;Z(a,b.$filter);var d,c;if(d=Kd(a))c=this.recurse(d);d=Id(a.body);var e;d&&(e=[],r(d,function(a,c){var d=b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];r(a.body, +function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?E:1===a.body.length?f[0]:function(a,b){var c;r(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left), +e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return f.identifier(a.name,b,d);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c, +e,b,d):this.nonComputedMember(c,e,b,d);case q.CallExpression:return g=[],r(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var p=[],n=0;n":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c= +a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k)?b(e,f,g,k):d(e,f,g,k);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c= +e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,k){var h=a(e,f,g,k),l,m;null!=h&&(l=b(e,f,g,k),l+="",c&&1!==c&&h&&!h[l]&&(h[l]={}),m=h[l]);return d?{context:h,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0;return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d, +c,e,f){return f?f[b]:a(d,c,e)}}};Nb.prototype={constructor:Nb,parse:function(a){a=this.getAst(a);var b=this.astCompiler.compile(a.ast),d=a.ast;b.literal=0===d.body.length||1===d.body.length&&(d.body[0].expression.type===q.Literal||d.body[0].expression.type===q.ArrayExpression||d.body[0].expression.type===q.ObjectExpression);b.constant=a.ast.constant;b.oneTime=a.oneTime;return b},getAst:function(a){var b=!1;a=a.trim();":"===a.charAt(0)&&":"===a.charAt(1)&&(b=!0,a=a.substring(2));return{ast:this.ast.ast(a), +oneTime:b}}};var Ea=F("$sce"),W={HTML:"html",CSS:"css",MEDIA_URL:"mediaUrl",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Dc=/_([a-z])/g,Zg=F("$templateRequest"),$g=F("$timeout"),aa=z.document.createElement("a"),Qd=ga(z.location.href),Na;aa.href="http://[::1]";var ah="[::1]"===aa.hostname;Rd.$inject=["$document"];fd.$inject=["$provide"];var Yd=22,Xd=".",Fc="0";Sd.$inject=["$locale"];Ud.$inject=["$locale"];var lh={yyyy:ea("FullYear",4,0,!1,!0),yy:ea("FullYear",2,0,!0,!0),y:ea("FullYear",1,0,!1,!0), +MMMM:lb("Month"),MMM:lb("Month",!0),MM:ea("Month",2,1),M:ea("Month",1,1),LLLL:lb("Month",!1,!0),dd:ea("Date",2),d:ea("Date",1),HH:ea("Hours",2),H:ea("Hours",1),hh:ea("Hours",2,-12),h:ea("Hours",1,-12),mm:ea("Minutes",2),m:ea("Minutes",1),ss:ea("Seconds",2),s:ea("Seconds",1),sss:ea("Milliseconds",3),EEEE:lb("Day"),EEE:lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Pb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},kh=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,jh=/^-?\d+$/;Td.$inject=["$locale"];var eh=ia(K),fh=ia(vb);Vd.$inject=["$parse"];var Re=ia({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===la.call(b.prop("href"))?"xlink:href":"href"; +b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};r(Hb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(vd,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(ke))){e.$set("ngPattern",new RegExp(c[1], +c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});r(["src","srcset","href"],function(a){var b=xa("ng-"+a);wb[b]=["$sce",function(d){return{priority:99,link:function(c,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===la.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$set(b,d.getTrustedMediaUrl(f[b]));f.$observe(b,function(b){b?(f.$set(k,b),wa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}]});var mb={$addControl:E,$getControls:ia([]),$$renameControl:function(a, +b){a.$name=b},$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E,$setSubmitted:E,$$setSubmitted:E};Qb.$inject=["$element","$attrs","$scope","$animate","$interpolate"];Qb.prototype={$rollbackViewValue:function(){r(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(a){a.$commitViewValue()})},$addControl:function(a){Ja(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$getControls:function(){return ja(this.$$controls)}, +$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name];r(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);r(this.$error,function(b,d){this.$setValidity(d,null,a)},this);r(this.$$success,function(b,d){this.$setValidity(d,null,a)},this);cb(this.$$controls,a);a.$$parentForm=mb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Za);this.$$animate.addClass(this.$$element, +Wb);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Za,Wb+" ng-submitted");this.$dirty=!1;this.$pristine=!0;this.$submitted=!1;r(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){for(var a=this;a.$$parentForm&&a.$$parentForm!==mb;)a=a.$$parentForm;a.$$setSubmitted()},$$setSubmitted:function(){this.$$animate.addClass(this.$$element, +"ng-submitted");this.$submitted=!0;r(this.$$controls,function(a){a.$$setSubmitted&&a.$$setSubmitted()})}};ce({clazz:Qb,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(cb(c,d),0===c.length&&delete a[b])}});var oe=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||E}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Qb,compile:function(d,f){d.addClass(Za).addClass(nb); +var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var p=f[0];if(!("action"in e)){var n=function(b){a.$apply(function(){p.$commitViewValue();p.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",n);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",n)},0,!1)})}(f[1]||p.$$parentForm).$addControl(p);var s=g?c(p.$name):E;g&&(s(a,p),e.$observe(g,function(b){p.$name!==b&&(s(a,void 0),p.$$parentForm.$$renameControl(p,b),s=c(p.$name),s(a,p))})); +d.on("$destroy",function(){p.$$parentForm.$removeControl(p);s(a,void 0);S(p,mb)})}}}}}]},Se=oe(),df=oe(!0),mh=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,xh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,yh=/^(?=.{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])?)*$/, +nh=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,pe=/^(\d{4,})-(\d{2})-(\d{2})$/,qe=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Oc=/^(\d{4,})-W(\d\d)$/,re=/^(\d{4,})-(\d\d)$/,se=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ee=T();r(["date","datetime-local","month","time","week"],function(a){ee[a]=!0});var te={text:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c)},date:ob("date",pe,Rb(pe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",qe,Rb(qe,"yyyy MM dd HH mm ss sss".split(" ")), +"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",se,Rb(se,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",Oc,function(a,b){if(ha(a))return a;if(C(a)){Oc.lastIndex=0;var d=Oc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,k=0,h=Zd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),k=b.getMilliseconds());return new Date(c,0,h.getDate()+e,d,f,g,k)}}return NaN},"yyyy-Www"),month:ob("month",re,Rb(re,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f,g,k){Jc(a,b,d,c,"number");fe(c);Sa(a, +b,d,c,e,f);var h;if(w(d.min)||d.ngMin){var l=d.min||k(d.ngMin)(a);h=na(l);c.$validators.min=function(a,b){return c.$isEmpty(b)||A(h)||b>=h};d.$observe("min",function(a){a!==l&&(h=na(a),l=a,c.$validate())})}if(w(d.max)||d.ngMax){var m=d.max||k(d.ngMax)(a),p=na(m);c.$validators.max=function(a,b){return c.$isEmpty(b)||A(p)||b<=p};d.$observe("max",function(a){a!==m&&(p=na(a),m=a,c.$validate())})}if(w(d.step)||d.ngStep){var n=d.step||k(d.ngStep)(a),s=na(n);c.$validators.step=function(a,b){return c.$isEmpty(b)|| +A(s)||ge(b,h||0,s)};d.$observe("step",function(a){a!==n&&(s=na(a),n=a,c.$validate())})}},url:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||xh.test(d)}},email:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||yh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==V(d.ngTrim);A(d.name)&&b.attr("name",++qb);b.on("change",function(a){var g;b[0].checked&&(g=d.value,e&&(g= +V(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=V(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,d[a]);var e=d[a];d.$observe(a,function(a){a!==e&&(e=a,c(a))})}function k(a){p=na(a);Y(c.$modelValue)||(m?(a=b.val(),p>a&&(a=p,b.val(a)),c.$setViewValue(a)):c.$validate())}function h(a){n=na(a);Y(c.$modelValue)||(m?(a=b.val(),n=p},g("min",k)); +e&&(n=na(d.max),c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||A(n)||b<=n},g("max",h));f&&(s=na(d.step),c.$validators.step=m?function(){return!r.stepMismatch}:function(a,b){return c.$isEmpty(b)||A(s)||ge(b,p||0,s)},g("step",l))},checkbox:function(a,b,d,c,e,f,g,k){var h=he(k,a,"ngTrueValue",d.ngTrueValue,!0),l=he(k,a,"ngFalseValue",d.ngFalseValue,!1);b.on("change",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty= +function(a){return!1===a};c.$formatters.push(function(a){return va(a,h)});c.$parsers.push(function(a){return a?h:l})},hidden:E,button:E,submit:E,reset:E,file:E},$c=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,k){k[0]&&(te[K(g.type)]||te.text)(e,f,g,k[0],b,a,d,c)}}}}],Af=function(){var a={configurable:!0,enumerable:!1,get:function(){return this.getAttribute("value")||""},set:function(a){this.setAttribute("value",a)}}; +return{restrict:"E",priority:200,compile:function(b,d){if("hidden"===K(d.type))return{pre:function(b,d,f,g){b=d[0];b.parentNode&&b.parentNode.insertBefore(b,b.nextSibling);Object.defineProperty&&Object.defineProperty(b,"value",a)}}}}},zh=/^(true|false|\d+)$/,xf=function(){function a(a,d,c){var e=w(c)?c:9===wa?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return zh.test(d.ngValue)?function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue, +function(b){a(d,f,b)})}}}},We=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=jc(a)})}}}}],Ye=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=A(a)?"":a})}}}}], +Xe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],wf=ia({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ze=Lc("",!0),af=Lc("Odd",0),$e=Lc("Even",1),bf=Ra({compile:function(a, +b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),cf=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ed={},Ah={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);ed[b]=["$parse","$rootScope","$exceptionHandler",function(d,c,e){return sd(d,c,e,b,a,Ah[a])}]});var ff=["$animate","$compile",function(a,b){return{multiElement:!0, +transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var k,h,l;d.$watch(e.ngIf,function(d){d?h||g(function(d,f){h=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);k={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ub(k.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),k=null))})}}}],gf=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element", +controller:ca.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",k=e.autoscroll;return function(c,e,m,p,n){var r=0,q,t,x,v=function(){t&&(t.remove(),t=null);q&&(q.$destroy(),q=null);x&&(d.leave(x).done(function(a){!1!==a&&(t=null)}),t=x,x=null)};c.$watch(f,function(f){var m=function(a){!1===a||!w(k)||k&&!c.$eval(k)||b()},t=++r;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===r){var b=c.$new();p.template=a;a=n(b,function(a){v();d.enter(a,null,e).done(m)});q=b;x=a;q.$emit("$includeContentLoaded", +f);c.$eval(g)}},function(){c.$$destroyed||t!==r||(v(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(v(),p.template=null)})}}}}],zf=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){la.call(d[0]).match(/SVG/)?(d.empty(),a(gd(e.template,z.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],hf=Ra({priority:450,compile:function(){return{pre:function(a, +b,d){a.$eval(d.ngInit)}}}}),vf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!A(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(H(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},nb="ng-valid",be="ng-invalid",Za="ng-pristine",Wb="ng-dirty",pb=F("ngModel");Sb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" "); +Sb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);B(c)&&(c=a(b));return c};this.$$ngModelSet=function(a,c){B(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw pb("nonassign",this.$$attr.ngModel,Aa(this.$$element));},$render:E,$isEmpty:function(a){return A(a)|| +""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element,"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Wb);this.$$animate.addClass(this.$$element,Za)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element, +Za);this.$$animate.addClass(this.$$element,Wb);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched=!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!Y(this.$modelValue)){var a= +this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!==c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;r(h.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(r(h.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(h.$asyncValidators,function(e, +g){var h=e(a,b);if(!h||!B(h.then))throw pb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?h.$$q.all(c).then(function(){g(d)},E):g(!0)}function f(a,b){k===h.$$currentValidationRunId&&h.$setValidity(a,b)}function g(a){k===h.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var k=this.$$currentValidationRunId,h=this;(function(){var a=h.$$parserName;if(A(h.$$parserValid))f(a,null);else return h.$$parserValid||(r(h.$validators,function(a, +b){f(b,null)}),r(h.$asyncValidators,function(a,b){f(b,null)})),f(a,h.$$parserValid),h.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce);if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;this.$$parserValid= +A(a)?void 0:!0;this.$setValidity(this.$$parserName,null);this.$$parserName="parse";if(this.$$parserValid)for(var d=0;dg||e.$isEmpty(b)||b.length<=g}}}}}],cd= +["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=c.minlength||a(c.ngMinlength)(b),g=Ub(f)||-1;c.$observe("minlength",function(a){f!==a&&(g=Ub(a)||-1,f=a,e.$validate())});e.$validators.minlength=function(a,b){return e.$isEmpty(b)||b.length>=g}}}}}];z.angular.bootstrap?z.console&&console.log("WARNING: Tried to load AngularJS more than once."):(Je(),Oe(ca),ca.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1== +b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "), +WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a, +c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),x(function(){Ee(z.document,Wc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element("