Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 ola (0.10.5.nojsmin-1) unstable; urgency=low
 .
   * New upstream release
     - Re-remove minified javascript
Author: Simon Newton <nomis52@gmail.com>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2017-09-10

--- /dev/null
+++ ola-0.10.7.nojsmin/.travis-ci.sh
@@ -0,0 +1,208 @@
+#!/bin/bash
+
+# This script is triggered from the script section of .travis.yml
+# It runs the appropriate commands depending on the task requested.
+
+set -e
+
+CPP_LINT_URL="https://raw.githubusercontent.com/google/styleguide/gh-pages/cpplint/cpplint.py";
+
+COVERITY_SCAN_BUILD_URL="https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh"
+
+SPELLINGBLACKLIST=$(cat <<-BLACKLIST
+      -wholename "./.codespellignore" -or \
+      -wholename "./.git/*" -or \
+      -wholename "./aclocal.m4" -or \
+      -wholename "./config/config.guess" -or \
+      -wholename "./config/config.sub" -or \
+      -wholename "./config/depcomp" -or \
+      -wholename "./config/install-sh" -or \
+      -wholename "./config/libtool.m4" -or \
+      -wholename "./config/ltmain.sh" -or \
+      -wholename "./config/ltoptions.m4" -or \
+      -wholename "./config/ltsugar.m4" -or \
+      -wholename "./config/missing" -or \
+      -wholename "./libtool" -or \
+      -wholename "./config.log" -or \
+      -wholename "./config.status" -or \
+      -wholename "./Makefile" -or \
+      -wholename "./Makefile.in" -or \
+      -wholename "./autom4te.cache/*" -or \
+      -wholename "./java/Makefile" -or \
+      -wholename "./java/Makefile.in" -or \
+      -wholename "./olad/www/new/js/app.min.js" -or \
+      -wholename "./olad/www/new/js/app.min.js.map" -or \
+      -wholename "./olad/www/new/libs/angular/js/angular.min.js" -or \
+      -wholename "./olad/www/mobile.js" -or \
+      -wholename "./olad/www/ola.js" -or \
+      -wholename "./configure" -or \
+      -wholename "./common/protocol/Ola.pb.*" -or \
+      -wholename "./plugins/artnet/messages/ArtNetConfigMessages.pb.*" -or \
+      -wholename "./tools/ola_trigger/config.tab.*" -or \
+      -wholename "./tools/ola_trigger/lex.yy.cpp"
+BLACKLIST
+)
+
+if [[ $TASK = 'lint' ]]; then
+  # run the lint tool only if it is the requested task
+  autoreconf -i;
+  ./configure --enable-rdm-tests --enable-ja-rule --enable-e133;
+  # 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
+  make builtfiles
+  # first check we've not got any generic NOLINTs
+  # count the number of generic NOLINTs
+  nolints=$(grep -IR NOLINT * | grep -v "NOLINT(" | wc -l)
+  if [[ $nolints -ne 0 ]]; then
+    # print the output for info
+    echo $(grep -IR NOLINT * | grep -v "NOLINT(")
+    echo "Found $nolints generic NOLINTs"
+    exit 1;
+  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;
+elif [[ $TASK = 'check-licences' ]]; then
+  # check licences only if it is the requested task
+  autoreconf -i;
+  ./configure --enable-rdm-tests --enable-ja-rule --enable-e133;
+  # 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
+  make builtfiles
+  ./scripts/enforce_licence.py
+  if [[ $? -ne 0 ]]; then
+    exit 1;
+  fi;
+elif [[ $TASK = 'spellintian' ]]; then
+  # run spellintian only if it is the requested task, ignoring duplicate words
+  autoreconf -i;
+  ./configure --enable-rdm-tests --enable-ja-rule --enable-e133;
+  # 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
+  make builtfiles
+  spellingfiles=$(eval "find ./ -type f -and ! \( \
+      $SPELLINGBLACKLIST \
+      \) | xargs")
+  # count the number of spellintian errors, ignoring duplicate words
+  spellingerrors=$(zrun spellintian $spellingfiles 2>&1 | grep -v "\(duplicate word\)" | wc -l)
+  if [[ $spellingerrors -ne 0 ]]; then
+    # print the output for info
+    zrun spellintian $spellingfiles | grep -v "\(duplicate word\)"
+    echo "Found $spellingerrors spelling errors via spellintian, ignoring duplicates"
+    exit 1;
+  else
+    echo "Found $spellingerrors spelling errors via spellintian, ignoring duplicates"
+  fi;
+elif [[ $TASK = 'spellintian-duplicates' ]]; then
+  # run spellintian only if it is the requested task
+  autoreconf -i;
+  ./configure --enable-rdm-tests --enable-ja-rule --enable-e133;
+  # 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
+  make builtfiles
+  spellingfiles=$(eval "find ./ -type f -and ! \( \
+      $SPELLINGBLACKLIST \
+      \) | xargs")
+  # count the number of spellintian errors
+  spellingerrors=$(zrun spellintian $spellingfiles 2>&1 | wc -l)
+  if [[ $spellingerrors -ne 0 ]]; then
+    # print the output for info
+    zrun spellintian $spellingfiles
+    echo "Found $spellingerrors spelling errors via spellintian"
+    exit 1;
+  else
+    echo "Found $spellingerrors spelling errors via spellintian"
+  fi;
+elif [[ $TASK = 'codespell' ]]; then
+  # run codespell only if it is the requested task
+  autoreconf -i;
+  ./configure --enable-rdm-tests --enable-ja-rule --enable-e133;
+  # 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
+  make builtfiles
+  spellingfiles=$(eval "find ./ -type f -and ! \( \
+      $SPELLINGBLACKLIST \
+      \) | xargs")
+  # count the number of codespell errors
+  spellingerrors=$(zrun codespell --check-filenames --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignore $spellingfiles 2>&1 | wc -l)
+  if [[ $spellingerrors -ne 0 ]]; then
+    # print the output for info
+    zrun codespell --check-filenames --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" --exclude-file .codespellignore $spellingfiles
+    echo "Found $spellingerrors spelling errors via codespell"
+    exit 1;
+  else
+    echo "Found $spellingerrors spelling errors via codespell"
+  fi;
+elif [[ $TASK = 'doxygen' ]]; then
+  # check doxygen only if it is the requested task
+  autoreconf -i;
+  # Doxygen is C++ only, so don't bother with RDM tests
+  ./configure --enable-ja-rule --enable-e133;
+  # 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
+  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
+    echo "Found $warnings doxygen warnings"
+    exit 1;
+  else
+    echo "Found $warnings doxygen warnings"
+  fi;
+elif [[ $TASK = 'coverage' ]]; then
+  # Compile with coverage for coveralls
+  autoreconf -i;
+  # Coverage is C++ only, so don't bother with RDM tests
+  ./configure --enable-gcov --enable-ja-rule --enable-e133;
+  make;
+  make check;
+elif [[ $TASK = 'coverity' ]]; then
+  # Run Coverity Scan unless token is zero length
+  # The Coverity Scan script also relies on a number of other COVERITY_SCAN_
+  # variables set in .travis.yml
+  if [[ ${#COVERITY_SCAN_TOKEN} -ne 0 ]]; then
+    curl -s $COVERITY_SCAN_BUILD_URL | bash
+  else
+    echo "Skipping Coverity Scan as no token found, probably a Pull Request"
+  fi;
+elif [[ $TASK = 'jshint' ]]; then
+  cd ./javascript/new-src;
+  npm install;
+  grunt test
+elif [[ $TASK = 'flake8' ]]; then
+  autoreconf -i;
+  ./configure --enable-rdm-tests
+  # 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
+  make builtfiles
+  flake8 --max-line-length 80 --exclude *_pb2.py,.git,__pycache --ignore E111,E114,E121,E127,E129 data/rdm include/ola python scripts tools/ola_mon tools/rdm
+else
+  # Otherwise compile and check as normal
+  export DISTCHECK_CONFIGURE_FLAGS='--enable-rdm-tests --enable-ja-rule --enable-e133'
+  autoreconf -i;
+  ./configure $DISTCHECK_CONFIGURE_FLAGS;
+  make distcheck;
+  make dist;
+  tarball=$(ls -Ut ola*.tar.gz | head -1)
+  tar -zxf $tarball;
+  tarball_root=$(echo $tarball | sed 's/.tar.gz$//')
+  ./scripts/verify_trees.py ./ $tarball_root
+fi
--- /dev/null
+++ ola-0.10.7.nojsmin/.travis.yml
@@ -0,0 +1,307 @@
+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
+script:
+ - "bash -ex .travis-ci.sh"
+
+addons:
+  apt:
+    packages: &base_build
+     # This is the absolute minimum for configure to pass
+     # Non C++ based tasks use it so they can run make builtfiles
+     - ccache
+     - libcppunit-dev
+     - bison
+     - flex
+     - uuid-dev
+     - libprotobuf-dev
+     - protobuf-compiler
+     - libprotoc-dev
+    packages: &core_build
+     # This is all the bits we need to enable all options
+     - *base_build
+     - libftdi-dev
+     - libftdi1
+     - libusb-1.0-0-dev
+     - liblo-dev
+     - libavahi-glib1
+     - libncurses5-dev
+     - libmicrohttpd-dev
+    packages: &core_build_gpp_latest
+     - *core_build
+     - g++-8
+    packages: &core_build_clang_latest
+     - *core_build
+     - clang-6.0
+
+matrix:
+  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
+      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
+      compiler: clang
+      env:
+      - TASK='compile'
+      - CPPUNIT='1.14'
+      - LIBFTDI='1'
+    - os: osx
+      osx_image: xcode9.3
+      compiler: gcc
+      env:
+      - TASK='compile'
+      - CPPUNIT='1.14'
+      - LIBFTDI='1'
+    - os: linux
+      dist: trusty
+      compiler: clang
+      env: TASK='compile'
+      python: '2.7'
+      addons:
+        apt:
+          packages:
+           - *core_build_clang_latest
+          sources:
+           - ubuntu-toolchain-r-test
+           - llvm-toolchain-trusty-6.0
+    - os: linux
+      dist: trusty
+      compiler: gcc
+      env: TASK='compile'
+      python: '2.7'
+      addons:
+        apt:
+          packages:
+           - *core_build_gpp_latest
+          sources:
+           - ubuntu-toolchain-r-test
+    - os: linux
+      dist: trusty
+      compiler: gcc
+      env: TASK='coverage'
+      addons:
+        apt:
+          packages:
+           - *core_build_gpp_latest
+          sources:
+           - ubuntu-toolchain-r-test
+    - os: linux
+      dist: trusty
+      compiler: gcc
+      env: TASK='coverity'
+      addons:
+        apt:
+          packages:
+           # Coverity doesn't work with g++-5 or g++-6 yet
+           - *core_build
+           - g++-4.9
+          sources:
+           - ubuntu-toolchain-r-test
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='doxygen'
+      addons:
+        apt:
+          packages:
+           - *core_build_gpp_latest
+           - doxygen
+           - graphviz
+          sources:
+           - ubuntu-toolchain-r-test
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='lint'
+      addons:
+        apt:
+          packages:
+           - *core_build
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='check-licences'
+      addons:
+        apt:
+          packages:
+           - *core_build
+    - os: linux
+      dist: trusty
+      # Short duration job, would use the container/without sudo image as it boots faster, but we need a backported lintian, so don't
+      sudo: required
+      env: TASK='spellintian'
+      addons:
+        apt:
+          packages:
+           - *core_build
+           - moreutils
+    - os: linux
+      dist: trusty
+      # Short duration job, would use the container/without sudo image as it boots faster, but we need a backported lintian, so don't
+      sudo: required
+      env: TASK='spellintian-duplicates'
+      addons:
+        apt:
+          packages:
+           - *core_build
+           - moreutils
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='codespell'
+      addons:
+        apt:
+          packages:
+           - *core_build
+           - moreutils
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='jshint'
+      addons:
+        apt:
+          packages:
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='flake8'
+      addons:
+        apt:
+          packages:
+           - *base_build
+  allow_failures:
+    - os: linux
+      dist: trusty
+      compiler: gcc
+      env: TASK='coverage'
+    - os: linux
+      dist: trusty
+      compiler: gcc
+      env: TASK='coverity'
+    - os: linux
+      dist: trusty
+      # Short duration job, use the container/without sudo image as it boots faster
+      sudo: false
+      env: TASK='pychecker-wip'
+    - os: linux
+      dist: trusty
+      env: TASK='spellintian'
+    - os: linux
+      dist: trusty
+      env: TASK='spellintian-duplicates'
+
+env:
+  global:
+   # Parallel make build
+   - MAKEFLAGS="-j 2"
+   # -- BEGIN Coverity Scan ENV
+   - COVERITY_SCAN_BUILD_COMMAND_PREPEND="cov-configure --comptype gcc --compiler gcc-4.9 --template && autoreconf -i && ./configure --enable-ja-rule --enable-e133"
+   # The build command with all of the arguments that you would apply to a manual `cov-build`
+   # Usually this is the same as STANDARD_BUILD_COMMAND, exluding the automated test arguments
+   - COVERITY_SCAN_BUILD_COMMAND="make"
+   # Name of the project
+   - COVERITY_SCAN_PROJECT_NAME="$TRAVIS_REPO_SLUG"
+   # Email address for notifications related to this build
+   - COVERITY_SCAN_NOTIFICATION_EMAIL="ola-coverity@pjnewman.co.uk"
+   # Regular expression selects on which branches to run analysis
+   # Be aware of quotas. Do not run on every branch/commit
+   - COVERITY_SCAN_BRANCH_PATTERN=".*"
+   # COVERITY_SCAN_TOKEN via "travis encrypt" using the repo's public key
+   - secure: "U+NmPtScHZ1NLmkDrzpqApHmJvELV44cXgjQsxA8N8xIATckbs+DrmWSNeECENyvuOPz+nPzglSgBvJtejf97jYJIIwAExq5TJMUAIPFS6KU3mohODW2PZSoVoUyJPzFIlhzcELQgONI+ILLm29lNdQNb7GFUVtO6+jS10AFtWY="
+   # -- END Coverity Scan ENV
+
+cache:
+  apt: true
+  directories:
+    - $HOME/.cache/pip # pip cache
+    - $HOME/.npm # npm cache
+    - $HOME/.ccache # ccache cache
+
+before_cache:
+  - rm -f $HOME/.cache/pip/log/debug.log # erase log
+  - ccache -s # see how many hits ccache got
+
+install:
+# Match the version of protobuf being installed via apt
+  - if [[ "$PROTOBUF" == "3.5" ]]; then pip install --user protobuf==3.5.1; fi
+  - if [[ "$PROTOBUF" != "3.5" ]]; then pip install --user protobuf==3.1.0; fi
+# We need to use pip rather than apt on Trusty
+  - 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
+#Fix a broken homebrew libtool install
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew reinstall -s libtool; 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 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
+ - 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
+#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 [ "$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
+#Report the compiler version
+ - $CXX --version
+ - if [ "$TASK" == "spellintian" -o "$TASK" == "spellintian-duplicates" ]; then sudo add-apt-repository ppa:waja/trusty-backports -y; sudo apt-get update -qq; sudo apt-get install lintian -y; fi # Install a late enough lintian
+
+after_failure:
+  - cat ${TRAVIS_BUILD_DIR}/ola-*/_build/sub/test-suite.log
+
+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
+
+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
+
+notifications:
+  irc:
+    channels:
+     - "chat.freenode.net#openlighting"
+    on_success: change
+    on_failure: change
--- /dev/null
+++ ola-0.10.7.nojsmin/common/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
--- /dev/null
+++ ola-0.10.7.nojsmin/examples/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/include/ola/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
--- /dev/null
+++ ola-0.10.7.nojsmin/include/ola/acn/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/include/ola/e133/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/include/olad/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/javascript/new-src/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\ No newline at end of file
--- /dev/null
+++ ola-0.10.7.nojsmin/javascript/ola/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/libs/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/man/generate-html.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+if [ $# != 1 ]; then
+  echo "Usage: $0 <output_dir>"
+  exit 1;
+fi
+
+output_dir=$1
+if [ ! -d $output_dir ]; then
+  echo $output_dir is not a directory
+  exit 1;
+fi
+
+index_file=$output_dir/index.html;
+
+echo "Output dir: $output_dir";
+echo "Index file: $index_file";
+
+cat << 'EOF' > $index_file
+<html>
+<head>
+<title>Man pages for the Open Lighting Architecture</title>
+</head>
+<body>
+<h1>Man pages for the <a href="https://openlighting.org/ola/">Open Lighting Architecture</a></h1>
+<ul>
+EOF
+
+if [ ! -d $output_dir/man1/ ]; then
+  echo $output_dir/man1/ doesn\'t exist, please create it
+  exit 1;
+fi
+for man_file in *.1; do
+  echo "Generating $man_file";
+  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 "<li><a href='./man1/$man_file.html'>$man_file</a></li>" >> $index_file
+done
+
+cat << 'EOF' >> $index_file
+</ul>
+</body>
+</html>
+EOF
--- /dev/null
+++ ola-0.10.7.nojsmin/ola/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
--- /dev/null
+++ ola-0.10.7.nojsmin/olad/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/plugins/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/plugins/kinet/kinet.cpp
@@ -0,0 +1,308 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * kinet.cpp
+ * Scratch pad for Kinet work
+ * Copyright (C) 2010 Simon Newton
+ */
+
+#include <ola/Callback.h>
+#include <ola/Logging.h>
+#include <ola/network/NetworkUtils.h>
+#include <ola/network/SelectServer.h>
+#include <ola/network/Socket.h>
+
+#include <iostream>
+#include <string>
+
+using std::cout;
+using std::endl;
+using std::string;
+using ola::network::SelectServer;
+using ola::network::UDPSocket;
+using ola::network::LittleEndianToHost;
+
+
+/*
+ * The KiNet protocol appears to be little-endian. We write the constants as
+ * they appear to a human and convert back and forth.
+ */
+
+// All packets seem to start with this number
+const uint32_t KINET_MAGIC = 0x4adc0104;
+// We haven't seen a non V1 protocol in the wild yet.
+const uint16_t KINET_VERSION = 0x0001;
+// No idea what this is, but we should send a poll reply when we see it
+const uint32_t KINET_DISCOVERY_COMMAND = 0x8988870a;
+
+// KiNet packet types
+typedef enum {
+  KINET_POLL = 0x0001,
+  KINET_POLL_REPLY = 0x0002,
+  KINET_SET_IP = 0x0003,
+  KINET_SET_UNIVERSE = 0x0005,
+  KINET_SET_NAME = 0x0006,
+  // KINET_?? = 0x000a;
+  KINET_DMX = 0x0101,
+  // KINET_PORTOUT = 0x0108;  // portout
+  // KINET_PORTOUT_SYNC = 0x0109;  // portout_sync
+  // KINET_?? = 0x0201;  // seems to be a discovery packet
+  // KINET_?? = 0x0203;  // get dmx address?
+} kinet_packet_type;
+
+
+/**
+ * The KiNet header
+ */
+PACK(
+struct kinet_header {
+  uint32_t magic;
+  uint16_t version;
+  uint16_t type;  // see kinet_packet_type above
+  uint32_t padding;  // always set to 0, seq #,
+                     // most of the time it's 0,
+                     // not implemented in most supplies
+});
+
+
+// A KiNet poll message
+PACK(
+struct kinet_poll {
+  uint32_t command;  // ??, Seems to always be KINET_DISCOVERY_COMMAND
+});
+
+
+// A KiNet poll reply message
+PACK(
+struct kinet_poll_reply {
+  uint32_t src_ip;
+  uint8_t hw_address[6];  // mac address
+  uint8_t  data[2];  // This contains non-0 data
+  uint32_t serial;  // The node serial #
+  uint32_t zero;
+  uint8_t node_name[60];
+  uint8_t node_label[31];
+  uint16_t zero2;
+});
+
+
+// A KiNet Set IP Command.
+// TODO(simon): Check what ip,mac dst this packet is sent to.
+PACK(
+struct kinet_set_ip {
+  uint32_t something;  // ef be ad de
+  uint8_t hw_address[6];  // The MAC address to match
+  uint16_t something2;  // 05 67
+  uint32_t new_ip;
+});
+
+
+// A KiNet Set Universe Command
+PACK(
+struct kinet_set_universe {
+  uint32_t something;  // ef be ad de
+  uint8_t universe;
+  uint8_t zero[3];
+});
+
+
+// A KiNet Set Name Command
+PACK(
+struct kinet_set_name {
+  uint32_t something;  // ef be ad de
+  uint8_t new_name[31];  // Null terminated.
+});
+
+
+// A KiNet Get Address command
+PACK(
+struct kinet_get_address {
+  uint32_t serial;
+  uint32_t something;  // 41 00 12 00
+});
+
+
+// A KiNet DMX packet
+PACK(
+struct kinet_dmx {
+  uint8_t port;  // should be set to 0 for v1
+  uint8_t flags;  // set to 0
+  uint16_t timerVal;  // set to 0
+  uint32_t universe;
+  uint8_t paylod[513];  // payload inc start code
+});
+
+
+struct kinet_port_out_flags {
+  uint16_t flags;
+    // little endian
+    // first bit is undefined  0:1;
+    // second bit is for 16 bit data, set to 0  :1;
+    // third is shall hold for sync packet :: 1;
+};
+
+
+struct kinet_port_out_sync {
+  uint32_t padding;
+}
+
+// A KiNet DMX port out packet
+PACK(
+struct kinet_port_out {
+  uint32_t universe;
+  uint8_t port;        // 1- 16
+  uint8_t pad;         // set to 0
+  portoutflags flags;
+  uint16_t length;     // little endian
+  uint16_t startCode;  // 0x0fff for chomASIC products, 0x0000 otherwise
+  uint8_t payload[512];
+});
+
+
+// The full kinet packet
+struct kinet_packet {
+  struct kinet_header header;
+  union {
+    struct kinet_poll poll;
+    struct kinet_poll_reply poll_reply;
+  } data;
+};
+
+
+uint8_t peer0_0[] = {
+  0x04, 0x01, 0xdc, 0x4a,  // magic number
+  0x01, 0x00,  // version #
+  0x02, 0x00,  // packet type (poll reply)
+  0x00, 0x00, 0x00, 0x00,  // sequence
+  0x0a, 0x00, 0x00, 0x01,  // 192.168.1.207
+  0x00, 0x0a, 0xc5, 0xff, 0xae, 0x01,  // mac address
+  0x01, 0x00,
+  0xff, 0xff, 0x00, 0x2d,  // serial #
+  0x00, 0x00, 0x00, 0x00,  // padding
+  // What follows is ascii text, with fields separated by new lines. Each field
+  // is in the form /[MD#R]:.*/
+  // It's unclear is this is a variable length field or not.
+  0x4d, 0x3a,  // M:
+  0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x4b, 0x69, 0x6e, 0x65, 0x74, 0x69, 0x63,
+  0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65,
+  0x64,  // Color Kinetics cs Incorporated
+  0x0a,  // \n
+  0x44, 0x3a,  // D:
+  0x50, 0x44, 0x53, 0x2d, 0x65,  // PDS-e
+  0x0a,  // \n
+  0x23, 0x3a,  // #:
+  0x53, 0x46, 0x54, 0x2d, 0x30, 0x30, 0x30, 0x30, 0x36, 0x36, 0x2d, 0x30, 0x30,
+  0x0a,  // SFT-000066-00
+  0x52, 0x3a,  // R:
+  0x30, 0x30,  // 00
+  0x0a,  // \n
+  0x00,
+  // offset 92
+  0x64, 0x73, 0x2d, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2d, 0x72, 0x65, 0x61, 0x72,
+  0x00,  // device name?
+  0x00, 0x95, 0x8c, 0xc7, 0xb6, 0x00,
+  0x00,
+  0xff, 0x00, 0x00,
+  0xff, 0x00, 0x00,
+  0xff, 0x00, 0x00,
+  0xff, 0x00, 0x00 };
+
+
+SelectServer ss;
+UDPSocket udp_socket;
+
+/**
+ * Check if a packet is valid KiNet
+ */
+bool IsKiNet(const kinet_packet *packet, unsigned int size) {
+  return (size > sizeof(struct kinet_header) &&
+          KINET_MAGIC == LittleEndianToHost(packet->header.magic) &&
+          KINET_VERSION == LittleEndianToHost(packet->header.version));
+}
+
+
+/**
+ * Handle a KiNet poll packet
+ */
+void HandlePoll(const struct sockaddr_in &source,
+                const kinet_packet &packet,
+                unsigned int size) {
+  ssize_t r = udp_socket.SendTo(peer0_0, sizeof(peer0_0), source);
+  OLA_INFO << "sent " << r << " bytes";
+}
+
+
+/**
+ * Handle a KiNet DMX packet
+ */
+void HandleDmx(const struct sockaddr_in &source,
+               const kinet_packet &packet,
+               unsigned int size) {
+}
+
+
+void SocketReady() {
+  kinet_packet packet;
+  ssize_t data_read = sizeof(packet);
+  struct sockaddr_in source;
+  socklen_t src_size = sizeof(source);
+
+  udp_socket.RecvFrom(reinterpret_cast<uint8_t*>(&packet),
+                      &data_read,
+                      source,
+                      src_size);
+  if (IsKiNet(&packet, data_read)) {
+    uint16_t command = LittleEndianToHost(packet.header.type);
+    switch (command) {
+      case KINET_POLL:
+        HandlePoll(source, packet, data_read);
+        break;
+      case KINET_DMX:
+        HandleDmx(source, packet, data_read);
+        break;
+      default:
+        OLA_WARN << "Unknown packet 0x" << std::hex << command;
+    }
+  } else {
+    OLA_WARN << "Not a KiNet packet";
+  }
+}
+
+
+/*
+ * Main
+ */
+int main(int argc, char *argv[]) {
+  ola::InitLogging(ola::OLA_LOG_INFO, ola::OLA_LOG_STDERR);
+
+  udp_socket.SetOnData(ola::NewCallback(&SocketReady));
+  if (!udp_socket.Init()) {
+    OLA_WARN << "Failed to init";
+    return 1;
+  }
+  if (!udp_socket.Bind(6038)) {
+    OLA_WARN << "Failed to bind";
+    return 1;
+  }
+  if (!udp_socket.EnableBroadcast()) {
+    OLA_WARN << "Failed to enabl bcast";
+    return 1;
+  }
+
+  ss.AddSocket(&udp_socket);
+
+  ss.Run();
+  return 0;
+}
--- /dev/null
+++ ola-0.10.7.nojsmin/python/examples/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/python/ola/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
--- /dev/null
+++ ola-0.10.7.nojsmin/scripts/enforce_licence.py
@@ -0,0 +1,328 @@
+#!/usr/bin/python
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU Library General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# enforce_licence.py
+# Copyright (C) 2013 Simon Newton
+
+import difflib
+import getopt
+import glob
+import os
+import pprint
+import re
+import sys
+import textwrap
+
+CPP, JS, PROTOBUF, PYTHON = xrange(4)
+
+IGNORED_DIRECTORIES = [
+  'javascript/new-src/node_modules/',
+]
+
+IGNORED_FILES = [
+  'common/rdm/testdata/duplicate_manufacturer.proto',
+  'common/rdm/testdata/duplicate_pid_name.proto',
+  'common/rdm/testdata/duplicate_pid_value.proto',
+  'common/rdm/testdata/inconsistent_pid.proto',
+  'common/rdm/testdata/invalid_esta_pid.proto',
+  'common/rdm/testdata/test_pids.proto',
+  'common/rdm/testdata/pids/overrides.proto',
+  'common/rdm/testdata/pids/pids1.proto',
+  'common/rdm/testdata/pids/pids2.proto',
+  'examples/ola-dmxconsole.cpp',
+  'examples/ola-dmxmonitor.cpp',
+  'include/ola/gen_callbacks.py',
+  'olad/www/mobile.js',
+  'olad/www/ola.js',
+  'javascript/new-src/Gruntfile.js',
+  'olad/www/new/js/app.min.js',
+  'olad/www/new/js/app.min.js.map',
+  'python/ola/PidStoreLocation.py',
+  'python/ola/Version.py',
+  'tools/ola_trigger/config.tab.cpp',
+  'tools/ola_trigger/config.tab.h',
+  'tools/ola_trigger/lex.yy.cpp',
+  'tools/rdm/DataLocation.py',
+  'tools/rdm/static/ui.multiselect.js',
+]
+
+
+def Usage(arg0):
+  print textwrap.dedent("""\
+  Usage: %s
+
+  Walk the directory tree from the current directory, and make sure all .cpp,
+  .h, .js, .proto and .py files have the appropriate Licence. The licence is
+  determined from the LICENCE file in each branch of the directory tree.
+
+    --diff               Print the diffs.
+    --fix                Fix the files.
+    --help               Display this message.""" % arg0)
+
+
+def ParseArgs():
+  """Extract the options."""
+  try:
+    opts, args = getopt.getopt(sys.argv[1:], '',
+                               ['diff', 'fix', 'help'])
+  except getopt.GetoptError, err:
+    print str(err)
+    Usage(sys.argv[0])
+    sys.exit(2)
+
+  help = False
+  fix = False
+  diff = False
+  for o, a in opts:
+    if o in ('--diff'):
+      diff = True
+    elif o in ('--fix'):
+      fix = True
+    elif o in ('-h', '--help'):
+      Usage(sys.argv[0])
+      sys.exit()
+
+  if help:
+    Usage(sys.argv[0])
+    sys.exit(0)
+  return diff, fix
+
+
+def IgnoreFile(file_name):
+  for ignored_dir in IGNORED_DIRECTORIES:
+    if file_name.rfind(ignored_dir) != -1:
+      return True
+  for ignored_file in IGNORED_FILES:
+    if file_name.endswith(ignored_file):
+      return True
+  return False
+
+
+def TransformCppLine(line):
+  """Transform a line to within a C++ multiline style comment"""
+  line = line.strip()
+  if line:
+    return ' * %s' % line
+  else:
+    return ' *'
+
+
+def TransformLicence(licence):
+  """Wrap a licence in C++ style comments"""
+  output = []
+  output.append('/*')
+  output.extend(map(TransformCppLine, licence))
+  output.append(TransformCppLine(''))
+  return '\n'.join(output)
+
+
+def TransformJsLine(line):
+  """Transform a line to within a JS multiline style comment"""
+  return TransformCppLine(line)
+
+
+def TransformCppToJsLicence(licence):
+  """Change a C++ licence to JS style"""
+  lines = licence.split('\n')
+  output = []
+  output.append('/**')
+  for l in lines[1:]:
+    output.append(TransformJsLine(l[2:]))
+  return '\n'.join(output)
+
+
+def TransformPythonLine(line):
+  """Transform a line to within a Python multiline style comment"""
+  line = line.strip()
+  if line:
+    return '# %s' % line
+  else:
+    return '#'
+
+
+def TransformCppToPythonLicence(licence):
+  """Change a C++ licence to Python style"""
+  lines = licence.split('\n')
+  output = []
+  for l in lines[1:]:
+    output.append(TransformPythonLine(l[3:]))
+  return '\n'.join(output)
+
+
+def TransformLine(line, lang):
+  if lang == CPP or lang == PROTOBUF:
+    return TransformCppLine(line)
+  elif lang == JS:
+    return TransformJsLine(line)
+  elif lang == PYTHON:
+    return TransformPythonLine(line)
+  else:
+    return line
+
+
+def ReplaceHeader(file_name, new_header, lang):
+  f = open(file_name)
+  breaks = 0
+  line = f.readline()
+  while line != '':
+    if (lang == CPP or lang == JS or lang == PROTOBUF) and \
+       re.match(r'^ \*\s*\n$', line):
+      breaks += 1
+    if lang == PYTHON and re.match(r'^#\s*\n$', line):
+      breaks += 1
+    if breaks == 3:
+      break
+    line = f.readline()
+
+  if breaks < 3:
+    print "Couldn't find header for %s so couldn't fix it" % file_name
+    f.close()
+    return
+
+  remainder = f.read()
+  f.close()
+
+  f = open(file_name, 'w')
+  f.write(new_header)
+  f.write('\n')
+  f.write(remainder)
+  f.close()
+
+
+def GetDirectoryLicences(root_dir):
+  """Walk the directory tree and determine the licence for each directory."""
+  LICENCE_FILE = 'LICENCE'
+  licences = {}
+
+  for dir_name, subdirs, files in os.walk(root_dir):
+    # skip the root_dir since the licence file is different there
+    if dir_name == root_dir:
+      continue
+
+    # skip ignored dirs since we don't check them anyways
+    skip = False
+    for ignored_dir in IGNORED_DIRECTORIES:
+      if dir_name.rfind(ignored_dir) != -1:
+        skip = True
+
+    if skip:
+      continue
+
+    # don't descend into hidden dirs like .libs and .deps
+    subdirs[:] = [d for d in subdirs if not d.startswith('.')]
+
+    if LICENCE_FILE in files:
+      f = open(os.path.join(dir_name, LICENCE_FILE))
+      lines = f.readlines()
+      f.close()
+      licences[dir_name] = TransformLicence(lines)
+      print 'Found LICENCE for directory %s' % dir_name
+
+    # use this licence for all subdirs
+    licence = licences.get(dir_name)
+    if licence is not None:
+      for sub_dir in subdirs:
+        licences[os.path.join(dir_name, sub_dir)] = licence
+  return licences
+
+
+def CheckLicenceForDir(dir_name, licence, diff, fix):
+  """Check all files in a directory contain the correct licence."""
+  errors = 0
+  # glob doesn't support { } so we iterate instead
+  for match in ['*.h', '*.cpp']:
+    for file_name in glob.glob(os.path.join(dir_name, match)):
+      # skip the generated protobuf code
+      if '.pb.' in file_name:
+        continue
+      errors += CheckLicenceForFile(file_name, licence, CPP, diff, fix)
+
+  js_licence = TransformCppToJsLicence(licence)
+  for file_name in glob.glob(os.path.join(dir_name, '*.js')):
+    errors += CheckLicenceForFile(file_name, js_licence, JS, diff, fix)
+
+  for file_name in glob.glob(os.path.join(dir_name, '*.proto')):
+    errors += CheckLicenceForFile(file_name, licence, PROTOBUF, diff, fix)
+
+  python_licence = TransformCppToPythonLicence(licence)
+  for file_name in glob.glob(os.path.join(dir_name, '*.py')):
+    # skip the generated protobuf code
+    if file_name.endswith('__init__.py') or file_name.endswith('pb2.py'):
+      continue
+    errors += CheckLicenceForFile(file_name, python_licence, PYTHON, diff, fix)
+
+  return errors
+
+
+def CheckLicenceForFile(file_name, licence, lang, diff, fix):
+  """Check a file contains the correct licence."""
+  if IgnoreFile(file_name):
+    return 0
+
+  f = open(file_name)
+  # + 1 to include the newline to have a complete line
+  header_size = len(licence) + 1
+  first_line = None
+  if lang == PYTHON:
+    first_line = f.readline()
+    if not first_line.startswith('#!') and not first_line.startswith('# !'):
+      # First line isn't a shebang, ignore it.
+      f.seek(0, os.SEEK_SET)
+      first_line = None
+  # strip the trailing newline off as we don't actually want it
+  header = f.read(header_size).rstrip('\n')
+  file_name_line = f.readline()
+  f.close()
+  if header == licence:
+    expected_line = TransformLine(os.path.basename(file_name), lang)
+    if lang != JS and file_name_line.rstrip('\n') != expected_line:
+      print ("File %s does not have a filename line after the licence; found "
+             "\"%s\" expected \"%s\"" %
+             (file_name, file_name_line.rstrip('\n'), expected_line))
+      return 1
+    return 0
+
+  if fix:
+    print 'Fixing %s' % file_name
+    if lang == PYTHON and first_line is not None:
+      licence = first_line + licence
+    ReplaceHeader(file_name, licence, lang)
+    return 1
+  else:
+    print "File %s does not start with \"%s...\"" % (
+        file_name,
+        licence.split('\n')[(0 if (lang == PYTHON) else 1)])
+    if diff:
+      d = difflib.Differ()
+      result = list(d.compare(header.splitlines(1), licence.splitlines(1)))
+      pprint.pprint(result)
+    return 1
+
+
+def main():
+  diff, fix = ParseArgs()
+  licences = GetDirectoryLicences(os.getcwd())
+  errors = 0
+  for dir_name, licence in licences.iteritems():
+    errors += CheckLicenceForDir(dir_name, licence, diff=diff, fix=fix)
+  print 'Found %d files with incorrect licences' % errors
+  if errors > 0:
+    sys.exit(1)
+  else:
+    sys.exit()
+
+
+if __name__ == '__main__':
+  main()
--- /dev/null
+++ ola-0.10.7.nojsmin/scripts/verify_trees.py
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# verify_trees.py
+# Copyright (C) 2015 Simon Newton
+
+from __future__ import print_function
+
+import os
+import fnmatch
+import textwrap
+import sys
+
+# File & directory patterns that differ between what's in the git repo and
+# what's in the tarball.
+IGNORE_PATTERNS = [
+  '*.log',
+  '*.pc',
+  '*.swp',
+  '*.trs',
+  '*/.deps',
+  '*/.dirstamp',
+  '*/.libs',
+  '*/LICENCE',
+  '*/Makefile',
+  '*_pb2.py',
+  '*~',
+  '.codespellignore',
+  '.git',
+  '.git/*',
+  '.gitignore',
+  '.travis-ci.sh',
+  '.travis.yml',
+  'Doxyfile',
+  'Makefile',
+  'README.md',
+  'autom4te.cache',
+  'config.h',
+  'config.status',
+  'html/*',
+  'include/ola/base/Version.h',
+  'libtool',
+  'man/generate-html.sh',
+  'ola-*.tar.gz',
+  'ola-*/*',
+  'plugins/kinet/kinet.cpp',
+  'python/ola/PidStoreLocation.py',
+  'python/ola/Version.py',
+  'scripts/*',
+  'stamp-h1',
+  'tools/rdm/DataLocation.py',
+]
+
+
+def Usage(arg0):
+  print (textwrap.dedent("""\
+  Usage: %s <treeA> <treeB>
+
+  Check for files that exist in treeA but aren't in treeB. This can be used to
+  ensure we don't miss files from the tarball.""" % arg0))
+
+
+def ShouldIgnore(path):
+  for pattern in IGNORE_PATTERNS:
+    if fnmatch.fnmatch(path, pattern):
+      return True
+  return False
+
+
+def BuildTree(root):
+  tree = set()
+  for directory, sub_dirs, files in os.walk(root):
+    rel_dir = os.path.relpath(directory, root)
+    if rel_dir == '.':
+      rel_dir = ''
+    if ShouldIgnore(rel_dir):
+      continue
+    for f in files:
+      path = os.path.join(rel_dir, f)
+      if not ShouldIgnore(path):
+        tree.add(path)
+
+  return tree
+
+
+def main():
+  if len(sys.argv) != 3:
+    Usage(sys.argv[0])
+    sys.exit(1)
+
+  tree_a_root = sys.argv[1]
+  tree_b_root = sys.argv[2]
+  for tree in (tree_a_root, tree_b_root):
+    if not os.path.isdir(tree):
+      print('Not a directory `%s`' % tree, file=sys.stderr)
+      sys.exit(2)
+
+  tree_a = BuildTree(tree_a_root)
+  tree_b = BuildTree(tree_b_root)
+
+  difference = tree_a.difference(tree_b)
+
+  if difference:
+    for file_path in difference:
+      print('Missing from tarball %s' % file_path, file=sys.stderr)
+
+    print('\n---------------------------------------', file=sys.stderr)
+    print('Either add the missing files to the appropriate Makefile.mk\n'
+          'or update IGNORE_PATTERNS in scripts/verify_trees.py',
+          file=sys.stderr)
+    print('---------------------------------------', file=sys.stderr)
+    sys.exit(1)
+
+  sys.exit()
+
+
+if __name__ == '__main__':
+  main()
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/e133/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/logic/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/ola_mon/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/ola_trigger/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/rdm/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- ola-0.10.7.nojsmin.orig/tools/rdm/static/rdmtests.html
+++ ola-0.10.7.nojsmin/tools/rdm/static/rdmtests.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html>
 <html>
   <head>
-    <link type='text/css' rel='stylesheet' href='/static/jquery-ui-1.8.21.custom.css' />
+    <link type='text/css' rel='stylesheet' href='/static/jquery-ui.css' />
     <link rel='stylesheet' href='/static/ui.multiselect.css' type='text/css'>
-    <script src='/static/jquery-1.7.2.min.js'></script>
-    <script src='/static/jquery-ui-1.8.21.custom.min.js'></script>
+    <script src='/static/jquery.min.js'></script>
+    <script src='/static/jquery-ui.min.js'></script>
     <script src='/static/ui.multiselect.js'></script>
     <script src='/static/rdm_tests.js'></script>
     <title>RDM Tests &amp; Publisher</title>
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/rdmpro/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/tools/usbpro/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- /dev/null
+++ ola-0.10.7.nojsmin/.codespellignore
@@ -0,0 +1,82 @@
+  int lock_fd = open(lock_file.c_str(), O_RDWR | O_CREAT | O_EXCL,
+    if (!(ifrcopy.ifr_flags & IFF_UP)) {
+    if (ifrcopy.ifr_flags & IFF_LOOPBACK) {
+    if (ifrcopy.ifr_flags & IFF_BROADCAST) {
+      string("  00 48 65 6c  .Hel\n"
+ * Renamed fempto(sic) to femto in the RDM code (C++ and Python)
+ * Renamed terra(sic) to tera in the RDM code (C++ and Python)
+ * 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
+        /^(?:([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',
+    // This is true iff all fields in a group are of a fixed size and the
+    <button ng-click="input(' THRU ')" class="btn btn-keypad">THRU</button>
+      if(/android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
+      state(AVAHI_ENTRY_GROUP_UNCOMMITED),
+    case AVAHI_ENTRY_GROUP_UNCOMMITED:
+    if (iter->second->state == AVAHI_ENTRY_GROUP_UNCOMMITED) {
+    iter->second->state = AVAHI_ENTRY_GROUP_UNCOMMITED;
+    case AVAHI_ENTRY_GROUP_UNCOMMITED:
+      return "AVAHI_ENTRY_GROUP_UNCOMMITED";
+      PRE_SOM,
+      uint8_t som;
+    static const uint8_t SOM = 0xa5;
+    PRE_SOM,
+    uint8_t som;
+  static const uint8_t SOM = 0x7e;
+  frame[0] = 0x7e;  // som
+  frame[0] = 0xa5;  // som
+  frame[0] = 0x7e;  // som
+const uint8_t BaseRobeWidget::SOM;
+      m_state(PRE_SOM),
+  header->som = SOM;
+  uint8_t crc = SOM + packet_type + (length & 0xFF) + ((length & 0xFF00) >> 8);
+    case PRE_SOM:
+        m_descriptor->Receive(&m_header.som, 1, count);
+      } while (m_header.som != SOM);
+        m_state = PRE_SOM;
+      m_crc = SOM + m_header.packet_type + m_header.len + m_header.len_hi;
+        m_state = PRE_SOM;
+      m_state = PRE_SOM;
+      m_state(PRE_SOM),
+  header->som = SOM;
+    case PRE_SOM:
+        m_descriptor->Receive(&m_header.som, 1, count);
+      } while (m_header.som != SOM);
+        m_state = PRE_SOM;
+      m_state = PRE_SOM;
+        '%s attempted to get %s which wasn\'t declared' %
+        '%s attempted to set %s which wasn\'t declared' %
+        'min': numpy.amin(array),
+  void Syncronize();
+  SC_E133_NONEXISTANT_ENDPOINT = 0x0005,
+  saver_thread.Syncronize();
+void FilePreferenceSaverThread::Syncronize() {
+  Mutex syncronize_mutex;
+  syncronize_mutex.Lock();
+        &syncronize_mutex));
+  condition_var.Wait(&syncronize_mutex);
+                      ola::e133::SC_E133_NONEXISTANT_ENDPOINT,
+    case ola::e133::SC_E133_NONEXISTANT_ENDPOINT:
+      *status_code = ola::e133::SC_E133_NONEXISTANT_ENDPOINT;
+    case ola::e133::SC_E133_NONEXISTANT_ENDPOINT:
+ * @brief A LibUsbAdaptor for use with Syncronous widgets.
+ * When using syncronous mode, we don't have the requirement of interacting
+class SyncronousLibUsbAdaptor : public BaseLibUsbAdaptor {
+  SyncronousLibUsbAdaptor() {}
+  DISALLOW_COPY_AND_ASSIGN(SyncronousLibUsbAdaptor);
+ * @brief A LibUsbAdaptor for use with Asyncronous widgets.
+ * Asyncronous mode requires notifying the LibUsbThread when handles are opened
+class AsyncronousLibUsbAdaptor : public BaseLibUsbAdaptor {
+  explicit AsyncronousLibUsbAdaptor(class LibUsbThread *thread)
+  DISALLOW_COPY_AND_ASSIGN(AsyncronousLibUsbAdaptor);
+  manufacturer_name: "ARRI -- Arnold & Richter Cine Technik GmbH & Co. Betriebs KG"
--- /dev/null
+++ ola-0.10.7.nojsmin/.gitlab-ci.yml
@@ -0,0 +1,18 @@
+before_script:
+- apt-get update
+- apt-get -y install devscripts autoconf automake autopkgtest adduser fakeroot sudo
+- autoreconf -f -i
+- mk-build-deps -t "apt-get -y -o Debug::pkgProblemResolver=yes --no-install-recommends" -i -r
+- adduser --disabled-password --gecos "" builduser
+- chown -R builduser:builduser .
+- chown builduser:builduser ..
+build_testing:
+  image: debian:testing
+  script:
+  - sudo -u builduser dpkg-buildpackage -b -rfakeroot
+  - autopkgtest ../*ges -- null
+build_unstable:
+  image: debian:sid
+  script:
+  - sudo -u builduser dpkg-buildpackage -b -rfakeroot
+  - autopkgtest ../*ges -- null
--- ola-0.10.7.nojsmin.orig/config/ola.m4
+++ ola-0.10.7.nojsmin/config/ola.m4
@@ -24,8 +24,10 @@ 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_MSG_CHECKING([protobuf library version])
+PROTOBUF_VERSION=`pkg-config --modversion protobuf`;
+AC_MSG_RESULT([$PROTOBUF_VERSION])
+AC_SUBST([PROTOBUF_VERSION])
 
 AC_SUBST([libprotobuf_CFLAGS])
 
--- ola-0.10.7.nojsmin.orig/java/Makefile.am
+++ ola-0.10.7.nojsmin/java/Makefile.am
@@ -12,8 +12,8 @@ src/main/java/ola/proto/Ola.java: ${top_
 src/main/java/ola/rpc/Rpc.java: ${top_srcdir}/common/rpc/Rpc.proto
 	$(PROTOC) --java_out=src/main/java --proto_path=${top_srcdir}/common/rpc ${top_srcdir}/common/rpc/Rpc.proto
 
-ola.jar: src/main/java/ola/proto/Ola.java src/main/java/ola/rpc/Rpc.java
-	mvn package
+ola.jar: generated-src/main/java/ola/proto/Ola.java generated-src/main/java/ola/rpc/Rpc.java
+	cd ${top_builddir}/java && mvn --file ${top_srcdir}/java/pom.xml -DbuildDir=${abs_top_builddir}/java -DprotobufGeneratedSource=$(abs_top_builddir)/java/generated-src/main/java -DprotobufJavaVersion=$(PROTOBUF_VERSION) package
 
 CLEANFILES = src/main/java/ola/proto/Ola.java \
              src/main/java/ola/rpc/Rpc.java
--- ola-0.10.7.nojsmin.orig/java/pom.xml
+++ ola-0.10.7.nojsmin/java/pom.xml
@@ -31,7 +31,7 @@
     <dependency>
       <groupId>com.google.protobuf</groupId>
       <artifactId>protobuf-java</artifactId>
-      <version>2.6.1</version>
+      <version>${protobufJavaVersion}</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
--- ola-0.10.7.nojsmin.orig/protoc/CppFileGenerator.cpp
+++ ola-0.10.7.nojsmin/protoc/CppFileGenerator.cpp
@@ -196,14 +196,6 @@ void FileGenerator::GenerateBuildDescrip
       "assigndescriptorsname", GlobalAssignDescriptorsName(m_output_name));
     printer->Indent();
 
-    // Make sure the file has found its way into the pool.  If a descriptor
-    // is requested *during* static init then AddDescriptors() may not have
-    // been called yet, so we call it manually.  Note that it's fine if
-    // AddDescriptors() is called multiple times.
-    printer->Print(
-      "$adddescriptorsname$();\n",
-      "adddescriptorsname", GlobalAddDescriptorsName(m_file->name()));
-
     // Get the file's descriptor from the pool.
     printer->Print(
       "const ::google::protobuf::FileDescriptor* file =\n"
--- ola-0.10.7.nojsmin.orig/protoc/GeneratorHelpers.cpp
+++ ola-0.10.7.nojsmin/protoc/GeneratorHelpers.cpp
@@ -104,11 +104,6 @@ string FilenameIdentifier(const string&
   return result;
 }
 
-// Return the name of the AddDescriptors() function for a given file.
-string GlobalAddDescriptorsName(const string& filename) {
-  return "protobuf_AddDesc_" + FilenameIdentifier(filename);
-}
-
 // Return the name of the AssignDescriptors() function for a given file.
 string GlobalAssignDescriptorsName(const string& filename) {
   return "protobuf_AssignDesc_" + FilenameIdentifier(filename);
--- ola-0.10.7.nojsmin.orig/protoc/GeneratorHelpers.h
+++ ola-0.10.7.nojsmin/protoc/GeneratorHelpers.h
@@ -67,9 +67,6 @@ string StripProto(const string& filename
 // Convert a file name into a valid identifier.
 string FilenameIdentifier(const string& filename);
 
-// Return the name of the AddDescriptors() function for a given file.
-string GlobalAddDescriptorsName(const string& filename);
-
 // Return the name of the AssignDescriptors() function for a given file.
 string GlobalAssignDescriptorsName(const string& filename);
 
