New Upstream Snapshot - python-easysnmp

Ready changes

Summary

Merged new upstream version: 0.2.6+git20220821.1.d014177 (was: 0.2.6).

Resulting package

Built on 2023-01-20T06:39 (took 4m29s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots python3-easysnmp-dbgsymapt install -t fresh-snapshots python3-easysnmp

Lintian Result

Diff

diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index bba85ce..0000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: "[BUG]"
-labels: bug
-assignees: ''
-
----
-
-**EasySNMP release version OR commit number**
-ex. 0.2.5 OR ecf5b3f
-
-**Operating System and Version**
- - OS: [e.g. macOS, Ubuntu, RHEL, CentOS, Fedora, etc.]
- - Version [e.g. 22]
-
-**Net-SNMP Library Version**
- - 5.x.x
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce the behavior:
-1. Go to '...'
-2. Click on '....'
-3. Scroll down to '....'
-4. See error
-
-**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**Additional context**
-Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index f455865..0000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: "[FEATURE]"
-labels: enhancement
-assignees: ''
-
----
-
-**Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**Describe the solution you'd like**
-A clear and concise description of what you want to happen.
-
-**Describe alternatives you've considered**
-A clear and concise description of any alternative solutions or features you've considered.
-
-**Additional context**
-Add any other context or screenshots about the feature request here.
diff --git a/.github/ISSUE_TEMPLATE/question-to-the-developers.md b/.github/ISSUE_TEMPLATE/question-to-the-developers.md
deleted file mode 100644
index fd31acf..0000000
--- a/.github/ISSUE_TEMPLATE/question-to-the-developers.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-name: Question to the developers
-about: General question(s) about the project
-title: "[Question]"
-labels: question
-assignees: ''
-
----
-
-**What's on your mind?**
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 2e34133..0000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: build
-on:
-  release:
-    types: [published]
-  push:
-    branches:
-      - 'actions'
-      - 'actions-test'
-
-jobs:
-  linux-wheels:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Set up Python
-        uses: actions/setup-python@v2
-      - name: Checkout repo
-        uses: actions/checkout@v3
-      - name: Create manylinux wheels
-        uses: RalfG/python-wheels-manylinux-build@v0.4.2
-        with:
-          system-packages: 'snmpd libsnmp-dev libperl-dev'
-      - name: Install local dependencies
-        run: sudo apt install -y snmpd libsnmp-dev libperl-dev
-      - name: Create source dist
-        run: sudo chown -R $USER . && python setup.py sdist
-      - name: Remove linux_x86_64
-        run: rm dist/*linux_x86_64.whl
-      - name: Upload artifacts
-        uses: actions/upload-artifact@v2
-        with:
-          name: wheels
-          path: dist/*
-
-  macos-wheels:
-    runs-on: macos-latest
-    steps:
-      - name: Set up Python
-        uses: actions/setup-python@v2
-      - name: Checkout repo
-        uses: actions/checkout@v2
-      - name: Install dependencies
-        run: |
-            brew install easysnmp/netsnmp-easysnmp/net-snmp
-            echo 'export PATH="/usr/local/opt/net-snmp/bin:$PATH"' >> /Users/runner/.bash_profile
-            export PATH="/usr/local/opt/net-snmp/bin:$PATH"
-            echo 'export PATH="/usr/local/opt/net-snmp/sbin:$PATH"' >> /Users/runner/.bash_profile
-            export PATH="/usr/local/opt/net-snmp/sbin:$PATH"
-      - name: Install cibuildwheel
-        run: python -m pip install cibuildwheel
-      - name: Build wheels
-        env:
-          CIBW_BEFORE_BUILD_MACOS: python setup.py build
-        run: python -m cibuildwheel --output-dir dist
-      - name: Upload artifacts
-        uses: actions/upload-artifact@v2
-        with:
-          name: wheels
-          path: dist/*
-
-  publish-wheels:
-    runs-on: ubuntu-latest
-    needs: [linux-wheels, macos-wheels]
-    if: ${{ always() }}
-    steps:
-      - name: Download wheel artifacts
-        id: download
-        uses: actions/download-artifact@v3
-        with:
-          path: ./dist
-          name: wheels
-      - name: Publish to PyPi
-        uses: pypa/gh-action-pypi-publish@release/v1
-        with:
-          user: __token__
-          password: ${{ github.event_name == 'release' && secrets.PYPI_API_TOKEN || secrets.TEST_PYPI_API_TOKEN }}
-          verbose: true
-          repository_url: ${{ github.event_name == 'release' && 'https://upload.pypi.org/legacy/' || 'https://test.pypi.org/legacy/' }}
-          skip_existing: true
-      - name: Add to release
-        uses: softprops/action-gh-release@v1
-        if: startsWith(github.ref, 'refs/tags/')
-        with:
-          files: dist/*
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
deleted file mode 100644
index 40422bb..0000000
--- a/.github/workflows/tests.yml
+++ /dev/null
@@ -1,214 +0,0 @@
-name: tests
-on:
-  push:
-    branches-ignore:
-      - 'master'
-      - 'actions'
-  pull_request:
-
-jobs:
-  check-source-changes:
-    runs-on: ubuntu-latest
-    outputs:
-      run_job: ${{ steps.changed-files.outputs.any_changed }}
-    steps:
-      - name: Checkout changes
-        uses: actions/checkout@v3
-      - name: Check for changes in source code
-        id: changed-files
-        uses: tj-actions/changed-files@v18.7
-        with:
-          files: |
-            easysnmp/*.py
-            easysnmp/*.c
-            easysnmp/*.h
-            setup.py
-            setup.cfg
-            setup-py2.7.cfg
-            .github/workflows/*.yml
-
-  build-and-test:
-    runs-on: ${{ matrix.os }}
-    needs: check-source-changes
-    if: needs.check-source-changes.outputs.run_job == 'true'
-    strategy:
-      fail-fast: false
-      matrix:
-        os: [ubuntu-latest, macos-latest]
-        python-version: ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10"]
-    steps:
-      - name: Set up dependencies
-        run: |
-          if [ "$RUNNER_OS" == "Linux" ]
-          then
-            sudo apt-get update
-            sudo apt-get install -y snmpd libsnmp-dev libperl-dev snmp-mibs-downloader valgrind
-            sudo systemctl stop snmpd
-            sudo download-mibs
-          elif [ "$RUNNER_OS" == "macOS" ]
-          then
-            brew install easysnmp/netsnmp-easysnmp/net-snmp
-            echo 'export PATH="/usr/local/opt/net-snmp/bin:$PATH"' >> /Users/runner/.bash_profile
-            export PATH="/usr/local/opt/net-snmp/bin:$PATH"
-            echo 'export PATH="/usr/local/opt/net-snmp/sbin:$PATH"' >> /Users/runner/.bash_profile
-            export PATH="/usr/local/opt/net-snmp/sbin:$PATH"
-          else
-            echo "$RUNNER_OS not currently supported"
-            exit 1
-          fi
-          mkdir -m 0755 ~/.snmp
-          echo 'mibs +ALL' > ~/.snmp/snmp.conf
-        shell: bash
-      - name: Checkout repo
-        uses: actions/checkout@v3
-      - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v2
-        with:
-          python-version: ${{ matrix.python-version }}
-      - name: Install pip dependencies
-        run: |
-          python -m pip install --upgrade pip
-          if [[ "${{ matrix.python-version }}" =~ "2.7" ]]
-          then
-            pip install pytest wheel six
-          else
-            pip install flake8 pytest pytest-flake8 pytest-cov wheel
-          fi
-          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
-      - name: Build source
-        run: |
-          python setup.py build
-          pip install -e .
-      - name: Start SNMP daemon
-        run: |
-          if [ "$RUNNER_OS" == "Linux" ]
-          then
-            mibdir="-M +/var/lib/snmp/mibs"
-            SNMPD=$(which snmpd)
-          elif [ "$RUNNER_OS" == "macOS" ]
-          then
-            mibdir=""
-            SNMPD=/usr/local/opt/net-snmp/sbin/snmpd
-          else
-            mibdir=""
-            SNMPD=$(which.exe snmpd)
-          fi
-          $SNMPD -C -c tests/snmpd.conf -r -Le $mibdir -m ALL
-      - name: Lint with flake8
-        uses: py-actions/flake8@v2
-        continue-on-error: true
-      - name: Run tests
-        run: |
-          if [[ "${{ matrix.python-version }}" =~ "2.7" ]]
-          then
-            PYTEST_ARGS=( '-c' './setup-py2.7.cfg' )
-          fi
-          if [[ "${{ matrix.python-version }}" =~ "3.10" ]] && [ "$RUNNER_OS" == "Linux" ]
-          then
-            wget https://raw.githubusercontent.com/python/cpython/main/Misc/valgrind-python.supp
-            VALGRIND=(
-              'valgrind'
-              '--tool=memcheck'
-              '--leak-check=full'
-              '--show-leak-kinds=definite,indirect,possible'
-              '--suppressions=./valgrind-python.supp'
-              '--log-file=./valgrind.out'
-            )
-            echo 'PYTHONMALLOC=malloc' >> $GITHUB_ENV
-          fi
-          ${VALGRIND[@]} python -m pytest ${PYTEST_ARGS[@]} --junitxml=test-results_${{ matrix.os }}_${{ matrix.python-version }}.xml | tee ./test-outputs_${{ matrix.os }}_${{ matrix.python-version }}.log
-      - name: Upload test results
-        uses: actions/upload-artifact@v2
-        with:
-          name: pytest-results
-          path: |
-            test-results_*.xml
-            test-outputs_*.log
-      - name: Upload valgrind report
-        uses: actions/upload-artifact@v2
-        if: ${{ matrix.python-version == '3.10' && matrix.os == 'ubuntu-latest' }}
-        with:
-          name: valgrind-report
-          path: ./valgrind.out
-      - name: Generate wheel
-        run: python setup.py bdist_wheel
-      - name: Upload wheel
-        uses: actions/upload-artifact@v2
-        with:
-          name: wheels
-          path: dist/*.whl
-
-  comment-coverage:
-    runs-on: ubuntu-latest
-    needs: build-and-test
-    steps:
-      - name: Download pytest artifacts
-        id: download
-        uses: actions/download-artifact@v3
-        with:
-          path: ./pytest-results
-          name: pytest-results
-      - name: Create multi-file output listing
-        run: |
-          echo 'pytest_multiple_files<<EOF' >> $GITHUB_ENV
-          export test_xml=($(ls -d ${{ steps.download.outputs.download-path }}/*.xml | sort ))
-          export test_log=($(ls -d ${{ steps.download.outputs.download-path }}/*.log | sort ))
-          for i in "${!test_log[@]}"
-          do
-            echo "$(echo ${test_log[$i]} | cut -d_ -f2) - $(echo ${test_log[$i]%.*} | cut -d_ -f3), ${test_log[$i]}, ${test_xml[$i]}" >> $GITHUB_ENV
-          done
-          echo 'EOF' >> $GITHUB_ENV
-      - name: Pytest coverage comment
-        uses: MishaKav/pytest-coverage-comment@main
-        with:
-          title: Pytest Coverage Report
-          hide-badge: true
-          hide-report: true
-          create-new-comment: false
-          hide-comment: false
-          report-only-changed-files: false
-          multiple-files: |
-            ${{ env.pytest_multiple_files }}
-
-  comment-valgrind:
-    runs-on: ubuntu-latest
-    needs: build-and-test
-    steps:
-      - name: Download valgrind artifact
-        id: download
-        uses: actions/download-artifact@v3
-        with:
-          path: ./valgrind-report
-          name: valgrind-report
-      - name: Parse valgrind report
-        run: |
-          python - << "EOF"
-          from re import split
-          with open("${{ steps.download.outputs.download-path }}/valgrind.out") as f:
-            data = f.read()
-          blocks = split(r'==[0-9]+==\s\n', data)
-          snmp = list(filter(lambda b: 'snmp' in b, blocks[1:]))
-          with open('./valgrind-stripped.log', 'w') as f:
-            f.write('```sh\n')
-            f.writelines(filter(lambda b: all(filt not in b for filt in ('invalid file descriptor', 'alternative log')), snmp))
-            f.write(blocks[-2])
-            f.write('```\n')
-          EOF
-      - id: get-comment-body
-        run: |
-          body="$(cat ./valgrind-stripped.log)"
-          body="${body//'%'/'%25'}"
-          body="${body//$'\n'/'%0A'}"
-          body="${body//$'\r'/'%0D'}" 
-          echo "::set-output name=body::$body"
-      - name: Create comment for PR
-        uses: peter-evans/create-or-update-comment@v1
-        if: github.event_name == 'pull_request'
-        with:
-          issue-number: ${{ github.event.pull_request.number }}
-          body: ${{ steps.get-comment-body.outputs.body }}
-      - name: Create comment for Push
-        uses: peter-evans/commit-comment@v1
-        if: github.event_name == 'push'
-        with:
-          body: ${{ steps.get-comment-body.outputs.body }}
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 655e547..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-# Python byte-compiled, optimized and DLL files
-*.py[cod]
-
-# Cache
-.cache
-
-# Compiled libraries
-*.so
-
-# Nosetests and coverage information
-.coverage
-nosetests.xml
-coverage.xml
-
-# Distribution & packaging
-build/
-develop-eggs/
-.eggs/
-dist/
-*.egg-info/
-*.egg
-
-# Documentation builds
-docs/_build/
-
-# vim stuff
-.ropeproject
-
-# Local development
-dev/
-.vscode
-*/*.log
-*.log
\ No newline at end of file
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
deleted file mode 100644
index 14df027..0000000
--- a/CHANGELOG.rst
+++ /dev/null
@@ -1,144 +0,0 @@
-Changelog
----------
-
-`0.2.6 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.6>`_ (2022-07-16)
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Cached SNMP v3 credentials for a session are removed when the session configuration is updated or session is free'd
-  (`3826d0a <https://github.com/easysnmp/easysnmp/commit/3826d0a866ff6dcd22b49aea022a317bc9f0324f>`_)
-- New method for (re)creating the underlying Net-SNMP interface object
-  (`e75aab <https://github.com/easysnmp/easysnmp/commit/e75aabfe61b167be68348fe4e0e6c2abf4f8694d>`_)
-- Developer requirements updated and are now using `Black <https://github.com/psf/black>`_ for Python formatting
-
-`0.2.6a1 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.6a1>`_ (2022-04-17)
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- CI/CD builds and publishes wheels and source code to PyPI
-
-`0.2.6a <https://github.com/easysnmp/easysnmp/releases/tag/0.2.6a>`_ (2022-04-17)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Finally fixed underlying memory leaks (`PR#142 <https://github.com/easysnmp/easysnmp/pull/142>`_)
-- Proper handling of errors caused within Python that prevented exception raises (`PR#129 <https://github.com/easysnmp/easysnmp/pull/129>`_)
-- Added modern SNMPv3 privacy/auth algorithms (`PR#143 <https://github.com/easysnmp/easysnmp/pull/143>`_, `94ad10 <https://github.com/easysnmp/easysnmp/commit/94ad101be880a7a739e34d343dd0d0da679a48fb>`_)
-- CI/CD moved to Github Actions (`PR#137 <https://github.com/easysnmp/easysnmp/pull/137>`_)
-
-`0.2.5 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.5>`_ (2017-06-14)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Refactored code to use CObjects/PyCapsules for better memory management. Fixed truncation of data returned.
-  (`#30 <https://github.com/easysnmp/easysnmp/issues/30>`_,
-  `PR#48 <https://github.com/easysnmp/easysnmp/pull/28>`_)
-- Implemented ``bulkwalk`` functionality
-  (`PR#48 <https://github.com/easysnmp/easysnmp/pull/28>`_)
-- Added support for Net-SNMP installed via ``brew`` on OS X
-  (`PR#48 <https://github.com/easysnmp/easysnmp/pull/28>`_)
-- Allow ``snmp_type`` parameter in ``set(...)`` to support snmpset(1)
-  type specifiers.
-  (`#28 <https://github.com/easysnmp/easysnmp/issues/28>`_,
-  `PR#29 <https://github.com/easysnmp/easysnmp/pull/29>`_)
-- Support Net-SNMP 5.6.x to add support for OSX.
-  (`#12 <https://github.com/easysnmp/easysnmp/issues/12>`_,
-  `4e121e9 <https://github.com/easysnmp/easysnmp/commit/4e121e9f9b4613485bcb8f9bab48b4528a223db3>`_)
-- Remove printf debug statements when making SNMPv1 fixes from interface.c.
-  (`320df28 <https://github.com/easysnmp/easysnmp/commit/320df2882bbc5e3f57a7e71164497b063baa855e>`_)
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.2.4...0.2.5>`_
-
-`0.2.4 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.4>`_ (2015-07-09)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Ensured that the simple bitarray header is correctly referenced.
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.2.3...0.2.4>`_
-
-`0.2.3 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.3>`_ (2015-06-30)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Introduce this changelog.
-- Removed dead Python 2.5.x code.
-  (`PR#22 <https://github.com/easysnmp/easysnmp/pull/22>`_)
-- Fix SNMPv1 when using ``retry_no_such=True`` to ensure the response
-  values return correctly to the corresponding supplied requested OIDs.
-  (`PR#18 <https://github.com/easysnmp/easysnmp/pull/18>`_)
-- Allow OIDs to be specified without a leading dot.
-  (`#15 <https://github.com/easysnmp/easysnmp/issues/15>`_)
-- By default do not throw exception if a non-existent OID is fetched,
-  and introduce ``abort_on_nonexistent`` to allow user-configurable
-  action.
-  (`49ea15ec <https://github.com/easysnmp/easysnmp/commit/49ea15ec32cd29cd2469041d0a6bab499dd7b599>`_)
-- Fix C interface to not tread on existing logging configuration to
-  instead import logging module and configure a NullHandler instead.
-  (`PR#13 <https://github.com/easysnmp/easysnmp/pull/13>`_)
-- Modify ``snmpd`` to run on ``localhost:11161`` to avoid requiring
-  root privilege and not clash with a local running instance of snmpd.
-  (`5604a4bb <https://github.com/easysnmp/easysnmp/commit/5604a4bbe72844295e966af270469aeccad19e98>`_)
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.2.2...0.2.3>`_
-
-`0.2.2 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.2>`_ (2015-06-03)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Cosmetic fixes to the codebase.
-- Fixes for Python 3.x/unicode support.
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.2.1...0.2.2>`_
-
-`0.2.1 <https://github.com/easysnmp/easysnmp/releases/tag/0.2.1>`_ (2015-06-02)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Various fixes to the C interface including better exception handling
-  and removal of remnant debug code.
-- Use pytest-sugar for bling-bling test output.
-  (`71c567f9 <https://github.com/easysnmp/easysnmp/commit/71c567f9ae0cabe8eee970ed0b102956b8c73565>`_)
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.2...0.2.1>`_
-
-`0.2 <https://github.com/easysnmp/easysnmp/releases/tag/0.2>`_ (2015-06-02)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Introduced support for Python 3.x.
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.1.1...0.2>`_
-
-`0.1.1 <https://github.com/easysnmp/easysnmp/releases/tag/0.1.1>`_ (2015-06-02)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Added PyPI documentation.
-  (`da16cd74 <https://github.com/easysnmp/easysnmp/commit/da16cd749bff13863fe6ea61d221f08f389ddca0>`_)
-- Quelch stderr messages generated from the internal Net-SNMP library.
-  (`15fce1ea <https://github.com/easysnmp/easysnmp/commit/15fce1ea7adcee4dc86d1a42271f123e749a0241>`_)
-- Improved coverage of testsuite.
-- Use of fixtures and parametization in testsuite to target specific
-  versions of SNMP (v1/v2/v3).
-  (`427a9dfd <https://github.com/easysnmp/easysnmp/commit/427a9dfd4740ce22f2af6bee617fe7a78a7bbcae>`_)
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/0.1...0.1.1>`_
-
-`0.1 <https://github.com/easysnmp/easysnmp/releases/tag/0.1>`_ (2015-05-30)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Raise Python exceptions in the C interface where necessary.
-- Bug fixes to the C interface when specifying context engine session
-  ID and the value returned when requesting an invalid OID.
-  (`PR#6 <https://github.com/easysnmp/easysnmp/pull/6>`_)
-- Implement python logging in the C interface and rewrite existing
-  fprintf diagnostics to use the logging interface.
-  (`PR#4 <https://github.com/easysnmp/easysnmp/pull/4>`_)
-- Unit tests rewritten in pytest and travis-ci integration.
-  (`PR#2 <https://github.com/easysnmp/easysnmp/pull/2>`_,
-  `b2018587 <https://github.com/easysnmp/easysnmp/commit/b20185875feae252b7f912f693156fca1d88b3d0>`_)
-- Implement ``compat_netsnmp_memdup()`` to fix C interface to compile
-  against Net-SNMP 5.7.2. (`PR#2 <https://github.com/easysnmp/easysnmp/pull/2>`_)
-- Import and overhaul of the original Net-SNMP Python bindings:
-    - Wrote a README that provides an overview and quickstart of the
-      project
-    - Sphinx generated documentation which is also hosted on
-      readthedocs.
-    - Conform to PEP8 using ``flake8``
-    - Coverage support via coveralls.io (integrated into travis)
-    - A simple pythonic interface which resembles the use of the
-      Net-SNMP CLI client utilities.
-    - Python package uploaded to PyPI
-
-`Full Source Code Changelog <https://github.com/easysnmp/easysnmp/compare/6c0f8c32709fc240f57934ed50e31bf05af04e20...0.1>`_
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..78b2150
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,199 @@
+Metadata-Version: 2.1
+Name: easysnmp
+Version: 0.2.6
+Summary: A blazingly fast and Pythonic SNMP library based on the official Net-SNMP bindings
+Home-page: https://github.com/kamakazikamikaze/easysnmp
+Author: Kent Coble
+Author-email: coblekent@gmail.com
+License: BSD
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Topic :: System :: Networking
+Classifier: Topic :: System :: Networking :: Monitoring
+License-File: LICENSE
+
+Easy SNMP
+=========
+
+|Python Code Style| |Build Status| |Discussions| |License|
+
+.. |Python Code Style| image:: https://img.shields.io/badge/code%20style-black-000000.svg
+    :target: https://github.com/psf/black
+.. |Build Status| image:: https://img.shields.io/github/workflow/status/easysnmp/easysnmp/build
+   :target: https://github.com/easysnmp/easysnmp/actions
+.. |License| image:: https://img.shields.io/badge/license-BSD-blue.svg
+   :target: https://github.com/kamakazikamikaze/easysnmp/blob/master/LICENSE
+.. |Discussions| image:: https://img.shields.io/github/discussions/easysnmp/easysnmp
+   :alt: Join the Discussions!
+   :target: https://github.com/easysnmp/easysnmp
+
+.. image:: https://raw.githubusercontent.com/easysnmp/easysnmp/master/images/easysnmp-logo.png
+    :alt: Easy SNMP Logo
+
+Artwork courtesy of `Open Clip Art
+Library <https://openclipart.org/detail/154453/network>`_
+
+
+Introduction
+------------
+
+Easy SNMP is a fork of `Net-SNMP Python
+Bindings <http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings>`_
+that attempts to bring a more Pythonic interface to the library. Check
+out the `Net-SNMP website <http://www.net-snmp.org/>`_ for more
+information about SNMP.
+
+This module provides a full-featured SNMP client API and supports all
+dialects of the SNMP protocol.
+
+Why Another Library?
+--------------------
+
+- The `original Net-SNMP Python
+  library <http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings>`_
+  is a great starting point but is quite un-Pythonic and lacks proper unit tests and documentation.
+- `PySNMP <http://pysnmp.sourceforge.net/>`_ is entirely written in Python
+  and therefore has a huge performance hit. In some brief tests, I
+  estimate that both the Net-SNMP Python bindings and Easy SNMP are more than 4 times faster than PySNMP. Further to this, PySNMP has an even less Pythonic interface than the official Net-SNMP bindings.
+- Many other libraries like `Snimpy <https://snimpy.readthedocs.org/en/latest/>`_ are sadly based on PySNMP, so they also suffer performance penalty.
+
+Quick Start
+-----------
+
+There are primarily two ways you can use the Easy SNMP library:
+
+1. By using a Session object which is most suitable
+when you want to request multiple pieces of SNMP data from a
+source:
+
+.. code:: python
+
+    from easysnmp import Session
+
+    # Create an SNMP session to be used for all our requests
+    session = Session(hostname='localhost', community='public', version=2)
+
+    # You may retrieve an individual OID using an SNMP GET
+    location = session.get('sysLocation.0')
+
+    # You may also specify the OID as a tuple (name, index)
+    # Note: the index is specified as a string as it can be of other types than
+    # just a regular integer
+    contact = session.get(('sysContact', '0'))
+
+    # And of course, you may use the numeric OID too
+    description = session.get('.1.3.6.1.2.1.1.1.0')
+
+    # Set a variable using an SNMP SET
+    session.set('sysLocation.0', 'The SNMP Lab')
+
+    # Perform an SNMP walk
+    system_items = session.walk('system')
+
+    # Each returned item can be used normally as its related type (str or int)
+    # but also has several extended attributes with SNMP-specific information
+    for item in system_items:
+        print '{oid}.{oid_index} {snmp_type} = {value}'.format(
+            oid=item.oid,
+            oid_index=item.oid_index,
+            snmp_type=item.snmp_type,
+            value=item.value
+        )
+
+2. By using Easy SNMP via its simple interface which is intended
+for one-off operations (where you wish to specify all details in the
+request):
+
+.. code:: python
+
+    from easysnmp import snmp_get, snmp_set, snmp_walk
+
+    # Grab a single piece of information using an SNMP GET
+    snmp_get('sysDescr.0', hostname='localhost', community='public', version=1)
+
+    # Perform an SNMP SET to update data
+    snmp_set(
+        'sysLocation.0', 'My Cool Place',
+        hostname='localhost', community='public', version=1
+    )
+
+    # Perform an SNMP walk
+    snmp_walk('system', hostname='localhost', community='public', version=1)
+
+Documentation
+-------------
+
+Please check out the `Easy SNMP documentation at Read the
+Docs <http://easysnmp.readthedocs.org/>`_. This includes installation
+instructions for various operating systems.
+
+You may generate the documentation as follows:
+
+.. code:: bash
+
+    # Install Sphinx
+    pip install sphinx
+
+    # You may optionally export the READTHEDOCS environment variable to build docs
+    # on systems where you haven't built the C interface
+    export READTHEDOCS=1
+
+    # Build the documentation into static HTML pages
+    cd docs
+    make html
+
+Acknowledgments
+---------------
+
+I'd like to say thanks to the following folks who have made this project
+possible:
+
+-  **Giovanni Marzot**: the original author
+-  **ScienceLogic, LLC**: sponsored the initial development of this
+   module
+-  **Wes Hardaker and the net-snmp-coders**: for their hard work and
+   dedication
+- **fgimian and nnathan**: the original contributors to this codebase
+
+Running Tests
+-------------
+
+Tests use `Pytest <https://github.com/pytest-dev/pytest>`_. You can run
+them with the following:
+
+.. code:: bash
+
+    git clone https://github.com/easysnmp/easysnmp.git
+    cd easysnmp
+    pip install pytest
+    pytest
+
+License
+-------
+
+Easy SNMP is released under the **BSD** license. Please see the
+`LICENSE <https://github.com/easysnmp/easysnmp/blob/master/LICENSE>`_
+file for more details.
+
+Copyright
+---------
+
+The original version of this library is copyright (c) 2006 G. S. Marzot.
+All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Net-SNMP itself.
+
+Copyright (c) 2006 SPARTA, Inc. All Rights Reserved. This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Net-SNMP itself.
diff --git a/debian/changelog b/debian/changelog
index a8ccaf8..11e0864 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,12 @@
-python-easysnmp (0.2.6-2) UNRELEASED; urgency=medium
+python-easysnmp (0.2.6+git20220821.1.d014177-1) UNRELEASED; urgency=medium
 
   * Trim trailing whitespace.
   * Bump debhelper from old 12 to 13.
   * Set upstream metadata fields: Bug-Database, Bug-Submit, Repository,
     Repository-Browse.
+  * New upstream snapshot.
 
- -- Debian Janitor <janitor@jelmer.uk>  Tue, 06 Sep 2022 21:47:12 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 20 Jan 2023 06:35:40 -0000
 
 python-easysnmp (0.2.6-1) unstable; urgency=medium
 
diff --git a/dev-requirements-py2.txt b/dev-requirements-py2.txt
deleted file mode 100644
index b437d03..0000000
--- a/dev-requirements-py2.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-atomicwrites==1.4.0
-attrs==21.4.0
-backports.functools-lru-cache==1.6.4
-configparser==4.0.2
-contextlib2==0.6.0.post1
-funcsigs==1.0.2
-importlib-metadata==2.1.3
-more-itertools==5.0.0
-packaging==20.9
-pathlib2==2.3.7.post1
-pkg-resources==0.0.0
-pluggy==0.13.1
-py==1.11.0
-pyparsing==2.4.7
-pytest==4.6.11
-scandir==1.10.0
-six==1.16.0
-typing==3.10.0.0
-wcwidth==0.2.5
-zipp==1.2.0
diff --git a/dev-requirements.txt b/dev-requirements.txt
deleted file mode 100644
index 19d1a8a..0000000
--- a/dev-requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-attrs==21.4.0
-black==22.3.0
-click==8.1.2
-coverage==6.3.2
-flake8==4.0.1
-iniconfig==1.1.1
-mccabe==0.6.1
-mypy-extensions==0.4.3
-packaging==21.3
-pathspec==0.9.0
-platformdirs==2.5.2
-pluggy==1.0.0
-py==1.11.0
-pycodestyle==2.8.0
-pyflakes==2.4.0
-pyparsing==3.0.8
-pytest==7.1.2
-pytest-cov==3.0.0
-pytest-flake8==1.1.1
-tomli==2.0.1
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index cb41b25..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,192 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = _build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  applehelp  to make an Apple Help Book"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-	@echo "  coverage   to run coverage check of the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/EasySNMP.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/EasySNMP.qhc"
-
-applehelp:
-	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
-	@echo
-	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
-	@echo "N.B. You won't be able to view it unless you put it in" \
-	      "~/Library/Documentation/Help or install it in your application" \
-	      "bundle."
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/EasySNMP"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/EasySNMP"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-coverage:
-	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
-	@echo "Testing of coverage in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/coverage/python.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/_static/easysnmp.png b/docs/_static/easysnmp.png
deleted file mode 100644
index 353983c..0000000
Binary files a/docs/_static/easysnmp.png and /dev/null differ
diff --git a/docs/_static/easysnmp.svg b/docs/_static/easysnmp.svg
deleted file mode 100644
index bab9453..0000000
--- a/docs/_static/easysnmp.svg
+++ /dev/null
@@ -1,770 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    xmlns="http://www.w3.org/2000/svg"
-    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-    xmlns:cc="http://creativecommons.org/ns#"
-    xmlns:xlink="http://www.w3.org/1999/xlink"
-    xmlns:dc="http://purl.org/dc/elements/1.1/"
-    xmlns:svg="http://www.w3.org/2000/svg"
-    xmlns:ns1="http://sozi.baierouge.fr"
-    id="svg5675"
-    sodipodi:docname="Network.svg"
-    viewBox="0 0 208.92 171.38"
-    version="1.1"
-    inkscape:version="0.48.1 "
-  >
-  <defs
-      id="defs5677"
-    >
-    <linearGradient
-        id="linearGradient3793-3"
-        inkscape:collect="always"
-      >
-      <stop
-          id="stop3795-2"
-          style="stop-color:#ffffff"
-          offset="0"
-      />
-      <stop
-          id="stop3797-4"
-          style="stop-color:#ffffff;stop-opacity:0"
-          offset="1"
-      />
-    </linearGradient
-    >
-    <linearGradient
-        id="linearGradient3810-2"
-        inkscape:collect="always"
-      >
-      <stop
-          id="stop3812-8"
-          style="stop-color:#2d404c"
-          offset="0"
-      />
-      <stop
-          id="stop3814-5"
-          style="stop-color:#2d404c;stop-opacity:0"
-          offset="1"
-      />
-    </linearGradient
-    >
-    <linearGradient
-        id="linearGradient5408"
-        y2="381.56"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="268.95"
-        y1="332.94"
-        x1="268.95"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6031"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6041"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.69926 .033897 0 .69926 100.93 306.44)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6044"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.62486 0 0 .77820 183.43 174.07)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6048"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6058"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 193 322.1)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6061"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.59975 0 0 .74615 272.5 187.02)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6065"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6075"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 278.25 329.6)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6078"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.59975 0 0 .74615 357.94 188.85)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6082"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6092"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.55272 .028950 0 .55272 235.57 322.74)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6095"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.49401 0 0 .61512 301.02 209.63)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6099"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6109"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(1.0751 .13391 0 1.0751 56.76 215.07)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6112"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(0.967 0 0 1.1965 184.69 12.01)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-  </defs
-  >
-  <sodipodi:namedview
-      id="base"
-      bordercolor="#666666"
-      inkscape:pageshadow="2"
-      inkscape:window-y="-8"
-      fit-margin-left="0"
-      pagecolor="#ffffff"
-      inkscape:window-height="988"
-      inkscape:window-maximized="0"
-      inkscape:zoom="1"
-      inkscape:window-x="-8"
-      showgrid="false"
-      borderopacity="1.0"
-      inkscape:current-layer="layer1"
-      inkscape:cx="396.60045"
-      inkscape:cy="157.11894"
-      fit-margin-top="0"
-      fit-margin-right="0"
-      fit-margin-bottom="0"
-      inkscape:window-width="1680"
-      inkscape:pageopacity="0.0"
-      inkscape:document-units="px"
-  />
-  <g
-      id="layer1"
-      inkscape:label="Layer 1"
-      inkscape:groupmode="layer"
-      transform="translate(-298.4 -518.1)"
-    >
-    <path
-        id="path5254"
-        d="m506.57 596.06c3.0655 8.4856-3.6607 15.061-15.271 14.326-0.867 30.196-28.291 57.516-72.466 63.105-4.82 10.121-15.775 17.013-28.152 15.86-12.365-1.1516-21.448-9.8963-23.791-20.66-41.609-13.475-61.794-44.979-55.64-74.488-11.03-1.4854-15.801-8.9284-10.982-16.523 4.4852-7.068 15.806-11.775 25.895-11.248 15.56-16.656 40.784-26.463 66.418-27.57 1.2098-4.5061 8.5414-7.3986 16.639-6.6946 8.1024 0.70443 14.622 4.8053 14.756 9.4341 24.953 5.5308 47.562 19.57 59.057 38.699 10.287 1.1314 20.689 7.8758 23.538 15.76m-6.1743-0.55006c-1.9073-5.7122-9.3379-10.564-16.886-11.234-7.5437-0.66923-12.641 3.0671-11.477 8.7071 1.2282 5.9511 8.8349 11.498 17.143 12.241 0.5194 0.0465 1.0273 0.0685 1.5215 0.0755 7.3923 0.0934 11.582-4.1482 9.6988-9.7893l-0.0002-0.00045m-15.872 13.662c-8.1544-2.3985-15.049-7.7727-17.681-13.675l-44.327-3.9543c-2.0215 6.4721-10.095 11.142-19.835 10.862l-3.7567 34.092c12.803 2.0766 22.789 13.039 22.506 26.339-0.012 0.5783-0.091 1.1429-0.1408 1.7131 37.645-5.9372 61.401-29.146 63.235-55.376m-7.106-28.907c-10.336-17.654-30.98-30.716-54.107-36.003-2.0022 3.6214-8.2233 5.9928-15.562 5.5052l-2.7037 23.627c9.4571 1.0666 17.053 6.8108 17.879 13.732l42.796 3.8104c-0.2265-5.8076 4.5764-9.8903 11.698-10.671m-64.275 81.808c0.5012-9.9466-7.036-18.075-17.006-18.986-9.9621-0.90961-19.216 5.6751-21.043 15.486-1.9641 10.546 5.3554 20.32 16.696 21.372 11.35 1.0529 20.814-7.1783 21.353-17.872m3.7289-74.004c0.2772-5.5001-5.4641-10.189-12.966-10.855-7.4971-0.66509-14.203 2.9153-15.214 8.3441-1.0667 5.7272 4.584 11.082 12.836 11.821 8.2571 0.73909 15.052-3.5076 15.344-9.3104m2.3497-46.631c0.1691-3.3559-4.3847-6.3285-10.289-6.8424-5.9013-0.51362-11.05 1.6123-11.667 4.9263-0.6434 3.4551 3.8663 6.742 10.225 7.2985 6.3623 0.55682 11.554-1.8836 11.73-5.3825m-27.938 94.871l4.8735-34.87c-8.5426-2.3232-14.126-8.3327-13.788-14.746l-42.778-3.814c-3.5981 5.9881-12.307 10.616-21.579 11.457-4.2383 25.812 13.395 52.643 48.555 65.227 0.085-0.58249 0.1459-1.1648 0.2721-1.7484 2.5602-11.844 12.93-20.252 24.446-21.505m7.9645-62.967l3.5092-24.366c-5.391-1.3811-9.2398-4.2238-10.147-7.3953-23.76 1.1758-46.845 10.332-60.958 25.701 6.4822 1.796 10.283 6.1512 9.519 11.351l42.353 3.7688c2.4788-4.9603 8.6188-8.3874 15.724-9.0591m-64.902 7.3754c2.4219-5.2917-1.66-9.8205-9.1155-10.482-7.4513-0.66103-15.737 2.7662-18.884 7.9874-3.319 5.5074 0.4124 10.675 8.6087 11.408 8.2016 0.7341 16.836-3.3319 19.391-8.9138"
-        style="block-progression:tb;text-indent:0;color:#000000;text-transform:none;fill:#486a83"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5258"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99233 .12360 0 1 0 0)"
-        rx="6.6358"
-        ry="6.5849"
-        height="32.521"
-        width="32.773"
-        y="588.3"
-        x="379.71"
-    />
-    <rect
-        id="rect5260"
-        style="color:#000000;fill:url(#linearGradient6112)"
-        transform="matrix(.99233 .12360 0 1 0 0)"
-        rx="3.8565"
-        ry="4.7716"
-        height="9.5432"
-        width="29.252"
-        y="589.3"
-        x="381.47"
-    />
-    <path
-        id="path5262"
-        d="m376.8 659.05v2.1166c0 3.648 2.9369 6.9507 6.5849 7.4051l19.352 2.4104c3.648 0.45439 6.5849-2.1167 6.5849-5.7647v-2.1166c0 3.648-2.9369 6.2191-6.5849 5.7647l-19.352-2.4104c-3.648-0.45438-6.5849-3.7571-6.5849-7.4051z"
-        style="color:#000000;fill:url(#linearGradient6109)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5264"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5266"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.79051 .098462 0 .56126 181.66 387.88)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5268"
-        d="m383.82 626.9c-0.008 0.15502-0.0335 0.30826-0.0335 0.46618 0 5.0469 4.0913 9.6479 9.1383 10.276 5.0469 0.62863 9.1383-2.9531 9.1383-8 0-0.15792-0.0257-0.3176-0.0335-0.47453-0.25371 4.7884-4.2215 8.1421-9.1047 7.5339-4.8832-0.60823-8.851-4.9504-9.1047-9.802z"
-        style="color:#000000;fill:url(#linearGradient6099)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5270"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5272"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.79051 .098462 0 .56126 181.66 387.88)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5274"
-        d="m383.82 626.9c-0.008 0.15502-0.0335 0.30826-0.0335 0.46618 0 5.0469 4.0913 9.6479 9.1383 10.276 5.0469 0.62863 9.1383-2.9531 9.1383-8 0-0.15792-0.0257-0.3176-0.0335-0.47453-0.25371 4.7884-4.2215 8.1421-9.1047 7.5339-4.8832-0.60823-8.851-4.9504-9.1047-9.802z"
-        style="color:#000000;fill:url(#linearGradient6099)"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5278"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99863 .052306 0 1 0 0)"
-        rx="3.39"
-        ry="3.3854"
-        height="16.72"
-        width="16.743"
-        y="505.91"
-        x="400.65"
-    />
-    <rect
-        id="rect5280"
-        style="color:#000000;fill:url(#linearGradient6095)"
-        transform="matrix(.99863 .052306 0 1 0 0)"
-        rx="1.9702"
-        ry="2.4531"
-        height="4.9063"
-        width="14.944"
-        y="506.43"
-        x="401.55"
-    />
-    <path
-        id="path5282"
-        style="color:#000000;fill:url(#linearGradient6092)"
-        inkscape:connector-curvature="0"
-        d="m400.1 539.11v1.0882c0 1.8755 1.5099 3.4645 3.3854 3.5627l9.949 0.52111c1.8755 0.0982 3.3854-1.3326 3.3854-3.2081v-1.0882c0 1.8755-1.5099 3.3063-3.3854 3.2081l-9.949-0.52111c-1.8755-0.0982-3.3854-1.6872-3.3854-3.5627z"
-    />
-    <path
-        id="path5284"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5286"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.40641 .021287 0 .28855 299.78 406.94)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5288"
-        style="color:#000000;fill:url(#linearGradient6082)"
-        inkscape:connector-curvature="0"
-        d="m403.71 522.33c-0.004 0.08-0.0172 0.15972-0.0172 0.24091 0 2.5947 2.1034 4.8083 4.6981 4.9442 2.5947 0.13591 4.6981-1.8573 4.6981-4.452 0-0.0812-0.0132-0.16233-0.0172-0.24272-0.13044 2.4712-2.1704 4.3426-4.6808 4.2111-2.5105-0.13149-4.5504-2.2166-4.6808-4.7015z"
-    />
-    <path
-        id="path5290"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5292"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.40641 .021287 0 .28855 299.78 406.94)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5294"
-        style="color:#000000;fill:url(#linearGradient6082)"
-        inkscape:connector-curvature="0"
-        d="m403.71 522.33c-0.004 0.08-0.0172 0.15972-0.0172 0.24091 0 2.5947 2.1034 4.8083 4.6981 4.9442 2.5947 0.13591 4.6981-1.8573 4.6981-4.452 0-0.0812-0.0132-0.16233-0.0172-0.24272-0.13044 2.4712-2.1704 4.3426-4.6808 4.2111-2.5105-0.13149-4.5504-2.2166-4.6808-4.7015z"
-    />
-    <rect
-        id="rect5298"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="4.1157"
-        ry="4.1066"
-        height="20.281"
-        width="20.326"
-        y="548.24"
-        x="478.9"
-    />
-    <rect
-        id="rect5300"
-        style="color:#000000;fill:url(#linearGradient6078)"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="2.3918"
-        ry="2.9757"
-        height="5.9514"
-        width="18.142"
-        y="548.87"
-        x="479.99"
-    />
-    <path
-        id="path5302"
-        d="m477.84 594.91v1.32c0 2.275 1.8315 4.2285 4.1066 4.38l12.068 0.80346c2.275 0.15146 4.1066-1.5581 4.1066-3.8332v-1.32c0 2.275-1.8315 3.9846-4.1066 3.8332l-12.068-0.80345c-2.275-0.15147-4.1066-2.1049-4.1066-4.38z"
-        style="color:#000000;fill:url(#linearGradient6075)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5304"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5306"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 356.14 432.86)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5308"
-        d="m482.22 574.61c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-        style="color:#000000;fill:url(#linearGradient6065)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5310"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5312"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 356.14 432.86)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5314"
-        d="m482.22 574.61c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-        style="color:#000000;fill:url(#linearGradient6065)"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5318"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="4.1157"
-        ry="4.1066"
-        height="20.281"
-        width="20.326"
-        y="546.41"
-        x="393.46"
-    />
-    <rect
-        id="rect5320"
-        style="color:#000000;fill:url(#linearGradient6061)"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="2.3918"
-        ry="2.9757"
-        height="5.9514"
-        width="18.142"
-        y="547.04"
-        x="394.55"
-    />
-    <path
-        id="path5322"
-        style="color:#000000;fill:url(#linearGradient6058)"
-        inkscape:connector-curvature="0"
-        d="m392.59 587.4v1.32c0 2.275 1.8315 4.2285 4.1066 4.38l12.068 0.80346c2.275 0.15146 4.1066-1.5581 4.1066-3.8332v-1.32c0 2.275-1.8315 3.9846-4.1066 3.8332l-12.068-0.80345c-2.275-0.15147-4.1066-2.1049-4.1066-4.38z"
-    />
-    <path
-        id="path5324"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5326"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 270.9 425.35)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5328"
-        style="color:#000000;fill:url(#linearGradient6048)"
-        inkscape:connector-curvature="0"
-        d="m396.97 567.1c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-    />
-    <path
-        id="path5330"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5332"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 270.9 425.35)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5334"
-        style="color:#000000;fill:url(#linearGradient6048)"
-        inkscape:connector-curvature="0"
-        d="m396.97 567.1c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-    />
-    <rect
-        id="rect5338"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99883 .048418 0 1 0 0)"
-        rx="4.288"
-        ry="4.2829"
-        height="21.153"
-        width="21.177"
-        y="548.89"
-        x="309.46"
-    />
-    <rect
-        id="rect5340"
-        style="color:#000000;fill:url(#linearGradient6044)"
-        transform="matrix(.99883 .048418 0 1 0 0)"
-        rx="2.492"
-        ry="3.1035"
-        height="6.2071"
-        width="18.902"
-        y="549.55"
-        x="310.59"
-    />
-    <path
-        id="path5342"
-        style="color:#000000;fill:url(#linearGradient6041)"
-        inkscape:connector-curvature="0"
-        d="m309.09 579.37v1.3767c0 2.3728 1.9102 4.3756 4.283 4.4906l12.587 0.61013c2.3728 0.11502 4.283-1.7026 4.283-4.0753v-1.3767c0 2.3728-1.9102 4.1904-4.283 4.0753l-12.587-0.61014c-2.3728-0.11502-4.283-2.1178-4.283-4.4906z"
-    />
-    <path
-        id="path5344"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5346"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.51416 .024924 0 .36505 182.17 412.65)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5348"
-        style="color:#000000;fill:url(#linearGradient6031)"
-        inkscape:connector-curvature="0"
-        d="m313.66 558.11c-0.005 0.10119-0.0218 0.20215-0.0218 0.30487 0 3.2826 2.6611 6.0727 5.9437 6.2318 3.2826 0.15912 5.9437-2.373 5.9437-5.6556 0-0.10272-0.0167-0.20531-0.0218-0.30699-0.16502 3.127-2.7458 5.5047-5.9218 5.3507-3.1761-0.15396-5.7568-2.7818-5.9218-5.9248z"
-    />
-    <path
-        id="path5350"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5352"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.51416 .024924 0 .36505 182.17 412.65)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5354"
-        style="color:#000000;fill:url(#linearGradient6031)"
-        inkscape:connector-curvature="0"
-        d="m313.66 558.11c-0.005 0.10119-0.0218 0.20215-0.0218 0.30487 0 3.2826 2.6611 6.0727 5.9437 6.2318 3.2826 0.15912 5.9437-2.373 5.9437-5.6556 0-0.10272-0.0167-0.20531-0.0218-0.30699-0.16502 3.127-2.7458 5.5047-5.9218 5.3507-3.1761-0.15396-5.7568-2.7818-5.9218-5.9248z"
-    />
-  </g
-  >
-  <metadata
-    >
-    <rdf:RDF
-      >
-      <cc:Work
-        >
-        <dc:format
-          >image/svg+xml</dc:format
-        >
-        <dc:type
-            rdf:resource="http://purl.org/dc/dcmitype/StillImage"
-        />
-        <cc:license
-            rdf:resource="http://creativecommons.org/licenses/publicdomain/"
-        />
-        <dc:publisher
-          >
-          <cc:Agent
-              rdf:about="http://openclipart.org/"
-            >
-            <dc:title
-              >Openclipart</dc:title
-            >
-          </cc:Agent
-          >
-        </dc:publisher
-        >
-        <dc:title
-          >Network</dc:title
-        >
-        <dc:date
-          >2011-08-09T15:31:22</dc:date
-        >
-        <dc:description
-          >Network</dc:description
-        >
-        <dc:source
-          >https://openclipart.org/detail/154453/network-by-printerkiller</dc:source
-        >
-        <dc:creator
-          >
-          <cc:Agent
-            >
-            <dc:title
-              >PrinterKiller</dc:title
-            >
-          </cc:Agent
-          >
-        </dc:creator
-        >
-        <dc:subject
-          >
-          <rdf:Bag
-            >
-            <rdf:li
-              >Network web internet connect www</rdf:li
-            >
-          </rdf:Bag
-          >
-        </dc:subject
-        >
-      </cc:Work
-      >
-      <cc:License
-          rdf:about="http://creativecommons.org/licenses/publicdomain/"
-        >
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#Reproduction"
-        />
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#Distribution"
-        />
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
-        />
-      </cc:License
-      >
-    </rdf:RDF
-    >
-  </metadata
-  >
-</svg
->
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index a10a072..0000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import sys
-import os
-
-# Include the parent path so that the package may be imported by autodoc
-sys.path.insert(0, os.path.abspath(os.path.pardir))
-
-# Enable the appropriate Sphinx extensions
-extensions = ['sphinx.ext.autodoc']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = 'Easy SNMP'
-copyright = '2015-2022, Fotis Gimian, Kent Coble'
-author = 'Fotis Gimian, Kent Coble'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The theme to use for HTML and HTML Help pages.
-html_theme = 'alabaster'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the Alabaster
-# documentation at https://github.com/bitprophet/alabaster.
-html_theme_options = {
-    'github_user': 'kamakazikamikaze',
-    'github_repo': 'easysnmp',
-    'github_banner': True,
-    'logo': 'easysnmp.svg',
-    'logo_name': True,
-    'font_family': "'Hiragino Mincho Pro', Georgia, serif"
-}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Custom sidebar templates, maps document names to template names.
-html_sidebars = {
-    '**': [
-        'about.html',
-        'localtoc.html',
-        'relations.html',
-        'searchbox.html',
-    ]
-}
diff --git a/docs/easy_api.rst b/docs/easy_api.rst
deleted file mode 100644
index 2dadf3d..0000000
--- a/docs/easy_api.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-Easy API
---------
-
-.. currentmodule:: easysnmp
-
-.. autofunction:: snmp_get
-.. autofunction:: snmp_set
-.. autofunction:: snmp_set_multiple
-.. autofunction:: snmp_get_next
-.. autofunction:: snmp_get_bulk
-.. autofunction:: snmp_walk
-.. autofunction:: snmp_bulkwalk
\ No newline at end of file
diff --git a/docs/exceptions.rst b/docs/exceptions.rst
deleted file mode 100644
index 260f6e1..0000000
--- a/docs/exceptions.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-Exceptions
-----------
-
-.. currentmodule:: easysnmp
-
-.. autoclass:: EasySNMPError
-.. autoclass:: EasySNMPConnectionError
-.. autoclass:: EasySNMPTimeoutError
-.. autoclass:: EasySNMPUnknownObjectIDError
-.. autoclass:: EasySNMPNoSuchObjectError
-.. autoclass:: EasySNMPNoSuchInstanceError
-.. autoclass:: EasySNMPUndeterminedTypeError
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index b0092e4..0000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,161 +0,0 @@
-Welcome to Easy SNMP
-====================
-*A blazingly fast and Pythonic SNMP library based on the official
-Net-SNMP bindings*
-
-Introduction
-------------
-
-This is a fork of the official `Net-SNMP Python Bindings`_ but attempts to
-bring a more Pythonic interface to the library.   Check out the
-`Net-SNMP website`_ for more information about SNMP.
-
-This module provides a full featured SNMP client API supporting all dialects
-of the SNMP protocol.
-
-.. _Net-SNMP Python Bindings: http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings
-.. _Net-SNMP website: http://www.net-snmp.org/
-
-Why Another Library?
---------------------
-
-* The `original Net-SNMP Python library`_ is a great starting point but is
-  quite un-Pythonic and lacks proper unit tests and documentation.
-* `PySNMP`_ is written in pure Python and therefore has a huge performance hit.
-  In some brief tests, I estimate that both the Net-SNMP Python bindings and
-  Easy SNMP are more than 4 times faster. Further to this, PySNMP has an even
-  less Pythonic interface than the official Net-SNMP bindings.
-* Many other libraries like `Snimpy`_ are sadly based on PySNMP and so they
-  suffer the same performance penalty.
-
-.. _original Net-SNMP Python library: http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings
-.. _PySNMP: http://pysnmp.sourceforge.net/
-.. _Snimpy: https://snimpy.readthedocs.org/en/latest/
-
-Installation
-------------
-EasySNMP has been tested and is supported on systems running Net-SNMP
-5.7.x and newer. All non-EOL versions of Python 3 are fully supported, with 2.7
-and recent EOL versions of Python 3 receiving partial support.
-
-If your OS ships with a supported version of Net-SNMP, then you can install it
-without compiling it via your package manager:
-
-On RHEL / CentOS systems:
-
-.. code-block:: bash
-
-    sudo yum install net-snmp-devel
-
-On Debian / Ubuntu systems:
-
-.. code-block:: bash
-
-    sudo apt-get install libsnmp-dev snmp-mibs-downloader
-
-On macOS systems:
-
-.. code-block:: bash
-
-    brew install net-snmp
-
-If your OS doesn't ship with Net-SNMP 5.7.x or newer, please follow instructions
-provided on the `Net-SNMP install page <http://www.net-snmp.org/docs/INSTALL.html>`_
-to build and install Net-SNMP on your system.
-
-You'll also need to ensure that you have the following packages installed so
-that Easy SNMP installs correctly:
-
-On RHEL / CentOS systems:
-
-.. code-block:: bash
-
-    sudo yum install gcc python-devel
-
-On Debian / Ubuntu systems:
-
-.. code-block:: bash
-
-    sudo apt-get install gcc python-dev
-
-On macOS systems:
-
-.. code-block:: bash
-
-    brew install gcc
-
-Install Easy SNMP via pip as follows:
-
-.. code-block:: bash
-
-    pip install easysnmp
-
-Quick Start
------------
-There are primarily two ways you can use the Easy SNMP library.
-
-The first is with the use of a Session object which is most suitable when you
-are planning on requesting multiple pieces of SNMP data from a source.
-
-.. code-block:: python
-
-    from easysnmp import Session
-
-    # Create an SNMP session to be used for all our requests
-    session = Session(hostname='localhost', community='public', version=2)
-
-    # You may retrieve an individual OID using an SNMP GET
-    location = session.get('sysLocation.0')
-
-    # You may also specify the OID as a tuple (name, index)
-    # Note: the index is specified as a string as it can be of other types than
-    # just a regular integer
-    contact = session.get(('sysContact', '0'))
-
-    # And of course, you may use the numeric OID too
-    description = session.get('.1.3.6.1.2.1.1.1.0')
-
-    # Set a variable using an SNMP SET
-    session.set('sysLocation.0', 'The SNMP Lab')
-
-    # Perform an SNMP walk
-    system_items = session.walk('system')
-
-    # Each returned item can be used normally as its related type (str or int)
-    # but also has several extended attributes with SNMP-specific information
-    for item in system_items:
-        print '{oid}.{oid_index} {snmp_type} = {value}'.format(
-            oid=item.oid,
-            oid_index=item.oid_index,
-            snmp_type=item.snmp_type,
-            value=item.value
-        )
-
-You may also use Easy SNMP via its simple interface which is intended for
-one-off operations where you wish to specify all details in the request:
-
-.. code-block:: python
-
-    from easysnmp import snmp_get, snmp_set, snmp_walk
-
-    # Grab a single piece of information using an SNMP GET
-    snmp_get('sysDescr.0', hostname='localhost', community='public', version=1)
-
-    # Perform an SNMP SET to update data
-    snmp_set(
-        'sysLocation.0', 'My Cool Place',
-        hostname='localhost', community='public', version=1
-    )
-
-    # Perform an SNMP walk
-    snmp_walk('system', hostname='localhost', community='public', version=1)
-
-API
----
-
-.. toctree::
-   :maxdepth: 2
-
-   session_api
-   easy_api
-   exceptions
diff --git a/docs/session_api.rst b/docs/session_api.rst
deleted file mode 100644
index 8808dd6..0000000
--- a/docs/session_api.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Session API
------------
-
-.. currentmodule:: easysnmp
-
-.. autoclass:: Session
-   :members: get, set, set_multiple, get_next, get_bulk, walk, bulkwalk, update_session
diff --git a/easysnmp.egg-info/PKG-INFO b/easysnmp.egg-info/PKG-INFO
new file mode 100644
index 0000000..78b2150
--- /dev/null
+++ b/easysnmp.egg-info/PKG-INFO
@@ -0,0 +1,199 @@
+Metadata-Version: 2.1
+Name: easysnmp
+Version: 0.2.6
+Summary: A blazingly fast and Pythonic SNMP library based on the official Net-SNMP bindings
+Home-page: https://github.com/kamakazikamikaze/easysnmp
+Author: Kent Coble
+Author-email: coblekent@gmail.com
+License: BSD
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Topic :: System :: Networking
+Classifier: Topic :: System :: Networking :: Monitoring
+License-File: LICENSE
+
+Easy SNMP
+=========
+
+|Python Code Style| |Build Status| |Discussions| |License|
+
+.. |Python Code Style| image:: https://img.shields.io/badge/code%20style-black-000000.svg
+    :target: https://github.com/psf/black
+.. |Build Status| image:: https://img.shields.io/github/workflow/status/easysnmp/easysnmp/build
+   :target: https://github.com/easysnmp/easysnmp/actions
+.. |License| image:: https://img.shields.io/badge/license-BSD-blue.svg
+   :target: https://github.com/kamakazikamikaze/easysnmp/blob/master/LICENSE
+.. |Discussions| image:: https://img.shields.io/github/discussions/easysnmp/easysnmp
+   :alt: Join the Discussions!
+   :target: https://github.com/easysnmp/easysnmp
+
+.. image:: https://raw.githubusercontent.com/easysnmp/easysnmp/master/images/easysnmp-logo.png
+    :alt: Easy SNMP Logo
+
+Artwork courtesy of `Open Clip Art
+Library <https://openclipart.org/detail/154453/network>`_
+
+
+Introduction
+------------
+
+Easy SNMP is a fork of `Net-SNMP Python
+Bindings <http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings>`_
+that attempts to bring a more Pythonic interface to the library. Check
+out the `Net-SNMP website <http://www.net-snmp.org/>`_ for more
+information about SNMP.
+
+This module provides a full-featured SNMP client API and supports all
+dialects of the SNMP protocol.
+
+Why Another Library?
+--------------------
+
+- The `original Net-SNMP Python
+  library <http://net-snmp.sourceforge.net/wiki/index.php/Python_Bindings>`_
+  is a great starting point but is quite un-Pythonic and lacks proper unit tests and documentation.
+- `PySNMP <http://pysnmp.sourceforge.net/>`_ is entirely written in Python
+  and therefore has a huge performance hit. In some brief tests, I
+  estimate that both the Net-SNMP Python bindings and Easy SNMP are more than 4 times faster than PySNMP. Further to this, PySNMP has an even less Pythonic interface than the official Net-SNMP bindings.
+- Many other libraries like `Snimpy <https://snimpy.readthedocs.org/en/latest/>`_ are sadly based on PySNMP, so they also suffer performance penalty.
+
+Quick Start
+-----------
+
+There are primarily two ways you can use the Easy SNMP library:
+
+1. By using a Session object which is most suitable
+when you want to request multiple pieces of SNMP data from a
+source:
+
+.. code:: python
+
+    from easysnmp import Session
+
+    # Create an SNMP session to be used for all our requests
+    session = Session(hostname='localhost', community='public', version=2)
+
+    # You may retrieve an individual OID using an SNMP GET
+    location = session.get('sysLocation.0')
+
+    # You may also specify the OID as a tuple (name, index)
+    # Note: the index is specified as a string as it can be of other types than
+    # just a regular integer
+    contact = session.get(('sysContact', '0'))
+
+    # And of course, you may use the numeric OID too
+    description = session.get('.1.3.6.1.2.1.1.1.0')
+
+    # Set a variable using an SNMP SET
+    session.set('sysLocation.0', 'The SNMP Lab')
+
+    # Perform an SNMP walk
+    system_items = session.walk('system')
+
+    # Each returned item can be used normally as its related type (str or int)
+    # but also has several extended attributes with SNMP-specific information
+    for item in system_items:
+        print '{oid}.{oid_index} {snmp_type} = {value}'.format(
+            oid=item.oid,
+            oid_index=item.oid_index,
+            snmp_type=item.snmp_type,
+            value=item.value
+        )
+
+2. By using Easy SNMP via its simple interface which is intended
+for one-off operations (where you wish to specify all details in the
+request):
+
+.. code:: python
+
+    from easysnmp import snmp_get, snmp_set, snmp_walk
+
+    # Grab a single piece of information using an SNMP GET
+    snmp_get('sysDescr.0', hostname='localhost', community='public', version=1)
+
+    # Perform an SNMP SET to update data
+    snmp_set(
+        'sysLocation.0', 'My Cool Place',
+        hostname='localhost', community='public', version=1
+    )
+
+    # Perform an SNMP walk
+    snmp_walk('system', hostname='localhost', community='public', version=1)
+
+Documentation
+-------------
+
+Please check out the `Easy SNMP documentation at Read the
+Docs <http://easysnmp.readthedocs.org/>`_. This includes installation
+instructions for various operating systems.
+
+You may generate the documentation as follows:
+
+.. code:: bash
+
+    # Install Sphinx
+    pip install sphinx
+
+    # You may optionally export the READTHEDOCS environment variable to build docs
+    # on systems where you haven't built the C interface
+    export READTHEDOCS=1
+
+    # Build the documentation into static HTML pages
+    cd docs
+    make html
+
+Acknowledgments
+---------------
+
+I'd like to say thanks to the following folks who have made this project
+possible:
+
+-  **Giovanni Marzot**: the original author
+-  **ScienceLogic, LLC**: sponsored the initial development of this
+   module
+-  **Wes Hardaker and the net-snmp-coders**: for their hard work and
+   dedication
+- **fgimian and nnathan**: the original contributors to this codebase
+
+Running Tests
+-------------
+
+Tests use `Pytest <https://github.com/pytest-dev/pytest>`_. You can run
+them with the following:
+
+.. code:: bash
+
+    git clone https://github.com/easysnmp/easysnmp.git
+    cd easysnmp
+    pip install pytest
+    pytest
+
+License
+-------
+
+Easy SNMP is released under the **BSD** license. Please see the
+`LICENSE <https://github.com/easysnmp/easysnmp/blob/master/LICENSE>`_
+file for more details.
+
+Copyright
+---------
+
+The original version of this library is copyright (c) 2006 G. S. Marzot.
+All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Net-SNMP itself.
+
+Copyright (c) 2006 SPARTA, Inc. All Rights Reserved. This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Net-SNMP itself.
diff --git a/easysnmp.egg-info/SOURCES.txt b/easysnmp.egg-info/SOURCES.txt
new file mode 100644
index 0000000..955febb
--- /dev/null
+++ b/easysnmp.egg-info/SOURCES.txt
@@ -0,0 +1,20 @@
+LICENSE
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+easysnmp/__init__.py
+easysnmp/compat.py
+easysnmp/easy.py
+easysnmp/exceptions.py
+easysnmp/helpers.py
+easysnmp/interface.c
+easysnmp/interface.h
+easysnmp/session.py
+easysnmp/simple_bitarray.h
+easysnmp/utils.py
+easysnmp/variables.py
+easysnmp.egg-info/PKG-INFO
+easysnmp.egg-info/SOURCES.txt
+easysnmp.egg-info/dependency_links.txt
+easysnmp.egg-info/top_level.txt
\ No newline at end of file
diff --git a/easysnmp.egg-info/dependency_links.txt b/easysnmp.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/easysnmp.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/easysnmp.egg-info/top_level.txt b/easysnmp.egg-info/top_level.txt
new file mode 100644
index 0000000..07ccecd
--- /dev/null
+++ b/easysnmp.egg-info/top_level.txt
@@ -0,0 +1 @@
+easysnmp
diff --git a/easysnmp/compat.py b/easysnmp/compat.py
index ab4c920..50fe5d3 100644
--- a/easysnmp/compat.py
+++ b/easysnmp/compat.py
@@ -1,8 +1,10 @@
-import logging
 import sys
 
 PY3 = sys.version_info[0] == 3
 
+if PY3:  # Clear Flake8 warnings
+    unicode = None
+
 if PY3:
     text_type = str
 
@@ -23,19 +25,3 @@ else:
             return repr(s)[1:]
         else:
             return repr(s)
-
-
-class NullHandler(logging.Handler):
-    """
-    This handler does nothing. It's intended to be used to avoid the
-    "No handlers could be found for logger XXX" one-off warning.
-    """
-
-    def handle(self, record):
-        pass
-
-    def emit(self, record):
-        pass
-
-    def createLock(self):
-        self.lock = None
diff --git a/easysnmp/interface.c b/easysnmp/interface.c
index 9b0827d..c31c131 100644
--- a/easysnmp/interface.c
+++ b/easysnmp/interface.c
@@ -458,7 +458,7 @@ static int __snprint_value(char *buf, size_t buf_len,
                            netsnmp_variable_list *var,
                            struct tree *tp, int type, int flag)
 {
-    int len = 0;
+    size_t len = 0;
     u_char *ip;
     struct enum_list *ep;
 
@@ -796,9 +796,8 @@ static int __get_label_iid(char *name, char **last_label, char **iid,
         }
         lcp--;
     }
-
-    if (!found_label ||
-        (!isdigit((int)*(icp + 1)) && (flag & FAIL_ON_NULL_IID)))
+    // get_bulk with OID SysUpTime can cause us to access one byte past the string length
+    if (!found_label || (((icp + 1) < &(name[len + 1])) && !isdigit((int)*(icp + 1)) && (flag & FAIL_ON_NULL_IID)))
     {
         return FAILURE;
     }
@@ -848,7 +847,7 @@ static int __get_label_iid(char *name, char **last_label, char **iid,
 /* Convert a tag (string) to an OID array              */
 /* Tag can be either a symbolic name, or an OID string */
 static struct tree *__tag2oid(char *tag, char *iid, oid *oid_arr,
-                              int *oid_arr_len, int *type, int best_guess)
+                              size_t *oid_arr_len, int *type, int best_guess)
 {
     struct tree *tp = NULL;
     struct tree *rtp = NULL;
@@ -1007,7 +1006,7 @@ done:
  *
  * returns : SUCCESS, FAILURE
  */
-static int __concat_oid_str(oid *doid_arr, int *doid_arr_len, char *soid_str)
+static int __concat_oid_str(oid *doid_arr, size_t *doid_arr_len, char *soid_str)
 {
     char *soid_buf;
     char *cp;
@@ -1189,13 +1188,13 @@ static int __add_var_val_str(netsnmp_pdu *pdu, oid *name, int name_length,
 
 /* takes ss and pdu as input and updates the 'response' argument */
 /* the input 'pdu' argument will be freed */
-static int __send_sync_pdu(netsnmp_session *ss, netsnmp_pdu *pdu,
+static int __send_sync_pdu(netsnmp_session *ss, netsnmp_pdu **pdu,
                            netsnmp_pdu **response, int retry_nosuch,
                            char *err_str, int *err_num, int *err_ind,
                            bitarray *invalid_oids)
 {
     int status = 0;
-    long command = pdu->command;
+    long command = (*pdu)->command;
     char *tmp_err_str;
     size_t retry_num = 0;
 
@@ -1220,7 +1219,7 @@ static int __send_sync_pdu(netsnmp_session *ss, netsnmp_pdu *pdu,
 retry:
 
     Py_BEGIN_ALLOW_THREADS
-        status = snmp_sess_synch_response(ss, pdu, response);
+        status = snmp_sess_synch_response(ss, *pdu, response);
     Py_END_ALLOW_THREADS
 
         if ((*response == NULL) && (status == STAT_SUCCESS))
@@ -1264,7 +1263,7 @@ retry:
                     /* we haven't seen an errindex yet */
                     bitarray_set_bit(invalid_oids, (*response)->errindex - 1);
                 }
-                else if (last_errindex > (*response)->errindex)
+                else if (last_errindex > (long unsigned int)(*response)->errindex)
                 {
                     /* case (1) where error index is in descending order */
                     bitarray_set_bit(invalid_oids, (*response)->errindex - 1);
@@ -1285,13 +1284,13 @@ retry:
                  * (which indicates SNMP_ERR_NOERROR) or returns NULL
                  * likely indicating no more remaining variables.
                  */
-                pdu = snmp_fix_pdu(*response, command);
+                *pdu = snmp_fix_pdu(*response, command);
 
                 /*
                  * The condition when pdu==NULL will happen when
                  * there are no OIDs left to retry.
                  */
-                if (!pdu)
+                if (!*pdu)
                 {
                     status = STAT_SUCCESS;
                     goto done;
@@ -1432,7 +1431,7 @@ static int py_netsnmp_attr_string(PyObject *obj, char *attr_name, char **val,
             // Encode the provided attribute using latin-1 into bytes and
             // retrieve its value and length
             *attr_bytes = PyUnicode_AsEncodedString(attr, "latin-1", "surrogateescape");
-            if (!attr_bytes)
+            if (!(*attr_bytes))
             {
                 Py_DECREF(attr);
                 return -1;
@@ -1467,23 +1466,6 @@ static long long py_netsnmp_attr_long(PyObject *obj, char *attr_name)
     return val;
 }
 
-static void *py_netsnmp_attr_void_ptr(PyObject *obj, char *attr_name)
-{
-    void *val = NULL;
-
-    if (obj && attr_name && PyObject_HasAttrString(obj, attr_name))
-    {
-        PyObject *attr = PyObject_GetAttrString(obj, attr_name);
-        if (attr)
-        {
-            val = PyLong_AsVoidPtr(attr);
-            Py_DECREF(attr);
-        }
-    }
-
-    return val;
-}
-
 static int py_netsnmp_attr_set_string(PyObject *obj, char *attr_name,
                                       char *val, size_t len)
 {
@@ -1606,7 +1588,7 @@ static PyObject *create_session_capsule(SnmpSession *session)
     ctx->handle = handle;
     ctx->invalid_oids = (bitarray *)ctx->invalid_oids_buf;
     bitarray_buf_init(ctx->invalid_oids, sizeof(ctx->invalid_oids_buf));
-    return (capsule);
+    return capsule;
 done:
     if (handle)
     {
@@ -1944,7 +1926,7 @@ static PyObject *netsnmp_get(PyObject *self, PyObject *args)
     struct session_capsule_ctx *session_ctx = NULL;
     netsnmp_session *ss = NULL;
     oid *oid_arr = NULL;
-    int oid_arr_len = 0;
+    size_t oid_arr_len = 0;
     u_char *str_buf = NULL;
     u_char *str_bufp = NULL;
     char *err_str = NULL;
@@ -2092,11 +2074,11 @@ static PyObject *netsnmp_get(PyObject *self, PyObject *args)
         bitarray_clear_bits(invalid_oids, (size_t)varlist_len);
     }
 
-    status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str,
+    status = __send_sync_pdu(ss, &pdu, &response, retry_nosuch, err_str,
                              &err_num, &err_ind, invalid_oids);
 
     __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
-    if (status != 0)
+    if (status != STAT_SUCCESS)
     {
         error = 1;
         goto done;
@@ -2293,8 +2275,8 @@ static PyObject *netsnmp_getnext(PyObject *self, PyObject *args)
     PyObject *err_bytes = NULL;
     PyObject *tag_bytes = NULL;
     PyObject *iid_bytes = NULL;
-    int varlist_len = 0;
-    int varlist_ind;
+    unsigned int varlist_len = 0;
+    unsigned int varlist_ind;
     struct session_capsule_ctx *session_ctx = NULL;
     netsnmp_session *ss;
     netsnmp_pdu *pdu = NULL;
@@ -2303,7 +2285,7 @@ static PyObject *netsnmp_getnext(PyObject *self, PyObject *args)
     struct tree *tp;
     int len;
     oid *oid_arr;
-    int oid_arr_len = MAX_OID_LEN;
+    size_t oid_arr_len = MAX_OID_LEN;
     int type;
     char type_str[MAX_TYPE_NAME_LEN];
     int status;
@@ -2452,7 +2434,7 @@ static PyObject *netsnmp_getnext(PyObject *self, PyObject *args)
             }
         }
 
-        status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str,
+        status = __send_sync_pdu(ss, &pdu, &response, retry_nosuch, err_str,
                                  &err_num, &err_ind, invalid_oids);
 
         __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
@@ -2662,7 +2644,7 @@ static PyObject *netsnmp_walk(PyObject *self, PyObject *args)
     struct tree *tp;
     int len;
     oid **oid_arr = NULL;
-    int *oid_arr_len = NULL;
+    size_t *oid_arr_len = NULL;
     oid **oid_arr_broken_check = NULL;
     int *oid_arr_broken_check_len = NULL;
     int type;
@@ -2755,7 +2737,7 @@ static PyObject *netsnmp_walk(PyObject *self, PyObject *args)
         }
         Py_XDECREF(varlist_iter);
 
-        oid_arr_len = calloc(varlist_len, sizeof(int));
+        oid_arr_len = calloc(varlist_len, sizeof(size_t));
         oid_arr_broken_check_len = calloc(varlist_len, sizeof(int));
 
         oid_arr = calloc(varlist_len, sizeof(oid *));
@@ -2888,7 +2870,7 @@ static PyObject *netsnmp_walk(PyObject *self, PyObject *args)
 
         while (notdone)
         {
-            status = __send_sync_pdu(ss, pdu, &response, retry_nosuch,
+            status = __send_sync_pdu(ss, &pdu, &response, retry_nosuch,
                                      err_str, &err_num, &err_ind, invalid_oids);
             __py_netsnmp_update_session_errors(session, err_str, err_num,
                                                err_ind);
@@ -3102,7 +3084,7 @@ static PyObject *netsnmp_getbulk(PyObject *self, PyObject *args)
     struct tree *tp;
     int len;
     oid *oid_arr;
-    int oid_arr_len = MAX_OID_LEN;
+    size_t oid_arr_len = MAX_OID_LEN;
     int type;
     char type_str[MAX_TYPE_NAME_LEN];
     int status;
@@ -3112,7 +3094,7 @@ static PyObject *netsnmp_getbulk(PyObject *self, PyObject *args)
     size_t out_len = 0;
     int buf_over = 0;
     char *tag;
-    char *iid;
+    char *iid = NULL;
     int getlabel_flag = NO_FLAGS;
     int sprintval_flag = USE_BASIC;
     int old_format;
@@ -3230,7 +3212,7 @@ static PyObject *netsnmp_getbulk(PyObject *self, PyObject *args)
                 goto done;
             }
 
-            status = __send_sync_pdu(ss, pdu, &response, retry_nosuch,
+            status = __send_sync_pdu(ss, &pdu, &response, retry_nosuch,
                                      err_str, &err_num, &err_ind, NULL);
             __py_netsnmp_update_session_errors(session, err_str, err_num,
                                                err_ind);
@@ -3425,7 +3407,7 @@ static PyObject *netsnmp_bulkwalk(PyObject *self, PyObject *args)
     struct tree *tp = NULL;
     int len;
     oid **oid_arr = NULL;
-    int *oid_arr_len = NULL;
+    size_t *oid_arr_len = NULL;
     // char **initial_oid_str_arr = NULL;
     char **oid_str_arr = NULL;
     char **oid_idx_str_arr = NULL;
@@ -3523,7 +3505,7 @@ static PyObject *netsnmp_bulkwalk(PyObject *self, PyObject *args)
         }
         Py_XDECREF(varlist_iter);
 
-        oid_arr_len = calloc(varlist_len, sizeof(int));
+        oid_arr_len = calloc(varlist_len, sizeof(size_t));
         oid_arr = calloc(varlist_len, sizeof(oid *));
         // initial_oid_str_arr = calloc(varlist_len, sizeof(char *));
         oid_str_arr = calloc(varlist_len, sizeof(char *));
@@ -3652,7 +3634,7 @@ static PyObject *netsnmp_bulkwalk(PyObject *self, PyObject *args)
             while (notdone)
             {
                 py_log_msg(DEBUG, "netsnmp_bulkwalk: Sending pdu req");
-                status = __send_sync_pdu(ss, pdu, &response, retry_nosuch,
+                status = __send_sync_pdu(ss, &pdu, &response, retry_nosuch,
                                          err_str, &err_num, &err_ind, NULL);
 
                 __py_netsnmp_update_session_errors(session, err_str, err_num,
@@ -3877,7 +3859,7 @@ static PyObject *netsnmp_set(PyObject *self, PyObject *args)
     char *type_str;
     int len;
     oid *oid_arr = calloc(MAX_OID_LEN, sizeof(oid));
-    int oid_arr_len = MAX_OID_LEN;
+    size_t oid_arr_len = MAX_OID_LEN;
     int type;
     u_char tmp_val_str[STR_BUF_SIZE];
     int use_enums;
@@ -4006,7 +3988,7 @@ static PyObject *netsnmp_set(PyObject *self, PyObject *args)
                     goto done;
                 }
                 memset(tmp_val_str, 0, sizeof(tmp_val_str));
-                if (tmplen >= sizeof(tmp_val_str))
+                if (tmplen >= (long int)sizeof(tmp_val_str))
                 {
                     tmplen = sizeof(tmp_val_str) - 1;
                 }
@@ -4051,7 +4033,7 @@ static PyObject *netsnmp_set(PyObject *self, PyObject *args)
             }
         }
 
-        status = __send_sync_pdu(ss, pdu, &response, NO_RETRY_NOSUCH,
+        status = __send_sync_pdu(ss, &pdu, &response, NO_RETRY_NOSUCH,
                                  err_str, &err_num, &err_ind, NULL);
         __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
 
@@ -4111,14 +4093,12 @@ static PyObject *py_get_logger(char *logger_name)
      * https://docs.python.org/3.4/howto/logging.html#library-config recommends:
      * >>> logging.getLogger('foo').addHandler(logging.NullHandler())
      *
-     * However NullHandler doesn't come with python <2.6 and <3.1, so we need
-     * to improvise by using an identical copy in easysnmp.compat.
      */
 
-    null_handler = PyObject_CallMethod(easysnmp_compat_import, "NullHandler", NULL);
+    null_handler = PyObject_CallMethod(logging_import, "NullHandler", NULL);
     if (null_handler == NULL)
     {
-        const char *err_msg = "failed to call easysnmp.compat.NullHandler()";
+        const char *err_msg = "failed to call logging.NullHandler()";
         PyErr_SetString(PyExc_RuntimeError, err_msg);
         goto done;
     }
@@ -4145,7 +4125,7 @@ done:
 
 static void py_log_msg(int log_level, char *printf_fmt, ...)
 {
-    PyObject *log_msg = NULL, *pval;
+    PyObject *log_msg = NULL, *pval = NULL;
     PyObject *type, *value, *traceback;
     va_list fmt_args;
     PyErr_Fetch(&type, &value, &traceback);
diff --git a/easysnmp/interface.h b/easysnmp/interface.h
index 3d3c79f..65c4550 100644
--- a/easysnmp/interface.h
+++ b/easysnmp/interface.h
@@ -45,6 +45,17 @@
         }              \
     } while (0)
 
+// Available from 5.6.x and older
+#ifdef HAVE_EVP_MD_CTX_CREATE
+struct session_list
+{
+    struct session_list *next;
+    netsnmp_session *session;
+    netsnmp_transport *transport;
+    struct snmp_internal_session *internal;
+};
+#endif
+
 /******************************************************************************
  *
  * Data structures used in the 'interface.c' file are listed below
@@ -124,8 +135,8 @@ static int __get_type_str(int type, char *str, int log_error);
 static int __get_label_iid(char *name, char **last_label, char **iid,
                            int flag);
 static struct tree *__tag2oid(char *tag, char *iid, oid *oid_arr,
-                              int *oid_arr_len, int *type, int best_guess);
-static int __concat_oid_str(oid *doid_arr, int *doid_arr_len, char *soid_str);
+                              size_t *oid_arr_len, int *type, int best_guess);
+static int __concat_oid_str(oid *doid_arr, size_t *doid_arr_len, char *soid_str);
 static int __add_var_val_str(netsnmp_pdu *pdu, oid *name, int name_length,
                              char *val, int len, int type);
 
diff --git a/easysnmp/simple_bitarray.h b/easysnmp/simple_bitarray.h
index 62e691d..8108930 100644
--- a/easysnmp/simple_bitarray.h
+++ b/easysnmp/simple_bitarray.h
@@ -47,7 +47,7 @@ typedef unsigned int bitarray;
  * }
  */
 #define BITARRAY_DECLARE(name, nbits) \
-    bitarray (name)[1 + BITARRAY_NUM_BITS_TO_LIMBS((nbits))] = { nbits }
+    bitarray(name)[1 + BITARRAY_NUM_BITS_TO_LIMBS((nbits))] = {nbits}
 
 static inline size_t bitarray_num_limbs(bitarray *ba)
 {
@@ -95,7 +95,7 @@ static inline void bitarray_clear_bits(bitarray *ba, size_t nbits)
     }
     else
     {
-        size_t nbytes;
+        size_t nbytes = ba[0] / CHAR_BIT;
 
         /*
          * cases:
@@ -123,38 +123,37 @@ static inline void bitarray_clear_bits(bitarray *ba, size_t nbits)
     }
 }
 
-
 /*
  * Allocation functions
  */
 static inline bitarray *bitarray_alloc(size_t nbits)
 {
-        bitarray *ba = NULL;
+    bitarray *ba = NULL;
 
-        size_t nlimbs = 1 + BITARRAY_NUM_BITS_TO_LIMBS(nbits);
+    size_t nlimbs = 1 + BITARRAY_NUM_BITS_TO_LIMBS(nbits);
 
-        ba = malloc(sizeof(bitarray) * nlimbs);
-        if (ba)
-        {
-            ba[0] = nbits;
-        }
+    ba = malloc(sizeof(bitarray) * nlimbs);
+    if (ba)
+    {
+        ba[0] = nbits;
+    }
 
-        return ba;
+    return ba;
 }
 
 static inline bitarray *bitarray_calloc(size_t nbits)
 {
-        bitarray *ba = NULL;
+    bitarray *ba = NULL;
 
-        size_t nlimbs = 1 + BITARRAY_NUM_BITS_TO_LIMBS(nbits);
+    size_t nlimbs = 1 + BITARRAY_NUM_BITS_TO_LIMBS(nbits);
 
-        ba = calloc(sizeof(bitarray), nlimbs);
-        if (ba)
-        {
-            ba[0] = nbits;
-        }
+    ba = calloc(sizeof(bitarray), nlimbs);
+    if (ba)
+    {
+        ba[0] = nbits;
+    }
 
-        return ba;
+    return ba;
 }
 
 static inline void bitarray_free(bitarray *ba)
@@ -219,7 +218,7 @@ static inline void bitarray_print_base16(bitarray *ba)
     bitarray i;
     size_t num_limbs = bitarray_num_limbs(ba);
 
-    printf("DEBUG numbits=%lu\n", (unsigned long) ba[0]);
+    printf("DEBUG numbits=%lu\n", (unsigned long)ba[0]);
     printf("DEBUG sizeof(limb)=%lu\n", sizeof(ba[0]));
     printf("DEBUG num_limbs=%lu\n", num_limbs);
     for (i = 0; i <= num_limbs; i++)
@@ -232,7 +231,7 @@ static inline void bitarray_print_base16(bitarray *ba)
         {
             /* mask the byte we want to print in hex */
             unsigned long mask = (0xFFUL) << (j * CHAR_BIT);
-            c = (unsigned char) ((ba[i] & mask) >> (j * CHAR_BIT));
+            c = (unsigned char)((ba[i] & mask) >> (j * CHAR_BIT));
             printf("%02x", c);
         }
 
@@ -242,18 +241,4 @@ static inline void bitarray_print_base16(bitarray *ba)
     printf("\n");
 }
 
-
-/* ignore unused function warnings */
-static void wno_unused_function_simple_bitarray_h(void)
-{
-    (void) bitarray_num_bits(NULL);
-    (void) bitarray_change_bit(NULL, 0);
-    (void) bitarray_clear_bit(NULL, 0);
-    (void) bitarray_clear_bits(NULL, 0);
-    (void) bitarray_alloc(0);
-    (void) bitarray_calloc(0);
-    (void) bitarray_free(NULL);
-    return;
-}
-
 #endif
\ No newline at end of file
diff --git a/images/easysnmp-logo.png b/images/easysnmp-logo.png
deleted file mode 100644
index 94011fe..0000000
Binary files a/images/easysnmp-logo.png and /dev/null differ
diff --git a/images/easysnmp-logo.svg b/images/easysnmp-logo.svg
deleted file mode 100644
index bab9453..0000000
--- a/images/easysnmp-logo.svg
+++ /dev/null
@@ -1,770 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    xmlns="http://www.w3.org/2000/svg"
-    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-    xmlns:cc="http://creativecommons.org/ns#"
-    xmlns:xlink="http://www.w3.org/1999/xlink"
-    xmlns:dc="http://purl.org/dc/elements/1.1/"
-    xmlns:svg="http://www.w3.org/2000/svg"
-    xmlns:ns1="http://sozi.baierouge.fr"
-    id="svg5675"
-    sodipodi:docname="Network.svg"
-    viewBox="0 0 208.92 171.38"
-    version="1.1"
-    inkscape:version="0.48.1 "
-  >
-  <defs
-      id="defs5677"
-    >
-    <linearGradient
-        id="linearGradient3793-3"
-        inkscape:collect="always"
-      >
-      <stop
-          id="stop3795-2"
-          style="stop-color:#ffffff"
-          offset="0"
-      />
-      <stop
-          id="stop3797-4"
-          style="stop-color:#ffffff;stop-opacity:0"
-          offset="1"
-      />
-    </linearGradient
-    >
-    <linearGradient
-        id="linearGradient3810-2"
-        inkscape:collect="always"
-      >
-      <stop
-          id="stop3812-8"
-          style="stop-color:#2d404c"
-          offset="0"
-      />
-      <stop
-          id="stop3814-5"
-          style="stop-color:#2d404c;stop-opacity:0"
-          offset="1"
-      />
-    </linearGradient
-    >
-    <linearGradient
-        id="linearGradient5408"
-        y2="381.56"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="268.95"
-        y1="332.94"
-        x1="268.95"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6031"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6041"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.69926 .033897 0 .69926 100.93 306.44)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6044"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.62486 0 0 .77820 183.43 174.07)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6048"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6058"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 193 322.1)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6061"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.59975 0 0 .74615 272.5 187.02)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6065"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6075"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.67046 .044636 0 .67046 278.25 329.6)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6078"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.59975 0 0 .74615 357.94 188.85)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6082"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6092"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(.55272 .028950 0 .55272 235.57 322.74)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6095"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(.49401 0 0 .61512 301.02 209.63)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6099"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6109"
-        y2="376.2"
-        xlink:href="#linearGradient3810-2"
-        gradientUnits="userSpaceOnUse"
-        x2="267.91"
-        gradientTransform="matrix(1.0751 .13391 0 1.0751 56.76 215.07)"
-        y1="387.3"
-        x1="267.91"
-        inkscape:collect="always"
-    />
-    <linearGradient
-        id="linearGradient6112"
-        y2="490.81"
-        xlink:href="#linearGradient3793-3"
-        gradientUnits="userSpaceOnUse"
-        x2="219.81"
-        gradientTransform="matrix(0.967 0 0 1.1965 184.69 12.01)"
-        y1="442.19"
-        x1="219.81"
-        inkscape:collect="always"
-    />
-  </defs
-  >
-  <sodipodi:namedview
-      id="base"
-      bordercolor="#666666"
-      inkscape:pageshadow="2"
-      inkscape:window-y="-8"
-      fit-margin-left="0"
-      pagecolor="#ffffff"
-      inkscape:window-height="988"
-      inkscape:window-maximized="0"
-      inkscape:zoom="1"
-      inkscape:window-x="-8"
-      showgrid="false"
-      borderopacity="1.0"
-      inkscape:current-layer="layer1"
-      inkscape:cx="396.60045"
-      inkscape:cy="157.11894"
-      fit-margin-top="0"
-      fit-margin-right="0"
-      fit-margin-bottom="0"
-      inkscape:window-width="1680"
-      inkscape:pageopacity="0.0"
-      inkscape:document-units="px"
-  />
-  <g
-      id="layer1"
-      inkscape:label="Layer 1"
-      inkscape:groupmode="layer"
-      transform="translate(-298.4 -518.1)"
-    >
-    <path
-        id="path5254"
-        d="m506.57 596.06c3.0655 8.4856-3.6607 15.061-15.271 14.326-0.867 30.196-28.291 57.516-72.466 63.105-4.82 10.121-15.775 17.013-28.152 15.86-12.365-1.1516-21.448-9.8963-23.791-20.66-41.609-13.475-61.794-44.979-55.64-74.488-11.03-1.4854-15.801-8.9284-10.982-16.523 4.4852-7.068 15.806-11.775 25.895-11.248 15.56-16.656 40.784-26.463 66.418-27.57 1.2098-4.5061 8.5414-7.3986 16.639-6.6946 8.1024 0.70443 14.622 4.8053 14.756 9.4341 24.953 5.5308 47.562 19.57 59.057 38.699 10.287 1.1314 20.689 7.8758 23.538 15.76m-6.1743-0.55006c-1.9073-5.7122-9.3379-10.564-16.886-11.234-7.5437-0.66923-12.641 3.0671-11.477 8.7071 1.2282 5.9511 8.8349 11.498 17.143 12.241 0.5194 0.0465 1.0273 0.0685 1.5215 0.0755 7.3923 0.0934 11.582-4.1482 9.6988-9.7893l-0.0002-0.00045m-15.872 13.662c-8.1544-2.3985-15.049-7.7727-17.681-13.675l-44.327-3.9543c-2.0215 6.4721-10.095 11.142-19.835 10.862l-3.7567 34.092c12.803 2.0766 22.789 13.039 22.506 26.339-0.012 0.5783-0.091 1.1429-0.1408 1.7131 37.645-5.9372 61.401-29.146 63.235-55.376m-7.106-28.907c-10.336-17.654-30.98-30.716-54.107-36.003-2.0022 3.6214-8.2233 5.9928-15.562 5.5052l-2.7037 23.627c9.4571 1.0666 17.053 6.8108 17.879 13.732l42.796 3.8104c-0.2265-5.8076 4.5764-9.8903 11.698-10.671m-64.275 81.808c0.5012-9.9466-7.036-18.075-17.006-18.986-9.9621-0.90961-19.216 5.6751-21.043 15.486-1.9641 10.546 5.3554 20.32 16.696 21.372 11.35 1.0529 20.814-7.1783 21.353-17.872m3.7289-74.004c0.2772-5.5001-5.4641-10.189-12.966-10.855-7.4971-0.66509-14.203 2.9153-15.214 8.3441-1.0667 5.7272 4.584 11.082 12.836 11.821 8.2571 0.73909 15.052-3.5076 15.344-9.3104m2.3497-46.631c0.1691-3.3559-4.3847-6.3285-10.289-6.8424-5.9013-0.51362-11.05 1.6123-11.667 4.9263-0.6434 3.4551 3.8663 6.742 10.225 7.2985 6.3623 0.55682 11.554-1.8836 11.73-5.3825m-27.938 94.871l4.8735-34.87c-8.5426-2.3232-14.126-8.3327-13.788-14.746l-42.778-3.814c-3.5981 5.9881-12.307 10.616-21.579 11.457-4.2383 25.812 13.395 52.643 48.555 65.227 0.085-0.58249 0.1459-1.1648 0.2721-1.7484 2.5602-11.844 12.93-20.252 24.446-21.505m7.9645-62.967l3.5092-24.366c-5.391-1.3811-9.2398-4.2238-10.147-7.3953-23.76 1.1758-46.845 10.332-60.958 25.701 6.4822 1.796 10.283 6.1512 9.519 11.351l42.353 3.7688c2.4788-4.9603 8.6188-8.3874 15.724-9.0591m-64.902 7.3754c2.4219-5.2917-1.66-9.8205-9.1155-10.482-7.4513-0.66103-15.737 2.7662-18.884 7.9874-3.319 5.5074 0.4124 10.675 8.6087 11.408 8.2016 0.7341 16.836-3.3319 19.391-8.9138"
-        style="block-progression:tb;text-indent:0;color:#000000;text-transform:none;fill:#486a83"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5258"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99233 .12360 0 1 0 0)"
-        rx="6.6358"
-        ry="6.5849"
-        height="32.521"
-        width="32.773"
-        y="588.3"
-        x="379.71"
-    />
-    <rect
-        id="rect5260"
-        style="color:#000000;fill:url(#linearGradient6112)"
-        transform="matrix(.99233 .12360 0 1 0 0)"
-        rx="3.8565"
-        ry="4.7716"
-        height="9.5432"
-        width="29.252"
-        y="589.3"
-        x="381.47"
-    />
-    <path
-        id="path5262"
-        d="m376.8 659.05v2.1166c0 3.648 2.9369 6.9507 6.5849 7.4051l19.352 2.4104c3.648 0.45439 6.5849-2.1167 6.5849-5.7647v-2.1166c0 3.648-2.9369 6.2191-6.5849 5.7647l-19.352-2.4104c-3.648-0.45438-6.5849-3.7571-6.5849-7.4051z"
-        style="color:#000000;fill:url(#linearGradient6109)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5264"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5266"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.79051 .098462 0 .56126 181.66 387.88)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5268"
-        d="m383.82 626.9c-0.008 0.15502-0.0335 0.30826-0.0335 0.46618 0 5.0469 4.0913 9.6479 9.1383 10.276 5.0469 0.62863 9.1383-2.9531 9.1383-8 0-0.15792-0.0257-0.3176-0.0335-0.47453-0.25371 4.7884-4.2215 8.1421-9.1047 7.5339-4.8832-0.60823-8.851-4.9504-9.1047-9.802z"
-        style="color:#000000;fill:url(#linearGradient6099)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5270"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(1.0751 .13391 0 1.0751 105.61 189.42)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5272"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.79051 .098462 0 .56126 181.66 387.88)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5274"
-        d="m383.82 626.9c-0.008 0.15502-0.0335 0.30826-0.0335 0.46618 0 5.0469 4.0913 9.6479 9.1383 10.276 5.0469 0.62863 9.1383-2.9531 9.1383-8 0-0.15792-0.0257-0.3176-0.0335-0.47453-0.25371 4.7884-4.2215 8.1421-9.1047 7.5339-4.8832-0.60823-8.851-4.9504-9.1047-9.802z"
-        style="color:#000000;fill:url(#linearGradient6099)"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5278"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99863 .052306 0 1 0 0)"
-        rx="3.39"
-        ry="3.3854"
-        height="16.72"
-        width="16.743"
-        y="505.91"
-        x="400.65"
-    />
-    <rect
-        id="rect5280"
-        style="color:#000000;fill:url(#linearGradient6095)"
-        transform="matrix(.99863 .052306 0 1 0 0)"
-        rx="1.9702"
-        ry="2.4531"
-        height="4.9063"
-        width="14.944"
-        y="506.43"
-        x="401.55"
-    />
-    <path
-        id="path5282"
-        style="color:#000000;fill:url(#linearGradient6092)"
-        inkscape:connector-curvature="0"
-        d="m400.1 539.11v1.0882c0 1.8755 1.5099 3.4645 3.3854 3.5627l9.949 0.52111c1.8755 0.0982 3.3854-1.3326 3.3854-3.2081v-1.0882c0 1.8755-1.5099 3.3063-3.3854 3.2081l-9.949-0.52111c-1.8755-0.0982-3.3854-1.6872-3.3854-3.5627z"
-    />
-    <path
-        id="path5284"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5286"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.40641 .021287 0 .28855 299.78 406.94)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5288"
-        style="color:#000000;fill:url(#linearGradient6082)"
-        inkscape:connector-curvature="0"
-        d="m403.71 522.33c-0.004 0.08-0.0172 0.15972-0.0172 0.24091 0 2.5947 2.1034 4.8083 4.6981 4.9442 2.5947 0.13591 4.6981-1.8573 4.6981-4.452 0-0.0812-0.0132-0.16233-0.0172-0.24272-0.13044 2.4712-2.1704 4.3426-4.6808 4.2111-2.5105-0.13149-4.5504-2.2166-4.6808-4.7015z"
-    />
-    <path
-        id="path5290"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.55272 .028950 0 .55272 260.68 307.74)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5292"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.40641 .021287 0 .28855 299.78 406.94)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5294"
-        style="color:#000000;fill:url(#linearGradient6082)"
-        inkscape:connector-curvature="0"
-        d="m403.71 522.33c-0.004 0.08-0.0172 0.15972-0.0172 0.24091 0 2.5947 2.1034 4.8083 4.6981 4.9442 2.5947 0.13591 4.6981-1.8573 4.6981-4.452 0-0.0812-0.0132-0.16233-0.0172-0.24272-0.13044 2.4712-2.1704 4.3426-4.6808 4.2111-2.5105-0.13149-4.5504-2.2166-4.6808-4.7015z"
-    />
-    <rect
-        id="rect5298"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="4.1157"
-        ry="4.1066"
-        height="20.281"
-        width="20.326"
-        y="548.24"
-        x="478.9"
-    />
-    <rect
-        id="rect5300"
-        style="color:#000000;fill:url(#linearGradient6078)"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="2.3918"
-        ry="2.9757"
-        height="5.9514"
-        width="18.142"
-        y="548.87"
-        x="479.99"
-    />
-    <path
-        id="path5302"
-        d="m477.84 594.91v1.32c0 2.275 1.8315 4.2285 4.1066 4.38l12.068 0.80346c2.275 0.15146 4.1066-1.5581 4.1066-3.8332v-1.32c0 2.275-1.8315 3.9846-4.1066 3.8332l-12.068-0.80345c-2.275-0.15147-4.1066-2.1049-4.1066-4.38z"
-        style="color:#000000;fill:url(#linearGradient6075)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5304"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5306"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 356.14 432.86)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5308"
-        d="m482.22 574.61c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-        style="color:#000000;fill:url(#linearGradient6065)"
-        inkscape:connector-curvature="0"
-    />
-    <path
-        id="path5310"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 308.71 311.84)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5312"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 356.14 432.86)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5314"
-        d="m482.22 574.61c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-        style="color:#000000;fill:url(#linearGradient6065)"
-        inkscape:connector-curvature="0"
-    />
-    <rect
-        id="rect5318"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="4.1157"
-        ry="4.1066"
-        height="20.281"
-        width="20.326"
-        y="546.41"
-        x="393.46"
-    />
-    <rect
-        id="rect5320"
-        style="color:#000000;fill:url(#linearGradient6061)"
-        transform="matrix(.99779 .066429 0 1 0 0)"
-        rx="2.3918"
-        ry="2.9757"
-        height="5.9514"
-        width="18.142"
-        y="547.04"
-        x="394.55"
-    />
-    <path
-        id="path5322"
-        style="color:#000000;fill:url(#linearGradient6058)"
-        inkscape:connector-curvature="0"
-        d="m392.59 587.4v1.32c0 2.275 1.8315 4.2285 4.1066 4.38l12.068 0.80346c2.275 0.15146 4.1066-1.5581 4.1066-3.8332v-1.32c0 2.275-1.8315 3.9846-4.1066 3.8332l-12.068-0.80345c-2.275-0.15147-4.1066-2.1049-4.1066-4.38z"
-    />
-    <path
-        id="path5324"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5326"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 270.9 425.35)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5328"
-        style="color:#000000;fill:url(#linearGradient6048)"
-        inkscape:connector-curvature="0"
-        d="m396.97 567.1c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-    />
-    <path
-        id="path5330"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.67046 .044636 0 .67046 223.47 304.33)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5332"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.49298 .032821 0 .35002 270.9 425.35)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5334"
-        style="color:#000000;fill:url(#linearGradient6048)"
-        inkscape:connector-curvature="0"
-        d="m396.97 567.1c-0.005 0.0969-0.0209 0.19345-0.0209 0.29193 0 3.1474 2.5515 5.8688 5.6989 6.0783 3.1474 0.20954 5.6989-2.1721 5.6989-5.3195 0-0.0985-0.016-0.19714-0.0209-0.29472-0.15823 2.9953-2.6327 5.2303-5.678 5.0276-3.0453-0.20274-5.5197-2.7672-5.678-5.7836z"
-    />
-    <rect
-        id="rect5338"
-        style="color:#000000;fill:#2f4e62"
-        transform="matrix(.99883 .048418 0 1 0 0)"
-        rx="4.288"
-        ry="4.2829"
-        height="21.153"
-        width="21.177"
-        y="548.89"
-        x="309.46"
-    />
-    <rect
-        id="rect5340"
-        style="color:#000000;fill:url(#linearGradient6044)"
-        transform="matrix(.99883 .048418 0 1 0 0)"
-        rx="2.492"
-        ry="3.1035"
-        height="6.2071"
-        width="18.902"
-        y="549.55"
-        x="310.59"
-    />
-    <path
-        id="path5342"
-        style="color:#000000;fill:url(#linearGradient6041)"
-        inkscape:connector-curvature="0"
-        d="m309.09 579.37v1.3767c0 2.3728 1.9102 4.3756 4.283 4.4906l12.587 0.61013c2.3728 0.11502 4.283-1.7026 4.283-4.0753v-1.3767c0 2.3728-1.9102 4.1904-4.283 4.0753l-12.587-0.61014c-2.3728-0.11502-4.283-2.1178-4.283-4.4906z"
-    />
-    <path
-        id="path5344"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5346"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.51416 .024924 0 .36505 182.17 412.65)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5348"
-        style="color:#000000;fill:url(#linearGradient6031)"
-        inkscape:connector-curvature="0"
-        d="m313.66 558.11c-0.005 0.10119-0.0218 0.20215-0.0218 0.30487 0 3.2826 2.6611 6.0727 5.9437 6.2318 3.2826 0.15912 5.9437-2.373 5.9437-5.6556 0-0.10272-0.0167-0.20531-0.0218-0.30699-0.16502 3.127-2.7458 5.5047-5.9218 5.3507-3.1761-0.15396-5.7568-2.7818-5.9218-5.9248z"
-    />
-    <path
-        id="path5350"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:#2f4e62"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.69926 .033897 0 .69926 132.71 287.34)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5352"
-        sodipodi:rx="8.5"
-        sodipodi:ry="8.5"
-        style="color:#000000;fill:url(#linearGradient5408)"
-        sodipodi:type="arc"
-        d="m275.75 375.11a8.5 8.5 0 1 1 -17 0 8.5 8.5 0 1 1 17 0z"
-        transform="matrix(.51416 .024924 0 .36505 182.17 412.65)"
-        sodipodi:cy="375.11218"
-        sodipodi:cx="267.25"
-    />
-    <path
-        id="path5354"
-        style="color:#000000;fill:url(#linearGradient6031)"
-        inkscape:connector-curvature="0"
-        d="m313.66 558.11c-0.005 0.10119-0.0218 0.20215-0.0218 0.30487 0 3.2826 2.6611 6.0727 5.9437 6.2318 3.2826 0.15912 5.9437-2.373 5.9437-5.6556 0-0.10272-0.0167-0.20531-0.0218-0.30699-0.16502 3.127-2.7458 5.5047-5.9218 5.3507-3.1761-0.15396-5.7568-2.7818-5.9218-5.9248z"
-    />
-  </g
-  >
-  <metadata
-    >
-    <rdf:RDF
-      >
-      <cc:Work
-        >
-        <dc:format
-          >image/svg+xml</dc:format
-        >
-        <dc:type
-            rdf:resource="http://purl.org/dc/dcmitype/StillImage"
-        />
-        <cc:license
-            rdf:resource="http://creativecommons.org/licenses/publicdomain/"
-        />
-        <dc:publisher
-          >
-          <cc:Agent
-              rdf:about="http://openclipart.org/"
-            >
-            <dc:title
-              >Openclipart</dc:title
-            >
-          </cc:Agent
-          >
-        </dc:publisher
-        >
-        <dc:title
-          >Network</dc:title
-        >
-        <dc:date
-          >2011-08-09T15:31:22</dc:date
-        >
-        <dc:description
-          >Network</dc:description
-        >
-        <dc:source
-          >https://openclipart.org/detail/154453/network-by-printerkiller</dc:source
-        >
-        <dc:creator
-          >
-          <cc:Agent
-            >
-            <dc:title
-              >PrinterKiller</dc:title
-            >
-          </cc:Agent
-          >
-        </dc:creator
-        >
-        <dc:subject
-          >
-          <rdf:Bag
-            >
-            <rdf:li
-              >Network web internet connect www</rdf:li
-            >
-          </rdf:Bag
-          >
-        </dc:subject
-        >
-      </cc:Work
-      >
-      <cc:License
-          rdf:about="http://creativecommons.org/licenses/publicdomain/"
-        >
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#Reproduction"
-        />
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#Distribution"
-        />
-        <cc:permits
-            rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
-        />
-      </cc:License
-      >
-    </rdf:RDF
-    >
-  </metadata
-  >
-</svg
->
diff --git a/setup-py2.7.cfg b/setup-py2.7.cfg
deleted file mode 100644
index a24e910..0000000
--- a/setup-py2.7.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-[tool:pytest]
-addopts = -s
-testpaths = tests
diff --git a/setup.cfg b/setup.cfg
index 1832d73..842f458 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,10 +1,15 @@
 [tool:pytest]
-addopts = -s --cov=easysnmp --cov-report=term-missing --flake8
+addopts = -s --cov=easysnmp --cov-report=term-missing
 testpaths = tests
-flake8-ignore =
-    build/*.py ALL
+
+[tool:black]
+line-length = 88
+target-version = ['py36', 'py37', 'py38', 'py39', 'py310']
 
 [flake8]
 max-line-length = 88
-exclude = build tests dev dist
-extend-ignore = E203
+
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/setup.py b/setup.py
index 5190dcd..cf4fe33 100644
--- a/setup.py
+++ b/setup.py
@@ -1,10 +1,11 @@
-from subprocess import check_output
+from subprocess import check_output, CalledProcessError
 from sys import argv, platform, exit
 from shlex import split as s_split
 
 from distutils import sysconfig
 from distutils.command import build
 from setuptools import setup, Extension
+from setuptools.command.build_ext import build_ext as BuildCommand
 from setuptools.command.test import test as TestCommand
 from setuptools import dist
 
@@ -15,36 +16,37 @@ in_tree = False
 compile_args = []
 link_args = []
 for arg in argv:
-    if arg.startswith('--debug'):
+    if arg.startswith("--debug"):
         # Note from GCC manual:
         #       If you use multiple -O options, with or without level numbers,
         #       the last such option is the one that is effective.
-        compile_args.extend(['-Wall', '-O0', '-g'])
-    elif arg.startswith('--basedir='):
-        basedir = arg.split('=')[1]
+        compile_args.extend(["-Wall", "-O0", "-g"])
+    elif arg.startswith("--basedir="):
+        basedir = arg.split("=")[1]
         in_tree = True
 
 
 # If a base directory has been provided, we use it
 if in_tree:
-    base_cmd = '{0}/net-snmp-config {{{0}}}'.format(basedir)
-    libs_cmd = base_cmd.format('--build-lib-dirs {0}'.format(basedir))
-    incl_cmd = base_cmd.format('--build-includes {0}'.format(basedir))
+    base_cmd = "{0}/net-snmp-config {{{0}}}".format(basedir)
+    libs_cmd = base_cmd.format("--build-lib-dirs {0}".format(basedir))
+    incl_cmd = base_cmd.format("--build-includes {0}".format(basedir))
 
-    netsnmp_libs = check_output(base_cmd.format('--libs'), shell=True).decode()
+    netsnmp_libs = check_output(base_cmd.format("--libs"), shell=True).decode()
     libdirs = check_output(libs_cmd, shell=True).decode()
     incdirs = check_output(incl_cmd, shell=True).decode()
 
-    libs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == '-l']
-    libdirs = [flag[2:] for flag in s_split(libdirs) if flag[:2] == '-L']
-    incdirs = [flag[2:] for flag in s_split(incdirs) if flag[:2] == '-I']
+    libs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == "-l"]
+    libdirs = [flag[2:] for flag in s_split(libdirs) if flag[:2] == "-L"]
+    incdirs = [flag[2:] for flag in s_split(incdirs) if flag[:2] == "-I"]
 
 # Otherwise, we use the system-installed SNMP libraries
 else:
-    netsnmp_libs = check_output('net-snmp-config --libs', shell=True).decode()
+    netsnmp_libs = check_output("net-snmp-config --libs", shell=True).decode()
 
     pass_next = False
-    has_arg = ('-framework',)
+    # macOS-specific
+    has_arg = ("-framework",)
     for flag in s_split(netsnmp_libs):
         if pass_next:
             link_args.append(flag)
@@ -52,45 +54,60 @@ else:
         elif flag in has_arg:  # -framework CoreFoundation
             link_args.append(flag)
             pass_next = True
-        elif flag[:2] == '-f':  # -flat_namespace
+        elif flag == "-flat_namespace":
             link_args.append(flag)
             pass_next = False
 
     # link_args += [flag for flag in s_split(netsnmp_libs) if flag[:2] == '-f']
-    libs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == '-l']
-    libdirs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == '-L']
+    libs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == "-l"]
+    libdirs = [flag[2:] for flag in s_split(netsnmp_libs) if flag[:2] == "-L"]
     incdirs = []
 
-    if platform == 'darwin':  # OS X
-        brew = check_output('brew info net-snmp', shell=True).decode()
-        if 'command not found' not in brew:
-            # /usr/local/opt is the default brew `opt` prefix, however the user
-            # may have installed it elsewhere. The `brew info <pkg>` includes
-            # an apostrophe, which breaks shlex. We'll simply replace it
-            buildvars = list(
-                map(lambda e: e.split('"', 1)[1].strip('"'),
-                    filter(lambda var: '="' in var, brew.split())))
-            libdirs += [flag[2:] for flag in buildvars if flag[:2] == '-L']
-            incdirs += [flag[2:] for flag in buildvars if flag[:2] == '-I']
+    if platform == "darwin":  # OS X
+        # Check if net-snmp is installed via Brew
+        try:
+            brew = check_output("brew list net-snmp 2>/dev/null", shell=True).decode()
+        except CalledProcessError:
+            pass
+        else:
+            lines = brew.splitlines()
+            include_dir = list(filter(lambda l: "include/net-snmp" in l, lines))[0]
+            incdirs.append(include_dir[: include_dir.index("include/net-snmp") + 7])
+            lib_dir = list(filter(lambda l: "lib/libnetsnmp.dylib" in l, lines))[0]
+            libdirs.append(lib_dir[: lib_dir.index("lib/libnetsnmp.dylib") + 3])
             # The homebrew version also depends on the Openssl keg
-            openssl_ver = list(filter(lambda o: 'openssl' in o, *map(str.split,
-                               filter(lambda l: 'openssl' in l,
-                                      str(brew.replace('\'', '')).split('\n')
-                                      ))))[0]
+            brew = check_output("brew info net-snmp", shell=True).decode()
+            openssl_ver = list(
+                filter(
+                    lambda o: "openssl" in o,
+                    *map(
+                        str.split,
+                        filter(
+                            lambda l: "openssl" in l,
+                            str(brew.replace("'", "")).split("\n"),
+                        ),
+                    )
+                )
+            )[0]
             brew = check_output(
-                'brew info {0}'.format(openssl_ver),
-                shell=True
+                "brew info {0}".format(openssl_ver), shell=True
             ).decode()
+            # /usr/local/opt is the default brew `opt` prefix, however the user
+            # may have installed it elsewhere. The `brew info <pkg>` includes
+            # an apostrophe, which breaks shlex. We'll simply replace it
             buildvars = list(
-                map(lambda e: e.split('"', 1)[1].strip('"'),
-                    filter(lambda var: '="' in var, brew.split())))
-            libdirs += [flag[2:] for flag in buildvars if flag[:2] == '-L']
-            incdirs += [flag[2:] for flag in buildvars if flag[:2] == '-I']
+                map(
+                    lambda e: e.split('"', 1)[1].strip('"'),
+                    filter(lambda var: '="' in var, brew.split()),
+                )
+            )
+            libdirs += [flag[2:] for flag in buildvars if flag[:2] == "-L"]
+            incdirs += [flag[2:] for flag in buildvars if flag[:2] == "-I"]
 
 
 # Setup the py.test class for use with the test command
 class PyTest(TestCommand):
-    user_options = [('pytest-args=', 'a', 'Arguments to pass to py.test')]
+    user_options = [("pytest-args=", "a", "Arguments to pass to py.test")]
 
     def initialize_options(self):
         TestCommand.initialize_options(self)
@@ -104,77 +121,101 @@ class PyTest(TestCommand):
     def run_tests(self):
         # Import here, cause outside the eggs aren't loaded
         import pytest
+
         errno = pytest.main(self.pytest_args)
         exit(errno)
 
 
+class RelinkLibraries(BuildCommand):
+    """Fix dylib path for macOS
+
+    Depending on system configuration and Brew setup, interface.so may get linked to
+    the wrong dylib file (prioritizing the system's 5.6.2.1 over brew's 5.8+). This
+    will change the path if net-snmp is installed via `brew`.
+
+    Non-brew installations and non-macOS systems will not be affected.
+    """
+
+    def run(self):
+        BuildCommand.run(self)
+        if platform == "darwin":  # Newer Net-SNMP dylib may not be linked to properly
+            try:
+                brew = check_output(
+                    "brew list net-snmp 2>/dev/null", shell=True
+                ).decode()
+            except CalledProcessError:
+                return
+            lib_dir = list(filter(lambda l: "lib/libnetsnmp.dylib" in l, lines))[0]
+            b = build.build(dist.Distribution())  # Dynamically determine build path
+            b.finalize_options()
+            ext = sysconfig.get_config_var("EXT_SUFFIX") or ".so"  # None for Python 2
+            linked = (
+                check_output(
+                    (
+                        "otool -L {0}/easysnmp/interface{1} | "
+                        r"egrep 'libnetsnmp\.' | "
+                        "tr -s '\t' ' ' | "
+                        "cut -d' ' -f2"
+                    ).format(b.build_platlib, ext),
+                    shell=True,
+                )
+                .decode()
+                .strip()
+            )
+            prefix = (
+                check_output("net-snmp-config --prefix", shell=True).decode().strip()
+            )
+            _ = check_output(
+                "install_name_tool -change {0} {1} {2}/easysnmp/interface{3}".format(
+                    linked, lib_dir, b.build_platlib, ext
+                ),
+                shell=True,
+            )
+
+
 # Read the long description from README.rst
-with open('README.rst') as f:
+with open("README.rst") as f:
     long_description = f.read()
 
 
 setup(
-    name='easysnmp',
-    version='0.2.6',
-    description='A blazingly fast and Pythonic SNMP library based on the '
-                'official Net-SNMP bindings',
+    name="easysnmp",
+    version="0.2.6",
+    description="A blazingly fast and Pythonic SNMP library based on the "
+    "official Net-SNMP bindings",
     long_description=long_description,
-    author='Kent Coble',
-    author_email='coblekent@gmail.com',
-    url='https://github.com/kamakazikamikaze/easysnmp',
-    license='BSD',
-    packages=['easysnmp'],
-    tests_require=['pytest-cov', 'pytest-flake8', 'pytest-sugar', 'pytest'],
-    cmdclass={'test': PyTest},
+    author="Kent Coble",
+    author_email="coblekent@gmail.com",
+    url="https://github.com/kamakazikamikaze/easysnmp",
+    license="BSD",
+    packages=["easysnmp"],
+    tests_require=["pytest-cov", "pytest-sugar", "pytest"],
+    cmdclass={"test": PyTest, "build_ext": RelinkLibraries},
     ext_modules=[
         Extension(
-            'easysnmp.interface', ['easysnmp/interface.c'],
-            library_dirs=libdirs, include_dirs=incdirs, libraries=libs,
-            extra_compile_args=compile_args, extra_link_args=link_args
+            "easysnmp.interface",
+            ["easysnmp/interface.c"],
+            library_dirs=libdirs,
+            include_dirs=incdirs,
+            libraries=libs,
+            extra_compile_args=compile_args,
+            extra_link_args=link_args,
         )
     ],
     classifiers=[
-        'Development Status :: 4 - Beta',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: BSD License',
-        'Operating System :: OS Independent',
-        'Programming Language :: Python',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: 3.7',
-        'Programming Language :: Python :: 3.8',
-        'Programming Language :: Python :: 3.9',
-        'Programming Language :: Python :: 3.10',
-        'Topic :: System :: Networking',
-        'Topic :: System :: Networking :: Monitoring'
-    ]
+        "Development Status :: 4 - Beta",
+        "Intended Audience :: Developers",
+        "License :: OSI Approved :: BSD License",
+        "Operating System :: OS Independent",
+        "Programming Language :: Python",
+        "Programming Language :: Python :: 2.7",
+        "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: 3.10",
+        "Topic :: System :: Networking",
+        "Topic :: System :: Networking :: Monitoring",
+    ],
 )
-
-if platform == 'darwin':  # Newer Net-SNMP dylib may not be linked to properly
-    b = build.build(dist.Distribution())  # Dynamically determine build path
-    b.finalize_options()
-    ext = sysconfig.get_config_var('EXT_SUFFIX') or '.so'  # None for Python 2
-    linked = check_output((
-        "otool -L {0}/easysnmp/interface{1} | "
-        r"egrep 'libnetsnmp\.' | "
-        "tr -s '\t' ' ' | "
-        "cut -d' ' -f2").format(
-            b.build_platlib,
-            ext
-        ),
-        shell=True).decode().strip()
-    target_libs = check_output(
-        "find {0} -name libnetsnmp.*.dylib".format(' '.join(libdirs)),
-        shell=True).decode().strip().split()
-    prefix = check_output(
-        "net-snmp-config --prefix",
-        shell=True).decode().strip()
-    for lib in target_libs:
-        if prefix in lib:
-            target_lib = lib
-            break
-    _ = check_output(
-        'install_name_tool -change {0} {1} {2}/easysnmp/interface{3}'.format(
-            linked, target_lib, b.build_platlib, ext),
-        shell=True)
diff --git a/tests/__init__.py b/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/conftest.py b/tests/conftest.py
deleted file mode 100644
index 024c060..0000000
--- a/tests/conftest.py
+++ /dev/null
@@ -1,130 +0,0 @@
-from __future__ import unicode_literals
-
-import logging
-import pytest
-from sys import version_info
-
-if version_info[0] >= 3:
-    from subprocess import Popen, DEVNULL
-else:
-    from subprocess import Popen
-    from os import devnull
-
-import easysnmp
-
-
-class SNMPSetCLIError(Exception):
-    """An exception raised when an SNMP SET fails via the CLI."""
-
-    pass
-
-
-if version_info[0] >= 3:  # Required to avoid UnboundLocalError in Python 3
-
-    def snmp_set_via_cli(oid, value, type):
-        """
-        Sets an SNMP variable using the snmpset command.
-
-        :param oid: the OID to update
-        :param value: the new value to set the OID to
-        :param type: a single character type as required by the snmpset command
-                     (i: INTEGER, u: unsigned INTEGER, t: TIMETICKS,
-                      a: IPADDRESS o: OBJID, s: STRING, x: HEX STRING,
-                      d: DECIMAL STRING, b: BITS U: unsigned int64,
-                      I: signed int64, F: float, D: double)
-        """
-        process = Popen(
-            "snmpset -v2c -c public localhost:11161 {} {} {}".format(
-                oid, type, '"{}"'.format(value) if type == "s" else value
-            ),
-            stdout=DEVNULL,
-            stderr=DEVNULL,
-            shell=True,
-        )
-        process.communicate()
-        if process.returncode != 0:
-            raise SNMPSetCLIError(
-                "failed to set {0} to {1} (type {2})".format(oid, value, type)
-            )
-
-else:
-
-    def snmp_set_via_cli(oid, value, type):
-        """
-        Sets an SNMP variable using the snmpset command.
-
-        :param oid: the OID to update
-        :param value: the new value to set the OID to
-        :param type: a single character type as required by the snmpset command
-                     (i: INTEGER, u: unsigned INTEGER, t: TIMETICKS,
-                      a: IPADDRESS o: OBJID, s: STRING, x: HEX STRING,
-                      d: DECIMAL STRING, b: BITS U: unsigned int64,
-                      I: signed int64, F: float, D: double)
-        """
-        DEVNULL = open(devnull, "w")
-        process = Popen(
-            "snmpset -v2c -c public localhost:11161 {} {} {}".format(
-                oid, type, '"{}"'.format(value) if type == "s" else value
-            ),
-            stdout=DEVNULL,
-            stderr=DEVNULL,
-            shell=True,
-        )
-        process.communicate()
-        if process.returncode != 0:
-            raise SNMPSetCLIError(
-                "failed to set {0} to {1} (type {2})".format(oid, value, type)
-            )
-        DEVNULL.close()
-
-
-# Disable logging for the C interface
-snmp_logger = logging.getLogger("easysnmp.interface")
-snmp_logger.disabled = True
-
-
-SESS_V1_ARGS = {
-    "version": 1,
-    "hostname": "localhost",
-    "remote_port": 11161,
-    "community": "public",
-}
-
-SESS_V2_ARGS = {
-    "version": 2,
-    "hostname": "localhost",
-    "remote_port": 11161,
-    "community": "public",
-}
-
-SESS_V3_ARGS = {
-    "version": 3,
-    "hostname": "localhost",
-    "remote_port": 11161,
-    "security_level": "authPriv",
-    "security_username": "initial",
-    "privacy_password": "priv_pass",
-    "auth_password": "auth_pass",
-}
-
-
-@pytest.fixture(params=[SESS_V1_ARGS, SESS_V2_ARGS, SESS_V3_ARGS])
-def sess_args(request):
-    return request.param
-
-
-@pytest.fixture
-def sess(sess_args):
-    return easysnmp.Session(**sess_args)
-
-
-@pytest.fixture
-def reset_values():
-    yield None
-    snmp_set_via_cli("sysLocation.0", "my original location", "s")
-    snmp_set_via_cli("nsCacheTimeout.1.3.6.1.2.1.2.2", "0", "i")
-
-
-@pytest.fixture
-def sess_v3():
-    return SESS_V3_ARGS
diff --git a/tests/snmpd.conf b/tests/snmpd.conf
deleted file mode 100644
index 70036d0..0000000
--- a/tests/snmpd.conf
+++ /dev/null
@@ -1,430 +0,0 @@
-###############################################################################
-#
-# EXAMPLE.conf:
-#   An example configuration file for configuring the ucd-snmp snmpd agent.
-#
-###############################################################################
-#
-# This file is intended to only be an example.  If, however, you want
-# to use it, it should be placed in /usr/local/etc/snmp/snmpd.conf.
-# When the snmpd agent starts up, this is where it will look for it.
-#
-# You might be interested in generating your own snmpd.conf file using
-# the "snmpconf" program (perl script) instead.  It's a nice menu
-# based interface to writing well commented configuration files.  Try it!
-#
-# Note: This file is automatically generated from EXAMPLE.conf.def.
-# Do NOT read the EXAMPLE.conf.def file! Instead, after you have run
-# configure & make, and then make sure you read the EXAMPLE.conf file
-# instead, as it will tailor itself to your configuration.
-
-# All lines beginning with a '#' are comments and are intended for you
-# to read.  All other lines are configuration commands for the agent.
-
-#
-# PLEASE: read the snmpd.conf(5) manual page as well!
-#
-
-
-###############################################################################
-# Access Control
-###############################################################################
-
-# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY
-# KNOWN AT YOUR SITE.  YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO
-# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.
-
-# By far, the most common question I get about the agent is "why won't
-# it work?", when really it should be "how do I configure the agent to
-# allow me to access it?"
-#
-# By default, the agent responds to the "public" community for read
-# only access, if run out of the box without any configuration file in 
-# place.  The following examples show you other ways of configuring
-# the agent so that you can change the community names, and give
-# yourself write access as well.
-#
-# The following lines change the access permissions of the agent so
-# that the COMMUNITY string provides read-only access to your entire
-# NETWORK (EG: 10.10.10.0/24), and read/write access to only the
-# localhost (127.0.0.1, not its real ipaddress).
-#
-# For more information, read the FAQ as well as the snmpd.conf(5)
-# manual page.
-
-####
-# First, map the community name (COMMUNITY) into a security name
-# (local and mynetwork, depending on where the request is coming
-# from):
-
-#       sec.name  source          community
-com2sec local     localhost       public
-com2sec mynetwork 192.168.1.0/24      public
-
-####
-# Second, map the security names into group names:
-
-#             	sec.model  sec.name
-group MyRWGroup	v1         local
-group MyRWGroup	v2c        local
-group MyRWGroup	usm        local
-group MyRWGroup	usm        initial
-group MyRWGroup usm        secondary
-group MyROGroup v1         mynetwork
-group MyROGroup v2c        mynetwork
-group MyROGroup usm        mynetwork
-
-####
-# Third, create a view for us to let the groups have rights to:
-
-#           incl/excl subtree                          mask
-view all    included  .1                               80
-
-####
-# Finally, grant the 2 groups access to the 1 view with different
-# write permissions:
-
-#                context sec.model sec.level match  read   write  notif
-access MyROGroup ""      any       noauth    exact  all    none   none
-access MyRWGroup ""      any       noauth    exact  all    all    none
-
-# -----------------------------------------------------------------------------
-
-rwuser initial priv 
-createUser initial MD5 auth_pass DES priv_pass
-rwuser secondary priv
-createUser secondary SHA auth_second AES priv_second
-
-###############################################################################
-# System contact information
-#
-
-# It is also possible to set the sysContact and sysLocation system
-# variables through the snmpd.conf file.  **PLEASE NOTE** that setting
-# the value of these objects here makes these objects READ-ONLY
-# (regardless of any access control settings).  Any attempt to set the
-# value of an object whose value is given here will fail with an error
-# status of notWritable.
-
-# syslocation Right here, right now.
-syscontact G. S. Marzot <gmarzot@marzot.net>
-
-# Example output of snmpwalk:
-#   % snmpwalk -v 1 -c public localhost system
-#   system.sysDescr.0 = "SunOS name sun4c"
-#   system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4
-#   system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55
-#   system.sysContact.0 = "Me <me@somewhere.org>"
-#   system.sysName.0 = "name"
-#   system.sysLocation.0 = "Right here, right now."
-#   system.sysServices.0 = 72
-
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# Process checks.
-#
-#  The following are examples of how to use the agent to check for
-#  processes running on the host.  The syntax looks something like:
-#
-#  proc NAME [MAX=0] [MIN=0]
-#
-#  NAME:  the name of the process to check for.  It must match
-#         exactly (ie, http will not find httpd processes).
-#  MAX:   the maximum number allowed to be running.  Defaults to 0.
-#  MIN:   the minimum number to be running.  Defaults to 0.
-
-#
-#  Examples:
-#
-
-#  Make sure mountd is running
-proc mountd
-
-#  Make sure there are no more than 4 ntalkds running, but 0 is ok too.
-proc ntalkd 4
-
-#  Make sure at least one sendmail, but less than or equal to 10 are running.
-proc sendmail 10 1
-
-#  A snmpwalk of the prTable would look something like this:
-# 
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.2
-# enterprises.ucdavis.procTable.prEntry.prIndex.1 = 1
-# enterprises.ucdavis.procTable.prEntry.prIndex.2 = 2
-# enterprises.ucdavis.procTable.prEntry.prIndex.3 = 3
-# enterprises.ucdavis.procTable.prEntry.prNames.1 = "mountd"
-# enterprises.ucdavis.procTable.prEntry.prNames.2 = "ntalkd"
-# enterprises.ucdavis.procTable.prEntry.prNames.3 = "sendmail"
-# enterprises.ucdavis.procTable.prEntry.prMin.1 = 0
-# enterprises.ucdavis.procTable.prEntry.prMin.2 = 0
-# enterprises.ucdavis.procTable.prEntry.prMin.3 = 1
-# enterprises.ucdavis.procTable.prEntry.prMax.1 = 0
-# enterprises.ucdavis.procTable.prEntry.prMax.2 = 4
-# enterprises.ucdavis.procTable.prEntry.prMax.3 = 10
-# enterprises.ucdavis.procTable.prEntry.prCount.1 = 0
-# enterprises.ucdavis.procTable.prEntry.prCount.2 = 0
-# enterprises.ucdavis.procTable.prEntry.prCount.3 = 1
-# enterprises.ucdavis.procTable.prEntry.prErrorFlag.1 = 1
-# enterprises.ucdavis.procTable.prEntry.prErrorFlag.2 = 0
-# enterprises.ucdavis.procTable.prEntry.prErrorFlag.3 = 0
-# enterprises.ucdavis.procTable.prEntry.prErrMessage.1 = "No mountd process running."
-# enterprises.ucdavis.procTable.prEntry.prErrMessage.2 = ""
-# enterprises.ucdavis.procTable.prEntry.prErrMessage.3 = ""
-# enterprises.ucdavis.procTable.prEntry.prErrFix.1 = 0
-# enterprises.ucdavis.procTable.prEntry.prErrFix.2 = 0
-# enterprises.ucdavis.procTable.prEntry.prErrFix.3 = 0
-#
-#  Note that the errorFlag for mountd is set to 1 because one is not
-#  running (in this case an rpc.mountd is, but thats not good enough),
-#  and the ErrMessage tells you what's wrong.  The configuration
-#  imposed in the snmpd.conf file is also shown.  
-# 
-#  Special Case:  When the min and max numbers are both 0, it assumes
-#  you want a max of infinity and a min of 1.
-#
-
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# Executables/scripts
-#
-
-#
-#  You can also have programs run by the agent that return a single
-#  line of output and an exit code.  Here are two examples.
-#
-#  exec NAME PROGRAM [ARGS ...]
-#
-#  NAME:     A generic name.
-#  PROGRAM:  The program to run.  Include the path!
-#  ARGS:     optional arguments to be passed to the program
-
-# a simple hello world
-exec echotest /bin/echo hello world
-
-# Run a shell script containing:
-#
-# #!/bin/sh
-# echo hello world
-# echo hi there
-# exit 35
-#
-# Note:  this has been specifically commented out to prevent
-# accidental security holes due to someone else on your system writing
-# a /tmp/shtest before you do.  Uncomment to use it.
-#
-#exec shelltest /bin/sh /tmp/shtest
-
-# Then, 
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.8
-# enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
-# enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2
-# enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest"
-# enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest"
-# enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world"
-# enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest"
-# enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
-# enterprises.ucdavis.extTable.extEntry.extResult.2 = 35
-# enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world."
-# enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world."
-# enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
-# enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0
-
-# Note that the second line of the /tmp/shtest shell script is cut
-# off.  Also note that the exit status of 35 was returned.
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# disk checks
-#
-
-# The agent can check the amount of available disk space, and make
-# sure it is above a set limit.  
-
-# disk PATH [MIN=DEFDISKMINIMUMSPACE]
-#
-# PATH:  mount path to the disk in question.
-# MIN:   Disks with space below this value will have the Mib's errorFlag set.
-#        Default value = DEFDISKMINIMUMSPACE.
-
-# Check the / partition and make sure it contains at least 10 megs.
-
-disk / 10000
-
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.9
-# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0
-# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F 
-# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0"
-# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000
-# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130
-# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325
-# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092
-# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58
-# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0
-# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = ""
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# load average checks
-#
-
-# load [1MAX=DEFMAXLOADAVE] [5MAX=DEFMAXLOADAVE] [15MAX=DEFMAXLOADAVE]
-#
-# 1MAX:   If the 1 minute load average is above this limit at query
-#         time, the errorFlag will be set.
-# 5MAX:   Similar, but for 5 min average.
-# 15MAX:  Similar, but for 15 min average.
-
-# Check for loads:
-load 12 14 14
-
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.10
-# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.1 = 1
-# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.2 = 2
-# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.3 = 3
-# enterprises.ucdavis.loadTable.laEntry.loadaveNames.1 = "Load-1"
-# enterprises.ucdavis.loadTable.laEntry.loadaveNames.2 = "Load-5"
-# enterprises.ucdavis.loadTable.laEntry.loadaveNames.3 = "Load-15"
-# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.1 = "0.49" Hex: 30 2E 34 39 
-# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.2 = "0.31" Hex: 30 2E 33 31 
-# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.3 = "0.26" Hex: 30 2E 32 36 
-# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.1 = "12.00"
-# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.2 = "14.00"
-# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.3 = "14.00"
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.1 = 0
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.2 = 0
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.3 = 0
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.1 = ""
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.2 = ""
-# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.3 = ""
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# Extensible sections.
-# 
-
-# This alleviates the multiple line output problem found in the
-# previous executable mib by placing each mib in its own mib table:
-
-# Run a shell script containing:
-#
-# #!/bin/sh
-# echo hello world
-# echo hi there
-# exit 35
-#
-# Note:  this has been specifically commented out to prevent
-# accidental security holes due to someone else on your system writing
-# a /tmp/shtest before you do.  Uncomment to use it.
-#
-# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest
-
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.50
-# enterprises.ucdavis.50.1.1 = 1
-# enterprises.ucdavis.50.2.1 = "shelltest"
-# enterprises.ucdavis.50.3.1 = "/bin/sh /tmp/shtest"
-# enterprises.ucdavis.50.100.1 = 35
-# enterprises.ucdavis.50.101.1 = "hello world."
-# enterprises.ucdavis.50.101.2 = "hi there."
-# enterprises.ucdavis.50.102.1 = 0
-
-# Now the Output has grown to two lines, and we can see the 'hi
-# there.' output as the second line from our shell script.
-#
-# Note that you must alter the mib.txt file to be correct if you want
-# the .50.* outputs above to change to reasonable text descriptions.
-
-# Other ideas:
-# 
-# exec .1.3.6.1.4.1.2021.51 ps /bin/ps 
-# exec .1.3.6.1.4.1.2021.52 top /usr/local/bin/top
-# exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq
-
-# -----------------------------------------------------------------------------
-
-
-###############################################################################
-# Pass through control.
-# 
-
-# Usage:
-#   pass MIBOID EXEC-COMMAND
-#
-# This will pass total control of the mib underneath the MIBOID
-# portion of the mib to the EXEC-COMMAND.  
-#
-# Note:  You'll have to change the path of the passtest script to your
-# source directory or install it in the given location.
-# 
-# Example:  (see the script for details)
-#           (commented out here since it requires that you place the
-#           script in the right location. (its not installed by default))
-
-# pass .1.3.6.1.4.1.2021.255 /bin/sh PREFIX/local/passtest
-
-# % snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.255
-# enterprises.ucdavis.255.1 = "life the universe and everything"
-# enterprises.ucdavis.255.2.1 = 42
-# enterprises.ucdavis.255.2.2 = OID: 42.42.42
-# enterprises.ucdavis.255.3 = Timeticks: (363136200) 42 days, 0:42:42
-# enterprises.ucdavis.255.4 = IpAddress: 127.0.0.1
-# enterprises.ucdavis.255.5 = 42
-# enterprises.ucdavis.255.6 = Gauge: 42
-#
-# % snmpget -v 1 -c public localhost .1.3.6.1.4.1.2021.255.5
-# enterprises.ucdavis.255.5 = 42
-#
-# % snmpset -v 1 -c public localhost .1.3.6.1.4.1.2021.255.1 s "New string"
-# enterprises.ucdavis.255.1 = "New string"
-#
-
-# For specific usage information, see the man/snmpd.conf.5 manual page
-# as well as the local/passtest script used in the above example.
-
-###############################################################################
-# Subagent control
-#
-
-# The agent can support subagents using a number of extension mechanisms.
-# From the 4.2.1 release, AgentX support is being compiled in by default.
-# However, this is still experimental code, so should not be used on
-# critical production systems.
-#   Please see the file README.agentx for more details.
-#
-# If having read, marked, learnt and inwardly digested this information,
-# you decide that you do wish to make use of this mechanism, simply
-# uncomment the following directive.
-#
-#  master  agentx
-#
-# I repeat - this is *NOT* regarded as suitable for front-line production
-# systems, though it is probably stable enough for day-to-day use.
-# Probably.
-#
-# No refunds will be given.
-
-
-###############################################################################
-# Further Information
-#
-#  See the snmpd.conf manual page, and the output of "snmpd -H".
-#  MUCH more can be done with the snmpd.conf than is shown as an
-#  example here.
-
-# certSecName 10 D020A78EAF99FCE276AA9F43063A69698E4F75D1 --rfc822
-# rwuser -s tsm hardaker@wjh.hardakers.net
-# trustCert D020A78EAF99FCE276AA9F43063A69698E4F75D1
-
-agentaddress 11161
-smuxsocket 11162
diff --git a/tests/test_easy.py b/tests/test_easy.py
deleted file mode 100644
index 5db3c0f..0000000
--- a/tests/test_easy.py
+++ /dev/null
@@ -1,450 +0,0 @@
-from __future__ import unicode_literals
-
-import platform
-
-import pytest
-from easysnmp.easy import (
-    snmp_get,
-    snmp_set,
-    snmp_set_multiple,
-    snmp_get_next,
-    snmp_get_bulk,
-    snmp_walk,
-    snmp_bulkwalk,
-)
-from easysnmp.exceptions import (
-    EasySNMPError,
-    EasySNMPUnknownObjectIDError,
-    EasySNMPNoSuchObjectError,
-    EasySNMPNoSuchInstanceError,
-    EasySNMPNoSuchNameError,
-)
-
-
-def test_snmp_get_regular(sess_args):
-    res = snmp_get("sysDescr.0", **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_tuple(sess_args):
-    res = snmp_get(("sysDescr", "0"), **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_fully_qualified(sess_args):
-    res = snmp_get(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0", **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_fully_qualified_tuple(sess_args):
-    res = snmp_get(
-        (".iso.org.dod.internet.mgmt.mib-2.system.sysDescr", "0"), **sess_args
-    )
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_numeric(sess_args):
-    res = snmp_get(".1.3.6.1.2.1.1.1.0", **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_numeric_no_leading_dot(sess_args):
-    res = snmp_get("1.3.6.1.2.1.1.1.0", **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_numeric_tuple(sess_args):
-    res = snmp_get((".1.3.6.1.2.1.1.1", "0"), **sess_args)
-
-    assert platform.version() in res.value
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_get_unknown(sess_args):
-    with pytest.raises(EasySNMPUnknownObjectIDError):
-        snmp_get("sysDescripto.0", **sess_args)
-
-
-def test_snmp_v1_get_with_retry_no_such(sess_args):
-    res = snmp_get(["iso", "sysDescr.0", "iso"], retry_no_such=True, **sess_args)
-
-    assert res[0]
-    if sess_args["version"] == 1:
-        assert res[0].oid == "iso"
-        assert res[0].snmp_type == "NOSUCHNAME"
-    else:
-        assert res[0].snmp_type == "NOSUCHOBJECT"
-
-    assert res[1]
-    assert platform.version() in res[1].value
-    assert res[1].oid == "sysDescr"
-    assert res[1].oid_index == "0"
-    assert res[1].snmp_type == "OCTETSTR"
-
-    assert res[2]
-    if sess_args["version"] == 1:
-        assert res[2].oid == "iso"
-        assert res[2].snmp_type == "NOSUCHNAME"
-    else:
-        assert res[2].snmp_type == "NOSUCHOBJECT"
-
-
-def test_snmp_get_invalid_instance(sess_args):
-    # Sadly, SNMP v1 doesn't distuingish between an invalid instance and an
-    # invalid object ID, instead it excepts with noSuchName
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            snmp_get("sysContact.1", **sess_args)
-    else:
-        res = snmp_get("sysContact.1", **sess_args)
-        assert res.snmp_type == "NOSUCHINSTANCE"
-
-
-def test_snmp_get_invalid_instance_with_abort_enabled(sess_args):
-    # Sadly, SNMP v1 doesn't distuingish between an invalid instance and an
-    # invalid object ID, so it raises the same exception for both
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            snmp_get("sysContact.1", abort_on_nonexistent=True, **sess_args)
-    else:
-        with pytest.raises(EasySNMPNoSuchInstanceError):
-            snmp_get("sysContact.1", abort_on_nonexistent=True, **sess_args)
-
-
-def test_snmp_get_invalid_object(sess_args):
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            snmp_get("iso", **sess_args)
-    else:
-        res = snmp_get("iso", **sess_args)
-        assert res.snmp_type == "NOSUCHOBJECT"
-
-
-def test_snmp_get_invalid_object_with_abort_enabled(sess_args):
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            snmp_get("iso", abort_on_nonexistent=True, **sess_args)
-    else:
-        with pytest.raises(EasySNMPNoSuchObjectError):
-            snmp_get("iso", abort_on_nonexistent=True, **sess_args)
-
-
-def test_snmp_get_next(sess_args):
-    res = snmp_get_next("nsCacheEntry", **sess_args)
-
-    assert res.oid == "nsCacheTimeout"
-    assert res.oid_index == "1.3.6.1.2.1.2.2"
-    assert int(res.value) >= 0
-    assert res.snmp_type == "INTEGER"
-
-
-def test_snmp_get_next_numeric(sess_args):
-    res = snmp_get_next((".1.3.6.1.2.1.1.1", "0"), **sess_args)
-
-    assert res.oid == "sysObjectID"
-    assert res.oid_index == "0"
-    # .10 == Linux, .16 == macosx, .13 == win32, .255 == UNKNOWN
-    assert res.value.rsplit(".", 1)[0] == ".1.3.6.1.4.1.8072.3.2"
-    assert res.snmp_type == "OBJECTID"
-
-
-def test_snmp_get_next_with_retry_no_such(sess_args):
-    res = snmp_get(["iso.9", "sysDescr.0", "iso.9"], retry_no_such=True, **sess_args)
-
-    assert res[0]
-    if sess_args["version"] == 1:
-        assert res[0].value == "NOSUCHNAME"
-        assert res[0].oid == "iso"
-        assert res[0].oid_index == "9"
-        assert res[0].snmp_type == "NOSUCHNAME"
-    else:
-        assert res[0].snmp_type == "NOSUCHOBJECT"
-
-    assert res[1]
-    assert platform.version() in res[1].value
-    assert res[1].oid == "sysDescr"
-    assert res[1].oid_index == "0"
-    assert res[1].snmp_type == "OCTETSTR"
-
-    assert res[2]
-    if sess_args["version"] == 1:
-        assert res[2].value == "NOSUCHNAME"
-        assert res[2].oid == "iso"
-        assert res[2].oid_index == "9"
-        assert res[2].snmp_type == "NOSUCHNAME"
-    else:
-        assert res[2].snmp_type == "NOSUCHOBJECT"
-
-
-def test_snmp_get_next_end_of_mib_view(sess_args):
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            snmp_get_next(["iso.9", "sysDescr", "iso.9"], **sess_args)
-    else:
-        res = snmp_get_next(["iso.9", "sysDescr", "iso.9"], **sess_args)
-
-        assert res[0]
-        assert res[0].value == "ENDOFMIBVIEW"
-        assert res[0].oid == "iso.9"
-        assert res[0].snmp_type == "ENDOFMIBVIEW"
-
-        assert res[1]
-        assert platform.version() in res[1].value
-        assert res[1].oid == "sysDescr"
-        assert res[1].oid_index == "0"
-        assert res[1].snmp_type == "OCTETSTR"
-
-        assert res[2]
-        assert res[2].value == "ENDOFMIBVIEW"
-        assert res[2].oid == "iso.9"
-        assert res[2].snmp_type == "ENDOFMIBVIEW"
-
-
-def test_snmp_get_next_unknown(sess_args):
-    with pytest.raises(EasySNMPUnknownObjectIDError):
-        snmp_get_next("sysDescripto.0", **sess_args)
-
-
-def test_snmp_set_string(sess_args, request, reset_values):
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value != "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-    success = snmp_set(("sysLocation", "0"), "my newer location", **sess_args)
-    assert success
-
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value == "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_set_string_long_type(sess_args, reset_values):
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value != "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-    success = snmp_set(
-        ("sysLocation", "0"), "my newer location", "OCTETSTR", **sess_args
-    )
-    assert success
-
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value == "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_set_string_short_type(sess_args, reset_values):
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value != "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-    success = snmp_set(("sysLocation", "0"), "my newer location", "s", **sess_args)
-    assert success
-
-    res = snmp_get(("sysLocation", "0"), **sess_args)
-    assert res.oid == "sysLocation"
-    assert res.oid_index == "0"
-    assert res.value == "my newer location"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_snmp_set_integer(sess_args, reset_values):
-    success = snmp_set(("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), 65, **sess_args)
-    assert success
-
-    res = snmp_get(("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), **sess_args)
-    assert res.oid == "nsCacheTimeout"
-    assert res.oid_index == "1.3.6.1.2.1.2.2"
-    assert res.value == "65"
-    assert res.snmp_type == "INTEGER"
-
-
-def test_snmp_set_integer_long_type(sess_args, reset_values):
-    success = snmp_set(
-        ("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), 65, "INTEGER", **sess_args
-    )
-    assert success
-
-    res = snmp_get(("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), **sess_args)
-    assert res.oid == "nsCacheTimeout"
-    assert res.oid_index == "1.3.6.1.2.1.2.2"
-    assert res.value == "65"
-    assert res.snmp_type == "INTEGER"
-
-
-def test_snmp_set_integer_short_type(sess_args, reset_values):
-    success = snmp_set(("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), 65, "i", **sess_args)
-    assert success
-
-    res = snmp_get(("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), **sess_args)
-    assert res.oid == "nsCacheTimeout"
-    assert res.oid_index == "1.3.6.1.2.1.2.2"
-    assert res.value == "65"
-    assert res.snmp_type == "INTEGER"
-
-
-def test_snmp_set_unknown(sess_args):
-    with pytest.raises(EasySNMPUnknownObjectIDError):
-        snmp_set("nsCacheTimeoooout", 1234, **sess_args)
-
-
-def test_snmp_set_multiple(sess_args, reset_values):
-    res = snmp_get(["sysLocation.0", "nsCacheTimeout.1.3.6.1.2.1.2.2"], **sess_args)
-    assert res[0].value != "my newer location"
-    assert res[1].value != "162"
-
-    success = snmp_set_multiple(
-        [
-            ("sysLocation.0", "my newer location"),
-            (("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), 162),
-        ],
-        **sess_args
-    )
-    assert success
-
-    res = snmp_get(["sysLocation.0", "nsCacheTimeout.1.3.6.1.2.1.2.2"], **sess_args)
-    assert res[0].value == "my newer location"
-    assert res[1].value == "162"
-
-
-def test_snmp_get_bulk(sess_args):
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPError):
-            snmp_get_bulk(
-                [
-                    "sysUpTime",
-                    "sysORLastChange",
-                    "sysORID",
-                    "sysORDescr",
-                    "sysORUpTime",
-                ],
-                2,
-                8,
-                **sess_args
-            )
-    else:
-        res = snmp_get_bulk(
-            ["sysUpTime", "sysORLastChange", "sysORID", "sysORDescr", "sysORUpTime"],
-            2,
-            8,
-            **sess_args
-        )
-
-        assert len(res) == 26
-
-        assert res[0].oid == "sysUpTimeInstance"
-        assert res[0].oid_index == ""
-        assert int(res[0].value) > 0
-        assert res[0].snmp_type == "TICKS"
-
-        assert res[4].oid == "sysORUpTime"
-        assert res[4].oid_index == "1"
-        assert int(res[4].value) >= 0
-        assert res[4].snmp_type == "TICKS"
-
-
-def test_snmp_walk(sess_args):
-    res = snmp_walk("system", **sess_args)
-    assert len(res) >= 7
-
-    assert platform.version() in res[0].value
-    assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res[4].value == platform.node()
-    assert res[5].value == "my original location"
-
-
-def test_snmp_walk_res(sess_args):
-    res = snmp_walk("system", **sess_args)
-
-    assert len(res) >= 7
-
-    assert res[0].oid == "sysDescr"
-    assert res[0].oid_index == "0"
-    assert platform.version() in res[0].value
-    assert res[0].snmp_type == "OCTETSTR"
-
-    assert res[3].oid == "sysContact"
-    assert res[3].oid_index == "0"
-    assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res[3].snmp_type == "OCTETSTR"
-
-    assert res[4].oid == "sysName"
-    assert res[4].oid_index == "0"
-    assert res[4].value == platform.node()
-    assert res[4].snmp_type == "OCTETSTR"
-
-    assert res[5].oid == "sysLocation"
-    assert res[5].oid_index == "0"
-    assert res[5].value == "my original location"
-    assert res[5].snmp_type == "OCTETSTR"
-
-
-def test_snmp_bulkwalk_res(sess_args):
-    if sess_args["version"] == 1:
-        with pytest.raises(EasySNMPError):
-            snmp_bulkwalk("system", **sess_args)
-    else:
-        res = snmp_bulkwalk("system", **sess_args)
-
-        assert len(res) >= 7
-
-        assert res[0].oid == "sysDescr"
-        assert res[0].oid_index == "0"
-        assert platform.version() in res[0].value
-        assert res[0].snmp_type == "OCTETSTR"
-
-        assert res[3].oid == "sysContact"
-        assert res[3].oid_index == "0"
-        assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-        assert res[3].snmp_type == "OCTETSTR"
-
-        assert res[4].oid == "sysName"
-        assert res[4].oid_index == "0"
-        assert res[4].value == platform.node()
-        assert res[4].snmp_type == "OCTETSTR"
-
-        assert res[5].oid == "sysLocation"
-        assert res[5].oid_index == "0"
-        assert res[5].value == "my original location"
-        assert res[5].snmp_type == "OCTETSTR"
-
-
-def test_snmp_walk_unknown(sess_args):
-    with pytest.raises(EasySNMPUnknownObjectIDError):
-        snmp_walk("systemo", **sess_args)
diff --git a/tests/test_helpers.py b/tests/test_helpers.py
deleted file mode 100644
index a74c7d1..0000000
--- a/tests/test_helpers.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from __future__ import unicode_literals
-
-from easysnmp.helpers import normalize_oid
-
-
-def test_normalize_oid_regular():
-    oid, oid_index = normalize_oid("sysContact.0")
-    assert oid == "sysContact"
-    assert oid_index == "0"
-
-
-def test_normalize_oid_numeric():
-    oid, oid_index = normalize_oid(".1.3.6.1.2.1.1.1.0")
-    assert oid == ".1.3.6.1.2.1.1.1.0"
-    assert oid_index == ""
-
-
-def test_normalize_oid_full_qualified():
-    oid, oid_index = normalize_oid(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0")
-    assert oid == ".iso.org.dod.internet.mgmt.mib-2.system.sysDescr"
-    assert oid_index == "0"
-
-
-def test_normalize_oid_with_index():
-    oid, oid_index = normalize_oid("abc", "def")
-    assert oid == "abc"
-    assert oid_index == "def"
diff --git a/tests/test_session.py b/tests/test_session.py
deleted file mode 100644
index c154a1e..0000000
--- a/tests/test_session.py
+++ /dev/null
@@ -1,391 +0,0 @@
-from __future__ import unicode_literals
-
-import platform
-import re
-
-import pytest
-from easysnmp.exceptions import (
-    EasySNMPError,
-    EasySNMPConnectionError,
-    EasySNMPTimeoutError,
-    EasySNMPNoSuchObjectError,
-    EasySNMPNoSuchInstanceError,
-    EasySNMPNoSuchNameError,
-)
-
-from easysnmp.session import Session
-
-
-def test_session_invalid_snmp_version():
-    with pytest.raises(ValueError):
-        Session(version=4)
-
-
-@pytest.mark.parametrize("version", [1, 2, 3])
-def test_session_invalid_hostname(version):
-    with pytest.raises(EasySNMPConnectionError):
-        session = Session(hostname="invalid", version=version)
-        session.get("sysContact.0")
-
-
-@pytest.mark.parametrize("version", [1, 2, 3])
-def test_session_invalid_hostname_and_remote_port(version):
-    with pytest.raises(ValueError):
-        Session(hostname="localhost:162", remote_port=163, version=version)
-
-
-@pytest.mark.parametrize("version", [1, 2, 3])
-def test_session_hostname_and_remote_port_split(version):
-    session = Session(hostname="localhost:162", version=version)
-    assert session.hostname == "localhost"
-    assert session.remote_port == 162
-
-
-@pytest.mark.parametrize("version", [1, 2, 3])
-def test_session_invalid_port(version):
-    with pytest.raises(EasySNMPTimeoutError):
-        session = Session(remote_port=1234, version=version, timeout=0.2, retries=1)
-        session.get("sysContact.0")
-
-
-def test_session_set_multiple_next(sess, reset_values):
-    # Destroy succeeds even if no row exists
-    sess.set(".1.3.6.1.6.3.12.1.2.1.9.116.101.115.116", 6)
-    success = sess.set_multiple(
-        [
-            (".1.3.6.1.6.3.12.1.2.1.2.116.101.115.116", ".1.3.6.1.6.1.1"),
-            (".1.3.6.1.6.3.12.1.2.1.3.116.101.115.116", "1234"),
-            (".1.3.6.1.6.3.12.1.2.1.9.116.101.115.116", 4),
-        ]
-    )
-    assert success
-
-    res = sess.get_next(
-        ["snmpTargetAddrTDomain", "snmpTargetAddrTAddress", "snmpTargetAddrRowStatus"]
-    )
-
-    assert len(res) == 3
-
-    assert res[0].oid == "snmpTargetAddrTDomain"
-    assert res[0].oid_index == "116.101.115.116"
-    assert res[0].value == ".1.3.6.1.6.1.1"
-    assert res[0].snmp_type == "OBJECTID"
-
-    assert res[1].oid == "snmpTargetAddrTAddress"
-    assert res[1].oid_index == "116.101.115.116"
-    assert res[1].value == "1234"
-    assert res[1].snmp_type == "OCTETSTR"
-
-    assert res[2].oid == "snmpTargetAddrRowStatus"
-    assert res[2].oid_index == "116.101.115.116"
-    assert res[2].value == "3"
-    assert res[2].snmp_type == "INTEGER"
-
-
-def test_session_set_clear(sess):
-    res = sess.set(".1.3.6.1.6.3.12.1.2.1.9.116.101.115.116", 6)
-    assert res == 1
-
-    res = sess.get_next(
-        ["snmpTargetAddrTDomain", "snmpTargetAddrTAddress", "snmpTargetAddrRowStatus"]
-    )
-
-    assert len(res) == 3
-
-    assert res[0].oid == "snmpUnavailableContexts"
-    assert res[0].oid_index == "0"
-    assert res[0].value == "0"
-    assert res[0].snmp_type == "COUNTER"
-
-    assert res[1].oid == "snmpUnavailableContexts"
-    assert res[1].oid_index == "0"
-    assert res[1].value == "0"
-    assert res[1].snmp_type == "COUNTER"
-
-    assert res[2].oid == "snmpUnavailableContexts"
-    assert res[2].oid_index == "0"
-    assert res[2].value == "0"
-    assert res[2].snmp_type == "COUNTER"
-
-
-def test_session_get(sess):
-    res = sess.get([("sysUpTime", "0"), ("sysContact", "0"), ("sysLocation", "0")])
-
-    assert len(res) == 3
-
-    assert res[0].oid == "sysUpTimeInstance"
-    assert res[0].oid_index == ""
-    assert int(res[0].value) > 0
-    assert res[0].snmp_type == "TICKS"
-
-    assert res[1].oid == "sysContact"
-    assert res[1].oid_index == "0"
-    assert res[1].value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res[1].snmp_type == "OCTETSTR"
-
-    assert res[2].oid == "sysLocation"
-    assert res[2].oid_index == "0"
-    assert res[2].value == "my original location"
-    assert res[2].snmp_type == "OCTETSTR"
-
-
-def test_session_get_use_numeric(sess):
-    sess.use_numeric = True
-    res = sess.get("sysContact.0")
-
-    assert res.oid == ".1.3.6.1.2.1.1.4"
-    assert res.oid_index == "0"
-    assert res.value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res.snmp_type == "OCTETSTR"
-
-
-def test_session_get_use_sprint_value(sess):
-    sess.use_sprint_value = True
-    res = sess.get("sysUpTimeInstance")
-
-    assert res.oid == "sysUpTimeInstance"
-    assert res.oid_index == ""
-    assert re.match(r"^\d+:\d+:\d+:\d+\.\d+$", res.value)
-    assert res.snmp_type == "TICKS"
-
-
-def test_session_get_use_enums(sess):
-    sess.use_enums = True
-    res = sess.get("ifAdminStatus.1")
-
-    assert res.oid == "ifAdminStatus"
-    assert res.oid_index == "1"
-    assert res.value == "up"
-    assert res.snmp_type == "INTEGER"
-
-
-def test_session_get_next(sess):
-    res = sess.get_next([("sysUpTime", "0"), ("sysContact", "0"), ("sysLocation", "0")])
-
-    assert len(res) == 3
-
-    assert res[0].oid == "sysContact"
-    assert res[0].oid_index == "0"
-    assert res[0].value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res[0].snmp_type == "OCTETSTR"
-
-    assert res[1].oid == "sysName"
-    assert res[1].oid_index == "0"
-    assert res[1].value == platform.node()
-    assert res[1].snmp_type == "OCTETSTR"
-
-    assert res[2].oid == "sysORLastChange"
-    assert res[2].oid_index == "0"
-    assert int(res[2].value) >= 0
-    assert res[2].snmp_type == "TICKS"
-
-
-def test_session_set(sess, reset_values):
-    res = sess.get(("sysLocation", "0"))
-    assert res.value != "my newer location"
-
-    success = sess.set(("sysLocation", "0"), "my newer location")
-    assert success
-
-    res = sess.get(("sysLocation", "0"))
-    assert res.value == "my newer location"
-
-
-def test_session_set_multiple(sess, reset_values):
-    res = sess.get(["sysLocation.0", "nsCacheTimeout.1.3.6.1.2.1.2.2"])
-    assert res[0].value != "my newer location"
-    assert res[1].value != "160"
-
-    success = sess.set_multiple(
-        [
-            ("sysLocation.0", "my newer location"),
-            (("nsCacheTimeout", ".1.3.6.1.2.1.2.2"), 160),
-        ]
-    )
-    assert success
-
-    res = sess.get(["sysLocation.0", "nsCacheTimeout.1.3.6.1.2.1.2.2"])
-    assert res[0].value == "my newer location"
-    assert res[1].value == "160"
-
-
-def test_session_get_bulk(sess):  # noqa
-    if sess.version == 1:
-        with pytest.raises(EasySNMPError):
-            sess.get_bulk(
-                [
-                    "sysUpTime",
-                    "sysORLastChange",
-                    "sysORID",
-                    "sysORDescr",
-                    "sysORUpTime",
-                ],
-                2,
-                8,
-            )
-    else:
-        res = sess.get_bulk(
-            ["sysUpTime", "sysORLastChange", "sysORID", "sysORDescr", "sysORUpTime"],
-            2,
-            8,
-        )
-
-        assert len(res) == 26
-
-        assert res[0].oid == "sysUpTimeInstance"
-        assert res[0].oid_index == ""
-        assert int(res[0].value) > 0
-        assert res[0].snmp_type == "TICKS"
-
-        assert res[4].oid == "sysORUpTime"
-        assert res[4].oid_index == "1"
-        assert int(res[4].value) >= 0
-        assert res[4].snmp_type == "TICKS"
-
-
-def test_session_get_invalid_instance(sess):
-    # Sadly, SNMP v1 doesn't distuingish between an invalid instance and an
-    # invalid object ID, instead it excepts with noSuchName
-    if sess.version == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            sess.get("sysDescr.100")
-    else:
-        res = sess.get("sysDescr.100")
-        assert res.snmp_type == "NOSUCHINSTANCE"
-
-
-def test_session_get_invalid_instance_with_abort_enabled(sess):
-    # Sadly, SNMP v1 doesn't distuingish between an invalid instance and an
-    # invalid object ID, instead it excepts with noSuchName
-    sess.abort_on_nonexistent = True
-    if sess.version == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            sess.get("sysDescr.100")
-    else:
-        with pytest.raises(EasySNMPNoSuchInstanceError):
-            sess.get("sysDescr.100")
-
-
-def test_session_get_invalid_object(sess):
-    if sess.version == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            sess.get("iso")
-    else:
-        res = sess.get("iso")
-        assert res.snmp_type == "NOSUCHOBJECT"
-
-
-def test_session_get_invalid_object_with_abort_enabled(sess):
-    sess.abort_on_nonexistent = True
-    if sess.version == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            sess.get("iso")
-    else:
-        with pytest.raises(EasySNMPNoSuchObjectError):
-            sess.get("iso")
-
-
-def test_session_walk(sess):
-    res = sess.walk("system")
-
-    assert len(res) >= 7
-
-    assert res[0].oid == "sysDescr"
-    assert res[0].oid_index == "0"
-    assert platform.version() in res[0].value
-    assert res[0].snmp_type == "OCTETSTR"
-
-    assert res[3].oid == "sysContact"
-    assert res[3].oid_index == "0"
-    assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-    assert res[3].snmp_type == "OCTETSTR"
-
-    assert res[4].oid == "sysName"
-    assert res[4].oid_index == "0"
-    assert res[4].value == platform.node()
-    assert res[4].snmp_type == "OCTETSTR"
-
-    assert res[5].oid == "sysLocation"
-    assert res[5].oid_index == "0"
-    assert res[5].value == "my original location"
-    assert res[5].snmp_type == "OCTETSTR"
-
-
-def test_session_bulkwalk(sess):
-    if sess.version == 1:
-        with pytest.raises(EasySNMPError):
-            sess.bulkwalk("system")
-    else:
-        res = sess.walk("system")
-
-        assert len(res) >= 7
-
-        assert res[0].oid == "sysDescr"
-        assert res[0].oid_index == "0"
-        assert platform.version() in res[0].value
-        assert res[0].snmp_type == "OCTETSTR"
-
-        assert res[3].oid == "sysContact"
-        assert res[3].oid_index == "0"
-        assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-        assert res[3].snmp_type == "OCTETSTR"
-
-        assert res[4].oid == "sysName"
-        assert res[4].oid_index == "0"
-        assert res[4].value == platform.node()
-        assert res[4].snmp_type == "OCTETSTR"
-
-        assert res[5].oid == "sysLocation"
-        assert res[5].oid_index == "0"
-        assert res[5].value == "my original location"
-        assert res[5].snmp_type == "OCTETSTR"
-
-
-def test_session_walk_all(sess):
-    # OID 1.3.6.1.6.3.16.1.5.2.1.6.6.95.110.111.110.101.95.1.2
-    # or SNMP-VIEW-BASED-ACM-MIB::vacmViewTreeFamilyStatus."_none_".1.2
-    # appears to return a noSuchName error when using v1, but not with v2c.
-    # This may be a Net-SNMP snmpd bug.
-    if sess.version == 1:
-        with pytest.raises(EasySNMPNoSuchNameError):
-            sess.walk(".")
-    else:
-        res = sess.walk(".")
-
-        assert len(res) > 0
-
-        assert res[0].oid == "sysDescr"
-        assert res[0].oid_index == "0"
-        assert platform.version() in res[0].value
-        assert res[0].snmp_type == "OCTETSTR"
-
-        assert res[3].oid == "sysContact"
-        assert res[3].oid_index == "0"
-        assert res[3].value == "G. S. Marzot <gmarzot@marzot.net>"
-        assert res[3].snmp_type == "OCTETSTR"
-
-        assert res[4].oid == "sysName"
-        assert res[4].oid_index == "0"
-        assert res[4].value == platform.node()
-        assert res[4].snmp_type == "OCTETSTR"
-
-        assert res[5].oid == "sysLocation"
-        assert res[5].oid_index == "0"
-        assert res[5].value == "my original location"
-        assert res[5].snmp_type == "OCTETSTR"
-
-
-def test_session_update():
-    s = Session(version=3)
-    ptr = s.sess_ptr
-    s.version = 1
-    s.update_session()
-    assert ptr != s.sess_ptr
-    s.tunneled = True
-    ptr = s.sess_ptr
-    with pytest.raises(ValueError):
-        s.update_session()
-    assert ptr == s.sess_ptr
-    s.update_session(tunneled=False, version=2)
-    assert s.version == 2
-    assert s.tunneled is False
diff --git a/tests/test_session_build_varlist.py b/tests/test_session_build_varlist.py
deleted file mode 100644
index d844bc7..0000000
--- a/tests/test_session_build_varlist.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from __future__ import unicode_literals
-
-from easysnmp.session import build_varlist
-
-
-def test_build_varlist():
-    varlist, is_list = build_varlist("sysContact.0")
-    assert len(varlist) == 1
-    assert varlist[0].oid == "sysContact"
-    assert varlist[0].oid_index == "0"
-    assert varlist[0].value is None
-    assert varlist[0].snmp_type is None
-    assert not is_list
-
-
-def test_build_varlist_list():
-    varlist, is_list = build_varlist(["sysContact.0", ("sysDescr", "0")])
-    assert len(varlist) == 2
-    assert varlist[0].oid == "sysContact"
-    assert varlist[0].oid_index == "0"
-    assert varlist[0].value is None
-    assert varlist[0].snmp_type is None
-    assert varlist[1].oid == "sysDescr"
-    assert varlist[1].oid_index == "0"
-    assert varlist[1].value is None
-    assert varlist[1].snmp_type is None
-    assert is_list
diff --git a/tests/test_utils.py b/tests/test_utils.py
deleted file mode 100644
index e703895..0000000
--- a/tests/test_utils.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from __future__ import unicode_literals
-
-from easysnmp.compat import ub
-from easysnmp.utils import strip_non_printable, tostr
-
-
-def test_strip_non_printable_regular():
-    assert strip_non_printable("hello there") == "hello there"
-
-
-def test_strip_non_printable_contains_binary():
-    assert strip_non_printable(ub(chr(20)) + "my thingo" + ub(chr(155))) == (
-        "my thingo (contains binary)"
-    )
-
-
-def test_strip_non_printable_only_binary():
-    assert strip_non_printable(ub(chr(20)) + ub(chr(155))) == ("(contains binary)")
-
-
-def test_tostr_none():
-    assert tostr(None) is None
-
-
-def test_tostr_string():
-    assert tostr("hello there") == "hello there"
-
-
-def test_tostr_integer():
-    assert tostr(1234) == "1234"
diff --git a/tests/test_v3_cache.py b/tests/test_v3_cache.py
deleted file mode 100644
index c9281cc..0000000
--- a/tests/test_v3_cache.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from __future__ import unicode_literals
-
-import pytest
-from easysnmp import Session
-from easysnmp.exceptions import EasySNMPConnectionError
-
-
-def test_v3_not_caching_user(sess_v3):
-    s = Session(**sess_v3)
-    res = s.get('sysDescr.0')
-
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
-    s.update_session(privacy_password="wrong_pass")
-
-    with pytest.raises(EasySNMPConnectionError):
-        res = s.get('sysDescr.0')
-
-    d = dict(**sess_v3)
-    d["privacy_password"] = "wrong_pass"
-    s = Session(**d)
-    with pytest.raises(EasySNMPConnectionError):
-        res = s.get("sysDescr.0")
-
-    s.update_session(privacy_password="priv_pass")
-    res = s.get('sysDescr.0')
-
-    assert res.oid == "sysDescr"
-    assert res.oid_index == "0"
-    assert res.snmp_type == "OCTETSTR"
diff --git a/tests/test_variables.py b/tests/test_variables.py
deleted file mode 100644
index 4f6471c..0000000
--- a/tests/test_variables.py
+++ /dev/null
@@ -1,87 +0,0 @@
-from __future__ import unicode_literals
-
-from easysnmp.compat import ub
-from easysnmp.variables import SNMPVariable, SNMPVariableList
-
-
-def test_snmp_variable_regular():
-    var = SNMPVariable("sysDescr", "0")
-    assert var.oid == "sysDescr"
-    assert var.oid_index == "0"
-
-
-def test_snmp_variable_value():
-    var = SNMPVariable("sysDescr", "0", "my thingo")
-    assert var.value == "my thingo"
-    assert var.oid == "sysDescr"
-    assert var.oid_index == "0"
-
-
-def test_snmp_variable_repr():
-    var = SNMPVariable("sysDescr", "0", "my thingo", "OCTETSTR")
-    assert var.__repr__() == (
-        "<SNMPVariable value='my thingo' "
-        "(oid='sysDescr', oid_index='0', snmp_type='OCTETSTR')>"
-    )
-
-
-def test_snmp_variable_repr_binary():
-    var = SNMPVariable(
-        "sysDescr", "0", ub(chr(20)) + "my thingo" + ub(chr(155)), "OCTETSTR"
-    )
-    assert var.__repr__() == (
-        "<SNMPVariable value='my thingo (contains binary)' "
-        "(oid='sysDescr', oid_index='0', snmp_type='OCTETSTR')>"
-    )
-
-
-def test_snmp_variable_repr_binary_only():
-    var = SNMPVariable("sysDescr", "0", ub(chr(20)) + ub(chr(155)), "OCTETSTR")
-    assert var.__repr__() == (
-        "<SNMPVariable value='(contains binary)' "
-        "(oid='sysDescr', oid_index='0', snmp_type='OCTETSTR')>"
-    )
-
-
-def test_snmp_variable_repr_none():
-    var = SNMPVariable()
-    assert var.__repr__() == (
-        "<SNMPVariable value=None (oid=None, oid_index=None, snmp_type=None)>"
-    )
-
-
-def test_snmp_variable_extract_oid_index():
-    var = SNMPVariable("sysDescr.0")
-    assert var.oid == "sysDescr"
-    assert var.oid_index == "0"
-    assert var.value is None
-    assert var.snmp_type is None
-
-
-def test_snmp_variable_long():
-    var = SNMPVariable(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr", "0")
-    assert var.oid == ".iso.org.dod.internet.mgmt.mib-2.system.sysDescr"
-    assert var.oid_index == "0"
-    assert var.value is None
-    assert var.snmp_type is None
-
-
-def test_snmp_variable_doesnt_extract_oid_index():
-    var = SNMPVariable(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0")
-    assert var.oid == ".iso.org.dod.internet.mgmt.mib-2.system.sysDescr"
-    assert var.oid_index == "0"
-    assert var.value is None
-    assert var.snmp_type is None
-
-
-def test_snmp_variable_numeric():
-    var = SNMPVariable(".1.3.6.1.2.1.1.1.0")
-    assert var.oid == ".1.3.6.1.2.1.1.1.0"
-    assert var.oid_index == ""
-    assert var.value is None
-    assert var.snmp_type is None
-
-
-def test_snmp_variable_list():
-    varlist = SNMPVariableList(["sysContact.0", "sysLocation.0", "sysDescr.0"])
-    assert varlist.varbinds == ["sysContact.0", "sysLocation.0", "sysDescr.0"]

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/lib/debug/.build-id/4e/e6d6738724bd5d3ecc3082fbffe71ae8061ddd.debug

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/lib/debug/.build-id/59/78636185ecc458c267c4e6f1c9e406ee6a698d.debug
-rw-r--r--  root/root   /usr/share/doc/python3-easysnmp/changelog.gz

No differences were encountered between the control files of package python3-easysnmp

Control files of package python3-easysnmp-dbgsym: lines which differ (wdiff format)

  • Build-Ids: 5978636185ecc458c267c4e6f1c9e406ee6a698d 4ee6d6738724bd5d3ecc3082fbffe71ae8061ddd

More details

Full run details