diff --git a/CHANGELOG b/CHANGELOG
index 1091af80..9200b6f6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,23 @@
 jc changelog
 
+20230621 v1.23.3
+- Add `lsattr` command parser
+- Add `srt` file parser
+- Add `veracrypt` command parser
+- Add X509 Certificate Request file parser
+- Enhance X509 Certificate parser to allow non-compliant email addresses with a warning
+- Enhance `dig` command parser to support the `+nsid` option
+- Enhance `last` and `lastb` command parser to support the `-x` option
+- Enhance `route` command parser to add Windows support
+- Enhnace `netstat` command parser to add Windows support
+- Enhance `ss` command parser to support extended options
+- Enhance the compatibility warning message
+- Fix `bluetoothctl` command parser for some mouse devices
+- Fix `certbot` command parser to be more robust with different line endings
+- Fix `ping` command parsers for output with missing hostname
+- Fix `stat` command parser for older versions that may not contain all fields
+- Fix deprecated option in `setup.cfg`
+
 20230429 v1.23.2
 - Add `bluetoothctl` command parser
 - Add `certbot` command parser for `certificates` and `show_account` options
diff --git a/EXAMPLES.md b/EXAMPLES.md
index 8d5cf649..49e878e5 100644
--- a/EXAMPLES.md
+++ b/EXAMPLES.md
@@ -4551,6 +4551,57 @@ cat entrust.pem | jc --x509-cert -p
   }
 ]
 ```
+### X.509 PEM and DER certificate request files
+```bash
+cat myserver.csr | jc --x509-csr -p
+```
+```json
+[
+  {
+    "certification_request_info": {
+      "version": "v1",
+      "subject": {
+        "common_name": "myserver.for.example"
+      },
+      "subject_pk_info": {
+        "algorithm": {
+          "algorithm": "ec",
+          "parameters": "secp256r1"
+        },
+        "public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2c:a4:35:1f:0f:54:c8:a9:9b:e3:9e:d4:f3:64:b8:60:cc:7f:39:75:dd:a7:61:31:02:7c:9e:89:c6:db:45:15:f2:5f:b0:65:29:0b:42:d2:6e:c2:ea:a6:23:bd:fc:65:e5:7d:4e"
+      },
+      "attributes": [
+        {
+          "type": "extension_request",
+          "values": [
+            [
+              {
+                "extn_id": "extended_key_usage",
+                "critical": false,
+                "extn_value": [
+                  "server_auth"
+                ]
+              },
+              {
+                "extn_id": "subject_alt_name",
+                "critical": false,
+                "extn_value": [
+                  "myserver.for.example"
+                ]
+              }
+            ]
+          ]
+        }
+      ]
+    },
+    "signature_algorithm": {
+      "algorithm": "sha384_ecdsa",
+      "parameters": null
+    },
+    "signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:8a:fe:95:98:98:98:a9:45:34:31:08:ff:2c:cc:92:d9:1c:70:28:74:02:21:00:97:79:7b:e7:45:18:76:cf:d7:3b:79:34:56:d2:69:b5:73:41:9b:8a:b7:ad:ec:80:23:c1:2f:64:da:e5:28:19"
+  }
+]
+```
 ### XML files
 ```bash
 cat cd_catalog.xml
diff --git a/README.md b/README.md
index 6e946df6..d2663ff2 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,13 @@
 
 > Try the `jc` [web demo](https://jc-web.onrender.com/) and [REST API](https://github.com/kellyjonbrazil/jc-restapi)
 
-> JC is [now available](https://galaxy.ansible.com/community/general) as an
+> `jc` is [now available](https://galaxy.ansible.com/community/general) as an
 Ansible filter plugin in the `community.general` collection. See this
 [blog post](https://blog.kellybrazil.com/2020/08/30/parsing-command-output-in-ansible-with-jc/)
 for an example.
 
+> Looking for something like `jc` but lower-level? Check out [regex2json](https://gitlab.com/tozd/regex2json).
+
 # JC
 JSON Convert
 
@@ -217,6 +219,7 @@ option.
 |          `--last` | `last` and `lastb` command parser                       | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/last)           |
 |            `--ls` | `ls` command parser                                     | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ls)             |
 |          `--ls-s` | `ls` command streaming parser                           | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ls_s)           |
+|        `--lsattr` | `lsattr` command parser                                 | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/lsattr)         |
 |         `--lsblk` | `lsblk` command parser                                  | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/lsblk)          |
 |         `--lsmod` | `lsmod` command parser                                  | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/lsmod)          |
 |          `--lsof` | `lsof` command parser                                   | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/lsof)           |
@@ -252,6 +255,7 @@ option.
 |        `--semver` | Semantic Version string parser                          | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/semver)         |
 |        `--sfdisk` | `sfdisk` command parser                                 | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/sfdisk)         |
 |        `--shadow` | `/etc/shadow` file parser                               | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/shadow)         |
+|           `--srt` | SRT file parser                                         | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/srt)            |
 |            `--ss` | `ss` command parser                                     | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ss)             |
 |      `--ssh-conf` | `ssh` config file and `ssh -G` command parser           | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ssh_conf)       |
 |     `--sshd-conf` | `sshd` config file and `sshd -T` command parser         | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/sshd_conf)      |
@@ -285,12 +289,14 @@ option.
 |        `--uptime` | `uptime` command parser                                 | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/uptime)         |
 |           `--url` | URL string parser                                       | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/url)            |
 |           `--ver` | Version string parser                                   | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ver)            |
+|     `--veracrypt` | `veracrypt` command parser                              | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/veracrypt)      |
 |        `--vmstat` | `vmstat` command parser                                 | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/vmstat)         |
 |      `--vmstat-s` | `vmstat` command streaming parser                       | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/vmstat_s)       |
 |             `--w` | `w` command parser                                      | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/w)              |
 |            `--wc` | `wc` command parser                                     | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/wc)             |
 |           `--who` | `who` command parser                                    | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/who)            |
 |     `--x509-cert` | X.509 PEM and DER certificate file parser               | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/x509_cert)      |
+|      `--x509-csr` | X.509 PEM and DER certificate request file parser       | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/x509_csr)       |
 |           `--xml` | XML file parser                                         | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/xml)            |
 |        `--xrandr` | `xrandr` command parser                                 | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/xrandr)         |
 |          `--yaml` | YAML file parser                                        | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/yaml)           |
diff --git a/completions/jc_bash_completion.sh b/completions/jc_bash_completion.sh
index 39f7cba7..04f9fe99 100644
--- a/completions/jc_bash_completion.sh
+++ b/completions/jc_bash_completion.sh
@@ -3,8 +3,8 @@ _jc()
     local cur prev words cword jc_commands jc_parsers jc_options \
           jc_about_options jc_about_mod_options jc_help_options jc_special_options
 
-    jc_commands=(acpi airport arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env file findmnt finger free git gpg hciconfig id ifconfig iostat iptables iw iwconfig jobs last lastb ls lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat netstat nmcli ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir vmstat w wc who xrandr zipinfo zpool)
-    jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --ntpq --openvpn --os-prober --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --ss --ssh-conf --sshd-conf --stat --stat-s --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --vmstat --vmstat-s --w --wc --who --x509-cert --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status)
+    jc_commands=(acpi airport arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env file findmnt finger free git gpg hciconfig id ifconfig iostat iptables iw iwconfig jobs last lastb ls lsattr lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat netstat nmcli ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool)
+    jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --ntpq --openvpn --os-prober --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status)
     jc_options=(--force-color -C --debug -d --monochrome -m --meta-out -M --pretty -p --quiet -q --raw -r --unbuffer -u --yaml-out -y)
     jc_about_options=(--about -a)
     jc_about_mod_options=(--pretty -p --yaml-out -y --monochrome -m --force-color -C)
diff --git a/completions/jc_zsh_completion.sh b/completions/jc_zsh_completion.sh
index cdf9074c..a1ad1678 100644
--- a/completions/jc_zsh_completion.sh
+++ b/completions/jc_zsh_completion.sh
@@ -9,7 +9,7 @@ _jc() {
              jc_help_options jc_help_options_describe \
              jc_special_options jc_special_options_describe
 
-    jc_commands=(acpi airport arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env file findmnt finger free git gpg hciconfig id ifconfig iostat iptables iw iwconfig jobs last lastb ls lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat netstat nmcli ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir vmstat w wc who xrandr zipinfo zpool)
+    jc_commands=(acpi airport arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env file findmnt finger free git gpg hciconfig id ifconfig iostat iptables iw iwconfig jobs last lastb ls lsattr lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat netstat nmcli ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool)
     jc_commands_describe=(
         'acpi:run "acpi" command with magic syntax.'
         'airport:run "airport" command with magic syntax.'
@@ -45,6 +45,7 @@ _jc() {
         'last:run "last" command with magic syntax.'
         'lastb:run "lastb" command with magic syntax.'
         'ls:run "ls" command with magic syntax.'
+        'lsattr:run "lsattr" command with magic syntax.'
         'lsblk:run "lsblk" command with magic syntax.'
         'lsmod:run "lsmod" command with magic syntax.'
         'lsof:run "lsof" command with magic syntax.'
@@ -98,6 +99,7 @@ _jc() {
         'upower:run "upower" command with magic syntax.'
         'uptime:run "uptime" command with magic syntax.'
         'vdir:run "vdir" command with magic syntax.'
+        'veracrypt:run "veracrypt" command with magic syntax.'
         'vmstat:run "vmstat" command with magic syntax.'
         'w:run "w" command with magic syntax.'
         'wc:run "wc" command with magic syntax.'
@@ -106,7 +108,7 @@ _jc() {
         'zipinfo:run "zipinfo" command with magic syntax.'
         'zpool:run "zpool" command with magic syntax.'
     )
-    jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --ntpq --openvpn --os-prober --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --ss --ssh-conf --sshd-conf --stat --stat-s --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --vmstat --vmstat-s --w --wc --who --x509-cert --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status)
+    jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --ntpq --openvpn --os-prober --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status)
     jc_parsers_describe=(
         '--acpi:`acpi` command parser'
         '--airport:`airport -I` command parser'
@@ -171,6 +173,7 @@ _jc() {
         '--last:`last` and `lastb` command parser'
         '--ls:`ls` command parser'
         '--ls-s:`ls` command streaming parser'
+        '--lsattr:`lsattr` command parser'
         '--lsblk:`lsblk` command parser'
         '--lsmod:`lsmod` command parser'
         '--lsof:`lsof` command parser'
@@ -255,6 +258,7 @@ _jc() {
         '--semver:Semantic Version string parser'
         '--sfdisk:`sfdisk` command parser'
         '--shadow:`/etc/shadow` file parser'
+        '--srt:SRT file parser'
         '--ss:`ss` command parser'
         '--ssh-conf:`ssh` config file and `ssh -G` command parser'
         '--sshd-conf:`sshd` config file and `sshd -T` command parser'
@@ -288,12 +292,14 @@ _jc() {
         '--uptime:`uptime` command parser'
         '--url:URL string parser'
         '--ver:Version string parser'
+        '--veracrypt:`veracrypt` command parser'
         '--vmstat:`vmstat` command parser'
         '--vmstat-s:`vmstat` command streaming parser'
         '--w:`w` command parser'
         '--wc:`wc` command parser'
         '--who:`who` command parser'
         '--x509-cert:X.509 PEM and DER certificate file parser'
+        '--x509-csr:X.509 PEM and DER certificate request file parser'
         '--xml:XML file parser'
         '--xrandr:`xrandr` command parser'
         '--yaml:YAML file parser'
diff --git a/docs/parsers/bluetoothctl.md b/docs/parsers/bluetoothctl.md
index affe1170..88656ec4 100644
--- a/docs/parsers/bluetoothctl.md
+++ b/docs/parsers/bluetoothctl.md
@@ -36,6 +36,7 @@ a controller and a device but there might be fields corresponding to one entity.
             "name":                 string,
             "is_default":           boolean,
             "is_public":            boolean,
+            "is_random":            boolean,
             "address":              string,
             "alias":                string,
             "class":                string,
@@ -54,8 +55,10 @@ a controller and a device but there might be fields corresponding to one entity.
         {
             "name":                 string,
             "is_public":            boolean,
+            "is_random":            boolean,
             "address":              string,
             "alias":                string,
+            "appearance":           string,
             "class":                string,
             "icon":                 string,
             "paired":               string,
@@ -66,7 +69,8 @@ a controller and a device but there might be fields corresponding to one entity.
             "legacy_pairing":       string,
             "rssi":                 int,
             "txpower":              int,
-            "uuids":                array
+            "uuids":                array,
+            "modalias":             string
         }
     ]
 
@@ -126,4 +130,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux
 
-Version 1.0 by Jake Ob (iakopap at gmail.com)
+Version 1.1 by Jake Ob (iakopap at gmail.com)
diff --git a/docs/parsers/certbot.md b/docs/parsers/certbot.md
index 9bfff3b6..ec23f55c 100644
--- a/docs/parsers/certbot.md
+++ b/docs/parsers/certbot.md
@@ -158,4 +158,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, cygwin, win32, aix, freebsd
 
-Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/dig.md b/docs/parsers/dig.md
index a664daee..509ce0b1 100644
--- a/docs/parsers/dig.md
+++ b/docs/parsers/dig.md
@@ -9,6 +9,7 @@ Options supported:
 - `+noall +answer` options are supported in cases where only the answer
   information is desired.
 - `+axfr` option is supported on its own
+- `+nsid` option is supported
 
 The `when_epoch` calculated timestamp field is naive. (i.e. based on the
 local time of the system the parser is run on)
@@ -345,4 +346,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, aix, freebsd, darwin, win32, cygwin
 
-Version 2.4 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 2.5 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/last.md b/docs/parsers/last.md
index 64927d50..a3c3d619 100644
--- a/docs/parsers/last.md
+++ b/docs/parsers/last.md
@@ -5,7 +5,7 @@
 
 jc - JSON Convert `last` and `lastb` command output parser
 
-Supports `-w` and `-F` options.
+Supports `-w`, `-F`, and `-x` options.
 
 Calculated epoch time fields are naive (i.e. based on the local time of the
 system the parser is run on) since there is no timezone information in the
@@ -127,4 +127,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, aix, freebsd
 
-Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.9 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/lsattr.md b/docs/parsers/lsattr.md
new file mode 100644
index 00000000..66b6d133
--- /dev/null
+++ b/docs/parsers/lsattr.md
@@ -0,0 +1,89 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+<a id="jc.parsers.lsattr"></a>
+
+# jc.parsers.lsattr
+
+jc - JSON Convert `lsattr` command output parser
+
+Usage (cli):
+
+    $ lsattr | jc --lsattr
+
+or
+
+    $ jc lsattr
+
+Usage (module):
+
+    import jc
+    result = jc.parse('lsattr', lsattr_command_output)
+
+Schema:
+
+Information from https://github.com/mirror/busybox/blob/2d4a3d9e6c1493a9520b907e07a41aca90cdfd94/e2fsprogs/e2fs_lib.c#L40
+used to define field names
+
+    [
+      {
+        "file":                           string,
+        "compressed_file":                Optional[boolean],
+        "compressed_dirty_file":          Optional[boolean],
+        "compression_raw_access":         Optional[boolean],
+        "secure_deletion":                Optional[boolean],
+        "undelete":                       Optional[boolean],
+        "synchronous_updates":            Optional[boolean],
+        "synchronous_directory_updates":  Optional[boolean],
+        "immutable":                      Optional[boolean],
+        "append_only":                    Optional[boolean],
+        "no_dump":                        Optional[boolean],
+        "no_atime":                       Optional[boolean],
+        "compression_requested":          Optional[boolean],
+        "encrypted":                      Optional[boolean],
+        "journaled_data":                 Optional[boolean],
+        "indexed_directory":              Optional[boolean],
+        "no_tailmerging":                 Optional[boolean],
+        "top_of_directory_hierarchies":   Optional[boolean],
+        "extents":                        Optional[boolean],
+        "no_cow":                         Optional[boolean],
+        "casefold":                       Optional[boolean],
+        "inline_data":                    Optional[boolean],
+        "project_hierarchy":              Optional[boolean],
+        "verity":                         Optional[boolean],
+      }
+    ]
+
+Examples:
+
+      $ sudo lsattr /etc/passwd | jc --lsattr
+      [
+        {
+            "file": "/etc/passwd",
+            "extents": true
+        }
+      ]
+
+<a id="jc.parsers.lsattr.parse"></a>
+
+### parse
+
+```python
+def parse(data: str,
+          raw: bool = False,
+          quiet: bool = False) -> List[JSONDictType]
+```
+
+Main text parsing function
+
+Parameters:
+
+    data:        (string)  text data to parse
+    quiet:       (boolean) suppress warning messages if True
+
+Returns:
+
+    List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility:  linux
+
+Version 1.0 by Mark Rotner (rotner.mr@gmail.com)
diff --git a/docs/parsers/netstat.md b/docs/parsers/netstat.md
index beb06e78..4c657ca1 100644
--- a/docs/parsers/netstat.md
+++ b/docs/parsers/netstat.md
@@ -376,6 +376,6 @@ Returns:
     List of Dictionaries. Raw or processed structured data.
 
 ### Parser Information
-Compatibility:  linux, darwin, freebsd
+Compatibility:  linux, darwin, freebsd, win32
 
-Version 1.13 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.14 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/ping.md b/docs/parsers/ping.md
index e13e41b1..2f884b43 100644
--- a/docs/parsers/ping.md
+++ b/docs/parsers/ping.md
@@ -185,4 +185,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, freebsd
 
-Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.9 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/ping_s.md b/docs/parsers/ping_s.md
index e5727553..07c4f165 100644
--- a/docs/parsers/ping_s.md
+++ b/docs/parsers/ping_s.md
@@ -106,4 +106,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, freebsd
 
-Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.3 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/route.md b/docs/parsers/route.md
index 3569de48..5a5aa21c 100644
--- a/docs/parsers/route.md
+++ b/docs/parsers/route.md
@@ -22,6 +22,13 @@ Schema:
 
     [
       {
+        "interfaces": [
+          {
+            "id": string,
+            "mac": string,
+            "name": string,
+          }
+        ]
         "destination":        string,
         "gateway":            string,
         "genmask":            string,
@@ -129,6 +136,6 @@ Returns:
     List of Dictionaries. Raw or processed structured data.
 
 ### Parser Information
-Compatibility:  linux
+Compatibility:  linux, win32
 
-Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.9 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/srt.md b/docs/parsers/srt.md
new file mode 100644
index 00000000..77febe3d
--- /dev/null
+++ b/docs/parsers/srt.md
@@ -0,0 +1,136 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+<a id="jc.parsers.srt"></a>
+
+# jc.parsers.srt
+
+jc - JSON Convert `SRT` file parser
+
+Usage (cli):
+
+    $ cat foo.srt | jc --srt
+
+Usage (module):
+
+    import jc
+    result = jc.parse('srt', srt_file_output)
+
+Schema:
+
+    [
+      {
+        "index":              int,
+        "start": {
+          "hours":            int,
+          "minutes":          int,
+          "seconds":          int,
+          "milliseconds":     int,
+          "timestamp":        string
+        },
+        "end": {
+          "hours":            int,
+          "minutes":          int,
+          "seconds":          int,
+          "milliseconds":     int,
+          "timestamp":        string
+        },
+        "content":            string
+      }
+    ]
+
+Examples:
+
+    $ cat attack_of_the_clones.srt
+    1
+    00:02:16,612 --> 00:02:19,376
+    Senator, we're making
+    our final approach into Coruscant.
+
+    2
+    00:02:19,482 --> 00:02:21,609
+    Very good, Lieutenant.
+    ...
+
+    $ cat attack_of_the_clones.srt | jc --srt
+    [
+        {
+            "index": 1,
+            "start": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 16,
+                "milliseconds": 612,
+                "timestamp": "00:02:16,612"
+            },
+            "end": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 19,
+                "milliseconds": 376,
+                "timestamp": "00:02:19,376"
+            },
+            "content": "Senator, we're making\nour final approach into Coruscant."
+        },
+        {
+            "index": 2,
+            "start": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 19,
+                "milliseconds": 482,
+                "timestamp": "00:02:19,482"
+            },
+            "end": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 21,
+                "milliseconds": 609,
+                "timestamp": "00:02:21,609"
+            },
+            "content": "Very good, Lieutenant."
+        },
+        ...
+    ]
+
+<a id="jc.parsers.srt.parse_timestamp"></a>
+
+### parse\_timestamp
+
+```python
+def parse_timestamp(timestamp: str) -> Dict
+```
+
+timestamp: "hours:minutes:seconds,milliseconds" --->
+{
+    "hours": "hours",
+    "minutes": "minutes",
+    "seconds": "seconds",
+    "milliseconds": "milliseconds",
+    "timestamp": "hours:minutes:seconds,milliseconds"
+}
+
+<a id="jc.parsers.srt.parse"></a>
+
+### parse
+
+```python
+def parse(data: str,
+          raw: bool = False,
+          quiet: bool = False) -> List[JSONDictType]
+```
+
+Main text parsing function
+
+Parameters:
+
+    data:        (string)  text data to parse
+    raw:         (boolean) unprocessed output if True
+    quiet:       (boolean) suppress warning messages if True
+
+Returns:
+
+    Dictionary. Raw or processed structured data.
+
+### Parser Information
+Compatibility:  linux, darwin, cygwin, win32, aix, freebsd
+
+Version 1.0 by Mark Rotner (rotner.mr@gmail.com)
diff --git a/docs/parsers/ss.md b/docs/parsers/ss.md
index 525dbaf6..473c4fd4 100644
--- a/docs/parsers/ss.md
+++ b/docs/parsers/ss.md
@@ -5,9 +5,6 @@
 
 jc - JSON Convert `ss` command output parser
 
-Extended information options like `-e` and `-p` are not supported and may
-cause parsing irregularities.
-
 Usage (cli):
 
     $ ss | jc --ss
@@ -28,21 +25,29 @@ field names
 
     [
       {
-        "netid":            string,
-        "state":            string,
-        "recv_q":           integer,
-        "send_q":           integer,
-        "local_address":    string,
-        "local_port":       string,
-        "local_port_num":   integer,
-        "peer_address":     string,
-        "peer_port":        string,
-        "peer_port_num":    integer,
-        "interface":        string,
-        "link_layer"        string,
-        "channel":          string,
-        "path":             string,
-        "pid":              integer
+        "netid":                      string,
+        "state":                      string,
+        "recv_q":                     integer,
+        "send_q":                     integer,
+        "local_address":              string,
+        "local_port":                 string,
+        "local_port_num":             integer,
+        "peer_address":               string,
+        "peer_port":                  string,
+        "peer_port_num":              integer,
+        "interface":                  string,
+        "link_layer"                  string,
+        "channel":                    string,
+        "path":                       string,
+        "pid":                        integer,
+        "opts": {
+          "process_id": {
+            "<process_id>": {
+              "user":                 string,
+              "file_descriptor":      string
+            }
+          }
+        }
       }
     ]
 
@@ -303,4 +308,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux
 
-Version 1.6 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.7 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/stat.md b/docs/parsers/stat.md
index 9cad94a0..b3229fba 100644
--- a/docs/parsers/stat.md
+++ b/docs/parsers/stat.md
@@ -193,4 +193,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, freebsd
 
-Version 1.12 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.13 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/veracrypt.md b/docs/parsers/veracrypt.md
new file mode 100644
index 00000000..308b233a
--- /dev/null
+++ b/docs/parsers/veracrypt.md
@@ -0,0 +1,108 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+<a id="jc.parsers.veracrypt"></a>
+
+# jc.parsers.veracrypt
+
+jc - JSON Convert `veracrypt` command output parser
+
+Supports the following `veracrypt` subcommands:
+- `veracrypt --text --list`
+- `veracrypt --text --list --verbose`
+- `veracrypt --text --volume-properties <volume>`
+
+Usage (cli):
+
+    $ veracrypt --text --list | jc --veracrypt
+or
+
+    $ jc veracrypt --text --list
+
+Usage (module):
+
+    import jc
+    result = jc.parse('veracrypt', veracrypt_command_output)
+
+Schema:
+
+    Volume:
+    [
+        {
+            "slot":                 integer,
+            "path":                 string,
+            "device":               string,
+            "mountpoint":           string,
+            "size":                 string,
+            "type":                 string,
+            "readonly":             string,
+            "hidden_protected":     string,
+            "encryption_algo":      string,
+            "pk_size":              string,
+            "sk_size":              string,
+            "block_size":           string,
+            "mode":                 string,
+            "prf":                  string,
+            "format_version":       integer,
+            "backup_header":        string
+        }
+    ]
+
+Examples:
+
+    $ veracrypt --text --list | jc --veracrypt -p
+    [
+        {
+            "slot": 1,
+            "path": "/dev/sdb1",
+            "device": "/dev/mapper/veracrypt1",
+            "mountpoint": "/home/bob/mount/encrypt/sdb1"
+        }
+    ]
+
+    $ veracrypt --text --list --verbose | jc --veracrypt -p
+    [
+        {
+            "slot": 1,
+            "path": "/dev/sdb1",
+            "device": "/dev/mapper/veracrypt1",
+            "mountpoint": "/home/bob/mount/encrypt/sdb1",
+            "size": "522 MiB",
+            "type": "Normal",
+            "readonly": "No",
+            "hidden_protected": "No",
+            "encryption_algo": "AES",
+            "pk_size": "256 bits",
+            "sk_size": "256 bits",
+            "block_size": "128 bits",
+            "mode": "XTS",
+            "prf": "HMAC-SHA-512",
+            "format_version": 2,
+            "backup_header": "Yes"
+        }
+    ]
+
+<a id="jc.parsers.veracrypt.parse"></a>
+
+### parse
+
+```python
+def parse(data: str,
+          raw: bool = False,
+          quiet: bool = False) -> List[JSONDictType]
+```
+
+Main text parsing function
+
+Parameters:
+
+    data:        (string)  text data to parse
+    raw:         (boolean) unprocessed output if True
+    quiet:       (boolean) suppress warning messages if True
+
+Returns:
+
+    List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility:  linux
+
+Version 1.0 by Jake Ob (iakopap at gmail.com)
diff --git a/docs/parsers/x509_cert.md b/docs/parsers/x509_cert.md
index 0b593a79..7fe2a77f 100644
--- a/docs/parsers/x509_cert.md
+++ b/docs/parsers/x509_cert.md
@@ -433,4 +433,4 @@ Returns:
 ### Parser Information
 Compatibility:  linux, darwin, cygwin, win32, aix, freebsd
 
-Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/x509_csr.md b/docs/parsers/x509_csr.md
new file mode 100644
index 00000000..9207205d
--- /dev/null
+++ b/docs/parsers/x509_csr.md
@@ -0,0 +1,282 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+<a id="jc.parsers.x509_csr"></a>
+
+# jc.parsers.x509\_csr
+
+jc - JSON Convert X.509 Certificate Request format file parser
+
+This parser will convert DER and PEM encoded X.509 certificate request files.
+
+Usage (cli):
+
+    $ cat certificateRequest.pem | jc --x509-csr
+
+Usage (module):
+
+    import jc
+    result = jc.parse('x509_csr', x509_csr_file_output)
+
+Schema:
+
+    [
+      {
+        "certification_request_info": {
+          "version":                      string,
+          "serial_number":                string,  # [0]
+          "serial_number_str":            string,
+          "signature": {
+            "algorithm":                  string,
+            "parameters":                 string/null,
+          },
+          "issuer": {
+            "country_name":               string,
+            "state_or_province_name"      string,
+            "locality_name":              string,
+            "organization_name":          array/string,
+            "organizational_unit_name":   array/string,
+            "common_name":                string,
+            "email_address":              string,
+            "serial_number":              string,   # [0]
+            "serial_number_str":          string
+          },
+          "validity": {
+            "not_before":                 integer,  # [1]
+            "not_after":                  integer,  # [1]
+            "not_before_iso":             string,
+            "not_after_iso":              string
+          },
+          "subject": {
+            "country_name":               string,
+            "state_or_province_name":     string,
+            "locality_name":              string,
+            "organization_name":          array/string,
+            "organizational_unit_name":   array/string,
+            "common_name":                string,
+            "email_address":              string,
+            "serial_number":              string,   # [0]
+            "serial_number_str":          string
+          },
+          "subject_public_key_info": {
+            "algorithm": {
+              "algorithm":                string,
+              "parameters":               string/null,
+            },
+            "public_key": {
+              "modulus":                  string,  # [0]
+              "public_exponent":          integer
+            }
+          },
+          "issuer_unique_id":             string/null,
+          "subject_unique_id":            string/null,
+          "extensions": [
+            {
+              "extn_id":                  string,
+              "critical":                 boolean,
+              "extn_value":               array/object/string/integer  # [2]
+            }
+          ]
+        },
+        "signature_algorithm": {
+          "algorithm":                    string,
+          "parameters":                   string/null
+        },
+        "signature_value":                string  # [0]
+      }
+    ]
+
+    [0] in colon-delimited hex notation
+    [1] time-zone-aware (UTC) epoch timestamp
+    [2] See below for well-known Extension schemas:
+
+        Basic Constraints:
+        {
+          "extn_id":                          "basic_constraints",
+          "critical":                         boolean,
+          "extn_value": {
+            "ca":                             boolean,
+            "path_len_constraint":            string/null
+          }
+        }
+
+        Key Usage:
+        {
+          "extn_id":                          "key_usage",
+          "critical":                         boolean,
+          "extn_value": [
+                                              string
+          ]
+        }
+
+        Key Identifier:
+        {
+          "extn_id":                          "key_identifier",
+          "critical":                         boolean,
+          "extn_value":                       string  # [0]
+        }
+
+        Authority Key Identifier:
+        {
+          "extn_id":                          "authority_key_identifier",
+          "critical":                         boolean,
+          "extn_value": {
+            "key_identifier":                 string,  # [0]
+            "authority_cert_issuer":          string/null,
+            "authority_cert_serial_number":   string/null
+          }
+        }
+
+        Subject Alternative Name:
+        {
+          "extn_id":                          "subject_alt_name",
+          "critical":                         boolean,
+          "extn_value": [
+                                              string
+          ]
+        }
+
+        Certificate Policies:
+        {
+          "extn_id":                          "certificate_policies",
+          "critical":                         boolean,
+          "extn_value": [
+            {
+              "policy_identifier":            string,
+              "policy_qualifiers": [          array or null
+                {
+                  "policy_qualifier_id":      string,
+                  "qualifier":                string
+                }
+              ]
+            }
+          ]
+        }
+
+        Signed Certificate Timestamp List:
+        {
+          "extn_id":                    "signed_certificate_timestamp_list",
+          "critical":                   boolean,
+          "extn_value":                 string  # [0]
+        }
+
+Examples:
+
+    $ cat server.csr| jc --x509-csr -p
+      [
+        {
+          "certification_request_info": {
+            "version": "v1",
+            "subject": {
+              "common_name": "myserver.for.example"
+            },
+            "subject_pk_info": {
+              "algorithm": {
+                "algorithm": "ec",
+                "parameters": "secp256r1"
+              },
+              "public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
+            },
+            "attributes": [
+              {
+                "type": "extension_request",
+                "values": [
+                  [
+                    {
+                      "extn_id": "extended_key_usage",
+                      "critical": false,
+                      "extn_value": [
+                        "server_auth"
+                      ]
+                    },
+                    {
+                      "extn_id": "subject_alt_name",
+                      "critical": false,
+                      "extn_value": [
+                        "myserver.for.example"
+                      ]
+                    }
+                  ]
+                ]
+              }
+            ]
+          },
+          "signature_algorithm": {
+            "algorithm": "sha384_ecdsa",
+            "parameters": null
+          },
+          "signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
+        }
+      ]
+
+    $ openssl req -in server.csr | jc --x509-csr -p
+      [
+        {
+          "certification_request_info": {
+            "version": "v1",
+            "subject": {
+              "common_name": "myserver.for.example"
+            },
+            "subject_pk_info": {
+              "algorithm": {
+                "algorithm": "ec",
+                "parameters": "secp256r1"
+              },
+              "public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
+            },
+            "attributes": [
+              {
+                "type": "extension_request",
+                "values": [
+                  [
+                    {
+                      "extn_id": "extended_key_usage",
+                      "critical": false,
+                      "extn_value": [
+                        "server_auth"
+                      ]
+                    },
+                    {
+                      "extn_id": "subject_alt_name",
+                      "critical": false,
+                      "extn_value": [
+                        "myserver.for.example"
+                      ]
+                    }
+                  ]
+                ]
+              }
+            ]
+          },
+          "signature_algorithm": {
+            "algorithm": "sha384_ecdsa",
+            "parameters": null
+          },
+          "signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
+        }
+      ]
+
+<a id="jc.parsers.x509_csr.parse"></a>
+
+### parse
+
+```python
+def parse(data: Union[str, bytes],
+          raw: bool = False,
+          quiet: bool = False) -> List[Dict]
+```
+
+Main text parsing function
+
+Parameters:
+
+    data:        (string or bytes) text or binary data to parse
+    raw:         (boolean) unprocessed output if True
+    quiet:       (boolean) suppress warning messages if True
+
+Returns:
+
+    List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility:  linux, darwin, cygwin, win32, aix, freebsd
+
+Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/jc/lib.py b/jc/lib.py
index 80afd720..526a8606 100644
--- a/jc/lib.py
+++ b/jc/lib.py
@@ -9,7 +9,7 @@ from .jc_types import ParserInfoType, JSONDictType
 from jc import appdirs
 
 
-__version__ = '1.23.2'
+__version__ = '1.23.3'
 
 parsers: List[str] = [
     'acpi',
@@ -76,6 +76,7 @@ parsers: List[str] = [
     'last',
     'ls',
     'ls-s',
+    'lsattr',
     'lsblk',
     'lsmod',
     'lsof',
@@ -160,6 +161,7 @@ parsers: List[str] = [
     'semver',
     'sfdisk',
     'shadow',
+    'srt',
     'ss',
     'ssh-conf',
     'sshd-conf',
@@ -193,12 +195,14 @@ parsers: List[str] = [
     'uptime',
     'url',
     'ver',
+    'veracrypt',
     'vmstat',
     'vmstat-s',
     'w',
     'wc',
     'who',
     'x509-cert',
+    'x509-csr',
     'xml',
     'xrandr',
     'yaml',
diff --git a/jc/parsers/asn1crypto/jc_global.py b/jc/parsers/asn1crypto/jc_global.py
new file mode 100644
index 00000000..91f2eb2c
--- /dev/null
+++ b/jc/parsers/asn1crypto/jc_global.py
@@ -0,0 +1 @@
+quiet = False
\ No newline at end of file
diff --git a/jc/parsers/asn1crypto/x509.py b/jc/parsers/asn1crypto/x509.py
index 8cfb2c78..2279bf53 100644
--- a/jc/parsers/asn1crypto/x509.py
+++ b/jc/parsers/asn1crypto/x509.py
@@ -251,7 +251,18 @@ class EmailAddress(IA5String):
                 self._unicode = contents.decode('cp1252')
             else:
                 mailbox, hostname = contents.rsplit(b'@', 1)
-                self._unicode = mailbox.decode('cp1252') + '@' + hostname.decode('idna')
+
+                # fix to allow incorrectly encoded email addresses to succeed with warning
+                try:
+                    self._unicode = mailbox.decode('cp1252') + '@' + hostname.decode('idna')
+                except UnicodeDecodeError:
+                    ascii_mailbox = mailbox.decode('ascii', errors='backslashreplace')
+                    ascii_hostname = hostname.decode('ascii', errors='backslashreplace')
+                    from jc.utils import warning_message
+                    import jc.parsers.asn1crypto.jc_global as jc_global
+                    if not jc_global.quiet:
+                        warning_message([f'Invalid email address found: {ascii_mailbox}@{ascii_hostname}'])
+                    self._unicode = ascii_mailbox + '@' + ascii_hostname
         return self._unicode
 
     def __ne__(self, other):
diff --git a/jc/parsers/bluetoothctl.py b/jc/parsers/bluetoothctl.py
index 9387947d..da3209e0 100644
--- a/jc/parsers/bluetoothctl.py
+++ b/jc/parsers/bluetoothctl.py
@@ -31,6 +31,7 @@ a controller and a device but there might be fields corresponding to one entity.
             "name":                 string,
             "is_default":           boolean,
             "is_public":            boolean,
+            "is_random":            boolean,
             "address":              string,
             "alias":                string,
             "class":                string,
@@ -49,8 +50,10 @@ a controller and a device but there might be fields corresponding to one entity.
         {
             "name":                 string,
             "is_public":            boolean,
+            "is_random":            boolean,
             "address":              string,
             "alias":                string,
+            "appearance":           string,
             "class":                string,
             "icon":                 string,
             "paired":               string,
@@ -61,7 +64,8 @@ a controller and a device but there might be fields corresponding to one entity.
             "legacy_pairing":       string,
             "rssi":                 int,
             "txpower":              int,
-            "uuids":                array
+            "uuids":                array,
+            "modalias":             string
         }
     ]
 
@@ -104,12 +108,12 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.0'
+    version = '1.1'
     description = '`bluetoothctl` command parser'
     author = 'Jake Ob'
     author_email = 'iakopap at gmail.com'
-    compatible = ["linux"]
-    magic_commands = ["bluetoothctl"]
+    compatible = ['linux']
+    magic_commands = ['bluetoothctl']
     tags = ['command']
 
 
@@ -124,6 +128,7 @@ try:
             "name": str,
             "is_default": bool,
             "is_public": bool,
+            "is_random": bool,
             "address": str,
             "alias": str,
             "class": str,
@@ -141,8 +146,10 @@ try:
         {
             "name": str,
             "is_public": bool,
+            "is_random": bool,
             "address": str,
             "alias": str,
+            "appearance": str,
             "class": str,
             "icon": str,
             "paired": str,
@@ -154,6 +161,7 @@ try:
             "rssi": int,
             "txpower": int,
             "uuids": List[str],
+            "modalias": str
         },
     )
 except ImportError:
@@ -195,6 +203,7 @@ def _parse_controller(next_lines: List[str]) -> Optional[Controller]:
             "name": '',
             "is_default": False,
             "is_public": False,
+            "is_random": False,
             "address": matches["address"],
             "alias": '',
             "class": '',
@@ -210,10 +219,12 @@ def _parse_controller(next_lines: List[str]) -> Optional[Controller]:
     if name.endswith("[default]"):
         controller["is_default"] = True
         name = name.replace("[default]", "")
-
-    if name.endswith("(public)"):
+    elif name.endswith("(public)"):
         controller["is_public"] = True
         name = name.replace("(public)", "")
+    elif name.endswith("(random)"):
+        controller["is_random"] = True
+        name = name.replace("(random)", "")
 
     controller["name"] = name.strip()
 
@@ -257,6 +268,7 @@ _device_head_pattern = r"Device (?P<address>([0-9A-F]{2}:){5}[0-9A-F]{2}) (?P<na
 _device_line_pattern = (
     r"(\s*Name:\s*(?P<name>.+)"
     + r"|\s*Alias:\s*(?P<alias>.+)"
+    + r"|\s*Appearance:\s*(?P<appearance>.+)"
     + r"|\s*Class:\s*(?P<class>.+)"
     + r"|\s*Icon:\s*(?P<icon>.+)"
     + r"|\s*Paired:\s*(?P<paired>.+)"
@@ -290,8 +302,10 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
     device: Device = {
         "name": '',
         "is_public": False,
+        "is_random": False,
         "address": matches["address"],
         "alias": '',
+        "appearance": '',
         "class": '',
         "icon": '',
         "paired": '',
@@ -303,11 +317,15 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
         "rssi": 0,
         "txpower": 0,
         "uuids": [],
+        "modalias": ''
     }
 
     if name.endswith("(public)"):
         device["is_public"] = True
         name = name.replace("(public)", "")
+    elif name.endswith("(random)"):
+        device["is_random"] = True
+        name = name.replace("(random)", "")
 
     device["name"] = name.strip()
 
@@ -325,6 +343,8 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
             device["name"] = matches["name"]
         elif matches["alias"]:
             device["alias"] = matches["alias"]
+        elif matches["appearance"]:
+            device["appearance"] = matches["appearance"]
         elif matches["class"]:
             device["class"] = matches["class"]
         elif matches["icon"]:
@@ -359,6 +379,8 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
             if not "uuids" in device:
                 device["uuids"] = []
             device["uuids"].append(matches["uuid"])
+        elif matches["modalias"]:
+            device["modalias"] = matches["modalias"]
 
     return device
 
@@ -376,12 +398,11 @@ def parse(data: str, raw: bool = False, quiet: bool = False) -> List[JSONDictTyp
 
         List of Dictionaries. Raw or processed structured data.
     """
+    jc.utils.compatibility(__name__, info.compatible, quiet)
+    jc.utils.input_type_check(data)
     result: List = []
 
     if jc.utils.has_data(data):
-        jc.utils.compatibility(__name__, info.compatible, quiet)
-        jc.utils.input_type_check(data)
-
         linedata = data.splitlines()
         linedata.reverse()
 
diff --git a/jc/parsers/certbot.py b/jc/parsers/certbot.py
index d05bd43e..4fa7c65d 100644
--- a/jc/parsers/certbot.py
+++ b/jc/parsers/certbot.py
@@ -130,6 +130,7 @@ Examples:
       }
     }
 """
+import re
 from typing import List, Dict
 from jc.jc_types import JSONDictType
 import jc.utils
@@ -137,7 +138,7 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.0'
+    version = '1.1'
     description = '`certbot` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -200,7 +201,9 @@ def parse(
 
     if jc.utils.has_data(data):
 
-        if 'Found the following certs:\n' in data:
+        cert_pattern = re.compile(r'^Found the following certs:$', re.MULTILINE)
+
+        if re.search(cert_pattern, data):
             cmd_option = 'certificates'
         else:
             cmd_option = 'account'
diff --git a/jc/parsers/dig.py b/jc/parsers/dig.py
index b184454e..cc146019 100644
--- a/jc/parsers/dig.py
+++ b/jc/parsers/dig.py
@@ -4,6 +4,7 @@ Options supported:
 - `+noall +answer` options are supported in cases where only the answer
   information is desired.
 - `+axfr` option is supported on its own
+- `+nsid` option is supported
 
 The `when_epoch` calculated timestamp field is naive. (i.e. based on the
 local time of the system the parser is run on)
@@ -322,7 +323,7 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '2.4'
+    version = '2.5'
     description = '`dig` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -427,6 +428,7 @@ def _parse_flags_line(flagsline):
 def _parse_opt_pseudosection(optline):
     # ;; OPT PSEUDOSECTION:
     # ; EDNS: version: 0, flags:; udp: 4096
+    # ; NSID: 67 70 64 6e 73 2d 73 66 6f ("gpdns-sfo")
     # ; COOKIE: 1cbc06703eaef210
     if optline.startswith('; EDNS:'):
         optline_list = optline.replace(',', ' ').split(';')
@@ -443,11 +445,18 @@ def _parse_opt_pseudosection(optline):
             }
         }
 
-    elif optline.startswith('; COOKIE:'):
+    if optline.startswith('; COOKIE:'):
         return {
             'cookie': optline.split()[2]
         }
 
+    if optline.startswith('; NSID:'):
+        return {
+            'nsid': optline.split('("')[-1].rstrip('")')
+        }
+
+    return {}
+
 
 def _parse_question(question):
     # ;www.cnn.com.           IN  A
diff --git a/jc/parsers/last.py b/jc/parsers/last.py
index 36f5f95e..8683e3d1 100644
--- a/jc/parsers/last.py
+++ b/jc/parsers/last.py
@@ -1,6 +1,6 @@
 """jc - JSON Convert `last` and `lastb` command output parser
 
-Supports `-w` and `-F` options.
+Supports `-w`, `-F`, and `-x` options.
 
 Calculated epoch time fields are naive (i.e. based on the local time of the
 system the parser is run on) since there is no timezone information in the
@@ -103,10 +103,15 @@ Examples:
 import re
 import jc.utils
 
+DATE_RE = re.compile(r'[MTWFS][ouerha][nedritnu] [JFMASOND][aepuco][nbrynlgptvc]')
+LAST_F_DATE_RE = re.compile(r'\d\d:\d\d:\d\d \d\d\d\d')
+LOGIN_LOGOUT_EPOCH_RE = re.compile(r'.*\d\d:\d\d:\d\d \d\d\d\d.*')
+LOGOUT_IGNORED_EVENTS = ['down', 'crash']
+
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.8'
+    version = '1.9'
     description = '`last` and `lastb` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -138,9 +143,6 @@ def _process(proc_data):
         if 'tty' in entry and entry['tty'] == '~':
             entry['tty'] = None
 
-        if 'tty' in entry and entry['tty'] == 'system_boot':
-            entry['tty'] = 'system boot'
-
         if 'hostname' in entry and entry['hostname'] == '-':
             entry['hostname'] = None
 
@@ -153,11 +155,11 @@ def _process(proc_data):
         if 'logout' in entry and entry['logout'] == 'gone_-_no_logout':
             entry['logout'] = 'gone - no logout'
 
-        if 'login' in entry and re.match(r'.*\d\d:\d\d:\d\d \d\d\d\d.*', entry['login']):
+        if 'login' in entry and LOGIN_LOGOUT_EPOCH_RE.match(entry['login']):
             timestamp = jc.utils.timestamp(entry['login'])
             entry['login_epoch'] = timestamp.naive
 
-        if 'logout' in entry and re.match(r'.*\d\d:\d\d:\d\d \d\d\d\d.*', entry['logout']):
+        if 'logout' in entry and LOGIN_LOGOUT_EPOCH_RE.match(entry['logout']):
             timestamp = jc.utils.timestamp(entry['logout'])
             entry['logout_epoch'] = timestamp.naive
 
@@ -194,66 +196,71 @@ def parse(data, raw=False, quiet=False):
     # Clear any blank lines
     cleandata = list(filter(None, data.splitlines()))
 
-    if jc.utils.has_data(data):
+    if not jc.utils.has_data(data):
+        return []
 
-        for entry in cleandata:
-            output_line = {}
+    for entry in cleandata:
+        output_line = {}
 
-            if (entry.startswith('wtmp begins ') or
-                entry.startswith('btmp begins ') or
-                entry.startswith('utx.log begins ')):
+        if any(
+            entry.startswith(f'{prefix} begins ')
+            for prefix in ['wtmp', 'btmp', 'utx.log']
+        ):
+            continue
 
-                continue
+        entry = entry.replace('boot time', 'boot_time')
+        entry = entry.replace('  still logged in', '- still_logged_in')
+        entry = entry.replace('  gone - no logout', '- gone_-_no_logout')
 
-            entry = entry.replace('system boot', 'system_boot')
-            entry = entry.replace('boot time', 'boot_time')
-            entry = entry.replace('  still logged in', '- still_logged_in')
-            entry = entry.replace('  gone - no logout', '- gone_-_no_logout')
+        linedata = entry.split()
 
-            linedata = entry.split()
-            if re.match(r'[MTWFS][ouerha][nedritnu] [JFMASOND][aepuco][nbrynlgptvc]', ' '.join(linedata[2:4])):
-                linedata.insert(2, '-')
+        # Adding "-" before the date part.
+        if DATE_RE.match(' '.join(linedata[2:4])):
+            linedata.insert(2, '-')
 
-            # freebsd fix
-            if linedata[0] == 'boot_time':
-                linedata.insert(1, '-')
-                linedata.insert(1, '~')
+        # freebsd fix
+        if linedata[0] == 'boot_time':
+            linedata.insert(1, '-')
+            linedata.insert(1, '~')
 
-            output_line['user'] = linedata[0]
-            output_line['tty'] = linedata[1]
-            output_line['hostname'] = linedata[2]
+        output_line['user'] = linedata[0]
 
-            # last -F support
-            if re.match(r'\d\d:\d\d:\d\d \d\d\d\d', ' '.join(linedata[6:8])):
-                output_line['login'] = ' '.join(linedata[3:8])
+        # Fix for last -x (runlevel).
+        if output_line['user'] == 'runlevel' and  linedata[1] == '(to':
+            linedata[1] += f' {linedata.pop(2)} {linedata.pop(2)}'
+        elif output_line['user'] in ['reboot', 'shutdown'] and linedata[1] == 'system':  # system down\system boot
+            linedata[1] += f' {linedata.pop(2)}'
 
-                if len(linedata) > 9 and linedata[9] != 'crash' and linedata[9] != 'down':
+        output_line['tty'] = linedata[1]
+        output_line['hostname'] = linedata[2]
+
+        # last -F support
+        if LAST_F_DATE_RE.match(' '.join(linedata[6:8])):
+            output_line['login'] = ' '.join(linedata[3:8])
+
+            if len(linedata) > 9:
+                if linedata[9] not in LOGOUT_IGNORED_EVENTS:
                     output_line['logout'] = ' '.join(linedata[9:14])
-
-                if len(linedata) > 9 and (linedata[9] == 'crash' or linedata[9] == 'down'):
+                else:
                     output_line['logout'] = linedata[9]
                     # add more items to the list to line up duration
-                    linedata.insert(10, '-')
-                    linedata.insert(10, '-')
-                    linedata.insert(10, '-')
-                    linedata.insert(10, '-')
+                    for _ in range(4):
+                        linedata.insert(10, '-')
 
-                if len(linedata) > 14:
-                    output_line['duration'] = linedata[14].replace('(', '').replace(')', '')
+            if len(linedata) > 14:
+                output_line['duration'] = linedata[14].replace('(', '').replace(')', '')
+        else: # normal last support
+            output_line['login'] = ' '.join(linedata[3:7])
 
-            # normal last support
-            else:
-                output_line['login'] = ' '.join(linedata[3:7])
+            if len(linedata) > 8:
+                output_line['logout'] = linedata[8]
 
-                if len(linedata) > 8:
-                    output_line['logout'] = linedata[8]
+            if len(linedata) > 9:
+                output_line['duration'] = linedata[9].replace('(', '').replace(')', '')
 
-                if len(linedata) > 9:
-                    output_line['duration'] = linedata[9].replace('(', '').replace(')', '')
-
-            raw_output.append(output_line)
+        raw_output.append(output_line)
 
     if raw:
         return raw_output
-    else:
-        return _process(raw_output)
+
+    return _process(raw_output)
diff --git a/jc/parsers/lsattr.py b/jc/parsers/lsattr.py
new file mode 100644
index 00000000..30d60945
--- /dev/null
+++ b/jc/parsers/lsattr.py
@@ -0,0 +1,162 @@
+"""jc - JSON Convert `lsattr` command output parser
+
+Usage (cli):
+
+    $ lsattr | jc --lsattr
+
+or
+
+    $ jc lsattr
+
+Usage (module):
+
+    import jc
+    result = jc.parse('lsattr', lsattr_command_output)
+
+Schema:
+
+Information from https://github.com/mirror/busybox/blob/2d4a3d9e6c1493a9520b907e07a41aca90cdfd94/e2fsprogs/e2fs_lib.c#L40
+used to define field names
+
+    [
+      {
+        "file":                           string,
+        "compressed_file":                Optional[boolean],
+        "compressed_dirty_file":          Optional[boolean],
+        "compression_raw_access":         Optional[boolean],
+        "secure_deletion":                Optional[boolean],
+        "undelete":                       Optional[boolean],
+        "synchronous_updates":            Optional[boolean],
+        "synchronous_directory_updates":  Optional[boolean],
+        "immutable":                      Optional[boolean],
+        "append_only":                    Optional[boolean],
+        "no_dump":                        Optional[boolean],
+        "no_atime":                       Optional[boolean],
+        "compression_requested":          Optional[boolean],
+        "encrypted":                      Optional[boolean],
+        "journaled_data":                 Optional[boolean],
+        "indexed_directory":              Optional[boolean],
+        "no_tailmerging":                 Optional[boolean],
+        "top_of_directory_hierarchies":   Optional[boolean],
+        "extents":                        Optional[boolean],
+        "no_cow":                         Optional[boolean],
+        "casefold":                       Optional[boolean],
+        "inline_data":                    Optional[boolean],
+        "project_hierarchy":              Optional[boolean],
+        "verity":                         Optional[boolean],
+      }
+    ]
+
+Examples:
+
+      $ sudo lsattr /etc/passwd | jc --lsattr
+      [
+        {
+            "file": "/etc/passwd",
+            "extents": true
+        }
+      ]
+"""
+from typing import List, Dict
+from jc.jc_types import JSONDictType
+import jc.utils
+
+
+class info():
+    """Provides parser metadata (version, author, etc.)"""
+    version = '1.0'
+    description = '`lsattr` command parser'
+    author = 'Mark Rotner'
+    author_email = 'rotner.mr@gmail.com'
+    compatible = ['linux']
+    magic_commands = ['lsattr']
+    tags = ['command']
+
+
+__version__ = info.version
+
+
+ERROR_PREFIX = "lsattr:"
+
+# https://github.com/mirror/busybox/blob/2d4a3d9e6c1493a9520b907e07a41aca90cdfd94/e2fsprogs/e2fs_lib.c#L40
+# https://github.com/landley/toybox/blob/f1682dc79fd75f64042b5438918fe5a507977e1c/toys/other/lsattr.c#L97
+ATTRIBUTES = {
+    "B": "compressed_file",
+    "Z": "compressed_dirty_file",
+    "X": "compression_raw_access",
+    "s": "secure_deletion",
+    "u": "undelete",
+    "S": "synchronous_updates",
+    "D": "synchronous_directory_updates",
+    "i": "immutable",
+    "a": "append_only",
+    "d": "no_dump",
+    "A": "no_atime",
+    "c": "compression_requested",
+    "E": "encrypted",
+    "j": "journaled_data",
+    "I": "indexed_directory",
+    "t": "no_tailmerging",
+    "T": "top_of_directory_hierarchies",
+    "e": "extents",
+    "C": "no_cow",
+    "F": "casefold",
+    "N": "inline_data",
+    "P": "project_hierarchy",
+    "V": "verity",
+}
+
+
+def parse(
+    data: str,
+    raw: bool = False,
+    quiet: bool = False
+) -> List[JSONDictType]:
+    """
+    Main text parsing function
+
+    Parameters:
+
+        data:        (string)  text data to parse
+        quiet:       (boolean) suppress warning messages if True
+
+    Returns:
+
+        List of Dictionaries. Raw or processed structured data.
+    """
+    jc.utils.compatibility(__name__, info.compatible, quiet)
+    jc.utils.input_type_check(data)
+
+    output: List = []
+
+    cleandata = list(filter(None, data.splitlines()))
+
+    if not jc.utils.has_data(data):
+        return output
+
+    for line in cleandata:
+        # -R flag returns the output in the format:
+        # Folder:
+        #   attributes file_in_folder
+        if line.endswith(':'):
+            continue
+
+        # lsattr: Operation not supported ....
+        if line.startswith(ERROR_PREFIX):
+            continue
+
+        line_output: Dict = {}
+
+        # attributes file
+        # --------------e----- /etc/passwd
+        attributes, file = line.split()
+        line_output['file'] = file
+        for attribute in list(attributes):
+            attribute_key = ATTRIBUTES.get(attribute)
+            if attribute_key:
+                line_output[attribute_key] = True
+
+        if line_output:
+            output.append(line_output)
+
+    return output
diff --git a/jc/parsers/netstat.py b/jc/parsers/netstat.py
index 5e86ef27..2842c796 100644
--- a/jc/parsers/netstat.py
+++ b/jc/parsers/netstat.py
@@ -355,17 +355,18 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.13'
+    version = '1.14'
     description = '`netstat` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
-    compatible = ['linux', 'darwin', 'freebsd']
+    compatible = ['linux', 'darwin', 'freebsd', 'win32']
     magic_commands = ['netstat']
     tags = ['command']
 
 
 __version__ = info.version
 
+WINDOWS_NETSTAT_HEADER = "Active Connections"
 
 def _process(proc_data):
     """
@@ -450,9 +451,10 @@ def parse(data, raw=False, quiet=False):
 
             import jc.parsers.netstat_freebsd_osx
             raw_output = jc.parsers.netstat_freebsd_osx.parse(cleandata)
-
-        # use linux parser
-        else:
+        elif cleandata[0] == WINDOWS_NETSTAT_HEADER:  # use windows parser.
+            import jc.parsers.netstat_windows
+            raw_output = jc.parsers.netstat_windows.parse(cleandata)
+        else:  # use linux parser.
             import jc.parsers.netstat_linux
             raw_output = jc.parsers.netstat_linux.parse(cleandata)
 
diff --git a/jc/parsers/netstat_windows.py b/jc/parsers/netstat_windows.py
new file mode 100644
index 00000000..835bc163
--- /dev/null
+++ b/jc/parsers/netstat_windows.py
@@ -0,0 +1,75 @@
+"""
+    jc - JSON Convert Windows `netstat` command output parser
+"""
+
+
+from typing import Dict, List
+
+POSSIBLE_PROTOCOLS = ("TCP", "UDP", "TCPv6", "UDPv6")
+
+def normalize_headers(headers: str):
+    """
+        Normalizes the headers to match the jc netstat parser style
+        (local_address -> local_address, local_port...).
+    """
+
+    headers = headers.lower().strip()
+    headers = headers.replace("local address", "local_address")
+    headers = headers.replace("foreign address", "foreign_address")
+    return headers.split()
+
+
+def parse(cleandata: List[str]):
+    """
+    Main text parsing function for Windows netstat
+
+    Parameters:
+
+        cleandata:   (string)  text data to parse
+
+    Returns:
+
+        List of Dictionaries. Raw structured data.
+    """
+
+    raw_output = []
+    cleandata.pop(0)  # Removing the "Active Connections" header.
+    headers = normalize_headers(cleandata.pop(0))
+
+    for line in cleandata:
+        line = line.strip()
+
+        if not line.startswith(POSSIBLE_PROTOCOLS):  # -b.
+            line_data = raw_output.pop(len(raw_output) - 1)
+            line_data['program_name'] = line
+            raw_output.append(line_data)
+            continue
+
+        line_data = line.split()
+        line_data: Dict[str, str] = dict(zip(headers, line_data))
+        for key in list(line_data.keys()):
+            if key == "local_address":
+                local_address, local_port = line_data[key].rsplit(
+                    ":", maxsplit=1)
+                line_data["local_address"] = local_address
+                line_data["local_port"] = local_port
+                continue
+
+            if key == "foreign_address":
+                foreign_address, foreign_port = line_data[key].rsplit(
+                    ":", maxsplit=1)
+                line_data["foreign_address"] = foreign_address
+                line_data["foreign_port"] = foreign_port
+                continue
+
+            # There is no state in UDP, so the data after the "state" header will leak.
+            if key == "proto" and "state" in headers and line_data["proto"] == "UDP":
+                next_header = headers.index("state") + 1
+                if len(headers) > next_header:
+                    next_header = headers[next_header]
+                    line_data[next_header] = line_data["state"]
+                    line_data["state"] = ''
+
+        raw_output.append(line_data)
+
+    return raw_output
diff --git a/jc/parsers/ping.py b/jc/parsers/ping.py
index 98129856..18b83ecc 100644
--- a/jc/parsers/ping.py
+++ b/jc/parsers/ping.py
@@ -164,7 +164,7 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.8'
+    version = '1.9'
     description = '`ping` and `ping6` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -284,6 +284,8 @@ def _linux_parse(data):
 
     if ipv4 and linedata[0][5] not in string.digits:
         hostname = True
+        # fixup for missing hostname
+        linedata[0] = linedata[0][:5] + 'nohost' + linedata[0][5:]
     elif ipv4 and linedata[0][5] in string.digits:
         hostname = False
     elif not ipv4 and ' (' in linedata[0]:
@@ -314,7 +316,8 @@ def _linux_parse(data):
 
         if line.startswith('---'):
             footer = True
-            raw_output['destination'] = line.split()[1]
+            if line[4] != ' ':  # fixup for missing hostname
+                raw_output['destination'] = line.split()[1]
             continue
 
         if footer:
diff --git a/jc/parsers/ping_s.py b/jc/parsers/ping_s.py
index d68a14cb..1e141fe7 100644
--- a/jc/parsers/ping_s.py
+++ b/jc/parsers/ping_s.py
@@ -85,7 +85,7 @@ from jc.exceptions import ParseError
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.2'
+    version = '1.3'
     description = '`ping` and `ping6` command streaming parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -340,6 +340,8 @@ def _linux_parse(line, s):
 
         if s.ipv4 and line[5] not in string.digits:
             s.hostname = True
+            # fixup for missing hostname
+            line = line[:5] + 'nohost' + line[5:]
         elif s.ipv4 and line[5] in string.digits:
             s.hostname = False
         elif not s.ipv4 and ' (' in line:
diff --git a/jc/parsers/route.py b/jc/parsers/route.py
index add7cf53..b9590ee6 100644
--- a/jc/parsers/route.py
+++ b/jc/parsers/route.py
@@ -17,6 +17,13 @@ Schema:
 
     [
       {
+        "interfaces": [
+          {
+            "id": string,
+            "mac": string,
+            "name": string,
+          }
+        ]
         "destination":        string,
         "gateway":            string,
         "genmask":            string,
@@ -109,11 +116,11 @@ import jc.parsers.universal
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.8'
+    version = '1.9'
     description = '`route` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
-    compatible = ['linux']
+    compatible = ['linux', 'win32']
     magic_commands = ['route']
     tags = ['command']
 
@@ -152,6 +159,14 @@ def _process(proc_data):
             if key in int_list:
                 entry[key] = jc.utils.convert_to_int(entry[key])
 
+        if 'interfaces' in entry:
+            interfaces = []
+            for interface in entry["interfaces"]:
+                # 00 ff 58 60 5f 61 -> 00:ff:58:60:5f:61
+                interface['mac'] = interface['mac'].replace(' ', ':').replace('.', '')
+                interfaces.append(interface)
+            entry["interfaces"] = interfaces
+
         # add flags_pretty
         # Flag mapping from https://www.man7.org/linux/man-pages/man8/route.8.html
         if 'flags' in entry:
@@ -165,6 +180,16 @@ def _process(proc_data):
 
     return proc_data
 
+def normalize_headers(headers: str):
+    # fixup header row for ipv6
+    if ' Next Hop ' in headers:
+      headers = headers.replace(' If', ' Iface')
+
+    headers = headers.replace(' Next Hop ', ' Next_Hop ')
+    headers = headers.replace(' Flag ', ' Flags ')
+    headers = headers.replace(' Met ', ' Metric ')
+    headers = headers.lower()
+    return headers
 
 def parse(data, raw=False, quiet=False):
     """
@@ -180,24 +205,22 @@ def parse(data, raw=False, quiet=False):
 
         List of Dictionaries. Raw or processed structured data.
     """
+    import jc.utils
     jc.utils.compatibility(__name__, info.compatible, quiet)
     jc.utils.input_type_check(data)
-
-    cleandata = data.splitlines()[1:]
+    cleandata = data.splitlines()
 
     raw_output = []
 
     if jc.utils.has_data(data):
-
-        # fixup header row for ipv6
-        if ' Next Hop ' in cleandata[0]:
-            cleandata[0] = cleandata[0].replace(' If', ' Iface')
-        cleandata[0] = cleandata[0].replace(' Next Hop ', ' Next_Hop ')\
-                                   .replace(' Flag ', ' Flags ')\
-                                   .replace(' Met ', ' Metric ')
-
-        cleandata[0] = cleandata[0].lower()
-        raw_output = jc.parsers.universal.simple_table_parse(cleandata)
+        import jc.parsers.route_windows
+        if cleandata[0] in jc.parsers.route_windows.SEPERATORS:
+           raw_output = jc.parsers.route_windows.parse(cleandata)
+        else:
+          cleandata.pop(0)  # Removing "Kernel IP routing table".
+          cleandata[0] = normalize_headers(cleandata[0])
+          import jc.parsers.universal
+          raw_output = jc.parsers.universal.simple_table_parse(cleandata)
 
     if raw:
         return raw_output
diff --git a/jc/parsers/route_windows.py b/jc/parsers/route_windows.py
new file mode 100644
index 00000000..19f7c142
--- /dev/null
+++ b/jc/parsers/route_windows.py
@@ -0,0 +1,128 @@
+"""
+    jc - JSON Convert Windows `route` command output parser
+"""
+
+
+import re
+from typing import List
+
+SEPERATORS = (
+    "===========================================================================",
+    "  None"
+)
+
+# 22...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
+# {"id": 22, "mac": "00 50 56 c0 00 01", "name": "VMware Virtual Ethernet Adapter for VMnet1"}
+INTERFACE_REGEX = re.compile(
+    r"^(?P<id>\d+)\.{3}(?P<mac>.{17})[\s+\.]+(?P<name>[^\n\r]+)$"
+)
+
+ROUTE_TABLES = ("IPv4 Route Table", "IPv6 Route Table")
+ROUTE_TYPES = ("Active Routes:", "Persistent Routes:")
+
+
+def get_lines_until_seperator(iterator):
+    lines = []
+    for line in iterator:
+        if line in SEPERATORS:
+            break
+        lines.append(line)
+    return lines
+
+
+def normalize_route_table(route_table: List[str]):
+    headers = route_table[0]
+    headers = headers.lower()
+    headers = headers.replace("network destination", "destination")
+    headers = headers.replace("if", "iface")
+    headers = headers.replace("interface", "iface")
+    headers = headers.replace("netmask", "genmask")
+    headers_count = len(headers.split())
+
+    previous_line_has_all_the_data = True
+    normalized_route_table = [headers]
+    for row in route_table[1:]:
+        row = row.strip()
+
+        has_all_the_data = len(row.split()) == headers_count
+        # If the number of columns doesn't match the number of headers in the current and previous line, concatenating them.
+        if not has_all_the_data and not previous_line_has_all_the_data:
+            previous_line = normalized_route_table.pop(
+                len(normalized_route_table) - 1)
+            row = f'{previous_line}  {row}'
+            has_all_the_data = True
+
+        normalized_route_table.append(row.strip())
+        previous_line_has_all_the_data = has_all_the_data
+
+    return normalized_route_table
+
+
+def parse(cleandata: List[str]):
+    """
+    Main text parsing function for Windows route
+
+    Parameters:
+
+        cleandata:   (string)  text data to parse
+
+    Returns:
+
+        List of Dictionaries. Raw structured data.
+    """
+
+    raw_output = []
+    data_iterator = iter(cleandata)
+    for line in data_iterator:
+        if not line:
+            continue
+
+        if line == "Interface List":
+            # Interface List
+            # 8...00 ff 58 60 5f 61 ......TAP-Windows Adapter V9
+            # 52...00 15 5d fd 0d 45 ......Hyper-V Virtual Ethernet Adapter
+            # ===========================================================================
+
+            interfaces = []
+            for interface_line in data_iterator:
+                interface_line = interface_line.strip()
+                if interface_line in SEPERATORS:
+                    break
+
+                interface_match = INTERFACE_REGEX.search(interface_line)
+                if interface_match:
+                    interfaces.append(interface_match.groupdict())
+
+            if interfaces:
+                raw_output.append({"interfaces": interfaces})
+            continue
+
+        full_route_table = []
+        if line in ROUTE_TABLES:
+            next(data_iterator)  # Skipping the table title.
+
+            # Persistent Routes:
+            # Network Address          Netmask  Gateway Address  Metric
+            # 157.0.0.0        255.0.0.0      157.55.80.1       3
+            # ===========================================================================
+            for route_line in data_iterator:
+                if route_line in ROUTE_TYPES:
+                    import jc.parsers.universal
+                    route_table = get_lines_until_seperator(
+                        data_iterator
+                    )
+                    if not route_table:
+                        continue
+
+                    route_table = normalize_route_table(
+                        route_table
+                    )
+                    full_route_table.extend(
+                        jc.parsers.universal.simple_table_parse(
+                            route_table
+                        )
+                    )
+
+            raw_output.extend(full_route_table)
+
+    return raw_output
diff --git a/jc/parsers/srt.py b/jc/parsers/srt.py
new file mode 100644
index 00000000..ef89f5ae
--- /dev/null
+++ b/jc/parsers/srt.py
@@ -0,0 +1,281 @@
+"""jc - JSON Convert `SRT` file parser
+
+Usage (cli):
+
+    $ cat foo.srt | jc --srt
+
+Usage (module):
+
+    import jc
+    result = jc.parse('srt', srt_file_output)
+
+Schema:
+
+    [
+      {
+        "index":              int,
+        "start": {
+          "hours":            int,
+          "minutes":          int,
+          "seconds":          int,
+          "milliseconds":     int,
+          "timestamp":        string
+        },
+        "end": {
+          "hours":            int,
+          "minutes":          int,
+          "seconds":          int,
+          "milliseconds":     int,
+          "timestamp":        string
+        },
+        "content":            string
+      }
+    ]
+
+Examples:
+
+    $ cat attack_of_the_clones.srt
+    1
+    00:02:16,612 --> 00:02:19,376
+    Senator, we're making
+    our final approach into Coruscant.
+
+    2
+    00:02:19,482 --> 00:02:21,609
+    Very good, Lieutenant.
+    ...
+
+    $ cat attack_of_the_clones.srt | jc --srt
+    [
+        {
+            "index": 1,
+            "start": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 16,
+                "milliseconds": 612,
+                "timestamp": "00:02:16,612"
+            },
+            "end": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 19,
+                "milliseconds": 376,
+                "timestamp": "00:02:19,376"
+            },
+            "content": "Senator, we're making\nour final approach into Coruscant."
+        },
+        {
+            "index": 2,
+            "start": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 19,
+                "milliseconds": 482,
+                "timestamp": "00:02:19,482"
+            },
+            "end": {
+                "hours": 0,
+                "minutes": 2,
+                "seconds": 21,
+                "milliseconds": 609,
+                "timestamp": "00:02:21,609"
+            },
+            "content": "Very good, Lieutenant."
+        },
+        ...
+    ]
+"""
+import jc.utils
+import re
+from typing import List, Dict
+from jc.jc_types import JSONDictType
+
+
+class info():
+    """Provides parser metadata (version, author, etc.)"""
+    version = '1.0'
+    description = 'SRT file parser'
+    author = 'Mark Rotner'
+    author_email = 'rotner.mr@gmail.com'
+    compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd']
+    tags = ['standard', 'file', 'string']
+
+
+__version__ = info.version
+
+# Regex from https://github.com/cdown/srt/blob/434d0c1c9d5c26d5c3fb1ce979fc05b478e9253c/srt.py#LL16C1.
+
+# The MIT License
+
+# Copyright (c) 2014-present Christopher Down
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# The format: (int)index\n(timestamp)start --> (timestamp)end\n(str)content\n.
+# Example:
+# 1
+# 00:02:16,612 --> 00:02:19,376
+# Senator, we're making our final approach into Coruscant.
+
+# Start & End timestamp format: hours:minutes:seconds,millisecond.
+# "." is not technically valid as a delimiter, but many editors create SRT
+# files with this delimiter for whatever reason. Many editors and players
+# accept it, so we do too.
+RGX_TIMESTAMP_MAGNITUDE_DELIM = r"[,.:,.。:]"
+RGX_POSITIVE_INT = r"[0-9]+"
+RGX_POSITIVE_INT_OPTIONAL = r"[0-9]*"
+RGX_TIMESTAMP = '{field}{separator}{field}{separator}{field}{separator}?{optional_field}'.format(
+    separator=RGX_TIMESTAMP_MAGNITUDE_DELIM,
+    field=RGX_POSITIVE_INT,
+    optional_field=RGX_POSITIVE_INT_OPTIONAL
+)
+RGX_INDEX = r"-?[0-9]+\.?[0-9]*"  # int\float\negative.
+RGX_CONTENT = r".*?"  # Anything(except newline) but lazy.
+RGX_NEWLINE = r"\r?\n"  # Newline(CRLF\LF).
+SRT_REGEX = re.compile(
+    r"\s*(?:({index})\s*{newline})?({ts}) *-[ -] *> *({ts}) ?(?:{newline}|\Z)({content})"
+    # Many sub editors don't add a blank line to the end, and many editors and
+    # players accept that. We allow it to be missing in input.
+    #
+    # We also allow subs that are missing a double blank newline. This often
+    # happens on subs which were first created as a mixed language subtitle,
+    # for example chs/eng, and then were stripped using naive methods (such as
+    # ed/sed) that don't understand newline preservation rules in SRT files.
+    #
+    # This means that when you are, say, only keeping chs, and the line only
+    # contains english, you end up with not only no content, but also all of
+    # the content lines are stripped instead of retaining a newline.
+    r"(?:{newline}|\Z)(?:{newline}|\Z|(?=(?:{index}\s*{newline}{ts})))"
+    # Some SRT blocks, while this is technically invalid, have blank lines
+    # inside the subtitle content. We look ahead a little to check that the
+    # next lines look like an index and a timestamp as a best-effort
+    # solution to work around these.
+    r"(?=(?:(?:{index}\s*{newline})?{ts}|\Z))".format(
+        index=RGX_INDEX,
+        ts=RGX_TIMESTAMP,
+        content=RGX_CONTENT,
+        newline=RGX_NEWLINE,
+    ),
+    re.DOTALL,
+)
+TIMESTAMP_REGEX = re.compile(
+    '^({field}){separator}({field}){separator}({field}){separator}?({optional_field})$'.format(
+        separator=RGX_TIMESTAMP_MAGNITUDE_DELIM,
+        field=RGX_POSITIVE_INT,
+        optional_field=RGX_POSITIVE_INT_OPTIONAL
+    )
+)
+
+
+def _process(proc_data: List[JSONDictType]) -> List[JSONDictType]:
+    """
+    Final processing to conform to the schema.
+
+    Parameters:
+
+        proc_data:  (Dictionary) raw structured data to process
+
+    Returns:
+
+        List of Dictionaries representing an SRT document.
+    """
+
+    int_list = {'index'}
+    timestamp_list = {"start", "end"}
+    timestamp_int_list = {"hours", "minutes", "seconds", "milliseconds"}
+
+    for entry in proc_data:
+        # Converting {"index"} to int.
+        for key in entry:
+            if key in int_list:
+                entry[key] = jc.utils.convert_to_int(entry[key])
+
+            # Converting {"hours", "minutes", "seconds", "milliseconds"} to int.
+            if key in timestamp_list:
+                timestamp = entry[key]
+                for timestamp_key in timestamp:
+                    if timestamp_key in timestamp_int_list:
+                        timestamp[timestamp_key] = jc.utils.convert_to_int(
+                            timestamp[timestamp_key])
+
+    return proc_data
+
+
+def parse_timestamp(timestamp: str) -> Dict:
+    """
+    timestamp: "hours:minutes:seconds,milliseconds" --->
+    {
+        "hours": "hours",
+        "minutes": "minutes",
+        "seconds": "seconds",
+        "milliseconds": "milliseconds",
+        "timestamp": "hours:minutes:seconds,milliseconds"
+    }
+    """
+    ts_match = TIMESTAMP_REGEX.match(timestamp)
+    if ts_match:
+        hours, minutes, seconds, milliseconds = ts_match.groups()
+        return {
+            "hours": hours,
+            "minutes": minutes,
+            "seconds": seconds,
+            "milliseconds": milliseconds,
+            "timestamp": timestamp
+        }
+    return {}
+
+
+def parse(
+    data: str,
+    raw: bool = False,
+    quiet: bool = False
+) -> List[JSONDictType]:
+    """
+    Main text parsing function
+
+    Parameters:
+
+        data:        (string)  text data to parse
+        raw:         (boolean) unprocessed output if True
+        quiet:       (boolean) suppress warning messages if True
+
+    Returns:
+
+        Dictionary. Raw or processed structured data.
+    """
+    jc.utils.compatibility(__name__, info.compatible, quiet)
+    jc.utils.input_type_check(data)
+
+    raw_output: List[Dict] = []
+    if not jc.utils.has_data(data):
+        return raw_output
+
+    for subtitle in SRT_REGEX.finditer(data):
+        index, start, end, content = subtitle.groups()
+        raw_output.append(
+            {
+                "index": index,
+                "start": parse_timestamp(start),
+                "end": parse_timestamp(end),
+                "content": content.replace("\r\n", "\n")
+            }
+        )
+
+    return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/ss.py b/jc/parsers/ss.py
index 628511b3..20f7cb6b 100644
--- a/jc/parsers/ss.py
+++ b/jc/parsers/ss.py
@@ -1,8 +1,5 @@
 """jc - JSON Convert `ss` command output parser
 
-Extended information options like `-e` and `-p` are not supported and may
-cause parsing irregularities.
-
 Usage (cli):
 
     $ ss | jc --ss
@@ -23,21 +20,29 @@ field names
 
     [
       {
-        "netid":            string,
-        "state":            string,
-        "recv_q":           integer,
-        "send_q":           integer,
-        "local_address":    string,
-        "local_port":       string,
-        "local_port_num":   integer,
-        "peer_address":     string,
-        "peer_port":        string,
-        "peer_port_num":    integer,
-        "interface":        string,
-        "link_layer"        string,
-        "channel":          string,
-        "path":             string,
-        "pid":              integer
+        "netid":                      string,
+        "state":                      string,
+        "recv_q":                     integer,
+        "send_q":                     integer,
+        "local_address":              string,
+        "local_port":                 string,
+        "local_port_num":             integer,
+        "peer_address":               string,
+        "peer_port":                  string,
+        "peer_port_num":              integer,
+        "interface":                  string,
+        "link_layer"                  string,
+        "channel":                    string,
+        "path":                       string,
+        "pid":                        integer,
+        "opts": {
+          "process_id": {
+            "<process_id>": {
+              "user":                 string,
+              "file_descriptor":      string
+            }
+          }
+        }
       }
     ]
 
@@ -275,13 +280,15 @@ Examples:
         }
       ]
 """
+import re
+import ast
 import string
 import jc.utils
 
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.6'
+    version = '1.7'
     description = '`ss` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -324,6 +331,57 @@ def _process(proc_data):
 
     return proc_data
 
+def _parse_opts(proc_data):
+    """ Process extra options -e, -o, -p
+
+    Parameters:
+
+        proc_data:   (List of Dictionaries) raw structured data to process
+
+    Returns:
+
+        Structured data dictionary for extra/optional headerless options.
+    """
+    o_field = proc_data.split(' ')
+    opts = {}
+    for item in o_field:
+        # -e option:
+        item = re.sub(
+            'uid', 'uid_number',
+            re.sub('sk', 'cookie', re.sub('ino', 'inode_number', item)))
+        if ":" in item:
+            key, val = item.split(':')
+            # -o option
+            if key == "timer":
+                val = val.replace('(', '[').replace(')', ']')
+                val = ast.literal_eval(re.sub(r'([a-z0-9\.]+)', '"\\1"', val))
+                val = {
+                    'timer_name': val[0],
+                    'expire_time': val[1],
+                    'retrans': val[2]
+                }
+                opts[key] = val
+            # -p option
+            if key == "users":
+                key = 'process_id'
+                val = val.replace('(', '[').replace(')', ']')
+                val = ast.literal_eval(re.sub(r'([a-z]+=[0-9]+)', '"\\1"', val))
+                data = {}
+                for rec in val:
+                    params = {}
+                    params['user'] = rec[0]
+                    for i in [x for x in rec if '=' in x]:
+                        k, v = i.split('=')
+                        params[k] = v
+                    data.update({
+                        params['pid']: {
+                            'user': params['user'],
+                            'file_descriptor': params['fd']
+                        }
+                    })
+                val = data
+            opts[key] = val
+    return opts
 
 def parse(data, raw=False, quiet=False):
     """
@@ -357,15 +415,20 @@ def parse(data, raw=False, quiet=False):
         header_text = header_text.replace('-', '_')
 
         header_list = header_text.split()
+        extra_opts = False
 
         for entry in cleandata[1:]:
             output_line = {}
             if entry[0] not in string.whitespace:
 
                 # fix weird ss bug where first two columns have no space between them sometimes
-                entry = entry[:5] + ' ' + entry[5:]
+                entry = entry[:5] + '  ' + entry[5:]
 
-                entry_list = entry.split()
+                entry_list = re.split(r'[ ]{1,}',entry.strip())
+
+                if len(entry_list) > len(header_list) or extra_opts == True:
+                    entry_list = re.split(r'[ ]{2,}',entry.strip())
+                    extra_opts = True
 
                 if entry_list[0] in contains_colon and ':' in entry_list[4]:
                     l_field = entry_list[4].rsplit(':', maxsplit=1)
@@ -381,6 +444,10 @@ def parse(data, raw=False, quiet=False):
                     entry_list[6] = p_address
                     entry_list.insert(7, p_port)
 
+                if re.search(r'ino:|uid:|sk:|users:|timer:',entry_list[-1]):
+                    header_list.append('opts')
+                    entry_list[-1] = _parse_opts(entry_list[-1])
+
             output_line = dict(zip(header_list, entry_list))
 
             # some post processing to pull out fields: interface, link_layer, path, pid, channel
diff --git a/jc/parsers/stat.py b/jc/parsers/stat.py
index daa07999..00040e04 100644
--- a/jc/parsers/stat.py
+++ b/jc/parsers/stat.py
@@ -171,7 +171,7 @@ import jc.utils
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.12'
+    version = '1.13'
     description = '`stat` command parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -238,112 +238,115 @@ def parse(data, raw=False, quiet=False):
     # Clear any blank lines
     cleandata = list(filter(None, data.splitlines()))
 
-    if jc.utils.has_data(data):
-
-        # linux output
-        if cleandata[0].startswith('  File: '):
-            # stats output contains 8 lines
-            for line in cleandata:
-
-                # line #1
-                if line.find('File:') == 2:
-                    output_line = {}
-                    line_list = line.split(maxsplit=1)
-                    output_line['file'] = line_list[1]
-
-                    # populate link_to field if -> found
-                    if ' -> ' in output_line['file']:
-                        filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
-                        link = output_line['file'].split(' -> ')[1].strip('\u2018').rstrip('\u2019')
-                        output_line['file'] = filename
-                        output_line['link_to'] = link
-                    else:
-                        filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
-                        output_line['file'] = filename
-
-                    continue
-
-                # line #2
-                if line.find('Size:') == 2:
-                    line_list = line.split(maxsplit=7)
-                    output_line['size'] = line_list[1]
-                    output_line['blocks'] = line_list[3]
-                    output_line['io_blocks'] = line_list[6]
-                    output_line['type'] = line_list[7]
-                    continue
-
-                # line #3
-                if line.startswith('Device:'):
-                    line_list = line.split()
-                    output_line['device'] = line_list[1]
-                    output_line['inode'] = line_list[3]
-                    output_line['links'] = line_list[5]
-                    continue
-
-                # line #4
-                if line.startswith('Access: ('):
-                    line = line.replace('(', ' ').replace(')', ' ').replace('/', ' ')
-                    line_list = line.split()
-                    output_line['access'] = line_list[1]
-                    output_line['flags'] = line_list[2]
-                    output_line['uid'] = line_list[4]
-                    output_line['user'] = line_list[5]
-                    output_line['gid'] = line_list[7]
-                    output_line['group'] = line_list[8]
-                    continue
-
-                # line #5
-                if line.startswith('Access: 2'):
-                    line_list = line.split(maxsplit=1)
-                    output_line['access_time'] = line_list[1]
-                    continue
-
-                # line #6
-                if line.startswith('Modify:'):
-                    line_list = line.split(maxsplit=1)
-                    output_line['modify_time'] = line_list[1]
-                    continue
-
-                # line #7
-                if line.startswith('Change:'):
-                    line_list = line.split(maxsplit=1)
-                    output_line['change_time'] = line_list[1]
-                    continue
-
-                # line #8
-                if line.find('Birth:') == 1:
-                    line_list = line.split(maxsplit=1)
-                    output_line['birth_time'] = line_list[1]
-
-                    raw_output.append(output_line)
-                    continue
-
-        # FreeBSD/OSX output
-        else:
-            for line in cleandata:
-                value = shlex.split(line)
-                output_line = {
-                    'file': ' '.join(value[15:]),
-                    'unix_device': value[0],
-                    'inode': value[1],
-                    'flags': value[2],
-                    'links': value[3],
-                    'user': value[4],
-                    'group': value[5],
-                    'rdev': value[6],
-                    'size': value[7],
-                    'access_time': value[8],
-                    'modify_time': value[9],
-                    'change_time': value[10],
-                    'birth_time': value[11],
-                    'block_size': value[12],
-                    'blocks': value[13],
-                    'unix_flags': value[14]
-                }
-
-                raw_output.append(output_line)
-
-    if raw:
+    if not jc.utils.has_data(data):
         return raw_output
+
+    # linux output
+    if cleandata[0].startswith('  File: '):
+        output_line = {}
+
+        # stats output contains 8 lines
+        for line in cleandata:
+            # line #1
+            if line.find('File:') == 2:
+                if output_line:  # Reached a new file stat info.
+                    raw_output.append(output_line)
+                    output_line = {}
+
+                line_list = line.split(maxsplit=1)
+                output_line['file'] = line_list[1]
+
+                # populate link_to field if -> found
+                if ' -> ' in output_line['file']:
+                    filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
+                    link = output_line['file'].split(' -> ')[1].strip('\u2018').rstrip('\u2019')
+                    output_line['file'] = filename
+                    output_line['link_to'] = link
+                else:
+                    filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
+                    output_line['file'] = filename
+
+                continue
+
+            # line #2
+            if line.startswith('  Size:'):
+                line_list = line.split(maxsplit=7)
+                output_line['size'] = line_list[1]
+                output_line['blocks'] = line_list[3]
+                output_line['io_blocks'] = line_list[6]
+                output_line['type'] = line_list[7]
+                continue
+
+            # line #3
+            if line.startswith('Device:'):
+                line_list = line.split()
+                output_line['device'] = line_list[1]
+                output_line['inode'] = line_list[3]
+                output_line['links'] = line_list[5]
+                continue
+
+            # line #4
+            if line.startswith('Access: ('):
+                line = line.replace('(', ' ').replace(')', ' ').replace('/', ' ')
+                line_list = line.split()
+                output_line['access'] = line_list[1]
+                output_line['flags'] = line_list[2]
+                output_line['uid'] = line_list[4]
+                output_line['user'] = line_list[5]
+                output_line['gid'] = line_list[7]
+                output_line['group'] = line_list[8]
+                continue
+
+            # line #5
+            if line.startswith('Access: 2'):
+                line_list = line.split(maxsplit=1)
+                output_line['access_time'] = line_list[1]
+                continue
+
+            # line #6
+            if line.startswith('Modify:'):
+                line_list = line.split(maxsplit=1)
+                output_line['modify_time'] = line_list[1]
+                continue
+
+            # line #7
+            if line.startswith('Change:'):
+                line_list = line.split(maxsplit=1)
+                output_line['change_time'] = line_list[1]
+                continue
+
+            # line #8
+            if line.startswith(' Birth:'):
+                line_list = line.split(maxsplit=1)
+                output_line['birth_time'] = line_list[1]
+                continue
+
+        if output_line:
+            raw_output.append(output_line)
+
+    # FreeBSD/OSX output
     else:
-        return _process(raw_output)
+        for line in cleandata:
+            value = shlex.split(line)
+            output_line = {
+                'file': ' '.join(value[15:]),
+                'unix_device': value[0],
+                'inode': value[1],
+                'flags': value[2],
+                'links': value[3],
+                'user': value[4],
+                'group': value[5],
+                'rdev': value[6],
+                'size': value[7],
+                'access_time': value[8],
+                'modify_time': value[9],
+                'change_time': value[10],
+                'birth_time': value[11],
+                'block_size': value[12],
+                'blocks': value[13],
+                'unix_flags': value[14]
+            }
+
+            raw_output.append(output_line)
+
+    return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/veracrypt.py b/jc/parsers/veracrypt.py
new file mode 100644
index 00000000..d48237b4
--- /dev/null
+++ b/jc/parsers/veracrypt.py
@@ -0,0 +1,256 @@
+"""jc - JSON Convert `veracrypt` command output parser
+
+Supports the following `veracrypt` subcommands:
+- `veracrypt --text --list`
+- `veracrypt --text --list --verbose`
+- `veracrypt --text --volume-properties <volume>`
+
+Usage (cli):
+
+    $ veracrypt --text --list | jc --veracrypt
+or
+
+    $ jc veracrypt --text --list
+
+Usage (module):
+
+    import jc
+    result = jc.parse('veracrypt', veracrypt_command_output)
+
+Schema:
+
+    Volume:
+    [
+        {
+            "slot":                 integer,
+            "path":                 string,
+            "device":               string,
+            "mountpoint":           string,
+            "size":                 string,
+            "type":                 string,
+            "readonly":             string,
+            "hidden_protected":     string,
+            "encryption_algo":      string,
+            "pk_size":              string,
+            "sk_size":              string,
+            "block_size":           string,
+            "mode":                 string,
+            "prf":                  string,
+            "format_version":       integer,
+            "backup_header":        string
+        }
+    ]
+
+Examples:
+
+    $ veracrypt --text --list | jc --veracrypt -p
+    [
+        {
+            "slot": 1,
+            "path": "/dev/sdb1",
+            "device": "/dev/mapper/veracrypt1",
+            "mountpoint": "/home/bob/mount/encrypt/sdb1"
+        }
+    ]
+
+    $ veracrypt --text --list --verbose | jc --veracrypt -p
+    [
+        {
+            "slot": 1,
+            "path": "/dev/sdb1",
+            "device": "/dev/mapper/veracrypt1",
+            "mountpoint": "/home/bob/mount/encrypt/sdb1",
+            "size": "522 MiB",
+            "type": "Normal",
+            "readonly": "No",
+            "hidden_protected": "No",
+            "encryption_algo": "AES",
+            "pk_size": "256 bits",
+            "sk_size": "256 bits",
+            "block_size": "128 bits",
+            "mode": "XTS",
+            "prf": "HMAC-SHA-512",
+            "format_version": 2,
+            "backup_header": "Yes"
+        }
+    ]
+
+"""
+import re
+from typing import List, Dict, Optional, Any
+from jc.jc_types import JSONDictType
+import jc.utils
+
+
+class info():
+    """Provides parser metadata (version, author, etc.)"""
+    version = '1.0'
+    description = '`veracrypt` command parser'
+    author = 'Jake Ob'
+    author_email = 'iakopap at gmail.com'
+    compatible = ["linux"]
+    magic_commands = ["veracrypt"]
+    tags = ['command']
+
+
+__version__ = info.version
+
+try:
+    from typing import TypedDict
+
+    Volume = TypedDict(
+        "Volume",
+        {
+            "slot": int,
+            "path": str,
+            "device": str,
+            "mountpoint": str,
+            "size": str,
+            "type": str,
+            "readonly": str,
+            "hidden_protected": str,
+            "encryption_algo": str,
+            "pk_size": str,
+            "sk_size": str,
+            "block_size": str,
+            "mode": str,
+            "prf": str,
+            "format_version": int,
+            "backup_header": str
+        },
+    )
+except ImportError:
+    Volume = Dict[str, Any]  # type: ignore
+
+_volume_line_pattern = r"(?P<slot>[0-9]+): (?P<path>.+?) (?P<device>.+?) (?P<mountpoint>.*)"
+
+_volume_verbose_pattern = (
+    r"(Slot:\s(?P<slot>.+)"
+    + r"|Volume:\s(?P<path>.+)"
+    + r"|Virtual\sDevice:\s(?P<device>.+)"
+    + r"|Mount\sDirectory:\s(?P<mountpoint>.+)"
+    + r"|Size:\s(?P<size>.+)"
+    + r"|Type:\s(?P<type>.+)"
+    + r"|Read-Only:\s(?P<readonly>.+)"
+    + r"|Hidden\sVolume Protected:\s(?P<hidden_protected>.+)"
+    + r"|Encryption\sAlgorithm:\s(?P<encryption_algo>.+)"
+    + r"|Primary\sKey\sSize:\s(?P<pk_size>.+)"
+    + r"|Secondary\sKey\sSize\s.*:\s(?P<sk_size>.+)"
+    + r"|Block\sSize:\s(?P<block_size>.+)"
+    + r"|Mode\sof\sOperation:\s(?P<mode>.+)"
+    + r"|PKCS-5\sPRF:\s(?P<prf>.+)"
+    + r"|Volume\sFormat\sVersion:\s(?P<format_version>.+)"
+    + r"|Embedded\sBackup\sHeader:\s(?P<backup_header>.+))"
+)
+
+def _parse_volume(next_lines: List[str]) -> Optional[Volume]:
+    next_line = next_lines.pop()
+    result = re.match(_volume_line_pattern, next_line)
+
+    # Parse and return the volume given as a single line (veracrypt -t --list)
+    if result:
+        matches = result.groupdict()
+        volume: Volume = {  # type: ignore
+            "slot": int(matches["slot"]),
+            "path": matches["path"],
+            "device": matches["device"],
+            "mountpoint": matches["mountpoint"],
+        }
+
+        return volume
+    else:
+        next_lines.append(next_line)
+
+    # Otherwise parse the volume given in multiple lines (veracrypt -t --list -v)
+    volume: Volume = {}  # type: ignore
+
+    while next_lines:
+        next_line = next_lines.pop()
+
+        # Return when encounter an empty line
+        if not next_line:
+            return volume
+
+        result = re.match(_volume_verbose_pattern, next_line)
+
+        # Skip to the next line in case of an unknown field line
+        if not result:
+            continue
+
+        matches = result.groupdict()
+
+        if matches["slot"]:
+            volume["slot"] = int(matches["slot"])
+        elif matches["path"]:
+            volume["path"] = matches["path"]
+        elif matches["device"]:
+            volume["device"] = matches["device"]
+        elif matches["mountpoint"]:
+            volume["mountpoint"] = matches["mountpoint"]
+        elif matches["size"]:
+            volume["size"] = matches["size"]
+        elif matches["type"]:
+            volume["type"] = matches["type"]
+        elif matches["readonly"]:
+            volume["readonly"] = matches["readonly"]
+        elif matches["hidden_protected"]:
+            volume["hidden_protected"] = matches["hidden_protected"]
+        elif matches["encryption_algo"]:
+            volume["encryption_algo"] = matches["encryption_algo"]
+        elif matches["pk_size"]:
+            volume["pk_size"] = matches["pk_size"]
+        elif matches["sk_size"]:
+            volume["sk_size"] = matches["sk_size"]
+        elif matches["block_size"]:
+            volume["block_size"] = matches["block_size"]
+        elif matches["mode"]:
+            volume["mode"] = matches["mode"]
+        elif matches["prf"]:
+            volume["prf"] = matches["prf"]
+        elif matches["format_version"]:
+            volume["format_version"] = int(matches["format_version"])
+        elif matches["backup_header"]:
+            volume["backup_header"] = matches["backup_header"]
+
+    return volume
+
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[JSONDictType]:
+    """
+    Main text parsing function
+
+    Parameters:
+
+        data:        (string)  text data to parse
+        raw:         (boolean) unprocessed output if True
+        quiet:       (boolean) suppress warning messages if True
+
+    Returns:
+
+        List of Dictionaries. Raw or processed structured data.
+    """
+    result: List = []
+
+    if jc.utils.has_data(data):
+        jc.utils.compatibility(__name__, info.compatible, quiet)
+        jc.utils.input_type_check(data)
+
+        linedata = data.splitlines()
+
+        first_line = linedata[0]
+        line_mode = re.search(_volume_line_pattern, first_line)
+        verbose_mode = re.search(_volume_verbose_pattern, first_line)
+
+        if not line_mode and not verbose_mode:
+            return []
+
+        linedata.reverse()
+
+        while linedata:
+            volume = _parse_volume(linedata)
+
+            if volume:
+                result.append(volume)
+            else:
+                break
+
+    return result
diff --git a/jc/parsers/x509_cert.py b/jc/parsers/x509_cert.py
index e8932539..501f0059 100644
--- a/jc/parsers/x509_cert.py
+++ b/jc/parsers/x509_cert.py
@@ -408,12 +408,12 @@ from collections import OrderedDict
 from datetime import datetime
 from typing import List, Dict, Union
 import jc.utils
-from jc.parsers.asn1crypto import pem, x509
+from jc.parsers.asn1crypto import pem, x509, jc_global
 
 
 class info():
     """Provides parser metadata (version, author, etc.)"""
-    version = '1.1'
+    version = '1.2'
     description = 'X.509 PEM and DER certificate file parser'
     author = 'Kelly Brazil'
     author_email = 'kellyjonbrazil@gmail.com'
@@ -462,6 +462,9 @@ def _fix_objects(obj):
     Recursively traverse the nested dictionary or list and convert objects
     into JSON serializable types.
     """
+    if isinstance(obj, tuple):
+        obj = list(obj)
+
     if isinstance(obj, set):
         obj = sorted(list(obj))
 
@@ -501,6 +504,10 @@ def _fix_objects(obj):
                 obj.update({k: v})
                 continue
 
+            if isinstance(v, tuple):
+                v = list(v)
+                obj.update({k: v})
+
             if isinstance(v, set):
                 v = sorted(list(v))
                 obj.update({k: v})
@@ -548,6 +555,7 @@ def parse(
         List of Dictionaries. Raw or processed structured data.
     """
     jc.utils.compatibility(__name__, info.compatible, quiet)
+    jc_global.quiet = quiet  # to inject quiet setting into asn1crypto library
 
     raw_output: List = []
 
diff --git a/jc/parsers/x509_csr.py b/jc/parsers/x509_csr.py
new file mode 100644
index 00000000..41bac2e9
--- /dev/null
+++ b/jc/parsers/x509_csr.py
@@ -0,0 +1,318 @@
+"""jc - JSON Convert X.509 Certificate Request format file parser
+
+This parser will convert DER and PEM encoded X.509 certificate request files.
+
+Usage (cli):
+
+    $ cat certificateRequest.pem | jc --x509-csr
+
+Usage (module):
+
+    import jc
+    result = jc.parse('x509_csr', x509_csr_file_output)
+
+Schema:
+
+    [
+      {
+        "certification_request_info": {
+          "version":                      string,
+          "serial_number":                string,  # [0]
+          "serial_number_str":            string,
+          "signature": {
+            "algorithm":                  string,
+            "parameters":                 string/null,
+          },
+          "issuer": {
+            "country_name":               string,
+            "state_or_province_name"      string,
+            "locality_name":              string,
+            "organization_name":          array/string,
+            "organizational_unit_name":   array/string,
+            "common_name":                string,
+            "email_address":              string,
+            "serial_number":              string,   # [0]
+            "serial_number_str":          string
+          },
+          "validity": {
+            "not_before":                 integer,  # [1]
+            "not_after":                  integer,  # [1]
+            "not_before_iso":             string,
+            "not_after_iso":              string
+          },
+          "subject": {
+            "country_name":               string,
+            "state_or_province_name":     string,
+            "locality_name":              string,
+            "organization_name":          array/string,
+            "organizational_unit_name":   array/string,
+            "common_name":                string,
+            "email_address":              string,
+            "serial_number":              string,   # [0]
+            "serial_number_str":          string
+          },
+          "subject_public_key_info": {
+            "algorithm": {
+              "algorithm":                string,
+              "parameters":               string/null,
+            },
+            "public_key": {
+              "modulus":                  string,  # [0]
+              "public_exponent":          integer
+            }
+          },
+          "issuer_unique_id":             string/null,
+          "subject_unique_id":            string/null,
+          "extensions": [
+            {
+              "extn_id":                  string,
+              "critical":                 boolean,
+              "extn_value":               array/object/string/integer  # [2]
+            }
+          ]
+        },
+        "signature_algorithm": {
+          "algorithm":                    string,
+          "parameters":                   string/null
+        },
+        "signature_value":                string  # [0]
+      }
+    ]
+
+    [0] in colon-delimited hex notation
+    [1] time-zone-aware (UTC) epoch timestamp
+    [2] See below for well-known Extension schemas:
+
+        Basic Constraints:
+        {
+          "extn_id":                          "basic_constraints",
+          "critical":                         boolean,
+          "extn_value": {
+            "ca":                             boolean,
+            "path_len_constraint":            string/null
+          }
+        }
+
+        Key Usage:
+        {
+          "extn_id":                          "key_usage",
+          "critical":                         boolean,
+          "extn_value": [
+                                              string
+          ]
+        }
+
+        Key Identifier:
+        {
+          "extn_id":                          "key_identifier",
+          "critical":                         boolean,
+          "extn_value":                       string  # [0]
+        }
+
+        Authority Key Identifier:
+        {
+          "extn_id":                          "authority_key_identifier",
+          "critical":                         boolean,
+          "extn_value": {
+            "key_identifier":                 string,  # [0]
+            "authority_cert_issuer":          string/null,
+            "authority_cert_serial_number":   string/null
+          }
+        }
+
+        Subject Alternative Name:
+        {
+          "extn_id":                          "subject_alt_name",
+          "critical":                         boolean,
+          "extn_value": [
+                                              string
+          ]
+        }
+
+        Certificate Policies:
+        {
+          "extn_id":                          "certificate_policies",
+          "critical":                         boolean,
+          "extn_value": [
+            {
+              "policy_identifier":            string,
+              "policy_qualifiers": [          array or null
+                {
+                  "policy_qualifier_id":      string,
+                  "qualifier":                string
+                }
+              ]
+            }
+          ]
+        }
+
+        Signed Certificate Timestamp List:
+        {
+          "extn_id":                    "signed_certificate_timestamp_list",
+          "critical":                   boolean,
+          "extn_value":                 string  # [0]
+        }
+
+Examples:
+
+    $ cat server.csr| jc --x509-csr -p
+      [
+        {
+          "certification_request_info": {
+            "version": "v1",
+            "subject": {
+              "common_name": "myserver.for.example"
+            },
+            "subject_pk_info": {
+              "algorithm": {
+                "algorithm": "ec",
+                "parameters": "secp256r1"
+              },
+              "public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
+            },
+            "attributes": [
+              {
+                "type": "extension_request",
+                "values": [
+                  [
+                    {
+                      "extn_id": "extended_key_usage",
+                      "critical": false,
+                      "extn_value": [
+                        "server_auth"
+                      ]
+                    },
+                    {
+                      "extn_id": "subject_alt_name",
+                      "critical": false,
+                      "extn_value": [
+                        "myserver.for.example"
+                      ]
+                    }
+                  ]
+                ]
+              }
+            ]
+          },
+          "signature_algorithm": {
+            "algorithm": "sha384_ecdsa",
+            "parameters": null
+          },
+          "signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
+        }
+      ]
+
+    $ openssl req -in server.csr | jc --x509-csr -p
+      [
+        {
+          "certification_request_info": {
+            "version": "v1",
+            "subject": {
+              "common_name": "myserver.for.example"
+            },
+            "subject_pk_info": {
+              "algorithm": {
+                "algorithm": "ec",
+                "parameters": "secp256r1"
+              },
+              "public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
+            },
+            "attributes": [
+              {
+                "type": "extension_request",
+                "values": [
+                  [
+                    {
+                      "extn_id": "extended_key_usage",
+                      "critical": false,
+                      "extn_value": [
+                        "server_auth"
+                      ]
+                    },
+                    {
+                      "extn_id": "subject_alt_name",
+                      "critical": false,
+                      "extn_value": [
+                        "myserver.for.example"
+                      ]
+                    }
+                  ]
+                ]
+              }
+            ]
+          },
+          "signature_algorithm": {
+            "algorithm": "sha384_ecdsa",
+            "parameters": null
+          },
+          "signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
+        }
+      ]
+
+"""
+# import binascii
+# from collections import OrderedDict
+# from datetime import datetime
+from typing import List, Dict, Union
+import jc.utils
+from jc.parsers.asn1crypto import pem, csr, jc_global
+from jc.parsers.x509_cert import _fix_objects, _process
+
+
+class info():
+    """Provides parser metadata (version, author, etc.)"""
+    version = '1.0'
+    description = 'X.509 PEM and DER certificate request file parser'
+    author = 'Kelly Brazil'
+    author_email = 'kellyjonbrazil@gmail.com'
+    details = 'Using the asn1crypto library at https://github.com/wbond/asn1crypto/releases/tag/1.5.1'
+    compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd']
+    tags = ['standard', 'file', 'string', 'binary']
+
+
+__version__ = info.version
+
+
+def parse(
+    data: Union[str, bytes],
+    raw: bool = False,
+    quiet: bool = False
+) -> List[Dict]:
+    """
+    Main text parsing function
+
+    Parameters:
+
+        data:        (string or bytes) text or binary data to parse
+        raw:         (boolean) unprocessed output if True
+        quiet:       (boolean) suppress warning messages if True
+
+    Returns:
+
+        List of Dictionaries. Raw or processed structured data.
+    """
+    jc.utils.compatibility(__name__, info.compatible, quiet)
+    jc_global.quiet = quiet  # to inject quiet setting into asn1crypto library
+
+    raw_output: List = []
+
+    if jc.utils.has_data(data):
+        # convert to bytes, if not already, for PEM detection since that's
+        # what pem.detect() needs. (cli.py will auto-convert to UTF-8 if it can)
+        try:
+            der_bytes = bytes(data, 'utf-8')  # type: ignore
+        except TypeError:
+            der_bytes = data  # type: ignore
+
+        certs = []
+        if pem.detect(der_bytes):
+            for type_name, headers, der_bytes in pem.unarmor(der_bytes, multiple=True):
+                if type_name == 'CERTIFICATE REQUEST' or type_name == 'NEW CERTIFICATE REQUEST':
+                    certs.append(csr.CertificationRequest.load(der_bytes))
+
+        else:
+            certs.append(csr.CertificationRequest.load(der_bytes))
+
+        raw_output = [_fix_objects(cert.native) for cert in certs]
+
+    return raw_output if raw else _process(raw_output)
diff --git a/jc/utils.py b/jc/utils.py
index 8cad1fff..70faf137 100644
--- a/jc/utils.py
+++ b/jc/utils.py
@@ -151,8 +151,9 @@ def compatibility(mod_name: str, compatible: List[str], quiet: bool = False) ->
         mod = mod_name.split('.')[-1]
         compat_list = ', '.join(compatible)
         warning_message([
-            f'{mod} parser is not compatible with your OS ({sys.platform}).',
-            f'Compatible platforms: {compat_list}'
+            f'`{mod}` command output from this OS ({sys.platform}) is not supported.',
+            f'`{mod}` command output from the following platforms is supported: {compat_list}',
+            'Disregard this warning if you are processing output that came from a supported platform. (Use the -q option to suppress this warning)'
         ])
 
 
diff --git a/man/jc.1 b/man/jc.1
index 548e52d2..2adb907f 100644
--- a/man/jc.1
+++ b/man/jc.1
@@ -1,4 +1,4 @@
-.TH jc 1 2023-04-30 1.23.2 "JSON Convert"
+.TH jc 1 2023-06-21 1.23.3 "JSON Convert"
 .SH NAME
 \fBjc\fP \- JSON Convert JSONifies the output of many CLI tools, file-types,
 and strings
@@ -357,6 +357,11 @@ Key/Value file and string parser
 \fB--ls-s\fP
 `ls` command streaming parser
 
+.TP
+.B
+\fB--lsattr\fP
+`lsattr` command parser
+
 .TP
 .B
 \fB--lsblk\fP
@@ -777,6 +782,11 @@ Semantic Version string parser
 \fB--shadow\fP
 `/etc/shadow` file parser
 
+.TP
+.B
+\fB--srt\fP
+SRT file parser
+
 .TP
 .B
 \fB--ss\fP
@@ -942,6 +952,11 @@ URL string parser
 \fB--ver\fP
 Version string parser
 
+.TP
+.B
+\fB--veracrypt\fP
+`veracrypt` command parser
+
 .TP
 .B
 \fB--vmstat\fP
@@ -972,6 +987,11 @@ Version string parser
 \fB--x509-cert\fP
 X.509 PEM and DER certificate file parser
 
+.TP
+.B
+\fB--x509-csr\fP
+X.509 PEM and DER certificate request file parser
+
 .TP
 .B
 \fB--xml\fP
diff --git a/setup.cfg b/setup.cfg
index 21934a22..f058a36f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,2 +1,2 @@
 [metadata]
-license_file = LICENSE.md
+license_files = LICENSE.md
diff --git a/setup.py b/setup.py
index 14e6d6ee..15819127 100755
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
 
 setuptools.setup(
     name='jc',
-    version='1.23.2',
+    version='1.23.3',
     author='Kelly Brazil',
     author_email='kellyjonbrazil@gmail.com',
     description='Converts the output of popular command-line tools and file-types to JSON.',
diff --git a/templates/readme_template b/templates/readme_template
index 92b767bf..4ce8318d 100644
--- a/templates/readme_template
+++ b/templates/readme_template
@@ -5,11 +5,13 @@
 
 > Try the `jc` [web demo](https://jc-web.onrender.com/) and [REST API](https://github.com/kellyjonbrazil/jc-restapi)
 
-> JC is [now available](https://galaxy.ansible.com/community/general) as an
+> `jc` is [now available](https://galaxy.ansible.com/community/general) as an
 Ansible filter plugin in the `community.general` collection. See this
 [blog post](https://blog.kellybrazil.com/2020/08/30/parsing-command-output-in-ansible-with-jc/)
 for an example.
 
+> Looking for something like `jc` but lower-level? Check out [regex2json](https://gitlab.com/tozd/regex2json).
+
 # JC
 JSON Convert
 
diff --git a/tests/fixtures/centos-7.7/last-wixF.json b/tests/fixtures/centos-7.7/last-wixF.json
new file mode 100644
index 00000000..a991b391
--- /dev/null
+++ b/tests/fixtures/centos-7.7/last-wixF.json
@@ -0,0 +1 @@
+[{"user":"root","tty":"pts/0","hostname":"192.168.255.1","login":"Mon Jun 19 14:18:13 2023","logout":"still logged in","login_epoch":1687209493}, {"user":"mark","tty":"pts/0","hostname":"192.168.255.1","login":"Mon Jun 19 14:15:57 2023","logout":"Mon Jun 19 14:18:00 2023","duration":"00:02","login_epoch":1687209357,"logout_epoch":1687209480,"duration_seconds":123}, {"user":"mark","tty":"pts/0","hostname":"192.168.255.1","login":"Mon Jun 19 14:15:45 2023","logout":"Mon Jun 19 14:15:52 2023","duration":"00:00","login_epoch":1687209345,"logout_epoch":1687209352,"duration_seconds":7}, {"user":"mark","tty":"tty1","hostname":"0.0.0.0","login":"Mon Jun 19 16:59:57 2023","logout":"still logged in","login_epoch":1687219197}, {"user":"runlevel","tty":"(to lvl 3)","hostname":"0.0.0.0","login":"Mon Jun 19 16:59:39 2023","logout":"Mon Jun 19 14:35:00 2023","duration":"-2:-24","login_epoch":1687219179,"logout_epoch":1687210500,"duration_seconds":-8679}, {"user":"reboot","tty":"system boot","hostname":"0.0.0.0","login":"Mon Jun 19 16:59:20 2023","logout":"Mon Jun 19 14:35:00 2023","duration":"-2:-24","login_epoch":1687219160,"logout_epoch":1687210500,"duration_seconds":-8660},{"user": "shutdown","tty": "system down","hostname": "0.0.0.0","login": "Fri Apr 14 13:46:46 2023","logout": "Fri Apr 14 13:47:12 2023","duration": "00:00","login_epoch": 1681505206,"logout_epoch": 1681505232,"duration_seconds": 26}]
\ No newline at end of file
diff --git a/tests/fixtures/centos-7.7/last-wixF.out b/tests/fixtures/centos-7.7/last-wixF.out
new file mode 100644
index 00000000..f3376a67
--- /dev/null
+++ b/tests/fixtures/centos-7.7/last-wixF.out
@@ -0,0 +1,9 @@
+root     pts/0        192.168.255.1    Mon Jun 19 14:18:13 2023   still logged in
+mark     pts/0        192.168.255.1    Mon Jun 19 14:15:57 2023 - Mon Jun 19 14:18:00 2023  (00:02)
+mark     pts/0        192.168.255.1    Mon Jun 19 14:15:45 2023 - Mon Jun 19 14:15:52 2023  (00:00)
+mark     tty1         0.0.0.0          Mon Jun 19 16:59:57 2023   still logged in
+runlevel (to lvl 3)   0.0.0.0          Mon Jun 19 16:59:39 2023 - Mon Jun 19 14:35:00 2023  (-2:-24)
+reboot   system boot  0.0.0.0          Mon Jun 19 16:59:20 2023 - Mon Jun 19 14:35:00 2023  (-2:-24)
+shutdown system down  0.0.0.0          Fri Apr 14 13:46:46 2023 - Fri Apr 14 13:47:12 2023  (00:00)
+
+wtmp begins Mon Jun 19 16:59:20 2023
\ No newline at end of file
diff --git a/tests/fixtures/centos-7.7/ping-missing-hostname-streaming.json b/tests/fixtures/centos-7.7/ping-missing-hostname-streaming.json
new file mode 100644
index 00000000..df17a394
--- /dev/null
+++ b/tests/fixtures/centos-7.7/ping-missing-hostname-streaming.json
@@ -0,0 +1 @@
+[{"type":"reply","destination_ip":"100.68.105.124","sent_bytes":56,"pattern":null,"timestamp":null,"response_bytes":64,"response_ip":"100.68.105.124","icmp_seq":1,"ttl":64,"time_ms":0.04,"duplicate":false},{"type":"summary","destination_ip":"100.68.105.124","sent_bytes":56,"pattern":null,"packets_transmitted":1,"packets_received":1,"packet_loss_percent":0.0,"duplicates":0,"time_ms":0.0,"round_trip_ms_min":0.04,"round_trip_ms_avg":0.04,"round_trip_ms_max":0.04,"round_trip_ms_stddev":0.0}]
diff --git a/tests/fixtures/centos-7.7/ping-missing-hostname.json b/tests/fixtures/centos-7.7/ping-missing-hostname.json
new file mode 100644
index 00000000..55ee1968
--- /dev/null
+++ b/tests/fixtures/centos-7.7/ping-missing-hostname.json
@@ -0,0 +1 @@
+{"destination_ip":"100.68.105.124","data_bytes":56,"pattern":null,"packets_transmitted":1,"packets_received":1,"packet_loss_percent":0.0,"duplicates":0,"time_ms":0.0,"round_trip_ms_min":0.04,"round_trip_ms_avg":0.04,"round_trip_ms_max":0.04,"round_trip_ms_stddev":0.0,"responses":[{"type":"reply","timestamp":null,"bytes":64,"response_ip":"100.68.105.124","icmp_seq":1,"ttl":64,"time_ms":0.04,"duplicate":false}]}
diff --git a/tests/fixtures/centos-7.7/ping-missing-hostname.out b/tests/fixtures/centos-7.7/ping-missing-hostname.out
new file mode 100644
index 00000000..4f4b65e6
--- /dev/null
+++ b/tests/fixtures/centos-7.7/ping-missing-hostname.out
@@ -0,0 +1,6 @@
+PING  (100.68.105.124) 56(84) bytes of data.
+64 bytes from 100.68.105.124 (100.68.105.124): icmp_seq=1 ttl=64 time=0.040 ms
+
+---  ping statistics ---
+1 packets transmitted, 1 received, 0% packet loss, time 0ms
+rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
diff --git a/tests/fixtures/generic/bluetoothctl_device_random.out b/tests/fixtures/generic/bluetoothctl_device_random.out
new file mode 100644
index 00000000..6e8e0491
--- /dev/null
+++ b/tests/fixtures/generic/bluetoothctl_device_random.out
@@ -0,0 +1,18 @@
+Device DF:1C:C3:B4:1A:1F (random)
+	Name: M585/M590
+	Alias: M585/M590
+	Appearance: 0x03c2
+	Icon: input-mouse
+	Paired: yes
+	Bonded: yes
+	Trusted: no
+	Blocked: no
+	Connected: no
+	LegacyPairing: no
+	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
+	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
+	UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
+	UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
+	UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
+	UUID: Vendor specific           (00010000-0000-1000-8000-011f2000046d)
+	Modalias: usb:v046DpB01Bd0011
\ No newline at end of file
diff --git a/tests/fixtures/generic/dig-nsid.json b/tests/fixtures/generic/dig-nsid.json
new file mode 100644
index 00000000..8128d136
--- /dev/null
+++ b/tests/fixtures/generic/dig-nsid.json
@@ -0,0 +1 @@
+[{"id":22691,"opcode":"QUERY","status":"NOERROR","flags":["qr","rd","ra"],"query_num":1,"answer_num":1,"authority_num":0,"additional_num":1,"opt_pseudosection":{"edns":{"version":0,"flags":[],"udp":512},"nsid":"gpdns-sfo"},"question":{"name":"mail.google.com.","class":"IN","type":"A"},"answer":[{"name":"mail.google.com.","class":"IN","type":"A","ttl":300,"data":"142.250.189.197"}],"query_time":189,"server":"2001:4860:4860::8888#53(2001:4860:4860::8888)","when":"Sat Jun 03 12:37:43 PDT 2023","rcvd":73,"when_epoch":1685821063,"when_epoch_utc":null}]
diff --git a/tests/fixtures/generic/dig-nsid.out b/tests/fixtures/generic/dig-nsid.out
new file mode 100644
index 00000000..a54bfe92
--- /dev/null
+++ b/tests/fixtures/generic/dig-nsid.out
@@ -0,0 +1,22 @@
+
+; <<>> DiG 9.10.6 <<>> +nsid @dns.google mail.google.com
+; (4 servers found)
+;; global options: +cmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22691
+;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 512
+; NSID: 67 70 64 6e 73 2d 73 66 6f ("gpdns-sfo")
+;; QUESTION SECTION:
+;mail.google.com.		IN	A
+
+;; ANSWER SECTION:
+mail.google.com.	300	IN	A	142.250.189.197
+
+;; Query time: 189 msec
+;; SERVER: 2001:4860:4860::8888#53(2001:4860:4860::8888)
+;; WHEN: Sat Jun 03 12:37:43 PDT 2023
+;; MSG SIZE  rcvd: 73
+
diff --git a/tests/fixtures/generic/srt-attack_of_the_clones.json b/tests/fixtures/generic/srt-attack_of_the_clones.json
new file mode 100644
index 00000000..932b04ea
--- /dev/null
+++ b/tests/fixtures/generic/srt-attack_of_the_clones.json
@@ -0,0 +1 @@
+[{"index": 1, "start": {"hours": 0, "minutes": 2, "seconds": 16, "milliseconds": 612, "timestamp": "00:02:16,612"}, "end": {"hours": 0, "minutes": 2, "seconds": 19, "milliseconds": 376, "timestamp": "00:02:19,376"}, "content": "Senator, we're making\nour final approach into Coruscant."}, {"index": 2, "start": {"hours": 0, "minutes": 2, "seconds": 19, "milliseconds": 482, "timestamp": "00:02:19,482"}, "end": {"hours": 0, "minutes": 2, "seconds": 21, "milliseconds": 609, "timestamp": "00:02:21,609"}, "content": "Very good, Lieutenant."}, {"index": 3, "start": {"hours": 0, "minutes": 3, "seconds": 13, "milliseconds": 336, "timestamp": "00:03:13,336"}, "end": {"hours": 0, "minutes": 3, "seconds": 15, "milliseconds": 167, "timestamp": "00:03:15,167"}, "content": "We made it."}, {"index": 4, "start": {"hours": 0, "minutes": 3, "seconds": 18, "milliseconds": 608, "timestamp": "00:03:18,608"}, "end": {"hours": 0, "minutes": 3, "seconds": 20, "milliseconds": 371, "timestamp": "00:03:20,371"}, "content": "I guess I was wrong."}, {"index": 5, "start": {"hours": 0, "minutes": 3, "seconds": 20, "milliseconds": 476, "timestamp": "00:03:20,476"}, "end": {"hours": 0, "minutes": 3, "seconds": 22, "milliseconds": 671, "timestamp": "00:03:22,671"}, "content": "There was no danger at all."}]
\ No newline at end of file
diff --git a/tests/fixtures/generic/srt-attack_of_the_clones.srt b/tests/fixtures/generic/srt-attack_of_the_clones.srt
new file mode 100644
index 00000000..ec7288ae
--- /dev/null
+++ b/tests/fixtures/generic/srt-attack_of_the_clones.srt
@@ -0,0 +1,20 @@
+1
+00:02:16,612 --> 00:02:19,376
+Senator, we're making
+our final approach into Coruscant.
+
+2
+00:02:19,482 --> 00:02:21,609
+Very good, Lieutenant.
+
+3
+00:03:13,336 --> 00:03:15,167
+We made it.
+
+4
+00:03:18,608 --> 00:03:20,371
+I guess I was wrong.
+
+5
+00:03:20,476 --> 00:03:22,671
+There was no danger at all.
\ No newline at end of file
diff --git a/tests/fixtures/generic/srt-attack_of_the_clones_raw.json b/tests/fixtures/generic/srt-attack_of_the_clones_raw.json
new file mode 100644
index 00000000..3fb78eea
--- /dev/null
+++ b/tests/fixtures/generic/srt-attack_of_the_clones_raw.json
@@ -0,0 +1 @@
+[{"index": "1", "start": {"hours": "00", "minutes": "02", "seconds": "16", "milliseconds": "612", "timestamp": "00:02:16,612"}, "end": {"hours": "00", "minutes": "02", "seconds": "19", "milliseconds": "376", "timestamp": "00:02:19,376"}, "content": "Senator, we're making\nour final approach into Coruscant."}, {"index": "2", "start": {"hours": "00", "minutes": "02", "seconds": "19", "milliseconds": "482", "timestamp": "00:02:19,482"}, "end": {"hours": "00", "minutes": "02", "seconds": "21", "milliseconds": "609", "timestamp": "00:02:21,609"}, "content": "Very good, Lieutenant."}, {"index": "3", "start": {"hours": "00", "minutes": "03", "seconds": "13", "milliseconds": "336", "timestamp": "00:03:13,336"}, "end": {"hours": "00", "minutes": "03", "seconds": "15", "milliseconds": "167", "timestamp": "00:03:15,167"}, "content": "We made it."}, {"index": "4", "start": {"hours": "00", "minutes": "03", "seconds": "18", "milliseconds": "608", "timestamp": "00:03:18,608"}, "end": {"hours": "00", "minutes": "03", "seconds": "20", "milliseconds": "371", "timestamp": "00:03:20,371"}, "content": "I guess I was wrong."}, {"index": "5", "start": {"hours": "00", "minutes": "03", "seconds": "20", "milliseconds": "476", "timestamp": "00:03:20,476"}, "end": {"hours": "00", "minutes": "03", "seconds": "22", "milliseconds": "671", "timestamp": "00:03:22,671"}, "content": "There was no danger at all."}]
\ No newline at end of file
diff --git a/tests/fixtures/generic/srt-complex.json b/tests/fixtures/generic/srt-complex.json
new file mode 100644
index 00000000..dba16e80
--- /dev/null
+++ b/tests/fixtures/generic/srt-complex.json
@@ -0,0 +1 @@
+[{"index": 1,"start": {"hours": 0,"minutes": 2,"seconds": 16,"milliseconds": 612,"timestamp": "00:02:16,612"},"end": {"hours": 0,"minutes": 2,"seconds": 19,"milliseconds": 376,"timestamp": "00:02:19,376"},"content": "--> --> --> -->"},{"index": 2,"start": {"hours": 0,"minutes": 2,"seconds": 19,"milliseconds": 482,"timestamp": "00:02:19.482"},"end": {"hours": 0,"minutes": 2,"seconds": 21,"milliseconds": 609,"timestamp": "00:02:21.609"},"content": "This subtitle has . as a delimiter in the timestamp."},{"index": 3,"start": {"hours": 0,"minutes": 3,"seconds": 13,"milliseconds": 336,"timestamp": "00:03:13,336"},"end": {"hours": 0,"minutes": 3,"seconds": 15,"milliseconds": 167,"timestamp": "00:03:15,167"},"content": "4"},{"index": 4,"start": {"hours": 0,"minutes": 3,"seconds": 18,"milliseconds": 608,"timestamp": "00:03:18,608"},"end": {"hours": 0,"minutes": 3,"seconds": 20,"milliseconds": 371,"timestamp": "00:03:20,371"},"content": "The previous subtitle has a number."},{"index": 5,"start": {"hours": 0,"minutes": 3,"seconds": 20,"milliseconds": 476,"timestamp": "00:03:20,476"},"end": {"hours": 0,"minutes": 3,"seconds": 22,"milliseconds": 671,"timestamp": "00:03:22,671"},"content": "This is a valid subtitle."}]
\ No newline at end of file
diff --git a/tests/fixtures/generic/srt-complex.srt b/tests/fixtures/generic/srt-complex.srt
new file mode 100644
index 00000000..67331e4a
--- /dev/null
+++ b/tests/fixtures/generic/srt-complex.srt
@@ -0,0 +1,19 @@
+1
+00:02:16,612 --> 00:02:19,376
+--> --> --> -->
+
+2
+00:02:19.482 --> 00:02:21.609
+This subtitle has . as a delimiter in the timestamp.
+
+3
+00:03:13,336 --> 00:03:15,167
+4
+
+4
+00:03:18,608 --> 00:03:20,371
+The previous subtitle has a number.
+
+5
+00:03:20,476 --> 00:03:22,671
+This is a valid subtitle.
\ No newline at end of file
diff --git a/tests/fixtures/generic/veracrypt_verbose_list_volumes.out b/tests/fixtures/generic/veracrypt_verbose_list_volumes.out
new file mode 100644
index 00000000..0fb45553
--- /dev/null
+++ b/tests/fixtures/generic/veracrypt_verbose_list_volumes.out
@@ -0,0 +1,33 @@
+Slot: 1
+Volume: /dev/sdb1
+Virtual Device: /dev/mapper/veracrypt1
+Mount Directory: /home/bob/mount/encrypt/sdb1
+Size: 498 MiB
+Type: Normal
+Read-Only: No
+Hidden Volume Protected: No
+Encryption Algorithm: AES
+Primary Key Size: 256 bits
+Secondary Key Size (XTS Mode): 256 bits
+Block Size: 128 bits
+Mode of Operation: XTS
+PKCS-5 PRF: HMAC-SHA-512
+Volume Format Version: 2
+Embedded Backup Header: Yes
+
+Slot: 2
+Volume: /dev/sdb2
+Virtual Device: /dev/mapper/veracrypt2
+Mount Directory: /home/bob/mount/encrypt/sdb2
+Size: 522 MiB
+Type: Normal
+Read-Only: No
+Hidden Volume Protected: No
+Encryption Algorithm: AES
+Primary Key Size: 256 bits
+Secondary Key Size (XTS Mode): 256 bits
+Block Size: 128 bits
+Mode of Operation: XTS
+PKCS-5 PRF: HMAC-SHA-512
+Volume Format Version: 2
+Embedded Backup Header: Yes
diff --git a/tests/fixtures/generic/veracrypt_verbose_list_volumes_unknown_fields.out b/tests/fixtures/generic/veracrypt_verbose_list_volumes_unknown_fields.out
new file mode 100644
index 00000000..2d77f166
--- /dev/null
+++ b/tests/fixtures/generic/veracrypt_verbose_list_volumes_unknown_fields.out
@@ -0,0 +1,35 @@
+Slot: 1
+Volume: /dev/sdb1
+Virtual Device: /dev/mapper/veracrypt1
+Mount Directory: /home/bob/mount/encrypt/sdb1
+Size: 498 MiB
+Type: Normal
+Read-Only: No
+Hidden Volume Protected: No
+Encryption Algorithm: AES
+Primary Key Size: 256 bits
+Secondary Key Size (XTS Mode): 256 bits
+Block Size: 128 bits
+Mode of Operation: XTS
+Label: bar
+PKCS-5 PRF: HMAC-SHA-512
+Volume Format Version: 2
+Embedded Backup Header: Yes
+
+Slot: 2
+Volume: /dev/sdb2
+Virtual Device: /dev/mapper/veracrypt2
+Mount Directory: /home/bob/mount/encrypt/sdb2
+Size: 522 MiB
+Type: Normal
+Read-Only: No
+Hidden Volume Protected: No
+Encryption Algorithm: AES
+Primary Key Size: 256 bits
+Secondary Key Size (XTS Mode): 256 bits
+Block Size: 128 bits
+Mode of Operation: XTS
+Label: foo
+PKCS-5 PRF: HMAC-SHA-512
+Volume Format Version: 2
+Embedded Backup Header: Yes
diff --git a/tests/fixtures/generic/x509-cert-bad-email.json b/tests/fixtures/generic/x509-cert-bad-email.json
new file mode 100644
index 00000000..a7c41e5b
--- /dev/null
+++ b/tests/fixtures/generic/x509-cert-bad-email.json
@@ -0,0 +1 @@
+[{"tbs_certificate":{"version":"v1","serial_number":"","signature":{"algorithm":"sha512_rsa","parameters":null},"issuer":{"country_name":"DE","state_or_province_name":"stateOrProvinceName","locality_name":"localityName","organization_name":"organizationName","organizational_unit_name":"organizationUnitName","common_name":"commonName","email_address":"emailAddress"},"validity":{"not_before":1686181858,"not_after":2001541858,"not_before_iso":"2023-06-07T23:50:58+00:00","not_after_iso":"2033-06-04T23:50:58+00:00"},"subject":{"country_name":"DE","state_or_province_name":"stateOrProvinceName","locality_name":"localityName","organization_name":"organizationName","organizational_unit_name":"organizationUnitName","common_name":"commonName","email_address":"emailAddress"},"subject_public_key_info":{"algorithm":{"algorithm":"rsa","parameters":null},"public_key":{"modulus":"aa:72:23:53:97:a6:e4:4e:7b:08:82:35:a5:3d:3a:83:f9:63:38:07:df:b8:38:61:7f:99:92:c8:31:6f:7f:ac:91:a4:47:64:7e:f9:2f:e0:9e:fd:d6:35:ee:50:78:55:47:fa:63:d4:b9:64:dc:d6:1d:f6:d6:67:4f:45:d1:96:81:3b:28:28:5f:c7:91:2f:a3:d5:a2:8d:3b:a0:21:91:25:6b:a9:40:5c:a4:8d:66:17:2a:3f:6e:61:74:fb:f4:35:25:e1:d1:64:aa:15:6c:6d:33:b6:f9:07:f2:a2:29:83:1c:b1:e5:97:3b:3e:14:ea:48:d6:c7:31:ea:3a:79:c1:28:a0:a7:ea:a6:7e:cf:c7:a3:00:d5:0d:70:00:f4:34:28:ab:f6:a3:80:7a:6f:01:9c:43:4a:a8:37:13:16:11:8f:e2:57:80:1d:df:50:4f:a3:2b:35:d9:d2:7d:1e:b6:b1:e4:b5:86:f2:a3:1c:63:c0:c2:e9:3e:f0:cf:23:e8:33:b4:da:ee:59:73:e9:94:16:1b:dd:33:8a:44:31:de:36:e2:58:1f:0e:75:fd:54:4b:6d:83:5f:a6:a1:dc:b6:1d:fc:45:1d:c9:1b:7a:01:d6:cc:0c:3d:1a:96:8b:0d:3b:20:a8:40:07:e0:c5:df:ad:1a:a2:86:47:f9:ca:f6:c5:a8:99:b8:60:e8:e2:09:ea:f5:0e:97:86:07:a6:ac:50:6b:19:06:f4:37:39:9a:0d:65:bb:89:e6:ae:eb:f3:a9:cd:72:c3:31:36:ef:ac:90:48:19:d0:84:df:b2:6d:9d:ef:6c:fd:9a:ff:3c:26:68:72:80:c2:c0:40:04:ba:84:39:69:5c:e9:b1:10:98:61:3d:1a:5c:a8:9e:79:48:2e:51:d0:c3:69:27:74:c1:ef:e2:98:2a:38:3c:6e:ea:7e:36:75:d3:3c:12:f5:cd:b2:a0:8a:0a:19:68:59:30:15:e3:cf:d3:4b:f4:99:a1:5a:3c:1f:c0:34:a3:e0:88:7a:44:6d:27:a9:87:2f:91:71:b4:c7:bb:c7:01:e2:fa:53:ef:09:1b:46:7b:df:52:f8:7a:cf:03:36:f9:b6:ce:a1:1c:3f:65:46:f8:13:cd:ac:9a:e2:19:43:26:b7:4a:2b:bd:da:94:d1:18:26:41:6e:19:2d:e1:6f:df:c4:c1:43:f6:8e:1e:99:d9:da:b2:8a:58:5e:5e:e8:a9:0c:4c:1d:a0:0f:50:b8:79:4b:3a:8a:4d:7a:7f:f4:10:b3:e8:d6:41:ec:57:e3:d1:c0:e1:fc:50:20:1c:f5:ad:84:a8:f6:af:2e:f4:cb:45:b7:4a:40:af:63:66:39:9b:73","public_exponent":65537}},"issuer_unique_id":null,"subject_unique_id":null,"extensions":[{"extn_id":"subject_alt_name","critical":false,"extn_value":["m\\xe4x@m\\xfcstermann.de"]}],"serial_number_str":"0"},"signature_algorithm":{"algorithm":"sha512_rsa","parameters":null},"signature_value":"78:ca:9f:d4:e7:e0:e9:95:6d:99:8f:ba:ca:69:ff:bd:2e:db:9f:4b:15:e5:ea:b8:c2:58:16:29:c2:2d:24:a3:62:36:91:61:ec:4b:99:e4:09:f9:a9:9b:fa:03:73:c1:ea:05:a9:ef:29:28:29:f6:00:aa:82:f8:53:1c:f0:6e:c0:87:ad:b2:93:24:ae:ba:56:f8:1c:62:54:23:d4:d5:66:a5:e1:36:cd:48:13:ad:fd:7b:4d:ff:c1:ee:de:fe:2f:d9:af:0e:82:7b:b0:58:2d:0c:e5:86:70:97:40:a5:ee:99:9a:96:59:14:8b:63:37:c5:04:07:17:58:04:56:d3:d9:71:a8:9c:c3:2f:21:77:19:ac:4d:95:83:f1:9f:91:0c:a3:8b:9c:1d:0e:0a:45:ed:e2:84:f9:57:6a:fa:5b:20:a8:15:26:d2:d8:34:2a:60:a7:d3:54:70:71:c3:17:aa:d7:3d:65:f5:5f:4e:a9:41:a2:e3:a7:c0:b4:5e:af:0b:48:64:f5:3a:08:0b:ec:c3:77:42:f8:13:19:45:19:7f:f8:09:79:1b:32:e2:9c:c2:91:b3:8d:e0:f4:e5:3f:9d:36:ae:22:a4:a8:d1:53:5b:c6:e3:ff:cb:a3:c0:47:ef:fd:b6:08:07:7a:97:1b:bf:cf:08:e0:5d:d1:4a:19:8a:14:c2:22:d0:79:b7:dc:76:d2:35:08:40:f8:33:80:8e:91:39:16:89:f5:51:18:d7:09:62:8d:47:ed:c6:e6:07:9d:d4:a8:3c:7a:df:e0:0d:bb:9a:a8:42:44:59:5d:f7:7b:f7:53:54:5f:0b:7f:1b:65:8d:df:bd:78:c9:e5:f8:57:e3:6b:e7:1f:d4:20:20:c3:0a:18:e2:6e:fa:10:e8:49:54:c7:25:6e:a1:5d:28:5f:45:f2:f1:c5:52:0e:28:c6:64:3a:4b:a6:d2:aa:66:e3:4d:fd:b2:3d:9c:30:b5:35:85:c8:44:93:53:f6:98:21:22:7c:36:8d:12:d9:d2:05:84:d0:22:b6:db:92:59:81:ea:26:3f:53:7b:a8:e8:34:c6:64:21:c0:e6:5b:3e:2b:23:6a:8b:dd:2d:63:25:46:ab:e7:a5:e4:1c:53:f0:e5:46:bb:80:17:da:ee:45:cf:da:34:34:3c:f4:61:a4:9e:00:92:a0:72:42:52:d9:9c:31:d0:90:6d:a7:90:53:9c:6a:49:83:55:f8:45:4a:1b:0c:da:65:1b:a3:d4:8c:b2:36:88:c3:c9:e2:ac:e2:93:e6:7c:fc:f6:e6:1b:35:21:26:d6:75:32:dc:98:dd:ba:7d:90:d8:48:25:36:7b:2e:f6:a1:72:bd:01"}]
diff --git a/tests/fixtures/generic/x509-cert-bad-email.pem b/tests/fixtures/generic/x509-cert-bad-email.pem
new file mode 100644
index 00000000..c5949a9b
--- /dev/null
+++ b/tests/fixtures/generic/x509-cert-bad-email.pem
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+MIIF9DCCA9wCAQAwDQYJKoZIhvcNAQENBQAwga4xCzAJBgNVBAYTAkRFMRwwGgYD
+VQQIDBNzdGF0ZU9yUHJvdmluY2VOYW1lMRUwEwYDVQQHDAxsb2NhbGl0eU5hbWUx
+GTAXBgNVBAoMEG9yZ2FuaXphdGlvbk5hbWUxHTAbBgNVBAsMFG9yZ2FuaXphdGlv
+blVuaXROYW1lMRMwEQYDVQQDDApjb21tb25OYW1lMRswGQYJKoZIhvcNAQkBFgxl
+bWFpbEFkZHJlc3MwHhcNMjMwNjA3MjM1MDU4WhcNMzMwNjA0MjM1MDU4WjCBrjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAgME3N0YXRlT3JQcm92aW5jZU5hbWUxFTATBgNV
+BAcMDGxvY2FsaXR5TmFtZTEZMBcGA1UECgwQb3JnYW5pemF0aW9uTmFtZTEdMBsG
+A1UECwwUb3JnYW5pemF0aW9uVW5pdE5hbWUxEzARBgNVBAMMCmNvbW1vbk5hbWUx
+GzAZBgkqhkiG9w0BCQEWDGVtYWlsQWRkcmVzczCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAKpyI1OXpuROewiCNaU9OoP5YzgH37g4YX+Zksgxb3+skaRH
+ZH75L+Ce/dY17lB4VUf6Y9S5ZNzWHfbWZ09F0ZaBOygoX8eRL6PVoo07oCGRJWup
+QFykjWYXKj9uYXT79DUl4dFkqhVsbTO2+QfyoimDHLHllzs+FOpI1scx6jp5wSig
+p+qmfs/HowDVDXAA9DQoq/ajgHpvAZxDSqg3ExYRj+JXgB3fUE+jKzXZ0n0etrHk
+tYbyoxxjwMLpPvDPI+gztNruWXPplBYb3TOKRDHeNuJYHw51/VRLbYNfpqHcth38
+RR3JG3oB1swMPRqWiw07IKhAB+DF360aooZH+cr2xaiZuGDo4gnq9Q6XhgemrFBr
+GQb0NzmaDWW7ieau6/OpzXLDMTbvrJBIGdCE37Jtne9s/Zr/PCZocoDCwEAEuoQ5
+aVzpsRCYYT0aXKieeUguUdDDaSd0we/imCo4PG7qfjZ10zwS9c2yoIoKGWhZMBXj
+z9NL9JmhWjwfwDSj4Ih6RG0nqYcvkXG0x7vHAeL6U+8JG0Z731L4es8DNvm2zqEc
+P2VG+BPNrJriGUMmt0orvdqU0RgmQW4ZLeFv38TBQ/aOHpnZ2rKKWF5e6KkMTB2g
+D1C4eUs6ik16f/QQs+jWQexX49HA4fxQIBz1rYSo9q8u9MtFt0pAr2NmOZtzAgMB
+AAGjIDAeMBwGA1UdEQQVMBOBEW3keEBt/HN0ZXJtYW5uLmRlMA0GCSqGSIb3DQEB
+DQUAA4ICAQB4yp/U5+DplW2Zj7rKaf+9LtufSxXl6rjCWBYpwi0ko2I2kWHsS5nk
+Cfmpm/oDc8HqBanvKSgp9gCqgvhTHPBuwIetspMkrrpW+BxiVCPU1Wal4TbNSBOt
+/XtN/8Hu3v4v2a8OgnuwWC0M5YZwl0Cl7pmallkUi2M3xQQHF1gEVtPZcaicwy8h
+dxmsTZWD8Z+RDKOLnB0OCkXt4oT5V2r6WyCoFSbS2DQqYKfTVHBxwxeq1z1l9V9O
+qUGi46fAtF6vC0hk9ToIC+zDd0L4ExlFGX/4CXkbMuKcwpGzjeD05T+dNq4ipKjR
+U1vG4//Lo8BH7/22CAd6lxu/zwjgXdFKGYoUwiLQebfcdtI1CED4M4COkTkWifVR
+GNcJYo1H7cbmB53UqDx63+ANu5qoQkRZXfd791NUXwt/G2WN3714yeX4V+Nr5x/U
+ICDDChjibvoQ6ElUxyVuoV0oX0Xy8cVSDijGZDpLptKqZuNN/bI9nDC1NYXIRJNT
+9pghInw2jRLZ0gWE0CK225JZgeomP1N7qOg0xmQhwOZbPisjaovdLWMlRqvnpeQc
+U/DlRruAF9ruRc/aNDQ89GGkngCSoHJCUtmcMdCQbaeQU5xqSYNV+EVKGwzaZRuj
+1IyyNojDyeKs4pPmfPz25hs1ISbWdTLcmN26fZDYSCU2ey72oXK9AQ==
+-----END CERTIFICATE-----
diff --git a/tests/fixtures/generic/x509-csr-der.json b/tests/fixtures/generic/x509-csr-der.json
new file mode 100644
index 00000000..4d6ae506
--- /dev/null
+++ b/tests/fixtures/generic/x509-csr-der.json
@@ -0,0 +1 @@
+[{"certification_request_info":{"version":"v1","subject":{"country_name":"US","state_or_province_name":"CA","locality_name":"San Francisco","organization_name":"jc","organizational_unit_name":"jc","common_name":"jc","email_address":"info@jc.com"},"subject_pk_info":{"algorithm":{"algorithm":"rsa","parameters":null},"public_key":{"modulus":"a3:6d:d5:69:43:b3:c2:00:87:a6:3e:57:6f:24:4c:d7:65:47:b5:87:bc:2f:3e:03:f5:bd:d8:96:36:d0:69:99:5e:3b:fd:cc:6a:3d:d9:ce:75:d8:36:ff:0e:08:55:ac:2b:ab:c5:ec:72:39:a4:12:ad:25:5f:1c:d6:c3:46:53:1b:fe:c9:53:fe:bf:18:33:64:2f:5c:36:f0:99:a1:46:4e:bc:84:19:88:0f:62:d5:14:65:c7:74:e3:a4:4c:50:6e:e0:5f:58:2a:e4:1a:10:fb:54:0b:7f:c6:d0:55:30:ea:8a:30:d2:ce:7e:93:c2:c9:0d:fd:75:20:89:70:51:49:3b:51:cb:6c:f7:5d:39:ee:d8:13:92:7d:31:04:61:e0:49:9f:34:ed:60:2a:72:a8:0b:a5:bf:2e:04:9f:61:13:7c:94:f1:e0:75:43:e0:5a:74:a4:78:36:50:f8:9b:c2:d4:e3:e2:f7:87:09:71:c7:b1:4c:53:60:3b:b3:1f:20:12:c4:cb:16:35:8b:a7:e1:00:01:a4:db:9e:c0:e7:e3:b3:a5:9b:ea:3d:38:1e:07:41:19:4c:48:34:92:71:c7:ee:ab:78:09:6f:f6:2b:78:c9:63:cc:46:1b:ad:e4:1d:96:dd:18:df:c9:66:79:73:ee:ee:d2:77:66:f5:3f","public_exponent":65537}},"attributes":[]},"signature_algorithm":{"algorithm":"sha256_rsa","parameters":null},"signature":"4a:8c:ea:3c:8a:4f:ae:f7:32:cf:46:f4:aa:a2:30:43:c8:21:26:6d:58:d4:89:12:3d:ed:69:7a:c8:3f:c7:62:d2:79:24:23:5d:53:b4:8d:6f:dd:60:82:bf:ab:46:14:bb:74:5d:92:7c:7f:f6:ad:0d:0c:74:fa:15:93:5e:ae:61:b2:dd:2c:89:a1:c9:c1:21:b9:92:57:39:be:05:98:97:e1:39:3c:5e:9a:18:56:b6:2a:db:62:51:23:d8:3c:f8:f9:dd:c1:5f:5a:85:a3:b6:e2:93:95:12:1a:6f:bb:93:14:50:e8:72:a0:b9:d9:4b:cb:8c:b6:08:35:60:4a:ba:9d:6d:e6:ba:7f:ea:a8:fe:d7:28:70:f4:c2:d1:29:92:94:c4:ff:ad:1e:b3:ad:c9:92:3e:b8:02:29:3c:e7:d6:84:a2:d4:77:46:bd:28:15:35:c6:f4:2c:a0:08:e8:9d:75:93:63:8d:e8:c8:be:60:12:da:09:a4:b7:bc:48:97:ca:fb:18:73:1f:0a:43:3d:9d:f4:8f:77:ad:7e:d2:21:b4:53:87:a1:89:d5:ee:cb:08:7c:5d:0f:a5:37:32:f2:74:53:67:97:59:f6:d4:fa:0b:9a:55:08:e3:5a:55:1b:e1:5c:f8:00:62:fb:83:e0:13:30:b1:71:5c:5c:8d"}]
diff --git a/tests/fixtures/generic/x509-csr-windows.json b/tests/fixtures/generic/x509-csr-windows.json
new file mode 100644
index 00000000..8a00a050
--- /dev/null
+++ b/tests/fixtures/generic/x509-csr-windows.json
@@ -0,0 +1 @@
+[{"certification_request_info":{"version":"v1","subject":{"country_name":"US","state_or_province_name":"NY","locality_name":"NY","organization_name":"My Company","organizational_unit_name":"IT","common_name":"www.mywebsite.com"},"subject_pk_info":{"algorithm":{"algorithm":"rsa","parameters":null},"public_key":{"modulus":"b5:92:fc:6c:31:40:34:d3:9b:34:d7:3d:be:4e:ee:33:39:ad:5a:ba:a1:fe:a9:c8:2d:c7:b0:db:e6:d0:d1:7d:37:68:4b:47:5e:06:61:4c:9e:cc:b0:2f:85:c8:49:a4:2b:96:45:f6:62:5f:24:50:0f:95:72:47:e5:62:f2:10:95:97:90:7e:b9:0f:11:a1:9d:c4:90:85:4d:68:04:bd:a0:c0:43:58:4c:f8:13:ba:98:3d:97:e4:68:8f:c3:55:fb:e0:d2:61:95:23:01:f1:7b:d8:61:c8:df:e1:3f:c6:fb:9d:ba:c1:e3:e3:44:2a:c1:dc:5c:a1:92:7a:95:3c:f1:e5:3f:55:4e:fe:22:3c:c0:2f:78:de:cc:7b:8c:ab:00:6d:f1:db:c9:eb:91:aa:d7:f0:89:c4:0c:60:a8:8c:cb:4a:af:bc:1c:1e:61:2d:cf:89:84:0f:ff:f6:dd:7f:61:0d:49:67:52:90:64:b1:e0:6c:e6:d8:28:00:08:11:0b:3a:cd:92:27:57:4f:0b:95:0d:59:90:06:a0:38:18:06:87:97:5a:48:97:10:fa:9d:dd:ef:dc:de:c6:88:dd:24:6b:1a:5e:4f:ab:ea:67:21:41:37:9a:7f:ac:cd:1c:3a:7a:0e:1f:d7:6b:28:91:ca:bd:2b:a8:ab:b8:38:19","public_exponent":65537}},"attributes":[{"type":"microsoft_os_version","values":["6.1.7601.2"]},{"type":"microsoft_request_client_info","values":[{"clientid":5,"machinename":"dell-PC","username":"dell-PC\\Dev","processname":"InetMgr.exe"}]},{"type":"microsoft_enrollment_csp_provider","values":[{"keyspec":1,"cspname":"Microsoft RSA SChannel Cryptographic Provider","signature":[]}]},{"type":"extension_request","values":[[{"extn_id":"key_usage","critical":true,"extn_value":["data_encipherment","digital_signature","key_encipherment","non_repudiation"]},{"extn_id":"extended_key_usage","critical":false,"extn_value":["server_auth"]},{"extn_id":"1.2.840.113549.1.9.15","critical":false,"extn_value":"30:69:30:0e:06:08:2a:86:48:86:f7:0d:03:02:02:02:00:80:30:0e:06:08:2a:86:48:86:f7:0d:03:04:02:02:00:80:30:0b:06:09:60:86:48:01:65:03:04:01:2a:30:0b:06:09:60:86:48:01:65:03:04:01:2d:30:0b:06:09:60:86:48:01:65:03:04:01:02:30:0b:06:09:60:86:48:01:65:03:04:01:05:30:07:06:05:2b:0e:03:02:07:30:0a:06:08:2a:86:48:86:f7:0d:03:07"},{"extn_id":"key_identifier","critical":false,"extn_value":"02:3f:12:86:0b:e5:e7:b6:48:cc:b3:57:b7:8b:1e:27:81:5f:0b:08"}]]}]},"signature_algorithm":{"algorithm":"sha1_rsa","parameters":null},"signature":"56:74:46:d0:35:ab:e1:fe:c6:07:5f:d7:d7:1c:0f:3b:28:c6:a0:80:e8:d2:95:58:04:61:ac:d1:b9:af:20:bc:f9:fd:15:84:54:87:d4:d3:8f:c8:46:35:68:c1:21:21:92:c9:a7:60:43:6a:83:f0:d8:6f:a5:c5:e4:da:97:bd:15:cd:b3:9b:93:96:f0:29:37:b7:2c:01:96:54:43:43:56:a9:8e:df:1d:db:16:05:ce:e4:f7:dd:15:84:c7:32:d5:f2:c9:8e:a7:64:2b:ab:ba:71:6a:1a:ca:2f:94:2c:6e:36:aa:d0:12:00:83:e5:0f:5a:67:a9:5c:4f:c7:76:5b:67:a9:69:ee:5b:0b:36:78:5b:11:c2:50:41:ed:61:e8:da:de:16:10:7e:4f:5e:16:96:80:56:ae:0a:14:8a:01:3e:71:98:e4:bf:95:27:51:fb:f7:07:5a:d2:9e:3e:d2:46:35:68:1f:cf:c9:52:8d:31:99:ae:4a:98:5d:78:c0:f4:e3:98:6c:2a:6e:94:15:3f:bd:f5:ec:2a:fe:87:0a:0c:82:57:ed:4e:d5:54:e8:10:ff:9d:df:52:62:77:ce:a5:1a:bd:c8:3e:4b:1a:f0:14:5f:30:15:4e:7d:54:a3:d2:19:8a:0c:04:e5:84:3d:df:f9:a5:bd:2b:1b:1f"}]
diff --git a/tests/fixtures/generic/x509-csr-windows.pem b/tests/fixtures/generic/x509-csr-windows.pem
new file mode 100644
index 00000000..5c2fe976
--- /dev/null
+++ b/tests/fixtures/generic/x509-csr-windows.pem
@@ -0,0 +1,25 @@
+-----BEGIN NEW CERTIFICATE REQUEST-----
+MIIERTCCAy0CAQAwZTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQswCQYDVQQH
+DAJOWTETMBEGA1UECgwKTXkgQ29tcGFueTELMAkGA1UECwwCSVQxGjAYBgNVBAMM
+EXd3dy5teXdlYnNpdGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtZL8bDFANNObNNc9vk7uMzmtWrqh/qnILcew2+bQ0X03aEtHXgZhTJ7MsC+F
+yEmkK5ZF9mJfJFAPlXJH5WLyEJWXkH65DxGhncSQhU1oBL2gwENYTPgTupg9l+Ro
+j8NV++DSYZUjAfF72GHI3+E/xvudusHj40QqwdxcoZJ6lTzx5T9VTv4iPMAveN7M
+e4yrAG3x28nrkarX8InEDGCojMtKr7wcHmEtz4mED//23X9hDUlnUpBkseBs5tgo
+AAgRCzrNkidXTwuVDVmQBqA4GAaHl1pIlxD6nd3v3N7GiN0kaxpeT6vqZyFBN5p/
+rM0cOnoOH9drKJHKvSuoq7g4GQIDAQABoIIBmTAaBgorBgEEAYI3DQIDMQwWCjYu
+MS43NjAxLjIwNQYJKwYBBAGCNxUUMSgwJgIBBQwHZGVsbC1QQwwLZGVsbC1QQ1xE
+ZXYMC0luZXRNZ3IuZXhlMHIGCisGAQQBgjcNAgIxZDBiAgEBHloATQBpAGMAcgBv
+AHMAbwBmAHQAIABSAFMAQQAgAFMAQwBoAGEAbgBuAGUAbAAgAEMAcgB5AHAAdABv
+AGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIDAQAwgc8GCSqGSIb3DQEJ
+DjGBwTCBvjAOBgNVHQ8BAf8EBAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwEweAYJ
+KoZIhvcNAQkPBGswaTAOBggqhkiG9w0DAgICAIAwDgYIKoZIhvcNAwQCAgCAMAsG
+CWCGSAFlAwQBKjALBglghkgBZQMEAS0wCwYJYIZIAWUDBAECMAsGCWCGSAFlAwQB
+BTAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4EFgQUAj8Shgvl57ZIzLNXt4se
+J4FfCwgwDQYJKoZIhvcNAQEFBQADggEBAFZ0RtA1q+H+xgdf19ccDzsoxqCA6NKV
+WARhrNG5ryC8+f0VhFSH1NOPyEY1aMEhIZLJp2BDaoPw2G+lxeTal70VzbObk5bw
+KTe3LAGWVENDVqmO3x3bFgXO5PfdFYTHMtXyyY6nZCurunFqGsovlCxuNqrQEgCD
+5Q9aZ6lcT8d2W2epae5bCzZ4WxHCUEHtYeja3hYQfk9eFpaAVq4KFIoBPnGY5L+V
+J1H79wda0p4+0kY1aB/PyVKNMZmuSphdeMD045hsKm6UFT+99ewq/ocKDIJX7U7V
+VOgQ/53fUmJ3zqUavcg+SxrwFF8wFU59VKPSGYoMBOWEPd/5pb0rGx8=
+-----END NEW CERTIFICATE REQUEST-----
diff --git a/tests/fixtures/generic/x509-csr.der b/tests/fixtures/generic/x509-csr.der
new file mode 100644
index 00000000..4e7d68c1
Binary files /dev/null and b/tests/fixtures/generic/x509-csr.der differ
diff --git a/tests/fixtures/generic/x509-csr.json b/tests/fixtures/generic/x509-csr.json
new file mode 100644
index 00000000..e48abcc1
--- /dev/null
+++ b/tests/fixtures/generic/x509-csr.json
@@ -0,0 +1 @@
+[{"certification_request_info":{"version":"v1","subject":{"country_name":"US","state_or_province_name":"Utah","locality_name":"Lindon","organization_name":"DigiCert Inc.","organizational_unit_name":"DigiCert","common_name":"example.digicert.com"},"subject_pk_info":{"algorithm":{"algorithm":"rsa","parameters":null},"public_key":{"modulus":"f3:e4:e8:ed:df:b6:90:f5:9e:06:ff:e8:ad:4d:cb:55:b2:70:0e:b4:90:6d:e2:9a:98:29:a8:c2:9e:5b:a8:3c:48:c1:5d:b4:ce:a4:5b:ec:03:d4:38:a6:28:54:41:45:38:44:2c:e9:3e:a0:22:69:c8:a2:58:5b:88:7e:a6:e3:38:19:fc:23:ef:58:13:a4:65:cf:9c:d4:fa:36:12:6b:c1:cf:e0:03:e6:c0:5d:4f:99:33:19:00:3a:35:b5:b2:64:69:5d:c5:1b:61:34:b3:ac:d5:e7:ce:85:d9:d6:16:e8:48:d7:ad:aa:99:c7:e5:82:98:88:58:3b:b0:ab:80:bd:7f:e6:24:78:98:4d:9f:d7:45:e7:ea:30:9b:c7:0e:42:60:eb:57:c3:4d:76:24:ea:8a:7f:2a:de:a6:00:1c:72:51:5b:6f:20:94:95:02:66:44:d9:c0:86:92:47:a7:2b:05:0f:13:6d:83:44:d1:d7:3e:09:a6:b7:0c:e2:24:cf:51:0e:b0:75:b3:4f:1f:a7:d3:32:9f:a9:c6:e0:5e:2e:03:27:1f:82:d5:b8:e9:b5:83:d1:04:f6:4b:f0:30:1e:5a:e0:3c:79:bb:9d:55:3e:38:c8:4a:7c:d8:6f:7a:fc:68:1c:7f:b1:77:df:13:31:7b:4c:9c:f9:76:ba:a3","public_exponent":65537}},"attributes":[]},"signature_algorithm":{"algorithm":"sha1_rsa","parameters":null},"signature":"1d:24:72:b1:5c:71:29:85:0e:6c:68:c7:43:5e:d3:55:08:a9:2b:03:a8:78:0b:f9:79:87:4d:72:70:ad:ee:83:84:94:99:c1:bb:c4:b4:e2:b4:1b:7f:9d:af:81:6c:d7:55:ae:50:db:79:a9:c2:ec:c7:96:bc:ba:4e:06:e8:02:87:33:3b:a1:2e:c2:7b:5d:98:e0:99:05:c6:10:2a:58:43:89:82:df:24:f7:66:80:86:a4:85:db:c3:e8:8f:de:59:84:11:78:1a:40:bd:13:c7:92:c5:97:fa:24:29:b2:98:c0:8a:8d:8b:22:96:38:c8:fb:65:1f:f0:c5:68:3f:64:31:91:b3:9e:71:ba:87:8b:0c:9f:d9:44:57:fd:6c:8f:88:68:25:1d:d5:8a:df:61:c1:c8:97:71:bc:ec:0b:fe:af:8f:58:57:0a:91:0d:3d:15:0d:5e:ee:2e:0a:a7:db:d5:c8:d4:fa:55:50:d0:8f:40:69:fd:a7:f7:97:e9:0a:3b:be:90:da:3f:26:d1:b4:0d:91:ed:72:ca:8d:06:85:f6:85:d6:78:25:2a:cb:58:6f:25:a7:3d:40:53:b6:f7:b3:9b:d5:a9:69:1c:fa:19:ee:65:a2:12:e2:70:8c:13:e2:8b:a6:bd:33:d1:b7:d2:75:28:df:d9:41:8b:5c"}]
diff --git a/tests/fixtures/generic/x509-csr.pem b/tests/fixtures/generic/x509-csr.pem
new file mode 100644
index 00000000..4687d668
--- /dev/null
+++ b/tests/fixtures/generic/x509-csr.pem
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFV0YWgxDzANBgNV
+BAcMBkxpbmRvbjEWMBQGA1UECgwNRGlnaUNlcnQgSW5jLjERMA8GA1UECwwIRGln
+aUNlcnQxHTAbBgNVBAMMFGV4YW1wbGUuZGlnaWNlcnQuY29tMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+To7d+2kPWeBv/orU3LVbJwDrSQbeKamCmo
+wp5bqDxIwV20zqRb7APUOKYoVEFFOEQs6T6gImnIolhbiH6m4zgZ/CPvWBOkZc+c
+1Po2EmvBz+AD5sBdT5kzGQA6NbWyZGldxRthNLOs1efOhdnWFuhI162qmcflgpiI
+WDuwq4C9f+YkeJhNn9dF5+owm8cOQmDrV8NNdiTqin8q3qYAHHJRW28glJUCZkTZ
+wIaSR6crBQ8TbYNE0dc+Caa3DOIkz1EOsHWzTx+n0zKfqcbgXi4DJx+C1bjptYPR
+BPZL8DAeWuA8ebudVT44yEp82G96/Ggcf7F33xMxe0yc+Xa6owIDAQABoAAwDQYJ
+KoZIhvcNAQEFBQADggEBAB0kcrFccSmFDmxox0Ne01UIqSsDqHgL+XmHTXJwre6D
+hJSZwbvEtOK0G3+dr4Fs11WuUNt5qcLsx5a8uk4G6AKHMzuhLsJ7XZjgmQXGECpY
+Q4mC3yT3ZoCGpIXbw+iP3lmEEXgaQL0Tx5LFl/okKbKYwIqNiyKWOMj7ZR/wxWg/
+ZDGRs55xuoeLDJ/ZRFf9bI+IaCUd1YrfYcHIl3G87Av+r49YVwqRDT0VDV7uLgqn
+29XI1PpVUNCPQGn9p/eX6Qo7vpDaPybRtA2R7XLKjQaF9oXWeCUqy1hvJac9QFO2
+97Ob1alpHPoZ7mWiEuJwjBPii6a9M9G30nUo39lBi1w=
+-----END CERTIFICATE REQUEST-----
diff --git a/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.json b/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.json
new file mode 100644
index 00000000..c36e2aaa
--- /dev/null
+++ b/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.json
@@ -0,0 +1,1599 @@
+[
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "4789",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "inode_number": "58296",
+      "cookie": "1"
+    },
+    "local_port_num": 4789
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "5353",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1510": {
+          "user": "avahi-daemon",
+          "file_descriptor": "12"
+        }
+      },
+      "uid_number": "112",
+      "inode_number": "25147",
+      "cookie": "2"
+    },
+    "local_port_num": 5353
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "39996",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1996": {
+          "user": "snmpd",
+          "file_descriptor": "12"
+        }
+      },
+      "inode_number": "42903",
+      "cookie": "3"
+    },
+    "local_port_num": 39996
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "7946",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "28"
+        }
+      },
+      "inode_number": "61138",
+      "cookie": "4"
+    },
+    "local_port_num": 7946
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "8125",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "104"
+        }
+      },
+      "inode_number": "78939",
+      "cookie": "5"
+    },
+    "local_port_num": 8125
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "192.168.122.1",
+    "local_port": "53",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2783": {
+          "user": "dnsmasq",
+          "file_descriptor": "5"
+        }
+      },
+      "inode_number": "43666",
+      "cookie": "6"
+    },
+    "local_port_num": 53
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "127.0.0.53",
+    "local_port": "53",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1117": {
+          "user": "systemd-resolve",
+          "file_descriptor": "12"
+        }
+      },
+      "uid_number": "101",
+      "inode_number": "29400",
+      "cookie": "7"
+    },
+    "interface": "lo",
+    "local_port_num": 53
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "67",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2783": {
+          "user": "dnsmasq",
+          "file_descriptor": "3"
+        }
+      },
+      "inode_number": "43663",
+      "cookie": "8"
+    },
+    "interface": "virbr0",
+    "local_port_num": 67
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "68",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "4852": {
+          "user": "dhclient",
+          "file_descriptor": "6"
+        }
+      },
+      "inode_number": "55971",
+      "cookie": "9"
+    },
+    "local_port_num": 68
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "68",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "4738": {
+          "user": "dhclient",
+          "file_descriptor": "6"
+        }
+      },
+      "inode_number": "46019",
+      "cookie": "a"
+    },
+    "local_port_num": 68
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "111",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1119": {
+          "user": "rpcbind",
+          "file_descriptor": "6"
+        }
+      },
+      "inode_number": "24994",
+      "cookie": "b"
+    },
+    "local_port_num": 111
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "161",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1996": {
+          "user": "snmpd",
+          "file_descriptor": "11"
+        }
+      },
+      "inode_number": "42905",
+      "cookie": "c"
+    },
+    "local_port_num": 161
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "631",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1880": {
+          "user": "cups-browsed",
+          "file_descriptor": "7"
+        }
+      },
+      "inode_number": "46417",
+      "cookie": "d"
+    },
+    "local_port_num": 631
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "871",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1119": {
+          "user": "rpcbind",
+          "file_descriptor": "7"
+        }
+      },
+      "inode_number": "34845",
+      "cookie": "e"
+    },
+    "local_port_num": 871
+  },
+  {
+    "netid": "udp",
+    "state": "UNCONN",
+    "recv_q": 0,
+    "send_q": 0,
+    "local_address": "0.0.0.0",
+    "local_port": "35059",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1510": {
+          "user": "avahi-daemon",
+          "file_descriptor": "13"
+        }
+      },
+      "uid_number": "112",
+      "inode_number": "37602",
+      "cookie": "f"
+    },
+    "local_port_num": 35059
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9187",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1671": {
+          "user": "prometheus-post",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "32721",
+      "cookie": "10"
+    },
+    "local_port_num": 9187
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "389",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "183"
+        }
+      },
+      "inode_number": "128462",
+      "cookie": "11"
+    },
+    "local_port_num": 389
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "0.0.0.0",
+    "local_port": "6566",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1": {
+          "user": "systemd",
+          "file_descriptor": "62"
+        }
+      },
+      "inode_number": "35013",
+      "cookie": "12"
+    },
+    "local_port_num": 6566
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2023",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "97"
+        }
+      },
+      "inode_number": "78929",
+      "cookie": "13"
+    },
+    "local_port_num": 2023
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "5000",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "214"
+        }
+      },
+      "inode_number": "138297",
+      "cookie": "14"
+    },
+    "local_port_num": 5000
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2024",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "99"
+        }
+      },
+      "inode_number": "75475",
+      "cookie": "15"
+    },
+    "local_port_num": 2024
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9000",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "66"
+        }
+      },
+      "inode_number": "71580",
+      "cookie": "16"
+    },
+    "local_port_num": 9000
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 10,
+    "local_address": "0.0.0.0",
+    "local_port": "3689",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "6716": {
+          "user": "rhythmbox",
+          "file_descriptor": "19"
+        }
+      },
+      "uid_number": "1000",
+      "inode_number": "150684",
+      "cookie": "17"
+    },
+    "local_port_num": 3689
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "27017",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "196"
+        }
+      },
+      "inode_number": "135216",
+      "cookie": "18"
+    },
+    "local_port_num": 27017
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2377",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "18"
+        }
+      },
+      "inode_number": "50423",
+      "cookie": "19"
+    },
+    "local_port_num": 2377
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "7946",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "27"
+        }
+      },
+      "inode_number": "61137",
+      "cookie": "1a"
+    },
+    "local_port_num": 7946
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 80,
+    "local_address": "0.0.0.0",
+    "local_port": "3306",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2367": {
+          "user": "mysqld",
+          "file_descriptor": "24"
+        }
+      },
+      "uid_number": "125",
+      "inode_number": "47161",
+      "cookie": "1b"
+    },
+    "local_port_num": 3306
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "6443",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "149"
+        }
+      },
+      "inode_number": "83788",
+      "cookie": "1c"
+    },
+    "local_port_num": 6443
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "6379",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "33"
+        }
+      },
+      "inode_number": "74330",
+      "cookie": "1d"
+    },
+    "local_port_num": 6379
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9100",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1419": {
+          "user": "prometheus-node",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "24436",
+      "cookie": "1e"
+    },
+    "local_port_num": 9100
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9133",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1951": {
+          "user": "fritzbox_export",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "42810",
+      "cookie": "1f"
+    },
+    "local_port_num": 9133
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2222",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "133"
+        }
+      },
+      "inode_number": "89671",
+      "cookie": "20"
+    },
+    "local_port_num": 2222
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2223",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "146"
+        }
+      },
+      "inode_number": "98624",
+      "cookie": "21"
+    },
+    "local_port_num": 2223
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "127.0.0.1",
+    "local_port": "40783",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2002": {
+          "user": "containerd",
+          "file_descriptor": "14"
+        }
+      },
+      "inode_number": "42959",
+      "cookie": "22"
+    },
+    "local_port_num": 40783
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "0.0.0.0",
+    "local_port": "111",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1119": {
+          "user": "rpcbind",
+          "file_descriptor": "8"
+        }
+      },
+      "inode_number": "34846",
+      "cookie": "23"
+    },
+    "local_port_num": 111
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 511,
+    "local_address": "0.0.0.0",
+    "local_port": "80",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "24795": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2157": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2156": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2155": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2154": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2153": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        },
+        "2079": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "3"
+        }
+      },
+      "inode_number": "40480",
+      "cookie": "24"
+    },
+    "local_port_num": 80
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9104",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1587": {
+          "user": "prometheus-mysq",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "24481",
+      "cookie": "25"
+    },
+    "local_port_num": 9104
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8081",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "205"
+        }
+      },
+      "inode_number": "131957",
+      "cookie": "26"
+    },
+    "local_port_num": 8081
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8082",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "223"
+        }
+      },
+      "inode_number": "140597",
+      "cookie": "27"
+    },
+    "local_port_num": 8082
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2003",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "85"
+        }
+      },
+      "inode_number": "75383",
+      "cookie": "28"
+    },
+    "local_port_num": 2003
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "127.0.0.1",
+    "local_port": "5939",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "4963": {
+          "user": "teamviewerd",
+          "file_descriptor": "12"
+        }
+      },
+      "inode_number": "59559",
+      "cookie": "29"
+    },
+    "local_port_num": 5939
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "2004",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "96"
+        }
+      },
+      "inode_number": "71664",
+      "cookie": "2a"
+    },
+    "local_port_num": 2004
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 500,
+    "local_address": "0.0.0.0",
+    "local_port": "8084",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1799": {
+          "user": "Main",
+          "file_descriptor": "5"
+        }
+      },
+      "uid_number": "33",
+      "inode_number": "44981",
+      "cookie": "2b"
+    },
+    "local_port_num": 8084
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8085",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "100"
+        }
+      },
+      "inode_number": "77932",
+      "cookie": "2c"
+    },
+    "local_port_num": 8085
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 32,
+    "local_address": "192.168.122.1",
+    "local_port": "53",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2783": {
+          "user": "dnsmasq",
+          "file_descriptor": "6"
+        }
+      },
+      "inode_number": "43667",
+      "cookie": "2d"
+    },
+    "local_port_num": 53
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "127.0.0.53",
+    "local_port": "53",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1117": {
+          "user": "systemd-resolve",
+          "file_descriptor": "13"
+        }
+      },
+      "uid_number": "101",
+      "inode_number": "29401",
+      "cookie": "2e"
+    },
+    "interface": "lo",
+    "local_port_num": 53
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8086",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "98"
+        }
+      },
+      "inode_number": "75513",
+      "cookie": "2f"
+    },
+    "local_port_num": 8086
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "0.0.0.0",
+    "local_port": "22",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1998": {
+          "user": "sshd",
+          "file_descriptor": "3"
+        }
+      },
+      "inode_number": "58511",
+      "cookie": "30"
+    },
+    "local_port_num": 22
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8087",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "157"
+        }
+      },
+      "inode_number": "98633",
+      "cookie": "31"
+    },
+    "local_port_num": 8087
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 5,
+    "local_address": "127.0.0.1",
+    "local_port": "631",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1410": {
+          "user": "cupsd",
+          "file_descriptor": "7"
+        }
+      },
+      "inode_number": "40509",
+      "cookie": "32"
+    },
+    "local_port_num": 631
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9111",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1941": {
+          "user": "syno_exporter-0",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "25196",
+      "cookie": "33"
+    },
+    "local_port_num": 9111
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "3000",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "42"
+        }
+      },
+      "inode_number": "89081",
+      "cookie": "34"
+    },
+    "local_port_num": 3000
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "5432",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "117"
+        }
+      },
+      "inode_number": "76497",
+      "cookie": "35"
+    },
+    "local_port_num": 5432
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "3033",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "139"
+        }
+      },
+      "inode_number": "89680",
+      "cookie": "36"
+    },
+    "local_port_num": 3033
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8089",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "185"
+        }
+      },
+      "inode_number": "84656",
+      "cookie": "37"
+    },
+    "local_port_num": 8089
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 100,
+    "local_address": "127.0.0.1",
+    "local_port": "25",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "5745": {
+          "user": "master",
+          "file_descriptor": "13"
+        }
+      },
+      "inode_number": "57959",
+      "cookie": "38"
+    },
+    "local_port_num": 25
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "3003",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "23"
+        }
+      },
+      "inode_number": "90254",
+      "cookie": "39"
+    },
+    "local_port_num": 3003
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8091",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "144"
+        }
+      },
+      "inode_number": "84694",
+      "cookie": "3a"
+    },
+    "local_port_num": 8091
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 511,
+    "local_address": "0.0.0.0",
+    "local_port": "443",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "24795": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2157": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2156": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2155": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2154": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2153": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        },
+        "2079": {
+          "user": "/usr/sbin/apach",
+          "file_descriptor": "4"
+        }
+      },
+      "inode_number": "40485",
+      "cookie": "3b"
+    },
+    "local_port_num": 443
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 100,
+    "local_address": "0.0.0.0",
+    "local_port": "1883",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1798": {
+          "user": "mosquitto",
+          "file_descriptor": "4"
+        }
+      },
+      "inode_number": "38377",
+      "cookie": "3c"
+    },
+    "local_port_num": 1883
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9115",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1651": {
+          "user": "prometheus-blac",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "25119",
+      "cookie": "3d"
+    },
+    "local_port_num": 9115
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "636",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "187"
+        }
+      },
+      "inode_number": "125799",
+      "cookie": "3e"
+    },
+    "local_port_num": 636
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8092",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "37"
+        }
+      },
+      "inode_number": "87972",
+      "cookie": "3f"
+    },
+    "local_port_num": 8092
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9116",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1928": {
+          "user": "snmp_exporter",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "45204",
+      "cookie": "40"
+    },
+    "local_port_num": 9116
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 1024,
+    "local_address": "127.0.0.1",
+    "local_port": "2812",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1806": {
+          "user": "monit",
+          "file_descriptor": "6"
+        }
+      },
+      "inode_number": "37711",
+      "cookie": "41"
+    },
+    "local_port_num": 2812
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "446",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "143"
+        }
+      },
+      "inode_number": "98615",
+      "cookie": "42"
+    },
+    "local_port_num": 446
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8126",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "105"
+        }
+      },
+      "inode_number": "77945",
+      "cookie": "43"
+    },
+    "local_port_num": 8126
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 100,
+    "local_address": "127.0.0.1",
+    "local_port": "49152",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "9583": {
+          "user": "TabNine-deep-lo",
+          "file_descriptor": "22"
+        }
+      },
+      "uid_number": "1000",
+      "inode_number": "486863",
+      "cookie": "6ae"
+    },
+    "local_port_num": 49152
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "127.0.0.1",
+    "local_port": "46624",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "27494": {
+          "user": "kited",
+          "file_descriptor": "3"
+        }
+      },
+      "uid_number": "1000",
+      "inode_number": "110003",
+      "cookie": "44"
+    },
+    "local_port_num": 46624
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "8000",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "2840": {
+          "user": "dockerd",
+          "file_descriptor": "50"
+        }
+      },
+      "inode_number": "73647",
+      "cookie": "45"
+    },
+    "local_port_num": 8000
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 128,
+    "local_address": "0.0.0.0",
+    "local_port": "5665",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "5337": {
+          "user": "icinga2",
+          "file_descriptor": "16"
+        }
+      },
+      "uid_number": "136",
+      "inode_number": "57169",
+      "cookie": "46"
+    },
+    "local_port_num": 5665
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "192.168.178.5",
+    "local_port": "10050",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "6359": {
+          "user": "zabbix_agent2",
+          "file_descriptor": "10"
+        }
+      },
+      "uid_number": "131",
+      "inode_number": "64927",
+      "cookie": "47"
+    },
+    "local_port_num": 10050
+  },
+  {
+    "netid": "tcp",
+    "state": "LISTEN",
+    "recv_q": 0,
+    "send_q": 4096,
+    "local_address": "0.0.0.0",
+    "local_port": "9090",
+    "peer_address": "0.0.0.0",
+    "peer_port": "*",
+    "opts": {
+      "process_id": {
+        "1543": {
+          "user": "prometheus",
+          "file_descriptor": "7"
+        }
+      },
+      "uid_number": "128",
+      "inode_number": "32704",
+      "cookie": "48"
+    },
+    "local_port_num": 9090
+  }
+]
diff --git a/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.out b/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.out
new file mode 100644
index 00000000..56c6aefe
--- /dev/null
+++ b/tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.out
@@ -0,0 +1,74 @@
+Netid State    Recv-Q   Send-Q       Local Address:Port      Peer Address:Port                                                                                  
+udp   UNCONN   0        0                  0.0.0.0:4789           0.0.0.0:*      ino:58296 sk:1 <->                                                             
+udp   UNCONN   0        0                  0.0.0.0:5353           0.0.0.0:*      users:(("avahi-daemon",pid=1510,fd=12)) uid:112 ino:25147 sk:2 <->             
+udp   UNCONN   0        0                  0.0.0.0:39996          0.0.0.0:*      users:(("snmpd",pid=1996,fd=12)) ino:42903 sk:3 <->                            
+udp   UNCONN   0        0                  0.0.0.0:7946           0.0.0.0:*      users:(("dockerd",pid=2840,fd=28)) ino:61138 sk:4 <->                          
+udp   UNCONN   0        0                  0.0.0.0:8125           0.0.0.0:*      users:(("dockerd",pid=2840,fd=104)) ino:78939 sk:5 <->                         
+udp   UNCONN   0        0            192.168.122.1:53             0.0.0.0:*      users:(("dnsmasq",pid=2783,fd=5)) ino:43666 sk:6 <->                           
+udp   UNCONN   0        0            127.0.0.53%lo:53             0.0.0.0:*      users:(("systemd-resolve",pid=1117,fd=12)) uid:101 ino:29400 sk:7 <->          
+udp   UNCONN   0        0           0.0.0.0%virbr0:67             0.0.0.0:*      users:(("dnsmasq",pid=2783,fd=3)) ino:43663 sk:8 <->                           
+udp   UNCONN   0        0                  0.0.0.0:68             0.0.0.0:*      users:(("dhclient",pid=4852,fd=6)) ino:55971 sk:9 <->                          
+udp   UNCONN   0        0                  0.0.0.0:68             0.0.0.0:*      users:(("dhclient",pid=4738,fd=6)) ino:46019 sk:a <->                          
+udp   UNCONN   0        0                  0.0.0.0:111            0.0.0.0:*      users:(("rpcbind",pid=1119,fd=6)) ino:24994 sk:b <->                           
+udp   UNCONN   0        0                  0.0.0.0:161            0.0.0.0:*      users:(("snmpd",pid=1996,fd=11)) ino:42905 sk:c <->                            
+udp   UNCONN   0        0                  0.0.0.0:631            0.0.0.0:*      users:(("cups-browsed",pid=1880,fd=7)) ino:46417 sk:d <->                      
+udp   UNCONN   0        0                  0.0.0.0:871            0.0.0.0:*      users:(("rpcbind",pid=1119,fd=7)) ino:34845 sk:e <->                           
+udp   UNCONN   0        0                  0.0.0.0:35059          0.0.0.0:*      users:(("avahi-daemon",pid=1510,fd=13)) uid:112 ino:37602 sk:f <->             
+tcp   LISTEN   0        4096               0.0.0.0:9187           0.0.0.0:*      users:(("prometheus-post",pid=1671,fd=3)) uid:128 ino:32721 sk:10 <->          
+tcp   LISTEN   0        4096               0.0.0.0:389            0.0.0.0:*      users:(("dockerd",pid=2840,fd=183)) ino:128462 sk:11 <->                       
+tcp   LISTEN   0        128                0.0.0.0:6566           0.0.0.0:*      users:(("systemd",pid=1,fd=62)) ino:35013 sk:12 <->                            
+tcp   LISTEN   0        4096               0.0.0.0:2023           0.0.0.0:*      users:(("dockerd",pid=2840,fd=97)) ino:78929 sk:13 <->                         
+tcp   LISTEN   0        4096               0.0.0.0:5000           0.0.0.0:*      users:(("dockerd",pid=2840,fd=214)) ino:138297 sk:14 <->                       
+tcp   LISTEN   0        4096               0.0.0.0:2024           0.0.0.0:*      users:(("dockerd",pid=2840,fd=99)) ino:75475 sk:15 <->                         
+tcp   LISTEN   0        4096               0.0.0.0:9000           0.0.0.0:*      users:(("dockerd",pid=2840,fd=66)) ino:71580 sk:16 <->                         
+tcp   LISTEN   0        10                 0.0.0.0:3689           0.0.0.0:*      users:(("rhythmbox",pid=6716,fd=19)) uid:1000 ino:150684 sk:17 <->             
+tcp   LISTEN   0        4096               0.0.0.0:27017          0.0.0.0:*      users:(("dockerd",pid=2840,fd=196)) ino:135216 sk:18 <->                       
+tcp   LISTEN   0        4096               0.0.0.0:2377           0.0.0.0:*      users:(("dockerd",pid=2840,fd=18)) ino:50423 sk:19 <->                         
+tcp   LISTEN   0        4096               0.0.0.0:7946           0.0.0.0:*      users:(("dockerd",pid=2840,fd=27)) ino:61137 sk:1a <->                         
+tcp   LISTEN   0        80                 0.0.0.0:3306           0.0.0.0:*      users:(("mysqld",pid=2367,fd=24)) uid:125 ino:47161 sk:1b <->                  
+tcp   LISTEN   0        4096               0.0.0.0:6443           0.0.0.0:*      users:(("dockerd",pid=2840,fd=149)) ino:83788 sk:1c <->                        
+tcp   LISTEN   0        4096               0.0.0.0:6379           0.0.0.0:*      users:(("dockerd",pid=2840,fd=33)) ino:74330 sk:1d <->                         
+tcp   LISTEN   0        4096               0.0.0.0:9100           0.0.0.0:*      users:(("prometheus-node",pid=1419,fd=3)) uid:128 ino:24436 sk:1e <->          
+tcp   LISTEN   0        4096               0.0.0.0:9133           0.0.0.0:*      users:(("fritzbox_export",pid=1951,fd=3)) uid:128 ino:42810 sk:1f <->          
+tcp   LISTEN   0        4096               0.0.0.0:2222           0.0.0.0:*      users:(("dockerd",pid=2840,fd=133)) ino:89671 sk:20 <->                        
+tcp   LISTEN   0        4096               0.0.0.0:2223           0.0.0.0:*      users:(("dockerd",pid=2840,fd=146)) ino:98624 sk:21 <->                        
+tcp   LISTEN   0        4096             127.0.0.1:40783          0.0.0.0:*      users:(("containerd",pid=2002,fd=14)) ino:42959 sk:22 <->                      
+tcp   LISTEN   0        128                0.0.0.0:111            0.0.0.0:*      users:(("rpcbind",pid=1119,fd=8)) ino:34846 sk:23 <->                          
+tcp   LISTEN   0        511                0.0.0.0:80             0.0.0.0:*      users:(("/usr/sbin/apach",pid=24795,fd=3),("/usr/sbin/apach",pid=2157,fd=3),("/usr/sbin/apach",pid=2156,fd=3),("/usr/sbin/apach",pid=2155,fd=3),("/usr/sbin/apach",pid=2154,fd=3),("/usr/sbin/apach",pid=2153,fd=3),("/usr/sbin/apach",pid=2079,fd=3)) ino:40480 sk:24 <->
+tcp   LISTEN   0        4096               0.0.0.0:9104           0.0.0.0:*      users:(("prometheus-mysq",pid=1587,fd=3)) uid:128 ino:24481 sk:25 <->          
+tcp   LISTEN   0        4096               0.0.0.0:8081           0.0.0.0:*      users:(("dockerd",pid=2840,fd=205)) ino:131957 sk:26 <->                       
+tcp   LISTEN   0        4096               0.0.0.0:8082           0.0.0.0:*      users:(("dockerd",pid=2840,fd=223)) ino:140597 sk:27 <->                       
+tcp   LISTEN   0        4096               0.0.0.0:2003           0.0.0.0:*      users:(("dockerd",pid=2840,fd=85)) ino:75383 sk:28 <->                         
+tcp   LISTEN   0        128              127.0.0.1:5939           0.0.0.0:*      users:(("teamviewerd",pid=4963,fd=12)) ino:59559 sk:29 <->                     
+tcp   LISTEN   0        4096               0.0.0.0:2004           0.0.0.0:*      users:(("dockerd",pid=2840,fd=96)) ino:71664 sk:2a <->                         
+tcp   LISTEN   0        500                0.0.0.0:8084           0.0.0.0:*      users:(("Main",pid=1799,fd=5)) uid:33 ino:44981 sk:2b <->                      
+tcp   LISTEN   0        4096               0.0.0.0:8085           0.0.0.0:*      users:(("dockerd",pid=2840,fd=100)) ino:77932 sk:2c <->                        
+tcp   LISTEN   0        32           192.168.122.1:53             0.0.0.0:*      users:(("dnsmasq",pid=2783,fd=6)) ino:43667 sk:2d <->                          
+tcp   LISTEN   0        128          127.0.0.53%lo:53             0.0.0.0:*      users:(("systemd-resolve",pid=1117,fd=13)) uid:101 ino:29401 sk:2e <->         
+tcp   LISTEN   0        4096               0.0.0.0:8086           0.0.0.0:*      users:(("dockerd",pid=2840,fd=98)) ino:75513 sk:2f <->                         
+tcp   LISTEN   0        128                0.0.0.0:22             0.0.0.0:*      users:(("sshd",pid=1998,fd=3)) ino:58511 sk:30 <->                             
+tcp   LISTEN   0        4096               0.0.0.0:8087           0.0.0.0:*      users:(("dockerd",pid=2840,fd=157)) ino:98633 sk:31 <->                        
+tcp   LISTEN   0        5                127.0.0.1:631            0.0.0.0:*      users:(("cupsd",pid=1410,fd=7)) ino:40509 sk:32 <->                            
+tcp   LISTEN   0        4096               0.0.0.0:9111           0.0.0.0:*      users:(("syno_exporter-0",pid=1941,fd=3)) uid:128 ino:25196 sk:33 <->          
+tcp   LISTEN   0        4096               0.0.0.0:3000           0.0.0.0:*      users:(("dockerd",pid=2840,fd=42)) ino:89081 sk:34 <->                         
+tcp   LISTEN   0        4096               0.0.0.0:5432           0.0.0.0:*      users:(("dockerd",pid=2840,fd=117)) ino:76497 sk:35 <->                        
+tcp   LISTEN   0        4096               0.0.0.0:3033           0.0.0.0:*      users:(("dockerd",pid=2840,fd=139)) ino:89680 sk:36 <->                        
+tcp   LISTEN   0        4096               0.0.0.0:8089           0.0.0.0:*      users:(("dockerd",pid=2840,fd=185)) ino:84656 sk:37 <->                        
+tcp   LISTEN   0        100              127.0.0.1:25             0.0.0.0:*      users:(("master",pid=5745,fd=13)) ino:57959 sk:38 <->                          
+tcp   LISTEN   0        4096               0.0.0.0:3003           0.0.0.0:*      users:(("dockerd",pid=2840,fd=23)) ino:90254 sk:39 <->                         
+tcp   LISTEN   0        4096               0.0.0.0:8091           0.0.0.0:*      users:(("dockerd",pid=2840,fd=144)) ino:84694 sk:3a <->                        
+tcp   LISTEN   0        511                0.0.0.0:443            0.0.0.0:*      users:(("/usr/sbin/apach",pid=24795,fd=4),("/usr/sbin/apach",pid=2157,fd=4),("/usr/sbin/apach",pid=2156,fd=4),("/usr/sbin/apach",pid=2155,fd=4),("/usr/sbin/apach",pid=2154,fd=4),("/usr/sbin/apach",pid=2153,fd=4),("/usr/sbin/apach",pid=2079,fd=4)) ino:40485 sk:3b <->
+tcp   LISTEN   0        100                0.0.0.0:1883           0.0.0.0:*      users:(("mosquitto",pid=1798,fd=4)) ino:38377 sk:3c <->                        
+tcp   LISTEN   0        4096               0.0.0.0:9115           0.0.0.0:*      users:(("prometheus-blac",pid=1651,fd=3)) uid:128 ino:25119 sk:3d <->          
+tcp   LISTEN   0        4096               0.0.0.0:636            0.0.0.0:*      users:(("dockerd",pid=2840,fd=187)) ino:125799 sk:3e <->                       
+tcp   LISTEN   0        4096               0.0.0.0:8092           0.0.0.0:*      users:(("dockerd",pid=2840,fd=37)) ino:87972 sk:3f <->                         
+tcp   LISTEN   0        4096               0.0.0.0:9116           0.0.0.0:*      users:(("snmp_exporter",pid=1928,fd=3)) uid:128 ino:45204 sk:40 <->            
+tcp   LISTEN   0        1024             127.0.0.1:2812           0.0.0.0:*      users:(("monit",pid=1806,fd=6)) ino:37711 sk:41 <->                            
+tcp   LISTEN   0        4096               0.0.0.0:446            0.0.0.0:*      users:(("dockerd",pid=2840,fd=143)) ino:98615 sk:42 <->                        
+tcp   LISTEN   0        4096               0.0.0.0:8126           0.0.0.0:*      users:(("dockerd",pid=2840,fd=105)) ino:77945 sk:43 <->                        
+tcp   LISTEN   0        100              127.0.0.1:49152          0.0.0.0:*      users:(("TabNine-deep-lo",pid=9583,fd=22)) uid:1000 ino:486863 sk:6ae <->      
+tcp   LISTEN   0        4096             127.0.0.1:46624          0.0.0.0:*      users:(("kited",pid=27494,fd=3)) uid:1000 ino:110003 sk:44 <->                 
+tcp   LISTEN   0        4096               0.0.0.0:8000           0.0.0.0:*      users:(("dockerd",pid=2840,fd=50)) ino:73647 sk:45 <->                         
+tcp   LISTEN   0        128                0.0.0.0:5665           0.0.0.0:*      users:(("icinga2",pid=5337,fd=16)) uid:136 ino:57169 sk:46 <->                 
+tcp   LISTEN   0        4096         192.168.178.5:10050          0.0.0.0:*      users:(("zabbix_agent2",pid=6359,fd=10)) uid:131 ino:64927 sk:47 <->           
+tcp   LISTEN   0        4096               0.0.0.0:9090           0.0.0.0:*      users:(("prometheus",pid=1543,fd=7)) uid:128 ino:32704 sk:48 <->               
diff --git a/tests/fixtures/ubuntu-20.04/lsattr-R.json b/tests/fixtures/ubuntu-20.04/lsattr-R.json
new file mode 100644
index 00000000..3eee1f52
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr-R.json
@@ -0,0 +1 @@
+[{"file": "/tmp/folder/folder", "extents": true}, {"file": "/tmp/folder/folder/test_file", "compression_requested": true, "extents": true}]
\ No newline at end of file
diff --git a/tests/fixtures/ubuntu-20.04/lsattr-R.out b/tests/fixtures/ubuntu-20.04/lsattr-R.out
new file mode 100644
index 00000000..6f5de629
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr-R.out
@@ -0,0 +1,5 @@
+--------------e----- /tmp/folder/folder
+
+/tmp/folder/folder:
+--------c-----e----- /tmp/folder/folder/test_file
+
diff --git a/tests/fixtures/ubuntu-20.04/lsattr-error.json b/tests/fixtures/ubuntu-20.04/lsattr-error.json
new file mode 100644
index 00000000..0637a088
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr-error.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/tests/fixtures/ubuntu-20.04/lsattr-error.out b/tests/fixtures/ubuntu-20.04/lsattr-error.out
new file mode 100644
index 00000000..9bd2d139
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr-error.out
@@ -0,0 +1 @@
+lsattr: Operation not supported While reading flags on /etc/apache2/mods-enabled/autoindex.load
\ No newline at end of file
diff --git a/tests/fixtures/ubuntu-20.04/lsattr.json b/tests/fixtures/ubuntu-20.04/lsattr.json
new file mode 100644
index 00000000..71330be1
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr.json
@@ -0,0 +1 @@
+[{"file": "/tmp/folder/folder/test_file", "compression_requested": true, "extents": true}]
\ No newline at end of file
diff --git a/tests/fixtures/ubuntu-20.04/lsattr.out b/tests/fixtures/ubuntu-20.04/lsattr.out
new file mode 100644
index 00000000..337faf3b
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/lsattr.out
@@ -0,0 +1 @@
+--------c-----e----- /tmp/folder/folder/test_file
diff --git a/tests/fixtures/ubuntu-20.04/stat-missing-data.json b/tests/fixtures/ubuntu-20.04/stat-missing-data.json
new file mode 100644
index 00000000..84c62462
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/stat-missing-data.json
@@ -0,0 +1 @@
+[{"file": "/etc/passwd", "size": 3399, "blocks": 8, "io_blocks": 4096, "type": "regular file", "device": "810h/2064d", "inode": 6392, "links": 1, "access": "0644", "flags": "-rw-r--r--", "uid": 0, "user": "root", "gid": 0, "group": "root", "access_time": "2023-06-01 13:12:52.776423000 -0700", "modify_time": "2023-01-07 03:10:13.752410800 -0800", "change_time": "2023-01-07 03:10:13.752410800 -0800", "access_time_epoch": 1685650372, "access_time_epoch_utc": null, "modify_time_epoch": 1673089813, "modify_time_epoch_utc": null, "change_time_epoch": 1673089813, "change_time_epoch_utc": null}]
\ No newline at end of file
diff --git a/tests/fixtures/ubuntu-20.04/stat-missing-data.out b/tests/fixtures/ubuntu-20.04/stat-missing-data.out
new file mode 100644
index 00000000..50799118
--- /dev/null
+++ b/tests/fixtures/ubuntu-20.04/stat-missing-data.out
@@ -0,0 +1,7 @@
+  File: /etc/passwd
+  Size: 3399            Blocks: 8          IO Block: 4096   regular file
+Device: 810h/2064d      Inode: 6392        Links: 1
+Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
+Access: 2023-06-01 13:12:52.776423000 -0700
+Modify: 2023-01-07 03:10:13.752410800 -0800
+Change: 2023-01-07 03:10:13.752410800 -0800
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/netstat-an.json b/tests/fixtures/windows/windows-10/netstat-an.json
new file mode 100644
index 00000000..01aadef7
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-an.json
@@ -0,0 +1 @@
+[{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"135","foreign_port":"0","local_port_num":135},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"443","foreign_port":"0","local_port_num":443},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"445","foreign_port":"0","local_port_num":445},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"902","foreign_port":"0","local_port_num":902},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"912","foreign_port":"0","local_port_num":912},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"1134","foreign_port":"0","local_port_num":1134},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"2179","foreign_port":"0","local_port_num":2179},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"2869","foreign_port":"0","local_port_num":2869},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"4325","foreign_port":"0","local_port_num":4325},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"5040","foreign_port":"0","local_port_num":5040},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"7070","foreign_port":"0","local_port_num":7070},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"7680","foreign_port":"0","local_port_num":7680},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"13656","foreign_port":"0","local_port_num":13656},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49664","foreign_port":"0","local_port_num":49664},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49665","foreign_port":"0","local_port_num":49665},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49666","foreign_port":"0","local_port_num":49666},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49667","foreign_port":"0","local_port_num":49667},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49668","foreign_port":"0","local_port_num":49668},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"49681","foreign_port":"0","local_port_num":49681},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"57621","foreign_port":"0","local_port_num":57621},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1031","foreign_port":"1032","local_port_num":1031,"foreign_port_num":1032},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1032","foreign_port":"1031","local_port_num":1032,"foreign_port_num":1031},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"1310","foreign_port":"0","local_port_num":1310},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1316","foreign_port":"1317","local_port_num":1316,"foreign_port_num":1317},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1317","foreign_port":"1316","local_port_num":1317,"foreign_port_num":1316},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1318","foreign_port":"1319","local_port_num":1318,"foreign_port_num":1319},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1319","foreign_port":"1318","local_port_num":1319,"foreign_port_num":1318},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1320","foreign_port":"1321","local_port_num":1320,"foreign_port_num":1321},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1321","foreign_port":"1320","local_port_num":1321,"foreign_port_num":1320},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1322","foreign_port":"1323","local_port_num":1322,"foreign_port_num":1323},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"1323","foreign_port":"1322","local_port_num":1323,"foreign_port_num":1322},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"2132","foreign_port":"2133","local_port_num":2132,"foreign_port_num":2133},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"2133","foreign_port":"2132","local_port_num":2133,"foreign_port_num":2132},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"3199","foreign_port":"3200","local_port_num":3199,"foreign_port_num":3200},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"3200","foreign_port":"3199","local_port_num":3200,"foreign_port_num":3199},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"5481","foreign_port":"5482","local_port_num":5481,"foreign_port_num":5482},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"5482","foreign_port":"5481","local_port_num":5482,"foreign_port_num":5481},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"5939","foreign_port":"0","local_port_num":5939},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"8307","foreign_port":"0","local_port_num":8307},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"8884","foreign_port":"0","local_port_num":8884},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"29802","foreign_port":"0","local_port_num":29802},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"30776","foreign_port":"0","local_port_num":30776},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30785","foreign_port":"30786","local_port_num":30785,"foreign_port_num":30786},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30786","foreign_port":"30785","local_port_num":30786,"foreign_port_num":30785},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30787","foreign_port":"30788","local_port_num":30787,"foreign_port_num":30788},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30788","foreign_port":"30787","local_port_num":30788,"foreign_port_num":30787},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30797","foreign_port":"30798","local_port_num":30797,"foreign_port_num":30798},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30798","foreign_port":"30797","local_port_num":30798,"foreign_port_num":30797},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30799","foreign_port":"30800","local_port_num":30799,"foreign_port_num":30800},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30800","foreign_port":"30799","local_port_num":30800,"foreign_port_num":30799},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30825","foreign_port":"30826","local_port_num":30825,"foreign_port_num":30826},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30826","foreign_port":"30825","local_port_num":30826,"foreign_port_num":30825},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30842","foreign_port":"30843","local_port_num":30842,"foreign_port_num":30843},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"30843","foreign_port":"30842","local_port_num":30843,"foreign_port_num":30842},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"31337","foreign_port":"31338","local_port_num":31337,"foreign_port_num":31338},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"31338","foreign_port":"31337","local_port_num":31338,"foreign_port_num":31337},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"44440","foreign_port":"0","local_port_num":44440},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"49673","foreign_port":"49674","local_port_num":49673,"foreign_port_num":49674},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","local_port":"49674","foreign_port":"49673","local_port_num":49674,"foreign_port_num":49673},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"65001","foreign_port":"0","local_port_num":65001},{"proto":"TCP","local_address":"172.17.96.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"172.26.240.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"172.27.128.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.24.1","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"0.0.0.0","state":"LISTENING","local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"135","foreign_port":"0","local_port_num":135},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"443","foreign_port":"0","local_port_num":443},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"445","foreign_port":"0","local_port_num":445},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"2179","foreign_port":"0","local_port_num":2179},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"2869","foreign_port":"0","local_port_num":2869},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"7680","foreign_port":"0","local_port_num":7680},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"13656","foreign_port":"0","local_port_num":13656},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49664","foreign_port":"0","local_port_num":49664},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49665","foreign_port":"0","local_port_num":49665},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49666","foreign_port":"0","local_port_num":49666},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49667","foreign_port":"0","local_port_num":49667},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49668","foreign_port":"0","local_port_num":49668},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","local_port":"49681","foreign_port":"0","local_port_num":49681},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","local_port":"1025","foreign_port":"0","local_port_num":1025},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","local_port":"8307","foreign_port":"0","local_port_num":8307},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"53","foreign_port":"*","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"53","foreign_port":"*","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"67","foreign_port":"*","local_port_num":67},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"500","foreign_port":"*","local_port_num":500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"4500","foreign_port":"*","local_port_num":4500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5050","foreign_port":"*","local_port_num":5050},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"5355","foreign_port":"*","local_port_num":5355},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"49376","foreign_port":"*","local_port_num":49376},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"50001","foreign_port":"*","local_port_num":50001},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"50531","foreign_port":"*","local_port_num":50531},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"52304","foreign_port":"*","local_port_num":52304},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"52915","foreign_port":"*","local_port_num":52915},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"53086","foreign_port":"*","local_port_num":53086},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"55581","foreign_port":"*","local_port_num":55581},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57180","foreign_port":"*","local_port_num":57180},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57621","foreign_port":"*","local_port_num":57621},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57752","foreign_port":"*","local_port_num":57752},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57753","foreign_port":"*","local_port_num":57753},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57754","foreign_port":"*","local_port_num":57754},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57755","foreign_port":"*","local_port_num":57755},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57756","foreign_port":"*","local_port_num":57756},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57757","foreign_port":"*","local_port_num":57757},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57758","foreign_port":"*","local_port_num":57758},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"57759","foreign_port":"*","local_port_num":57759},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"60874","foreign_port":"*","local_port_num":60874},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"62243","foreign_port":"*","local_port_num":62243},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"62245","foreign_port":"*","local_port_num":62245},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"62777","foreign_port":"*","local_port_num":62777},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"62808","foreign_port":"*","local_port_num":62808},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","local_port":"64544","foreign_port":"*","local_port_num":64544},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","local_port":"10250","foreign_port":"*","local_port_num":10250},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","local_port":"49826","foreign_port":"*","local_port_num":49826},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","local_port":"52299","foreign_port":"*","local_port_num":52299},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","local_port":"61810","foreign_port":"*","local_port_num":61810},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","local_port":"52300","foreign_port":"*","local_port_num":52300},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"67","foreign_port":"*","local_port_num":67},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"68","foreign_port":"*","local_port_num":68},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","local_port":"52292","foreign_port":"*","local_port_num":52292},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","local_port":"52293","foreign_port":"*","local_port_num":52293},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","local_port":"52298","foreign_port":"*","local_port_num":52298},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","local_port":"52294","foreign_port":"*","local_port_num":52294},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","local_port":"52295","foreign_port":"*","local_port_num":52295},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","local_port":"52297","foreign_port":"*","local_port_num":52297},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","local_port":"52296","foreign_port":"*","local_port_num":52296},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"500","foreign_port":"*","local_port_num":500},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"4500","foreign_port":"*","local_port_num":4500},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"5355","foreign_port":"*","local_port_num":5355},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"49377","foreign_port":"*","local_port_num":49377},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"52305","foreign_port":"*","local_port_num":52305},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"62244","foreign_port":"*","local_port_num":62244},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"62246","foreign_port":"*","local_port_num":62246},{"proto":"UDP","local_address":"[::]","foreign_address":"*","local_port":"62809","foreign_port":"*","local_port_num":62809},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","local_port":"52290","foreign_port":"*","local_port_num":52290},{"proto":"UDP","local_address":"[fe80::asda:4124:2096:62b2%9]","foreign_address":"*","local_port":"1900","foreign_port":"*","local_port_num":1900}]
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/netstat-an.out b/tests/fixtures/windows/windows-10/netstat-an.out
new file mode 100644
index 00000000..fa908215
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-an.out
@@ -0,0 +1,264 @@
+
+Active Connections
+
+  Proto  Local Address          Foreign Address        State
+  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:902            0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:912            0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:1134           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:2179           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:2869           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:4325           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:7070           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:7680           0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:13656          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:49681          0.0.0.0:0              LISTENING
+  TCP    0.0.0.0:57621          0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:1031         127.0.0.1:1032         ESTABLISHED
+  TCP    127.0.0.1:1032         127.0.0.1:1031         ESTABLISHED
+  TCP    127.0.0.1:1310         0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:1316         127.0.0.1:1317         ESTABLISHED
+  TCP    127.0.0.1:1317         127.0.0.1:1316         ESTABLISHED
+  TCP    127.0.0.1:1318         127.0.0.1:1319         ESTABLISHED
+  TCP    127.0.0.1:1319         127.0.0.1:1318         ESTABLISHED
+  TCP    127.0.0.1:1320         127.0.0.1:1321         ESTABLISHED
+  TCP    127.0.0.1:1321         127.0.0.1:1320         ESTABLISHED
+  TCP    127.0.0.1:1322         127.0.0.1:1323         ESTABLISHED
+  TCP    127.0.0.1:1323         127.0.0.1:1322         ESTABLISHED
+  TCP    127.0.0.1:2132         127.0.0.1:2133         ESTABLISHED
+  TCP    127.0.0.1:2133         127.0.0.1:2132         ESTABLISHED
+  TCP    127.0.0.1:3199         127.0.0.1:3200         ESTABLISHED
+  TCP    127.0.0.1:3200         127.0.0.1:3199         ESTABLISHED
+  TCP    127.0.0.1:5481         127.0.0.1:5482         ESTABLISHED
+  TCP    127.0.0.1:5482         127.0.0.1:5481         ESTABLISHED
+  TCP    127.0.0.1:5939         0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:8884         0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:29802        0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:30776        0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:30785        127.0.0.1:30786        ESTABLISHED
+  TCP    127.0.0.1:30786        127.0.0.1:30785        ESTABLISHED
+  TCP    127.0.0.1:30787        127.0.0.1:30788        ESTABLISHED
+  TCP    127.0.0.1:30788        127.0.0.1:30787        ESTABLISHED
+  TCP    127.0.0.1:30797        127.0.0.1:30798        ESTABLISHED
+  TCP    127.0.0.1:30798        127.0.0.1:30797        ESTABLISHED
+  TCP    127.0.0.1:30799        127.0.0.1:30800        ESTABLISHED
+  TCP    127.0.0.1:30800        127.0.0.1:30799        ESTABLISHED
+  TCP    127.0.0.1:30825        127.0.0.1:30826        ESTABLISHED
+  TCP    127.0.0.1:30826        127.0.0.1:30825        ESTABLISHED
+  TCP    127.0.0.1:30842        127.0.0.1:30843        ESTABLISHED
+  TCP    127.0.0.1:30843        127.0.0.1:30842        ESTABLISHED
+  TCP    127.0.0.1:31337        127.0.0.1:31338        ESTABLISHED
+  TCP    127.0.0.1:31338        127.0.0.1:31337        ESTABLISHED
+  TCP    127.0.0.1:44440        0.0.0.0:0              LISTENING
+  TCP    127.0.0.1:49673        127.0.0.1:49674        ESTABLISHED
+  TCP    127.0.0.1:49674        127.0.0.1:49673        ESTABLISHED
+  TCP    127.0.0.1:65001        0.0.0.0:0              LISTENING
+  TCP    172.17.96.1:139        0.0.0.0:0              LISTENING
+  TCP    172.26.240.1:139       0.0.0.0:0              LISTENING
+  TCP    172.27.128.1:139       0.0.0.0:0              LISTENING
+  TCP    192.168.24.1:139       0.0.0.0:0              LISTENING
+  TCP    192.168.31.221:139     0.0.0.0:0              LISTENING
+  TCP    [::]:135               [::]:0                 LISTENING
+  TCP    [::]:443               [::]:0                 LISTENING
+  TCP    [::]:445               [::]:0                 LISTENING
+  TCP    [::]:2179              [::]:0                 LISTENING
+  TCP    [::]:2869              [::]:0                 LISTENING
+  TCP    [::]:7680              [::]:0                 LISTENING
+  TCP    [::]:13656             [::]:0                 LISTENING
+  TCP    [::]:49664             [::]:0                 LISTENING
+  TCP    [::]:49665             [::]:0                 LISTENING
+  TCP    [::]:49666             [::]:0                 LISTENING
+  TCP    [::]:49667             [::]:0                 LISTENING
+  TCP    [::]:49668             [::]:0                 LISTENING
+  TCP    [::]:49681             [::]:0                 LISTENING
+  TCP    [::1]:1025             [::]:0                 LISTENING
+  TCP    [::1]:8307             [::]:0                 LISTENING
+  UDP    0.0.0.0:53             *:*                    
+  UDP    0.0.0.0:53             *:*                    
+  UDP    0.0.0.0:67             *:*                    
+  UDP    0.0.0.0:500            *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:1900           *:*                    
+  UDP    0.0.0.0:3702           *:*                    
+  UDP    0.0.0.0:3702           *:*                    
+  UDP    0.0.0.0:4500           *:*                    
+  UDP    0.0.0.0:5050           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5353           *:*                    
+  UDP    0.0.0.0:5355           *:*                    
+  UDP    0.0.0.0:49376          *:*                    
+  UDP    0.0.0.0:50001          *:*                    
+  UDP    0.0.0.0:50531          *:*                    
+  UDP    0.0.0.0:52304          *:*                    
+  UDP    0.0.0.0:52915          *:*                    
+  UDP    0.0.0.0:53086          *:*                    
+  UDP    0.0.0.0:55581          *:*                    
+  UDP    0.0.0.0:57180          *:*                    
+  UDP    0.0.0.0:57621          *:*                    
+  UDP    0.0.0.0:57752          *:*                    
+  UDP    0.0.0.0:57753          *:*                    
+  UDP    0.0.0.0:57754          *:*                    
+  UDP    0.0.0.0:57755          *:*                    
+  UDP    0.0.0.0:57756          *:*                    
+  UDP    0.0.0.0:57757          *:*                    
+  UDP    0.0.0.0:57758          *:*                    
+  UDP    0.0.0.0:57759          *:*                    
+  UDP    0.0.0.0:60874          *:*                    
+  UDP    0.0.0.0:62243          *:*                    
+  UDP    0.0.0.0:62245          *:*                    
+  UDP    0.0.0.0:62777          *:*                    
+  UDP    0.0.0.0:62808          *:*                    
+  UDP    0.0.0.0:64544          *:*                    
+  UDP    127.0.0.1:1900         *:*                    
+  UDP    127.0.0.1:10250        *:*                    
+  UDP    127.0.0.1:49826        *:*                    
+  UDP    127.0.0.1:52299        *:*                    
+  UDP    127.0.0.1:61810        *:*                    
+  UDP    172.17.96.1:137        *:*                    
+  UDP    172.17.96.1:138        *:*                    
+  UDP    172.17.96.1:1900       *:*                    
+  UDP    172.17.96.1:2177       *:*                    
+  UDP    172.17.96.1:5353       *:*                    
+  UDP    172.17.96.1:52300      *:*                    
+  UDP    172.26.240.1:67        *:*                    
+  UDP    172.26.240.1:68        *:*                    
+  UDP    172.26.240.1:137       *:*                    
+  UDP    172.26.240.1:138       *:*                    
+  UDP    172.26.240.1:1900      *:*                    
+  UDP    172.26.240.1:2177      *:*                    
+  UDP    172.26.240.1:5353      *:*                    
+  UDP    172.26.240.1:52292     *:*                    
+  UDP    172.27.128.1:137       *:*                    
+  UDP    172.27.128.1:138       *:*                    
+  UDP    172.27.128.1:1900      *:*                    
+  UDP    172.27.128.1:2177      *:*                    
+  UDP    172.27.128.1:5353      *:*                    
+  UDP    172.27.128.1:52293     *:*                    
+  UDP    192.168.24.1:137       *:*                    
+  UDP    192.168.24.1:138       *:*                    
+  UDP    192.168.24.1:1900      *:*                    
+  UDP    192.168.24.1:2177      *:*                    
+  UDP    192.168.24.1:5353      *:*                    
+  UDP    192.168.24.1:5353      *:*                    
+  UDP    192.168.24.1:52298     *:*                    
+  UDP    192.168.31.221:137     *:*                    
+  UDP    192.168.31.221:138     *:*                    
+  UDP    192.168.31.221:1900    *:*                    
+  UDP    192.168.31.221:2177    *:*                    
+  UDP    192.168.31.221:5353    *:*                    
+  UDP    192.168.31.221:52294   *:*                    
+  UDP    192.168.216.1:137      *:*                    
+  UDP    192.168.216.1:138      *:*                    
+  UDP    192.168.216.1:1900     *:*                    
+  UDP    192.168.216.1:2177     *:*                    
+  UDP    192.168.216.1:5353     *:*                    
+  UDP    192.168.216.1:5353     *:*                    
+  UDP    192.168.216.1:52295    *:*                    
+  UDP    192.168.234.1:137      *:*                    
+  UDP    192.168.234.1:138      *:*                    
+  UDP    192.168.234.1:1900     *:*                    
+  UDP    192.168.234.1:2177     *:*                    
+  UDP    192.168.234.1:5353     *:*                    
+  UDP    192.168.234.1:5353     *:*                    
+  UDP    192.168.234.1:52297    *:*                    
+  UDP    192.168.255.1:137      *:*                    
+  UDP    192.168.255.1:138      *:*                    
+  UDP    192.168.255.1:1900     *:*                    
+  UDP    192.168.255.1:2177     *:*                    
+  UDP    192.168.255.1:5353     *:*                    
+  UDP    192.168.255.1:5353     *:*                    
+  UDP    192.168.255.1:52296    *:*                    
+  UDP    [::]:500               *:*                    
+  UDP    [::]:3702              *:*                    
+  UDP    [::]:3702              *:*                    
+  UDP    [::]:4500              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5353              *:*                    
+  UDP    [::]:5355              *:*                    
+  UDP    [::]:49377             *:*                    
+  UDP    [::]:52305             *:*                    
+  UDP    [::]:62244             *:*                    
+  UDP    [::]:62246             *:*                    
+  UDP    [::]:62809             *:*                    
+  UDP    [::1]:1900             *:*                    
+  UDP    [::1]:5353             *:*                    
+  UDP    [::1]:5353             *:*                    
+  UDP    [::1]:52290            *:*                    
+  UDP    [fe80::asda:4124:2096:62b2%9]:1900  *:*                    
diff --git a/tests/fixtures/windows/windows-10/netstat-aon.json b/tests/fixtures/windows/windows-10/netstat-aon.json
new file mode 100644
index 00000000..32f9b3a1
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-aon.json
@@ -0,0 +1 @@
+[{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":1712,"local_port":"135","foreign_port":"0","local_port_num":135},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":9396,"local_port":"443","foreign_port":"0","local_port_num":443},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"445","foreign_port":"0","local_port_num":445},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":7388,"local_port":"902","foreign_port":"0","local_port_num":902},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":2160,"local_port":"49667","foreign_port":"0","local_port_num":49667},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":3952,"local_port":"49668","foreign_port":"0","local_port_num":49668},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":6316,"local_port":"49681","foreign_port":"0","local_port_num":49681},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":27696,"local_port":"57621","foreign_port":"0","local_port_num":57621},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":10644,"local_port":"1031","foreign_port":"1032","local_port_num":1031,"foreign_port_num":1032},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":10644,"local_port":"1032","foreign_port":"1031","local_port_num":1032,"foreign_port_num":1031},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":9328,"local_port":"1310","foreign_port":"0","local_port_num":1310},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1316","foreign_port":"1317","local_port_num":1316,"foreign_port_num":1317},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1317","foreign_port":"1316","local_port_num":1317,"foreign_port_num":1316},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1318","foreign_port":"1319","local_port_num":1318,"foreign_port_num":1319},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1319","foreign_port":"1318","local_port_num":1319,"foreign_port_num":1318},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1320","foreign_port":"1321","local_port_num":1320,"foreign_port_num":1321},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1321","foreign_port":"1320","local_port_num":1321,"foreign_port_num":1320},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1322","foreign_port":"1323","local_port_num":1322,"foreign_port_num":1323},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1323","foreign_port":"1322","local_port_num":1323,"foreign_port_num":1322},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"2132","foreign_port":"2133","local_port_num":2132,"foreign_port_num":2133},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"2133","foreign_port":"2132","local_port_num":2133,"foreign_port_num":2132},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"3949","foreign_port":"3950","local_port_num":3949,"foreign_port_num":3950},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"3950","foreign_port":"3949","local_port_num":3950,"foreign_port_num":3949},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20136,"local_port":"5481","foreign_port":"5482","local_port_num":5481,"foreign_port_num":5482},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20136,"local_port":"5482","foreign_port":"5481","local_port_num":5482,"foreign_port_num":5481},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":7340,"local_port":"5939","foreign_port":"0","local_port_num":5939},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":9396,"local_port":"8307","foreign_port":"0","local_port_num":8307},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"8884","foreign_port":"0","local_port_num":8884},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":6372,"local_port":"29802","foreign_port":"0","local_port_num":29802},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":30224,"local_port":"30776","foreign_port":"0","local_port_num":30776},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30785","foreign_port":"30786","local_port_num":30785,"foreign_port_num":30786},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30786","foreign_port":"30785","local_port_num":30786,"foreign_port_num":30785},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30787","foreign_port":"30788","local_port_num":30787,"foreign_port_num":30788},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30788","foreign_port":"30787","local_port_num":30788,"foreign_port_num":30787},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30797","foreign_port":"30798","local_port_num":30797,"foreign_port_num":30798},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30798","foreign_port":"30797","local_port_num":30798,"foreign_port_num":30797},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30799","foreign_port":"30800","local_port_num":30799,"foreign_port_num":30800},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30800","foreign_port":"30799","local_port_num":30800,"foreign_port_num":30799},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":22140,"local_port":"30825","foreign_port":"30826","local_port_num":30825,"foreign_port_num":30826},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":22140,"local_port":"30826","foreign_port":"30825","local_port_num":30826,"foreign_port_num":30825},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":23200,"local_port":"30842","foreign_port":"30843","local_port_num":30842,"foreign_port_num":30843},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":23200,"local_port":"30843","foreign_port":"30842","local_port_num":30843,"foreign_port_num":30842},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":18580,"local_port":"31337","foreign_port":"31338","local_port_num":31337,"foreign_port_num":31338},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":18580,"local_port":"31338","foreign_port":"31337","local_port_num":31338,"foreign_port_num":31337},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":6804,"local_port":"44440","foreign_port":"0","local_port_num":44440},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":4260,"local_port":"49673","foreign_port":"49674","local_port_num":49673,"foreign_port_num":49674},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":4260,"local_port":"49674","foreign_port":"49673","local_port_num":49674,"foreign_port_num":49673},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":7140,"local_port":"65001","foreign_port":"0","local_port_num":65001},{"proto":"TCP","local_address":"172.17.96.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"172.26.240.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"172.27.128.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.24.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.216.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.234.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"192.168.255.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","local_port_num":139},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1712,"local_port":"135","foreign_port":"0","local_port_num":135},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":9396,"local_port":"443","foreign_port":"0","local_port_num":443},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4,"local_port":"445","foreign_port":"0","local_port_num":445},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4032,"local_port":"2179","foreign_port":"0","local_port_num":2179},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4,"local_port":"2869","foreign_port":"0","local_port_num":2869},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":10404,"local_port":"7680","foreign_port":"0","local_port_num":7680},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1400,"local_port":"13656","foreign_port":"0","local_port_num":13656},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1428,"local_port":"49664","foreign_port":"0","local_port_num":49664},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1036,"local_port":"49665","foreign_port":"0","local_port_num":49665},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":2152,"local_port":"49666","foreign_port":"0","local_port_num":49666},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":2160,"local_port":"49667","foreign_port":"0","local_port_num":49667},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":3952,"local_port":"49668","foreign_port":"0","local_port_num":49668},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":6316,"local_port":"49681","foreign_port":"0","local_port_num":49681},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","pid":6088,"local_port":"1025","foreign_port":"0","local_port_num":1025},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","pid":9396,"local_port":"8307","foreign_port":"0","local_port_num":8307},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"53","foreign_port":"*","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"53","foreign_port":"*","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":34064,"local_port":"67","foreign_port":"*","local_port_num":67},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6856,"local_port":"500","foreign_port":"*","local_port_num":500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6856,"local_port":"4500","foreign_port":"*","local_port_num":4500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":13528,"local_port":"5050","foreign_port":"*","local_port_num":5050},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":3404,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":3404,"local_port":"5355","foreign_port":"*","local_port_num":5355},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":7140,"local_port":"49376","foreign_port":"*","local_port_num":49376},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6608,"local_port":"50001","foreign_port":"*","local_port_num":50001},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":21952,"local_port":"50531","foreign_port":"*","local_port_num":50531},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":7340,"local_port":"52304","foreign_port":"*","local_port_num":52304},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":19692,"local_port":"52506","foreign_port":"*","local_port_num":52506},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":23200,"local_port":"55581","foreign_port":"*","local_port_num":55581},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":21952,"local_port":"56621","foreign_port":"*","local_port_num":56621},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":18580,"local_port":"57180","foreign_port":"*","local_port_num":57180},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57621","foreign_port":"*","local_port_num":57621},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57752","foreign_port":"*","local_port_num":57752},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57753","foreign_port":"*","local_port_num":57753},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57754","foreign_port":"*","local_port_num":57754},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57755","foreign_port":"*","local_port_num":57755},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57756","foreign_port":"*","local_port_num":57756},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57757","foreign_port":"*","local_port_num":57757},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57758","foreign_port":"*","local_port_num":57758},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57759","foreign_port":"*","local_port_num":57759},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"62243","foreign_port":"*","local_port_num":62243},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"62245","foreign_port":"*","local_port_num":62245},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"62808","foreign_port":"*","local_port_num":62808},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"64544","foreign_port":"*","local_port_num":64544},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":6372,"local_port":"10250","foreign_port":"*","local_port_num":10250},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":5876,"local_port":"49826","foreign_port":"*","local_port_num":49826},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":8844,"local_port":"52299","foreign_port":"*","local_port_num":52299},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":27560,"local_port":"61810","foreign_port":"*","local_port_num":61810},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":8844,"local_port":"52300","foreign_port":"*","local_port_num":52300},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4808,"local_port":"67","foreign_port":"*","local_port_num":67},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4808,"local_port":"68","foreign_port":"*","local_port_num":68},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":8844,"local_port":"52292","foreign_port":"*","local_port_num":52292},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":8844,"local_port":"52293","foreign_port":"*","local_port_num":52293},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":8844,"local_port":"52295","foreign_port":"*","local_port_num":52295},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":8844,"local_port":"52297","foreign_port":"*","local_port_num":52297},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","local_port_num":137},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","local_port_num":138},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","local_port_num":2177},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":8844,"local_port":"52296","foreign_port":"*","local_port_num":52296},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":3404,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":3404,"local_port":"5355","foreign_port":"*","local_port_num":5355},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":7140,"local_port":"49377","foreign_port":"*","local_port_num":49377},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":7340,"local_port":"52305","foreign_port":"*","local_port_num":52305},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":4808,"local_port":"62244","foreign_port":"*","local_port_num":62244},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":4808,"local_port":"62246","foreign_port":"*","local_port_num":62246},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6952,"local_port":"62809","foreign_port":"*","local_port_num":62809},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":8844,"local_port":"52290","foreign_port":"*","local_port_num":52290},{"proto":"UDP","local_address":"[fe80::244e:2f1e:2096:62b2%9]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::f5d1:8bf7:c410:e325%64]","foreign_address":"*","state":"","pid":8844,"local_port":"52284","foreign_port":"*","local_port_num":52284}]
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/netstat-aon.out b/tests/fixtures/windows/windows-10/netstat-aon.out
new file mode 100644
index 00000000..d572b84c
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-aon.out
@@ -0,0 +1,212 @@
+
+Active Connections
+
+  Proto  Local Address          Foreign Address        State           PID
+  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1712
+  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       9396
+  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
+  TCP    0.0.0.0:902            0.0.0.0:0              LISTENING       7388
+  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING       2160
+  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING       3952
+  TCP    0.0.0.0:49681          0.0.0.0:0              LISTENING       6316
+  TCP    0.0.0.0:57621          0.0.0.0:0              LISTENING       27696
+  TCP    127.0.0.1:1031         127.0.0.1:1032         ESTABLISHED     10644
+  TCP    127.0.0.1:1032         127.0.0.1:1031         ESTABLISHED     10644
+  TCP    127.0.0.1:1310         0.0.0.0:0              LISTENING       9328
+  TCP    127.0.0.1:1316         127.0.0.1:1317         ESTABLISHED     1112
+  TCP    127.0.0.1:1317         127.0.0.1:1316         ESTABLISHED     1112
+  TCP    127.0.0.1:1318         127.0.0.1:1319         ESTABLISHED     1112
+  TCP    127.0.0.1:1319         127.0.0.1:1318         ESTABLISHED     1112
+  TCP    127.0.0.1:1320         127.0.0.1:1321         ESTABLISHED     28104
+  TCP    127.0.0.1:1321         127.0.0.1:1320         ESTABLISHED     28104
+  TCP    127.0.0.1:1322         127.0.0.1:1323         ESTABLISHED     28104
+  TCP    127.0.0.1:1323         127.0.0.1:1322         ESTABLISHED     28104
+  TCP    127.0.0.1:2132         127.0.0.1:2133         ESTABLISHED     21952
+  TCP    127.0.0.1:2133         127.0.0.1:2132         ESTABLISHED     21952
+  TCP    127.0.0.1:3949         127.0.0.1:3950         ESTABLISHED     21952
+  TCP    127.0.0.1:3950         127.0.0.1:3949         ESTABLISHED     21952
+  TCP    127.0.0.1:5481         127.0.0.1:5482         ESTABLISHED     20136
+  TCP    127.0.0.1:5482         127.0.0.1:5481         ESTABLISHED     20136
+  TCP    127.0.0.1:5939         0.0.0.0:0              LISTENING       7340
+  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       9396
+  TCP    127.0.0.1:8884         0.0.0.0:0              LISTENING       4
+  TCP    127.0.0.1:29802        0.0.0.0:0              LISTENING       6372
+  TCP    127.0.0.1:30776        0.0.0.0:0              LISTENING       30224
+  TCP    127.0.0.1:30785        127.0.0.1:30786        ESTABLISHED     25596
+  TCP    127.0.0.1:30786        127.0.0.1:30785        ESTABLISHED     25596
+  TCP    127.0.0.1:30787        127.0.0.1:30788        ESTABLISHED     25596
+  TCP    127.0.0.1:30788        127.0.0.1:30787        ESTABLISHED     25596
+  TCP    127.0.0.1:30797        127.0.0.1:30798        ESTABLISHED     20364
+  TCP    127.0.0.1:30798        127.0.0.1:30797        ESTABLISHED     20364
+  TCP    127.0.0.1:30799        127.0.0.1:30800        ESTABLISHED     20364
+  TCP    127.0.0.1:30800        127.0.0.1:30799        ESTABLISHED     20364
+  TCP    127.0.0.1:30825        127.0.0.1:30826        ESTABLISHED     22140
+  TCP    127.0.0.1:30826        127.0.0.1:30825        ESTABLISHED     22140
+  TCP    127.0.0.1:30842        127.0.0.1:30843        ESTABLISHED     23200
+  TCP    127.0.0.1:30843        127.0.0.1:30842        ESTABLISHED     23200
+  TCP    127.0.0.1:31337        127.0.0.1:31338        ESTABLISHED     18580
+  TCP    127.0.0.1:31338        127.0.0.1:31337        ESTABLISHED     18580
+  TCP    127.0.0.1:44440        0.0.0.0:0              LISTENING       6804
+  TCP    127.0.0.1:49673        127.0.0.1:49674        ESTABLISHED     4260
+  TCP    127.0.0.1:49674        127.0.0.1:49673        ESTABLISHED     4260
+  TCP    127.0.0.1:65001        0.0.0.0:0              LISTENING       7140
+  TCP    172.17.96.1:139        0.0.0.0:0              LISTENING       4
+  TCP    172.26.240.1:139       0.0.0.0:0              LISTENING       4
+  TCP    172.27.128.1:139       0.0.0.0:0              LISTENING       4
+  TCP    192.168.24.1:139       0.0.0.0:0              LISTENING       4
+  TCP    192.168.31.221:139     0.0.0.0:0              LISTENING       4
+  TCP    192.168.216.1:139      0.0.0.0:0              LISTENING       4
+  TCP    192.168.234.1:139      0.0.0.0:0              LISTENING       4
+  TCP    192.168.255.1:139      0.0.0.0:0              LISTENING       4
+  TCP    [::]:135               [::]:0                 LISTENING       1712
+  TCP    [::]:443               [::]:0                 LISTENING       9396
+  TCP    [::]:445               [::]:0                 LISTENING       4
+  TCP    [::]:2179              [::]:0                 LISTENING       4032
+  TCP    [::]:2869              [::]:0                 LISTENING       4
+  TCP    [::]:7680              [::]:0                 LISTENING       10404
+  TCP    [::]:13656             [::]:0                 LISTENING       1400
+  TCP    [::]:49664             [::]:0                 LISTENING       1428
+  TCP    [::]:49665             [::]:0                 LISTENING       1036
+  TCP    [::]:49666             [::]:0                 LISTENING       2152
+  TCP    [::]:49667             [::]:0                 LISTENING       2160
+  TCP    [::]:49668             [::]:0                 LISTENING       3952
+  TCP    [::]:49681             [::]:0                 LISTENING       6316
+  TCP    [::1]:1025             [::]:0                 LISTENING       6088
+  TCP    [::1]:8307             [::]:0                 LISTENING       9396
+  UDP    0.0.0.0:53             *:*                                    4808
+  UDP    0.0.0.0:53             *:*                                    4808
+  UDP    0.0.0.0:67             *:*                                    34064
+  UDP    0.0.0.0:500            *:*                                    6856
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:1900           *:*                                    27696
+  UDP    0.0.0.0:3702           *:*                                    6952
+  UDP    0.0.0.0:3702           *:*                                    6952
+  UDP    0.0.0.0:4500           *:*                                    6856
+  UDP    0.0.0.0:5050           *:*                                    13528
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    3404
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5353           *:*                                    14156
+  UDP    0.0.0.0:5353           *:*                                    27696
+  UDP    0.0.0.0:5355           *:*                                    3404
+  UDP    0.0.0.0:49376          *:*                                    7140
+  UDP    0.0.0.0:50001          *:*                                    6608
+  UDP    0.0.0.0:50531          *:*                                    21952
+  UDP    0.0.0.0:52304          *:*                                    7340
+  UDP    0.0.0.0:52506          *:*                                    19692
+  UDP    0.0.0.0:55581          *:*                                    23200
+  UDP    0.0.0.0:56621          *:*                                    21952
+  UDP    0.0.0.0:57180          *:*                                    18580
+  UDP    0.0.0.0:57621          *:*                                    27696
+  UDP    0.0.0.0:57752          *:*                                    27696
+  UDP    0.0.0.0:57753          *:*                                    27696
+  UDP    0.0.0.0:57754          *:*                                    27696
+  UDP    0.0.0.0:57755          *:*                                    27696
+  UDP    0.0.0.0:57756          *:*                                    27696
+  UDP    0.0.0.0:57757          *:*                                    27696
+  UDP    0.0.0.0:57758          *:*                                    27696
+  UDP    0.0.0.0:57759          *:*                                    27696
+  UDP    0.0.0.0:62243          *:*                                    4808
+  UDP    0.0.0.0:62245          *:*                                    4808
+  UDP    0.0.0.0:62808          *:*                                    6952
+  UDP    0.0.0.0:64544          *:*                                    4808
+  UDP    127.0.0.1:1900         *:*                                    8844
+  UDP    127.0.0.1:10250        *:*                                    6372
+  UDP    127.0.0.1:49826        *:*                                    5876
+  UDP    127.0.0.1:52299        *:*                                    8844
+  UDP    127.0.0.1:61810        *:*                                    27560
+  UDP    172.17.96.1:137        *:*                                    4
+  UDP    172.17.96.1:138        *:*                                    4
+  UDP    172.17.96.1:1900       *:*                                    8844
+  UDP    172.17.96.1:2177       *:*                                    28108
+  UDP    172.17.96.1:5353       *:*                                    7140
+  UDP    172.17.96.1:52300      *:*                                    8844
+  UDP    172.26.240.1:67        *:*                                    4808
+  UDP    172.26.240.1:68        *:*                                    4808
+  UDP    172.26.240.1:137       *:*                                    4
+  UDP    172.26.240.1:138       *:*                                    4
+  UDP    172.26.240.1:1900      *:*                                    8844
+  UDP    172.26.240.1:2177      *:*                                    28108
+  UDP    172.26.240.1:5353      *:*                                    7140
+  UDP    172.26.240.1:52292     *:*                                    8844
+  UDP    172.27.128.1:137       *:*                                    4
+  UDP    172.27.128.1:138       *:*                                    4
+  UDP    172.27.128.1:1900      *:*                                    8844
+  UDP    172.27.128.1:2177      *:*                                    28108
+  UDP    172.27.128.1:5353      *:*                                    7140
+  UDP    172.27.128.1:52293     *:*                                    8844
+  UDP    192.168.216.1:138      *:*                                    4
+  UDP    192.168.216.1:1900     *:*                                    8844
+  UDP    192.168.216.1:2177     *:*                                    28108
+  UDP    192.168.216.1:5353     *:*                                    7140
+  UDP    192.168.216.1:5353     *:*                                    7340
+  UDP    192.168.216.1:52295    *:*                                    8844
+  UDP    192.168.234.1:137      *:*                                    4
+  UDP    192.168.234.1:138      *:*                                    4
+  UDP    192.168.234.1:1900     *:*                                    8844
+  UDP    192.168.234.1:2177     *:*                                    28108
+  UDP    192.168.234.1:5353     *:*                                    7340
+  UDP    192.168.234.1:5353     *:*                                    7140
+  UDP    192.168.234.1:52297    *:*                                    8844
+  UDP    192.168.255.1:137      *:*                                    4
+  UDP    192.168.255.1:138      *:*                                    4
+  UDP    192.168.255.1:1900     *:*                                    8844
+  UDP    192.168.255.1:2177     *:*                                    28108
+  UDP    192.168.255.1:5353     *:*                                    7340
+  UDP    192.168.255.1:5353     *:*                                    7140
+  UDP    192.168.255.1:52296    *:*                                    8844
+  UDP    [::]:5353              *:*                                    3404
+  UDP    [::]:5355              *:*                                    3404
+  UDP    [::]:49377             *:*                                    7140
+  UDP    [::]:52305             *:*                                    7340
+  UDP    [::]:62244             *:*                                    4808
+  UDP    [::]:62246             *:*                                    4808
+  UDP    [::]:62809             *:*                                    6952
+  UDP    [::1]:1900             *:*                                    8844
+  UDP    [::1]:5353             *:*                                    7140
+  UDP    [::1]:5353             *:*                                    7340
+  UDP    [::1]:52290            *:*                                    8844
+  UDP    [fe80::244e:2f1e:2096:62b2%9]:1900  *:*                                    8844
+  UDP    [fe80::f5d1:8bf7:c410:e325%64]:52284  *:*                                    8844
diff --git a/tests/fixtures/windows/windows-10/netstat-aonb.json b/tests/fixtures/windows/windows-10/netstat-aonb.json
new file mode 100644
index 00000000..92a42f32
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-aonb.json
@@ -0,0 +1 @@
+[{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":1712,"local_port":"135","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":135},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":9396,"local_port":"443","foreign_port":"0","program_name":"[vmware-hostd.exe]","local_port_num":443},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"445","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":445},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":7388,"local_port":"902","foreign_port":"0","program_name":"[vmware-authd.exe]","local_port_num":902},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":7388,"local_port":"912","foreign_port":"0","program_name":"[vmware-authd.exe]","local_port_num":912},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":27696,"local_port":"1134","foreign_port":"0","program_name":"[Spotify.exe]","local_port_num":1134},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":4032,"local_port":"2179","foreign_port":"0","program_name":"[vmms.exe]","local_port_num":2179},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"2869","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":2869},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":5876,"local_port":"4325","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":4325},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":13528,"local_port":"5040","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":5040},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":6608,"local_port":"7070","foreign_port":"0","program_name":"[AnyDesk.exe]","local_port_num":7070},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":10404,"local_port":"7680","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":7680},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":1400,"local_port":"13656","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":13656},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":1428,"local_port":"49664","foreign_port":"0","program_name":"[System]","local_port_num":49664},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":1036,"local_port":"49665","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":49665},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":2152,"local_port":"49666","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49666},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":2160,"local_port":"49667","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49667},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":3952,"local_port":"49668","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49668},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":6316,"local_port":"49681","foreign_port":"0","program_name":"[spoolsv.exe]","local_port_num":49681},{"proto":"TCP","local_address":"0.0.0.0","foreign_address":"0.0.0.0","state":"LISTENING","pid":27696,"local_port":"57621","foreign_port":"0","program_name":"[Spotify.exe]","local_port_num":57621},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":10644,"local_port":"1031","foreign_port":"1032","program_name":"[ProductAgentService.exe]","local_port_num":1031,"foreign_port_num":1032},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":10644,"local_port":"1032","foreign_port":"1031","program_name":"[ProductAgentService.exe]","local_port_num":1032,"foreign_port_num":1031},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":9328,"local_port":"1310","foreign_port":"0","program_name":"[Code.exe]","local_port_num":1310},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1316","foreign_port":"1317","program_name":"[python.exe]","local_port_num":1316,"foreign_port_num":1317},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1317","foreign_port":"1316","program_name":"[python.exe]","local_port_num":1317,"foreign_port_num":1316},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1318","foreign_port":"1319","program_name":"[python.exe]","local_port_num":1318,"foreign_port_num":1319},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":1112,"local_port":"1319","foreign_port":"1318","program_name":"[python.exe]","local_port_num":1319,"foreign_port_num":1318},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1320","foreign_port":"1321","program_name":"[python.exe]","local_port_num":1320,"foreign_port_num":1321},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1321","foreign_port":"1320","program_name":"[python.exe]","local_port_num":1321,"foreign_port_num":1320},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1322","foreign_port":"1323","program_name":"[python.exe]","local_port_num":1322,"foreign_port_num":1323},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":28104,"local_port":"1323","foreign_port":"1322","program_name":"[python.exe]","local_port_num":1323,"foreign_port_num":1322},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"2132","foreign_port":"2133","program_name":"[bdservicehost.exe]","local_port_num":2132,"foreign_port_num":2133},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"2133","foreign_port":"2132","program_name":"[bdservicehost.exe]","local_port_num":2133,"foreign_port_num":2132},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"3949","foreign_port":"3950","program_name":"[bdservicehost.exe]","local_port_num":3949,"foreign_port_num":3950},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":21952,"local_port":"3950","foreign_port":"3949","program_name":"[bdservicehost.exe]","local_port_num":3950,"foreign_port_num":3949},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20136,"local_port":"5481","foreign_port":"5482","program_name":"[bdservicehost.exe]","local_port_num":5481,"foreign_port_num":5482},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20136,"local_port":"5482","foreign_port":"5481","program_name":"[bdservicehost.exe]","local_port_num":5482,"foreign_port_num":5481},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":7340,"local_port":"5939","foreign_port":"0","program_name":"[TeamViewer_Service.exe]","local_port_num":5939},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":9396,"local_port":"8307","foreign_port":"0","program_name":"[vmware-hostd.exe]","local_port_num":8307},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"8884","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":8884},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":6372,"local_port":"29802","foreign_port":"0","program_name":"[NVIDIA Web Helper.exe]","local_port_num":29802},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":30224,"local_port":"30776","foreign_port":"0","program_name":"[Code.exe]","local_port_num":30776},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30785","foreign_port":"30786","program_name":"[python.exe]","local_port_num":30785,"foreign_port_num":30786},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30786","foreign_port":"30785","program_name":"[python.exe]","local_port_num":30786,"foreign_port_num":30785},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30787","foreign_port":"30788","program_name":"[python.exe]","local_port_num":30787,"foreign_port_num":30788},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":25596,"local_port":"30788","foreign_port":"30787","program_name":"[python.exe]","local_port_num":30788,"foreign_port_num":30787},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30797","foreign_port":"30798","program_name":"[python.exe]","local_port_num":30797,"foreign_port_num":30798},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30798","foreign_port":"30797","program_name":"[python.exe]","local_port_num":30798,"foreign_port_num":30797},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30799","foreign_port":"30800","program_name":"[python.exe]","local_port_num":30799,"foreign_port_num":30800},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":20364,"local_port":"30800","foreign_port":"30799","program_name":"[python.exe]","local_port_num":30800,"foreign_port_num":30799},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":22140,"local_port":"30825","foreign_port":"30826","program_name":"[bdvpnapp.exe]","local_port_num":30825,"foreign_port_num":30826},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":22140,"local_port":"30826","foreign_port":"30825","program_name":"[bdvpnapp.exe]","local_port_num":30826,"foreign_port_num":30825},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":23200,"local_port":"30842","foreign_port":"30843","program_name":"[bdagent.exe]","local_port_num":30842,"foreign_port_num":30843},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":23200,"local_port":"30843","foreign_port":"30842","program_name":"[bdagent.exe]","local_port_num":30843,"foreign_port_num":30842},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":18580,"local_port":"31337","foreign_port":"31338","program_name":"[bdwtxag.exe]","local_port_num":31337,"foreign_port_num":31338},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":18580,"local_port":"31338","foreign_port":"31337","program_name":"[bdwtxag.exe]","local_port_num":31338,"foreign_port_num":31337},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":6804,"local_port":"44440","foreign_port":"0","program_name":"[FoxitConnectedPDFService.exe]","local_port_num":44440},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":4260,"local_port":"49673","foreign_port":"49674","program_name":"[bdvpnservice.exe]","local_port_num":49673,"foreign_port_num":49674},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"127.0.0.1","state":"ESTABLISHED","pid":4260,"local_port":"49674","foreign_port":"49673","program_name":"[bdvpnservice.exe]","local_port_num":49674,"foreign_port_num":49673},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":7140,"local_port":"65001","foreign_port":"0","program_name":"[nvcontainer.exe]","local_port_num":65001},{"proto":"TCP","local_address":"172.17.96.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"172.26.240.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"172.27.128.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"192.168.24.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"169.150.202.133","state":"ESTABLISHED","pid":6608,"local_port":"1028","foreign_port":"443","program_name":"[AnyDesk.exe]","local_port_num":1028,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"66.102.1.188","state":"ESTABLISHED","pid":19692,"local_port":"1053","foreign_port":"5228","program_name":"[chrome.exe]","local_port_num":1053,"foreign_port_num":5228},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"23.98.104.215","state":"ESTABLISHED","pid":29992,"local_port":"1114","foreign_port":"8883","program_name":"[SupportAssistAgent.exe]","local_port_num":1114,"foreign_port_num":8883},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"104.199.65.124","state":"ESTABLISHED","pid":27696,"local_port":"1135","foreign_port":"4070","program_name":"[Spotify.exe]","local_port_num":1135,"foreign_port_num":4070},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"35.186.224.47","state":"ESTABLISHED","pid":27696,"local_port":"1143","foreign_port":"443","program_name":"[Spotify.exe]","local_port_num":1143,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"35.186.224.40","state":"ESTABLISHED","pid":20740,"local_port":"1146","foreign_port":"443","program_name":"[Spotify.exe]","local_port_num":1146,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"149.154.167.91","state":"ESTABLISHED","pid":15276,"local_port":"3405","foreign_port":"443","program_name":"[Telegram.exe]","local_port_num":3405,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"149.154.175.59","state":"ESTABLISHED","pid":15276,"local_port":"3411","foreign_port":"443","program_name":"[Telegram.exe]","local_port_num":3411,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"40.84.185.67","state":"ESTABLISHED","pid":35392,"local_port":"3504","foreign_port":"9354","program_name":"[ServiceHub.SettingsHost.exe]","local_port_num":3504,"foreign_port_num":9354},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"35.186.224.25","state":"ESTABLISHED","pid":20740,"local_port":"3962","foreign_port":"443","program_name":"[Spotify.exe]","local_port_num":3962,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"34.120.68.241","state":"ESTABLISHED","pid":21952,"local_port":"4215","foreign_port":"443","program_name":"[bdservicehost.exe]","local_port_num":4215,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"104.17.107.108","state":"ESTABLISHED","pid":18580,"local_port":"4290","foreign_port":"443","program_name":"[bdwtxag.exe]","local_port_num":4290,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"140.82.112.26","state":"ESTABLISHED","pid":19692,"local_port":"4582","foreign_port":"443","program_name":"[chrome.exe]","local_port_num":4582,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"82.102.152.152","state":"CLOSE_WAIT","pid":27568,"local_port":"4604","foreign_port":"443","program_name":"[SearchApp.exe]","local_port_num":4604,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"82.102.152.152","state":"CLOSE_WAIT","pid":27568,"local_port":"4605","foreign_port":"443","program_name":"[SearchApp.exe]","local_port_num":4605,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"192.229.221.95","state":"CLOSE_WAIT","pid":27568,"local_port":"4607","foreign_port":"80","program_name":"[SearchApp.exe]","local_port_num":4607,"foreign_port_num":80},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"82.102.152.161","state":"CLOSE_WAIT","pid":27568,"local_port":"4608","foreign_port":"443","program_name":"[SearchApp.exe]","local_port_num":4608,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"82.102.152.179","state":"CLOSE_WAIT","pid":27568,"local_port":"4611","foreign_port":"443","program_name":"[SearchApp.exe]","local_port_num":4611,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"82.102.152.179","state":"CLOSE_WAIT","pid":27568,"local_port":"4612","foreign_port":"443","program_name":"[SearchApp.exe]","local_port_num":4612,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"35.186.224.18","state":"ESTABLISHED","pid":20740,"local_port":"4630","foreign_port":"443","program_name":"[Spotify.exe]","local_port_num":4630,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"34.120.68.241","state":"ESTABLISHED","pid":18580,"local_port":"4634","foreign_port":"443","program_name":"[bdwtxag.exe]","local_port_num":4634,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"104.17.108.108","state":"ESTABLISHED","pid":21952,"local_port":"4670","foreign_port":"443","program_name":"[bdservicehost.exe]","local_port_num":4670,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"20.54.232.160","state":"ESTABLISHED","pid":17684,"local_port":"4699","foreign_port":"443","program_name":"[svchost.exe]","local_port_num":4699,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"157.240.252.61","state":"TIME_WAIT","pid":0,"local_port":"4713","foreign_port":"5222","local_port_num":4713,"foreign_port_num":5222},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"212.199.140.34","state":"ESTABLISHED","pid":33968,"local_port":"4714","foreign_port":"443","program_name":"[WhatsApp.exe]","local_port_num":4714,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"212.199.140.162","state":"ESTABLISHED","pid":33968,"local_port":"4715","foreign_port":"443","program_name":"[WhatsApp.exe]","local_port_num":4715,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"31.13.69.60","state":"ESTABLISHED","pid":33968,"local_port":"4716","foreign_port":"443","program_name":"[WhatsApp.exe]","local_port_num":4716,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"157.240.252.60","state":"ESTABLISHED","pid":33968,"local_port":"4717","foreign_port":"443","program_name":"[WhatsApp.exe]","local_port_num":4717,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"192.168.31.99","state":"TIME_WAIT","pid":0,"local_port":"4718","foreign_port":"53","local_port_num":4718,"foreign_port_num":53},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"192.168.31.99","state":"TIME_WAIT","pid":0,"local_port":"4719","foreign_port":"53","local_port_num":4719,"foreign_port_num":53},{"proto":"TCP","local_address":"192.168.31.221","foreign_address":"20.199.120.151","state":"ESTABLISHED","pid":7920,"local_port":"49472","foreign_port":"443","program_name":"[svchost.exe]","local_port_num":49472,"foreign_port_num":443},{"proto":"TCP","local_address":"192.168.216.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"192.168.234.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"192.168.255.1","foreign_address":"0.0.0.0","state":"LISTENING","pid":4,"local_port":"139","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":139},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1712,"local_port":"135","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":135},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":9396,"local_port":"443","foreign_port":"0","program_name":"[vmware-hostd.exe]","local_port_num":443},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4,"local_port":"445","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":445},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4032,"local_port":"2179","foreign_port":"0","program_name":"[vmms.exe]","local_port_num":2179},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":4,"local_port":"2869","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":2869},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":10404,"local_port":"7680","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":7680},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1400,"local_port":"13656","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":13656},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1428,"local_port":"49664","foreign_port":"0","program_name":"[System]","local_port_num":49664},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":1036,"local_port":"49665","foreign_port":"0","program_name":"Can not obtain ownership information","local_port_num":49665},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":2152,"local_port":"49666","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49666},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":2160,"local_port":"49667","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49667},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":3952,"local_port":"49668","foreign_port":"0","program_name":"[svchost.exe]","local_port_num":49668},{"proto":"TCP","local_address":"[::]","foreign_address":"[::]","state":"LISTENING","pid":6316,"local_port":"49681","foreign_port":"0","program_name":"[spoolsv.exe]","local_port_num":49681},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","pid":6088,"local_port":"1025","foreign_port":"0","program_name":"[jhi_service.exe]","local_port_num":1025},{"proto":"TCP","local_address":"[::1]","foreign_address":"[::]","state":"LISTENING","pid":9396,"local_port":"8307","foreign_port":"0","program_name":"[vmware-hostd.exe]","local_port_num":8307},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"53","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"53","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":53},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":34064,"local_port":"67","foreign_port":"*","program_name":"[bdntwrk.exe]","local_port_num":67},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6856,"local_port":"500","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"1900","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":1900},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":3702},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6856,"local_port":"4500","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":4500},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":13528,"local_port":"5050","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":5050},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":3404,"local_port":"5353","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":3404,"local_port":"5355","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":5355},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":7140,"local_port":"49376","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":49376},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6608,"local_port":"50001","foreign_port":"*","program_name":"[AnyDesk.exe]","local_port_num":50001},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":20740,"local_port":"50157","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":50157},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":21952,"local_port":"50531","foreign_port":"*","program_name":"[bdservicehost.exe]","local_port_num":50531},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":7340,"local_port":"52304","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":52304},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":20740,"local_port":"55981","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":55981},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":21952,"local_port":"56621","foreign_port":"*","program_name":"[bdservicehost.exe]","local_port_num":56621},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57621","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57621},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57752","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57752},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57753","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57753},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57754","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57754},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57755","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57755},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57756","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57756},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57757","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57757},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57758","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57758},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":27696,"local_port":"57759","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":57759},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":18580,"local_port":"59680","foreign_port":"*","program_name":"[bdwtxag.exe]","local_port_num":59680},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":18580,"local_port":"59993","foreign_port":"*","program_name":"[bdwtxag.exe]","local_port_num":59993},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"62243","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":62243},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"62245","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":62245},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":6952,"local_port":"62808","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":62808},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":20136,"local_port":"64105","foreign_port":"*","program_name":"[bdservicehost.exe]","local_port_num":64105},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":4808,"local_port":"64544","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":64544},{"proto":"UDP","local_address":"0.0.0.0","foreign_address":"*","state":"","pid":21952,"local_port":"65042","foreign_port":"*","program_name":"[bdservicehost.exe]","local_port_num":65042},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":6372,"local_port":"10250","foreign_port":"*","program_name":"[NVIDIA Web Helper.exe]","local_port_num":10250},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":5876,"local_port":"49826","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":49826},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":8844,"local_port":"52299","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52299},{"proto":"UDP","local_address":"127.0.0.1","foreign_address":"*","state":"","pid":27560,"local_port":"61810","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":61810},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"172.17.96.1","foreign_address":"*","state":"","pid":8844,"local_port":"52300","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52300},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4808,"local_port":"67","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":67},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4808,"local_port":"68","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":68},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"172.26.240.1","foreign_address":"*","state":"","pid":8844,"local_port":"52292","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52292},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"172.27.128.1","foreign_address":"*","state":"","pid":8844,"local_port":"52293","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52293},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.24.1","foreign_address":"*","state":"","pid":8844,"local_port":"52298","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52298},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.31.221","foreign_address":"*","state":"","pid":8844,"local_port":"52294","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52294},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.216.1","foreign_address":"*","state":"","pid":8844,"local_port":"52295","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52295},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.234.1","foreign_address":"*","state":"","pid":8844,"local_port":"52297","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52297},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":4,"local_port":"137","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":137},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":4,"local_port":"138","foreign_port":"*","program_name":"Can not obtain ownership information","local_port_num":138},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"192.168.255.1","foreign_address":"*","state":"","pid":8844,"local_port":"52296","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52296},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6856,"local_port":"500","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":500},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":3702},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6952,"local_port":"3702","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":3702},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6856,"local_port":"4500","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":4500},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":3404,"local_port":"5353","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":27696,"local_port":"5353","foreign_port":"*","program_name":"[Spotify.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":14156,"local_port":"5353","foreign_port":"*","program_name":"[chrome.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":3404,"local_port":"5355","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":5355},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":7140,"local_port":"49377","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":49377},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":7340,"local_port":"52305","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":52305},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":4808,"local_port":"62244","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":62244},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":4808,"local_port":"62246","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":62246},{"proto":"UDP","local_address":"[::]","foreign_address":"*","state":"","pid":6952,"local_port":"62809","foreign_port":"*","program_name":"[dashost.exe]","local_port_num":62809},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":7340,"local_port":"5353","foreign_port":"*","program_name":"[TeamViewer_Service.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":7140,"local_port":"5353","foreign_port":"*","program_name":"[nvcontainer.exe]","local_port_num":5353},{"proto":"UDP","local_address":"[::1]","foreign_address":"*","state":"","pid":8844,"local_port":"52290","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52290},{"proto":"UDP","local_address":"[fe80::244e:2f1e:2096:62b2%9]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::244e:2f1e:2096:62b2%9]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::244e:2f1e:2096:62b2%9]","foreign_address":"*","state":"","pid":8844,"local_port":"52285","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52285},{"proto":"UDP","local_address":"[fe80::36de:3306:84b0:6717%21]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::36de:3306:84b0:6717%21]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::36de:3306:84b0:6717%21]","foreign_address":"*","state":"","pid":8844,"local_port":"52289","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52289},{"proto":"UDP","local_address":"[fe80::8bd5:17a8:5e7d:9a50%52]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::8bd5:17a8:5e7d:9a50%52]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::8bd5:17a8:5e7d:9a50%52]","foreign_address":"*","state":"","pid":8844,"local_port":"52183","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52183},{"proto":"UDP","local_address":"[fe80::a625:de92:858:a42a%57]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::a625:de92:858:a42a%57]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::a625:de92:858:a42a%57]","foreign_address":"*","state":"","pid":8844,"local_port":"52291","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52291},{"proto":"UDP","local_address":"[fe80::af17:660e:b87c:eb22%22]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::af17:660e:b87c:eb22%22]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::af17:660e:b87c:eb22%22]","foreign_address":"*","state":"","pid":8844,"local_port":"52286","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52286},{"proto":"UDP","local_address":"[fe80::d586:c72e:e178:1147%11]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::d586:c72e:e178:1147%11]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::d586:c72e:e178:1147%11]","foreign_address":"*","state":"","pid":8844,"local_port":"52287","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52287},{"proto":"UDP","local_address":"[fe80::d8df:ceee:28ba:aad%14]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::d8df:ceee:28ba:aad%14]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::d8df:ceee:28ba:aad%14]","foreign_address":"*","state":"","pid":8844,"local_port":"52288","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52288},{"proto":"UDP","local_address":"[fe80::f5d1:8bf7:c410:e325%64]","foreign_address":"*","state":"","pid":8844,"local_port":"1900","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":1900},{"proto":"UDP","local_address":"[fe80::f5d1:8bf7:c410:e325%64]","foreign_address":"*","state":"","pid":28108,"local_port":"2177","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":2177},{"proto":"UDP","local_address":"[fe80::f5d1:8bf7:c410:e325%64]","foreign_address":"*","state":"","pid":8844,"local_port":"52284","foreign_port":"*","program_name":"[svchost.exe]","local_port_num":52284}]
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/netstat-aonb.out b/tests/fixtures/windows/windows-10/netstat-aonb.out
new file mode 100644
index 00000000..0f113dc1
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat-aonb.out
@@ -0,0 +1,720 @@
+
+Active Connections
+
+  Proto  Local Address          Foreign Address        State           PID
+  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1712
+  RpcSs
+ [svchost.exe]
+  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       9396
+ [vmware-hostd.exe]
+  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    0.0.0.0:902            0.0.0.0:0              LISTENING       7388
+ [vmware-authd.exe]
+  TCP    0.0.0.0:912            0.0.0.0:0              LISTENING       7388
+ [vmware-authd.exe]
+  TCP    0.0.0.0:1134           0.0.0.0:0              LISTENING       27696
+ [Spotify.exe]
+  TCP    0.0.0.0:2179           0.0.0.0:0              LISTENING       4032
+ [vmms.exe]
+  TCP    0.0.0.0:2869           0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    0.0.0.0:4325           0.0.0.0:0              LISTENING       5876
+  iphlpsvc
+ [svchost.exe]
+  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       13528
+  CDPSvc
+ [svchost.exe]
+  TCP    0.0.0.0:7070           0.0.0.0:0              LISTENING       6608
+ [AnyDesk.exe]
+  TCP    0.0.0.0:7680           0.0.0.0:0              LISTENING       10404
+ Can not obtain ownership information
+  TCP    0.0.0.0:13656          0.0.0.0:0              LISTENING       1400
+ Can not obtain ownership information
+  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING       1428
+ [System]
+  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING       1036
+ Can not obtain ownership information
+  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING       2152
+  EventLog
+ [svchost.exe]
+  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING       2160
+  Schedule
+ [svchost.exe]
+  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING       3952
+  SessionEnv
+ [svchost.exe]
+  TCP    0.0.0.0:49681          0.0.0.0:0              LISTENING       6316
+ [spoolsv.exe]
+  TCP    0.0.0.0:57621          0.0.0.0:0              LISTENING       27696
+ [Spotify.exe]
+  TCP    127.0.0.1:1031         127.0.0.1:1032         ESTABLISHED     10644
+ [ProductAgentService.exe]
+  TCP    127.0.0.1:1032         127.0.0.1:1031         ESTABLISHED     10644
+ [ProductAgentService.exe]
+  TCP    127.0.0.1:1310         0.0.0.0:0              LISTENING       9328
+ [Code.exe]
+  TCP    127.0.0.1:1316         127.0.0.1:1317         ESTABLISHED     1112
+ [python.exe]
+  TCP    127.0.0.1:1317         127.0.0.1:1316         ESTABLISHED     1112
+ [python.exe]
+  TCP    127.0.0.1:1318         127.0.0.1:1319         ESTABLISHED     1112
+ [python.exe]
+  TCP    127.0.0.1:1319         127.0.0.1:1318         ESTABLISHED     1112
+ [python.exe]
+  TCP    127.0.0.1:1320         127.0.0.1:1321         ESTABLISHED     28104
+ [python.exe]
+  TCP    127.0.0.1:1321         127.0.0.1:1320         ESTABLISHED     28104
+ [python.exe]
+  TCP    127.0.0.1:1322         127.0.0.1:1323         ESTABLISHED     28104
+ [python.exe]
+  TCP    127.0.0.1:1323         127.0.0.1:1322         ESTABLISHED     28104
+ [python.exe]
+  TCP    127.0.0.1:2132         127.0.0.1:2133         ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    127.0.0.1:2133         127.0.0.1:2132         ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    127.0.0.1:3949         127.0.0.1:3950         ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    127.0.0.1:3950         127.0.0.1:3949         ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    127.0.0.1:5481         127.0.0.1:5482         ESTABLISHED     20136
+ [bdservicehost.exe]
+  TCP    127.0.0.1:5482         127.0.0.1:5481         ESTABLISHED     20136
+ [bdservicehost.exe]
+  TCP    127.0.0.1:5939         0.0.0.0:0              LISTENING       7340
+ [TeamViewer_Service.exe]
+  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       9396
+ [vmware-hostd.exe]
+  TCP    127.0.0.1:8884         0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    127.0.0.1:29802        0.0.0.0:0              LISTENING       6372
+ [NVIDIA Web Helper.exe]
+  TCP    127.0.0.1:30776        0.0.0.0:0              LISTENING       30224
+ [Code.exe]
+  TCP    127.0.0.1:30785        127.0.0.1:30786        ESTABLISHED     25596
+ [python.exe]
+  TCP    127.0.0.1:30786        127.0.0.1:30785        ESTABLISHED     25596
+ [python.exe]
+  TCP    127.0.0.1:30787        127.0.0.1:30788        ESTABLISHED     25596
+ [python.exe]
+  TCP    127.0.0.1:30788        127.0.0.1:30787        ESTABLISHED     25596
+ [python.exe]
+  TCP    127.0.0.1:30797        127.0.0.1:30798        ESTABLISHED     20364
+ [python.exe]
+  TCP    127.0.0.1:30798        127.0.0.1:30797        ESTABLISHED     20364
+ [python.exe]
+  TCP    127.0.0.1:30799        127.0.0.1:30800        ESTABLISHED     20364
+ [python.exe]
+  TCP    127.0.0.1:30800        127.0.0.1:30799        ESTABLISHED     20364
+ [python.exe]
+  TCP    127.0.0.1:30825        127.0.0.1:30826        ESTABLISHED     22140
+ [bdvpnapp.exe]
+  TCP    127.0.0.1:30826        127.0.0.1:30825        ESTABLISHED     22140
+ [bdvpnapp.exe]
+  TCP    127.0.0.1:30842        127.0.0.1:30843        ESTABLISHED     23200
+ [bdagent.exe]
+  TCP    127.0.0.1:30843        127.0.0.1:30842        ESTABLISHED     23200
+ [bdagent.exe]
+  TCP    127.0.0.1:31337        127.0.0.1:31338        ESTABLISHED     18580
+ [bdwtxag.exe]
+  TCP    127.0.0.1:31338        127.0.0.1:31337        ESTABLISHED     18580
+ [bdwtxag.exe]
+  TCP    127.0.0.1:44440        0.0.0.0:0              LISTENING       6804
+ [FoxitConnectedPDFService.exe]
+  TCP    127.0.0.1:49673        127.0.0.1:49674        ESTABLISHED     4260
+ [bdvpnservice.exe]
+  TCP    127.0.0.1:49674        127.0.0.1:49673        ESTABLISHED     4260
+ [bdvpnservice.exe]
+  TCP    127.0.0.1:65001        0.0.0.0:0              LISTENING       7140
+ [nvcontainer.exe]
+  TCP    172.17.96.1:139        0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    172.26.240.1:139       0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    172.27.128.1:139       0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    192.168.24.1:139       0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    192.168.31.221:139     0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    192.168.31.221:1028    169.150.202.133:443    ESTABLISHED     6608
+ [AnyDesk.exe]
+  TCP    192.168.31.221:1053    66.102.1.188:5228      ESTABLISHED     19692
+ [chrome.exe]
+  TCP    192.168.31.221:1114    23.98.104.215:8883     ESTABLISHED     29992
+ [SupportAssistAgent.exe]
+  TCP    192.168.31.221:1135    104.199.65.124:4070    ESTABLISHED     27696
+ [Spotify.exe]
+  TCP    192.168.31.221:1143    35.186.224.47:443      ESTABLISHED     27696
+ [Spotify.exe]
+  TCP    192.168.31.221:1146    35.186.224.40:443      ESTABLISHED     20740
+ [Spotify.exe]
+  TCP    192.168.31.221:3405    149.154.167.91:443     ESTABLISHED     15276
+ [Telegram.exe]
+  TCP    192.168.31.221:3411    149.154.175.59:443     ESTABLISHED     15276
+ [Telegram.exe]
+  TCP    192.168.31.221:3504    40.84.185.67:9354      ESTABLISHED     35392
+ [ServiceHub.SettingsHost.exe]
+  TCP    192.168.31.221:3962    35.186.224.25:443      ESTABLISHED     20740
+ [Spotify.exe]
+  TCP    192.168.31.221:4215    34.120.68.241:443      ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    192.168.31.221:4290    104.17.107.108:443     ESTABLISHED     18580
+ [bdwtxag.exe]
+  TCP    192.168.31.221:4582    140.82.112.26:443      ESTABLISHED     19692
+ [chrome.exe]
+  TCP    192.168.31.221:4604    82.102.152.152:443     CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4605    82.102.152.152:443     CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4607    192.229.221.95:80      CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4608    82.102.152.161:443     CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4611    82.102.152.179:443     CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4612    82.102.152.179:443     CLOSE_WAIT      27568
+ [SearchApp.exe]
+  TCP    192.168.31.221:4630    35.186.224.18:443      ESTABLISHED     20740
+ [Spotify.exe]
+  TCP    192.168.31.221:4634    34.120.68.241:443      ESTABLISHED     18580
+ [bdwtxag.exe]
+  TCP    192.168.31.221:4670    104.17.108.108:443     ESTABLISHED     21952
+ [bdservicehost.exe]
+  TCP    192.168.31.221:4699    20.54.232.160:443      ESTABLISHED     17684
+  CDPUserSvc_46a8de2e
+ [svchost.exe]
+  TCP    192.168.31.221:4713    157.240.252.61:5222    TIME_WAIT       0
+  TCP    192.168.31.221:4714    212.199.140.34:443     ESTABLISHED     33968
+ [WhatsApp.exe]
+  TCP    192.168.31.221:4715    212.199.140.162:443    ESTABLISHED     33968
+ [WhatsApp.exe]
+  TCP    192.168.31.221:4716    31.13.69.60:443        ESTABLISHED     33968
+ [WhatsApp.exe]
+  TCP    192.168.31.221:4717    157.240.252.60:443     ESTABLISHED     33968
+ [WhatsApp.exe]
+  TCP    192.168.31.221:4718    192.168.31.99:53       TIME_WAIT       0
+  TCP    192.168.31.221:4719    192.168.31.99:53       TIME_WAIT       0
+  TCP    192.168.31.221:49472   20.199.120.151:443     ESTABLISHED     7920
+  WpnService
+ [svchost.exe]
+  TCP    192.168.216.1:139      0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    192.168.234.1:139      0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    192.168.255.1:139      0.0.0.0:0              LISTENING       4
+ Can not obtain ownership information
+  TCP    [::]:135               [::]:0                 LISTENING       1712
+  RpcSs
+ [svchost.exe]
+  TCP    [::]:443               [::]:0                 LISTENING       9396
+ [vmware-hostd.exe]
+  TCP    [::]:445               [::]:0                 LISTENING       4
+ Can not obtain ownership information
+  TCP    [::]:2179              [::]:0                 LISTENING       4032
+ [vmms.exe]
+  TCP    [::]:2869              [::]:0                 LISTENING       4
+ Can not obtain ownership information
+  TCP    [::]:7680              [::]:0                 LISTENING       10404
+ Can not obtain ownership information
+  TCP    [::]:13656             [::]:0                 LISTENING       1400
+ Can not obtain ownership information
+  TCP    [::]:49664             [::]:0                 LISTENING       1428
+ [System]
+  TCP    [::]:49665             [::]:0                 LISTENING       1036
+ Can not obtain ownership information
+  TCP    [::]:49666             [::]:0                 LISTENING       2152
+  EventLog
+ [svchost.exe]
+  TCP    [::]:49667             [::]:0                 LISTENING       2160
+  Schedule
+ [svchost.exe]
+  TCP    [::]:49668             [::]:0                 LISTENING       3952
+  SessionEnv
+ [svchost.exe]
+  TCP    [::]:49681             [::]:0                 LISTENING       6316
+ [spoolsv.exe]
+  TCP    [::1]:1025             [::]:0                 LISTENING       6088
+ [jhi_service.exe]
+  TCP    [::1]:8307             [::]:0                 LISTENING       9396
+ [vmware-hostd.exe]
+  UDP    0.0.0.0:53             *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    0.0.0.0:53             *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    0.0.0.0:67             *:*                                    34064
+ [bdntwrk.exe]
+  UDP    0.0.0.0:500            *:*                                    6856
+  IKEEXT
+ [svchost.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:1900           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:3702           *:*                                    6952
+ [dashost.exe]
+  UDP    0.0.0.0:3702           *:*                                    6952
+ [dashost.exe]
+  UDP    0.0.0.0:4500           *:*                                    6856
+  IKEEXT
+ [svchost.exe]
+  UDP    0.0.0.0:5050           *:*                                    13528
+  CDPSvc
+ [svchost.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    3404
+  Dnscache
+ [svchost.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5353           *:*                                    14156
+ [chrome.exe]
+  UDP    0.0.0.0:5355           *:*                                    3404
+  Dnscache
+ [svchost.exe]
+  UDP    0.0.0.0:49376          *:*                                    7140
+ [nvcontainer.exe]
+  UDP    0.0.0.0:50001          *:*                                    6608
+ [AnyDesk.exe]
+  UDP    0.0.0.0:50157          *:*                                    20740
+ [Spotify.exe]
+  UDP    0.0.0.0:50531          *:*                                    21952
+ [bdservicehost.exe]
+  UDP    0.0.0.0:52304          *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    0.0.0.0:55981          *:*                                    20740
+ [Spotify.exe]
+  UDP    0.0.0.0:56621          *:*                                    21952
+ [bdservicehost.exe]
+  UDP    0.0.0.0:57621          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57752          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57753          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57754          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57755          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57756          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57757          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57758          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:57759          *:*                                    27696
+ [Spotify.exe]
+  UDP    0.0.0.0:59680          *:*                                    18580
+ [bdwtxag.exe]
+  UDP    0.0.0.0:59993          *:*                                    18580
+ [bdwtxag.exe]
+  UDP    0.0.0.0:62243          *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    0.0.0.0:62245          *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    0.0.0.0:62808          *:*                                    6952
+ [dashost.exe]
+  UDP    0.0.0.0:64105          *:*                                    20136
+ [bdservicehost.exe]
+  UDP    0.0.0.0:64544          *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    0.0.0.0:65042          *:*                                    21952
+ [bdservicehost.exe]
+  UDP    127.0.0.1:1900         *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    127.0.0.1:10250        *:*                                    6372
+ [NVIDIA Web Helper.exe]
+  UDP    127.0.0.1:49826        *:*                                    5876
+  iphlpsvc
+ [svchost.exe]
+  UDP    127.0.0.1:52299        *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    127.0.0.1:61810        *:*                                    27560
+ [nvcontainer.exe]
+  UDP    172.17.96.1:137        *:*                                    4
+ Can not obtain ownership information
+  UDP    172.17.96.1:138        *:*                                    4
+ Can not obtain ownership information
+  UDP    172.17.96.1:1900       *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    172.17.96.1:2177       *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    172.17.96.1:5353       *:*                                    7140
+ [nvcontainer.exe]
+  UDP    172.17.96.1:52300      *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    172.26.240.1:67        *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    172.26.240.1:68        *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    172.26.240.1:137       *:*                                    4
+ Can not obtain ownership information
+  UDP    172.26.240.1:138       *:*                                    4
+ Can not obtain ownership information
+  UDP    172.26.240.1:1900      *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    172.26.240.1:2177      *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    172.26.240.1:5353      *:*                                    7140
+ [nvcontainer.exe]
+  UDP    172.26.240.1:52292     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    172.27.128.1:137       *:*                                    4
+ Can not obtain ownership information
+  UDP    172.27.128.1:138       *:*                                    4
+ Can not obtain ownership information
+  UDP    172.27.128.1:1900      *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    172.27.128.1:2177      *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    172.27.128.1:5353      *:*                                    7140
+ [nvcontainer.exe]
+  UDP    172.27.128.1:52293     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.24.1:137       *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.24.1:138       *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.24.1:1900      *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.24.1:2177      *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    192.168.24.1:5353      *:*                                    7140
+ [nvcontainer.exe]
+  UDP    192.168.24.1:5353      *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    192.168.24.1:52298     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.31.221:137     *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.31.221:138     *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.31.221:1900    *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.31.221:2177    *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    192.168.31.221:5353    *:*                                    7140
+ [nvcontainer.exe]
+  UDP    192.168.31.221:52294   *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.216.1:137      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.216.1:138      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.216.1:1900     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.216.1:2177     *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    192.168.216.1:5353     *:*                                    7140
+ [nvcontainer.exe]
+  UDP    192.168.216.1:5353     *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    192.168.216.1:52295    *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.234.1:137      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.234.1:138      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.234.1:1900     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.234.1:2177     *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    192.168.234.1:5353     *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    192.168.234.1:5353     *:*                                    7140
+ [nvcontainer.exe]
+  UDP    192.168.234.1:52297    *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.255.1:137      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.255.1:138      *:*                                    4
+ Can not obtain ownership information
+  UDP    192.168.255.1:1900     *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    192.168.255.1:2177     *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    192.168.255.1:5353     *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    192.168.255.1:5353     *:*                                    7140
+ [nvcontainer.exe]
+  UDP    192.168.255.1:52296    *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [::]:500               *:*                                    6856
+  IKEEXT
+ [svchost.exe]
+  UDP    [::]:3702              *:*                                    6952
+ [dashost.exe]
+  UDP    [::]:3702              *:*                                    6952
+ [dashost.exe]
+  UDP    [::]:4500              *:*                                    6856
+  IKEEXT
+ [svchost.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    3404
+  Dnscache
+ [svchost.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    27696
+ [Spotify.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5353              *:*                                    14156
+ [chrome.exe]
+  UDP    [::]:5355              *:*                                    3404
+  Dnscache
+ [svchost.exe]
+  UDP    [::]:49377             *:*                                    7140
+ [nvcontainer.exe]
+  UDP    [::]:52305             *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    [::]:62244             *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    [::]:62246             *:*                                    4808
+  SharedAccess
+ [svchost.exe]
+  UDP    [::]:62809             *:*                                    6952
+ [dashost.exe]
+  UDP    [::1]:1900             *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [::1]:5353             *:*                                    7340
+ [TeamViewer_Service.exe]
+  UDP    [::1]:5353             *:*                                    7140
+ [nvcontainer.exe]
+  UDP    [::1]:52290            *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::244e:2f1e:2096:62b2%9]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::244e:2f1e:2096:62b2%9]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::244e:2f1e:2096:62b2%9]:52285  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::36de:3306:84b0:6717%21]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::36de:3306:84b0:6717%21]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::36de:3306:84b0:6717%21]:52289  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::8bd5:17a8:5e7d:9a50%52]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::8bd5:17a8:5e7d:9a50%52]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::8bd5:17a8:5e7d:9a50%52]:52183  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::a625:de92:858:a42a%57]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::a625:de92:858:a42a%57]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::a625:de92:858:a42a%57]:52291  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::af17:660e:b87c:eb22%22]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::af17:660e:b87c:eb22%22]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::af17:660e:b87c:eb22%22]:52286  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::d586:c72e:e178:1147%11]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::d586:c72e:e178:1147%11]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::d586:c72e:e178:1147%11]:52287  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::d8df:ceee:28ba:aad%14]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::d8df:ceee:28ba:aad%14]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::d8df:ceee:28ba:aad%14]:52288  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::f5d1:8bf7:c410:e325%64]:1900  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
+  UDP    [fe80::f5d1:8bf7:c410:e325%64]:2177  *:*                                    28108
+  QWAVE
+ [svchost.exe]
+  UDP    [fe80::f5d1:8bf7:c410:e325%64]:52284  *:*                                    8844
+  SSDPSRV
+ [svchost.exe]
diff --git a/tests/fixtures/windows/windows-10/netstat.json b/tests/fixtures/windows/windows-10/netstat.json
new file mode 100644
index 00000000..7c6356de
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat.json
@@ -0,0 +1 @@
+[{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1031","foreign_port":"1032","local_port_num":1031,"foreign_port_num":1032},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1032","foreign_port":"1031","local_port_num":1032,"foreign_port_num":1031},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1316","foreign_port":"1317","local_port_num":1316,"foreign_port_num":1317},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1317","foreign_port":"1316","local_port_num":1317,"foreign_port_num":1316},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1318","foreign_port":"1319","local_port_num":1318,"foreign_port_num":1319},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1319","foreign_port":"1318","local_port_num":1319,"foreign_port_num":1318},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1320","foreign_port":"1321","local_port_num":1320,"foreign_port_num":1321},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1321","foreign_port":"1320","local_port_num":1321,"foreign_port_num":1320},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1322","foreign_port":"1323","local_port_num":1322,"foreign_port_num":1323},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"1323","foreign_port":"1322","local_port_num":1323,"foreign_port_num":1322},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"2132","foreign_port":"2133","local_port_num":2132,"foreign_port_num":2133},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"2133","foreign_port":"2132","local_port_num":2133,"foreign_port_num":2132},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"3199","foreign_port":"3200","local_port_num":3199,"foreign_port_num":3200},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"3200","foreign_port":"3199","local_port_num":3200,"foreign_port_num":3199},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"5481","foreign_port":"5482","local_port_num":5481,"foreign_port_num":5482},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"5482","foreign_port":"5481","local_port_num":5482,"foreign_port_num":5481},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30785","foreign_port":"30786","local_port_num":30785,"foreign_port_num":30786},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30786","foreign_port":"30785","local_port_num":30786,"foreign_port_num":30785},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30787","foreign_port":"30788","local_port_num":30787,"foreign_port_num":30788},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30788","foreign_port":"30787","local_port_num":30788,"foreign_port_num":30787},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30797","foreign_port":"30798","local_port_num":30797,"foreign_port_num":30798},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30798","foreign_port":"30797","local_port_num":30798,"foreign_port_num":30797},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30799","foreign_port":"30800","local_port_num":30799,"foreign_port_num":30800},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30800","foreign_port":"30799","local_port_num":30800,"foreign_port_num":30799},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30825","foreign_port":"30826","local_port_num":30825,"foreign_port_num":30826},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30826","foreign_port":"30825","local_port_num":30826,"foreign_port_num":30825},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30842","foreign_port":"30843","local_port_num":30842,"foreign_port_num":30843},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"30843","foreign_port":"30842","local_port_num":30843,"foreign_port_num":30842},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"31337","foreign_port":"31338","local_port_num":31337,"foreign_port_num":31338},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"31338","foreign_port":"31337","local_port_num":31338,"foreign_port_num":31337},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"49673","foreign_port":"49674","local_port_num":49673,"foreign_port_num":49674},{"proto":"TCP","local_address":"127.0.0.1","foreign_address":"api","state":"ESTABLISHED","local_port":"49674","foreign_port":"49673","local_port_num":49674,"foreign_port_num":49673}]
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/netstat.out b/tests/fixtures/windows/windows-10/netstat.out
new file mode 100644
index 00000000..c20dcf57
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/netstat.out
@@ -0,0 +1,36 @@
+
+Active Connections
+
+  Proto  Local Address          Foreign Address        State
+  TCP    127.0.0.1:1031         api:1032               ESTABLISHED
+  TCP    127.0.0.1:1032         api:1031               ESTABLISHED
+  TCP    127.0.0.1:1316         api:1317               ESTABLISHED
+  TCP    127.0.0.1:1317         api:1316               ESTABLISHED
+  TCP    127.0.0.1:1318         api:1319               ESTABLISHED
+  TCP    127.0.0.1:1319         api:1318               ESTABLISHED
+  TCP    127.0.0.1:1320         api:1321               ESTABLISHED
+  TCP    127.0.0.1:1321         api:1320               ESTABLISHED
+  TCP    127.0.0.1:1322         api:1323               ESTABLISHED
+  TCP    127.0.0.1:1323         api:1322               ESTABLISHED
+  TCP    127.0.0.1:2132         api:2133               ESTABLISHED
+  TCP    127.0.0.1:2133         api:2132               ESTABLISHED
+  TCP    127.0.0.1:3199         api:3200               ESTABLISHED
+  TCP    127.0.0.1:3200         api:3199               ESTABLISHED
+  TCP    127.0.0.1:5481         api:5482               ESTABLISHED
+  TCP    127.0.0.1:5482         api:5481               ESTABLISHED
+  TCP    127.0.0.1:30785        api:30786              ESTABLISHED
+  TCP    127.0.0.1:30786        api:30785              ESTABLISHED
+  TCP    127.0.0.1:30787        api:30788              ESTABLISHED
+  TCP    127.0.0.1:30788        api:30787              ESTABLISHED
+  TCP    127.0.0.1:30797        api:30798              ESTABLISHED
+  TCP    127.0.0.1:30798        api:30797              ESTABLISHED
+  TCP    127.0.0.1:30799        api:30800              ESTABLISHED
+  TCP    127.0.0.1:30800        api:30799              ESTABLISHED
+  TCP    127.0.0.1:30825        api:30826              ESTABLISHED
+  TCP    127.0.0.1:30826        api:30825              ESTABLISHED
+  TCP    127.0.0.1:30842        api:30843              ESTABLISHED
+  TCP    127.0.0.1:30843        api:30842              ESTABLISHED
+  TCP    127.0.0.1:31337        api:31338              ESTABLISHED
+  TCP    127.0.0.1:31338        api:31337              ESTABLISHED
+  TCP    127.0.0.1:49673        api:49674              ESTABLISHED
+  TCP    127.0.0.1:49674        api:49673              ESTABLISHED
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/route.json b/tests/fixtures/windows/windows-10/route.json
new file mode 100644
index 00000000..42605432
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/route.json
@@ -0,0 +1 @@
+[{"interfaces":[{"id":"8","mac":"00:ff:58:60:5f:61","name":"TAP-Windows Adapter V9"},{"id":"52","mac":"00:15:5d:fd:0d:45","name":"Hyper-V Virtual Ethernet Adapter"},{"id":"64","mac":"00:15:5d:14:4d:b0","name":"Hyper-V Virtual Ethernet Adapter #3"},{"id":"22","mac":"00:50:56:c0:00:01","name":"VMware Virtual Ethernet Adapter for VMnet1"},{"id":"11","mac":"00:50:56:c0:00:08","name":"VMware Virtual Ethernet Adapter for VMnet8"},{"id":"14","mac":"00:50:56:c0:00:02","name":"VMware Virtual Ethernet Adapter for VMnet2"},{"id":"21","mac":"00:50:56:c0:00:0b","name":"VMware Virtual Ethernet Adapter for VMnet11"},{"id":"1","mac":"","name":"Software Loopback Interface 1"},{"id":"57","mac":"00:15:5d:0e:f1:0f","name":"Hyper-V Virtual Ethernet Adapter #2"}]},{"destination":"0.0.0.0","genmask":"0.0.0.0","gateway":"192.168.31.1","iface":"192.168.31.221","metric":30},{"destination":"127.0.0.0","genmask":"255.0.0.0","gateway":"On-link","iface":"127.0.0.1","metric":331},{"destination":"127.0.0.1","genmask":"255.255.255.255","gateway":"On-link","iface":"127.0.0.1","metric":331},{"destination":"127.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"127.0.0.1","metric":331},{"destination":"157.0.0.0","genmask":"255.0.0.0","gateway":"157.55.80.1","iface":"127.0.0.1","metric":78},{"destination":"172.17.96.0","genmask":"255.255.240.0","gateway":"On-link","iface":"172.17.96.1","metric":5256},{"destination":"172.17.96.1","genmask":"255.255.255.255","gateway":"On-link","iface":"172.17.96.1","metric":5256},{"destination":"172.17.111.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.17.96.1","metric":5256},{"destination":"172.26.240.0","genmask":"255.255.240.0","gateway":"On-link","iface":"172.26.240.1","metric":271},{"destination":"172.26.240.1","genmask":"255.255.255.255","gateway":"On-link","iface":"172.26.240.1","metric":271},{"destination":"172.26.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.26.240.1","metric":271},{"destination":"172.27.128.0","genmask":"255.255.240.0","gateway":"On-link","iface":"172.27.128.1","metric":271},{"destination":"172.27.128.1","genmask":"255.255.255.255","gateway":"On-link","iface":"172.27.128.1","metric":271},{"destination":"172.27.143.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.27.128.1","metric":271},{"destination":"192.168.24.0","genmask":"255.255.255.0","gateway":"On-link","iface":"192.168.24.1","metric":291},{"destination":"192.168.24.1","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.24.1","metric":291},{"destination":"192.168.24.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.24.1","metric":291},{"destination":"192.168.31.0","genmask":"255.255.255.0","gateway":"On-link","iface":"192.168.31.221","metric":286},{"destination":"192.168.31.221","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.31.221","metric":286},{"destination":"192.168.31.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.31.221","metric":286},{"destination":"192.168.216.0","genmask":"255.255.255.0","gateway":"On-link","iface":"192.168.216.1","metric":291},{"destination":"192.168.216.1","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.216.1","metric":291},{"destination":"192.168.216.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.216.1","metric":291},{"destination":"192.168.234.0","genmask":"255.255.255.0","gateway":"On-link","iface":"192.168.234.1","metric":291},{"destination":"192.168.234.1","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.234.1","metric":291},{"destination":"192.168.234.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.234.1","metric":291},{"destination":"192.168.255.0","genmask":"255.255.255.0","gateway":"On-link","iface":"192.168.255.1","metric":291},{"destination":"192.168.255.1","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.255.1","metric":291},{"destination":"192.168.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.255.1","metric":291},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"127.0.0.1","metric":331},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"172.17.96.1","metric":5256},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"192.168.234.1","metric":291},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"192.168.255.1","metric":291},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"192.168.24.1","metric":291},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"192.168.216.1","metric":291},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"192.168.31.221","metric":286},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"172.26.240.1","metric":271},{"destination":"224.0.0.0","genmask":"240.0.0.0","gateway":"On-link","iface":"172.27.128.1","metric":271},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"127.0.0.1","metric":331},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.17.96.1","metric":5256},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.234.1","metric":291},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.255.1","metric":291},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.24.1","metric":291},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.216.1","metric":291},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"192.168.31.221","metric":286},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.26.240.1","metric":271},{"destination":"255.255.255.255","genmask":"255.255.255.255","gateway":"On-link","iface":"172.27.128.1","metric":271},{"network":"157.0.0.0","address":"255.0.0.0","genmask":"157.55.80.1","gateway":"3"},{"iface":"1","metric":331,"destination":"::1/128","gateway":"On-link"},{"iface":"57","metric":5256,"destination":"fe80::/64","gateway":"On-link"},{"iface":"14","metric":291,"destination":"fe80::/64","gateway":"On-link"},{"iface":"11","metric":291,"destination":"fe80::/64","gateway":"On-link"},{"iface":"21","metric":291,"destination":"fe80::/64","gateway":"On-link"},{"iface":"22","metric":291,"destination":"fe80::/64","gateway":"On-link"},{"iface":"9","metric":286,"destination":"fe80::/64","gateway":"On-link"},{"iface":"52","metric":271,"destination":"fe80::/64","gateway":"On-link"},{"iface":"64","metric":271,"destination":"fe80::/64","gateway":"On-link"},{"iface":"9","metric":286,"destination":"fe80::244e:2f1e:2096:62b2/128","gateway":"On-link"},{"iface":"21","metric":291,"destination":"fe80::36de:3306:84b0:6717/128","gateway":"On-link"},{"iface":"52","metric":271,"destination":"fe80::8bd5:17a8:5e7d:9a50/128","gateway":"On-link"},{"iface":"57","metric":5256,"destination":"fe80::a625:de92:858:a42a/128","gateway":"On-link"},{"iface":"22","metric":291,"destination":"fe80::af17:660e:b87c:eb22/128","gateway":"On-link"},{"iface":"11","metric":291,"destination":"fe80::d586:c72e:e178:1147/128","gateway":"On-link"},{"iface":"14","metric":291,"destination":"fe80::d8df:ceee:28ba:aad/128","gateway":"On-link"},{"iface":"64","metric":271,"destination":"fe80::f5d1:8bf7:c410:e325/128","gateway":"On-link"},{"iface":"1","metric":331,"destination":"ff00::/8","gateway":"On-link"},{"iface":"57","metric":5256,"destination":"ff00::/8","gateway":"On-link"},{"iface":"14","metric":291,"destination":"ff00::/8","gateway":"On-link"},{"iface":"11","metric":291,"destination":"ff00::/8","gateway":"On-link"},{"iface":"21","metric":291,"destination":"ff00::/8","gateway":"On-link"},{"iface":"22","metric":291,"destination":"ff00::/8","gateway":"On-link"},{"iface":"9","metric":286,"destination":"ff00::/8","gateway":"On-link"},{"iface":"52","metric":271,"destination":"ff00::/8","gateway":"On-link"},{"iface":"64","metric":271,"destination":"ff00::/8","gateway":"On-link"}]
\ No newline at end of file
diff --git a/tests/fixtures/windows/windows-10/route.out b/tests/fixtures/windows/windows-10/route.out
new file mode 100644
index 00000000..b115eebc
--- /dev/null
+++ b/tests/fixtures/windows/windows-10/route.out
@@ -0,0 +1,111 @@
+===========================================================================
+Interface List
+  8...00 ff 58 60 5f 61 ......TAP-Windows Adapter V9
+ 52...00 15 5d fd 0d 45 ......Hyper-V Virtual Ethernet Adapter
+ 64...00 15 5d 14 4d b0 ......Hyper-V Virtual Ethernet Adapter #3
+ 22...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
+ 11...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
+ 14...00 50 56 c0 00 02 ......VMware Virtual Ethernet Adapter for VMnet2
+ 21...00 50 56 c0 00 0b ......VMware Virtual Ethernet Adapter for VMnet11
+  1...........................Software Loopback Interface 1
+ 57...00 15 5d 0e f1 0f ......Hyper-V Virtual Ethernet Adapter #2
+===========================================================================
+
+IPv4 Route Table
+===========================================================================
+Active Routes:
+Network Destination        Netmask          Gateway       Interface  Metric
+          0.0.0.0          0.0.0.0     192.168.31.1   192.168.31.221     30
+        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
+        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
+  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
+        157.0.0.0        255.0.0.0      157.55.80.1        127.0.0.1     78
+      172.17.96.0    255.255.240.0         On-link       172.17.96.1   5256
+      172.17.96.1  255.255.255.255         On-link       172.17.96.1   5256
+   172.17.111.255  255.255.255.255         On-link       172.17.96.1   5256
+     172.26.240.0    255.255.240.0         On-link      172.26.240.1    271
+     172.26.240.1  255.255.255.255         On-link      172.26.240.1    271
+   172.26.255.255  255.255.255.255         On-link      172.26.240.1    271
+     172.27.128.0    255.255.240.0         On-link      172.27.128.1    271
+     172.27.128.1  255.255.255.255         On-link      172.27.128.1    271
+   172.27.143.255  255.255.255.255         On-link      172.27.128.1    271
+     192.168.24.0    255.255.255.0         On-link      192.168.24.1    291
+     192.168.24.1  255.255.255.255         On-link      192.168.24.1    291
+   192.168.24.255  255.255.255.255         On-link      192.168.24.1    291
+     192.168.31.0    255.255.255.0         On-link    192.168.31.221    286
+   192.168.31.221  255.255.255.255         On-link    192.168.31.221    286
+   192.168.31.255  255.255.255.255         On-link    192.168.31.221    286
+    192.168.216.0    255.255.255.0         On-link     192.168.216.1    291
+    192.168.216.1  255.255.255.255         On-link     192.168.216.1    291
+  192.168.216.255  255.255.255.255         On-link     192.168.216.1    291
+    192.168.234.0    255.255.255.0         On-link     192.168.234.1    291
+    192.168.234.1  255.255.255.255         On-link     192.168.234.1    291
+  192.168.234.255  255.255.255.255         On-link     192.168.234.1    291
+    192.168.255.0    255.255.255.0         On-link     192.168.255.1    291
+    192.168.255.1  255.255.255.255         On-link     192.168.255.1    291
+  192.168.255.255  255.255.255.255         On-link     192.168.255.1    291
+        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
+        224.0.0.0        240.0.0.0         On-link       172.17.96.1   5256
+        224.0.0.0        240.0.0.0         On-link     192.168.234.1    291
+        224.0.0.0        240.0.0.0         On-link     192.168.255.1    291
+        224.0.0.0        240.0.0.0         On-link      192.168.24.1    291
+        224.0.0.0        240.0.0.0         On-link     192.168.216.1    291
+        224.0.0.0        240.0.0.0         On-link    192.168.31.221    286
+        224.0.0.0        240.0.0.0         On-link      172.26.240.1    271
+        224.0.0.0        240.0.0.0         On-link      172.27.128.1    271
+  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
+  255.255.255.255  255.255.255.255         On-link       172.17.96.1   5256
+  255.255.255.255  255.255.255.255         On-link     192.168.234.1    291
+  255.255.255.255  255.255.255.255         On-link     192.168.255.1    291
+  255.255.255.255  255.255.255.255         On-link      192.168.24.1    291
+  255.255.255.255  255.255.255.255         On-link     192.168.216.1    291
+  255.255.255.255  255.255.255.255         On-link    192.168.31.221    286
+  255.255.255.255  255.255.255.255         On-link      172.26.240.1    271
+  255.255.255.255  255.255.255.255         On-link      172.27.128.1    271
+===========================================================================
+Persistent Routes:
+  Network Address          Netmask  Gateway Address  Metric
+        157.0.0.0        255.0.0.0      157.55.80.1       3
+===========================================================================
+
+IPv6 Route Table
+===========================================================================
+Active Routes:
+ If Metric Network Destination      Gateway
+  1    331 ::1/128                  On-link
+ 57   5256 fe80::/64                On-link
+ 14    291 fe80::/64                On-link
+ 11    291 fe80::/64                On-link
+ 21    291 fe80::/64                On-link
+ 22    291 fe80::/64                On-link
+  9    286 fe80::/64                On-link
+ 52    271 fe80::/64                On-link
+ 64    271 fe80::/64                On-link
+  9    286 fe80::244e:2f1e:2096:62b2/128
+                                    On-link
+ 21    291 fe80::36de:3306:84b0:6717/128
+                                    On-link
+ 52    271 fe80::8bd5:17a8:5e7d:9a50/128
+                                    On-link
+ 57   5256 fe80::a625:de92:858:a42a/128
+                                    On-link
+ 22    291 fe80::af17:660e:b87c:eb22/128
+                                    On-link
+ 11    291 fe80::d586:c72e:e178:1147/128
+                                    On-link
+ 14    291 fe80::d8df:ceee:28ba:aad/128
+                                    On-link
+ 64    271 fe80::f5d1:8bf7:c410:e325/128
+                                    On-link
+  1    331 ff00::/8                 On-link
+ 57   5256 ff00::/8                 On-link
+ 14    291 ff00::/8                 On-link
+ 11    291 ff00::/8                 On-link
+ 21    291 ff00::/8                 On-link
+ 22    291 ff00::/8                 On-link
+  9    286 ff00::/8                 On-link
+ 52    271 ff00::/8                 On-link
+ 64    271 ff00::/8                 On-link
+===========================================================================
+Persistent Routes:
+  None
diff --git a/tests/test_bluetoothctl.py b/tests/test_bluetoothctl.py
index 34d30c8f..937f5616 100644
--- a/tests/test_bluetoothctl.py
+++ b/tests/test_bluetoothctl.py
@@ -181,6 +181,47 @@ class BluetoothctlTests(unittest.TestCase):
             for k, v in expected.items():
                 self.assertEqual(v, actual[0][k], f"Device regex failed on {k}")
 
+    def test_bluetoothctl_device_random(self):
+        """
+        Test 'bluetoothctl' with device random
+        """
+
+        with open("tests/fixtures/generic/bluetoothctl_device_random.out", "r") as f:
+            output = f.read()
+
+        actual = parse(output, quiet=True)
+
+        self.assertIsNotNone(actual)
+        self.assertIsNotNone(actual[0])
+
+        expected = {
+            "address": "DF:1C:C3:B4:1A:1F",
+            "is_random": True,
+            "name": "M585/M590",
+            "alias": "M585/M590",
+            "appearance": "0x03c2",
+            "icon": "input-mouse",
+            "paired": "yes",
+            "bonded": "yes",
+            "trusted": "no",
+            "blocked": "no",
+            "connected": "no",
+            "legacy_pairing": "no",
+            "uuids": [
+                "Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)",
+                "Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)",
+                "Device Information        (0000180a-0000-1000-8000-00805f9b34fb)",
+                "Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)",
+                "Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)",
+                "Vendor specific           (00010000-0000-1000-8000-011f2000046d)"
+            ],
+            "modalias": "usb:v046DpB01Bd0011"
+        }
+
+        if actual:
+            for k, v in expected.items():
+                self.assertEqual(v, actual[0][k], f"Device regex failed on {k}")
+
     def test_bluetoothctl_devices(self):
         """
         Test 'bluetoothctl' with devices
diff --git a/tests/test_dig.py b/tests/test_dig.py
index b7b6eb9d..947687fd 100644
--- a/tests/test_dig.py
+++ b/tests/test_dig.py
@@ -85,6 +85,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/dig-edns3.out'), 'r', encoding='utf-8') as f:
         generic_dig_edns3 = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/dig-nsid.out'), 'r', encoding='utf-8') as f:
+        generic_dig_nsid = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/dig.json'), 'r', encoding='utf-8') as f:
         centos_7_7_dig_json = json.loads(f.read())
@@ -155,6 +158,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/dig-edns3.json'), 'r', encoding='utf-8') as f:
         generic_dig_edns3_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/dig-nsid.json'), 'r', encoding='utf-8') as f:
+        generic_dig_nsid_json = json.loads(f.read())
+
 
     def test_dig_nodata(self):
         """
@@ -300,6 +306,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.dig.parse(self.generic_dig_edns3, quiet=True), self.generic_dig_edns3_json)
 
+    def test_dig_nsid(self):
+        """
+        Test 'dig' with nsid info
+        """
+        self.assertEqual(jc.parsers.dig.parse(self.generic_dig_nsid, quiet=True), self.generic_dig_nsid_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_last.py b/tests/test_last.py
index 89880bd1..6800b338 100644
--- a/tests/test_last.py
+++ b/tests/test_last.py
@@ -52,6 +52,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/last-wF.out'), 'r', encoding='utf-8') as f:
         centos_7_7_last_wF = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/last-wixF.out'), 'r', encoding='utf-8') as f:
+        centos_7_7_last_wixF = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/last.json'), 'r', encoding='utf-8') as f:
         centos_7_7_last_json = json.loads(f.read())
@@ -89,6 +92,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/last-wF.json'), 'r', encoding='utf-8') as f:
         centos_7_7_last_wF_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/last-wixF.json'), 'r', encoding='utf-8') as f:
+        centos_7_7_last_wixF_json = json.loads(f.read())
+
 
     def test_last_nodata(self):
         """
@@ -168,6 +174,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.last.parse(self.centos_7_7_last_wF, quiet=True), self.centos_7_7_last_wF_json)
 
+    def test_last_wixF_centos_7_7(self):
+        """
+        Test 'last -wixF' on Centos 7.7
+        """
+        self.assertEqual(jc.parsers.last.parse(self.centos_7_7_last_wixF, quiet=True), self.centos_7_7_last_wixF_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_lsattr.py b/tests/test_lsattr.py
new file mode 100644
index 00000000..8e74193b
--- /dev/null
+++ b/tests/test_lsattr.py
@@ -0,0 +1,56 @@
+import os
+import json
+import unittest
+import jc.parsers.lsattr
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+
+
+class MyTests(unittest.TestCase):
+
+    # input
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr-error.out'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr_error = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr-R.out'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr_R = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr.out'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr = f.read()
+
+    # output
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr-error.json'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr_error_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr-R.json'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr_R_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/lsattr.json'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_lsattr_json = json.loads(f.read())
+
+    def test_lsattr_nodata(self):
+        """
+        Test 'lsattr' with no data
+        """
+        self.assertEqual(jc.parsers.lsattr.parse('', quiet=True), [])
+
+    def test_lsattr_error(self):
+        """
+        Test 'lsattr' with permission error
+        """
+        self.assertEqual(jc.parsers.lsattr.parse(self.ubuntu_20_4_lsattr_error, quiet=True), self.ubuntu_20_4_lsattr_error_json)
+
+    def test_lsattr_R_ubuntu_20_4(self):
+        """
+        Test 'sudo lsattr -R' on Ubuntu 20.4
+        """
+        self.assertEqual(jc.parsers.lsattr.parse(self.ubuntu_20_4_lsattr_R, quiet=True), self.ubuntu_20_4_lsattr_R_json)
+
+    def test_lsattr_ubuntu_20_4(self):
+        """
+        Test 'sudo lsattr' on Ubuntu 20.4
+        """
+        self.assertEqual(jc.parsers.lsattr.parse(self.ubuntu_20_4_lsattr, quiet=True), self.ubuntu_20_4_lsattr_json)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/test_netstat.py b/tests/test_netstat.py
index 209cfb85..f8e53985 100644
--- a/tests/test_netstat.py
+++ b/tests/test_netstat.py
@@ -76,6 +76,18 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/netstat-old.out'), 'r', encoding='utf-8') as f:
         generic_netstat_old = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat.out'), 'r', encoding='utf-8') as f:
+        windows_netstat = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-an.out'), 'r', encoding='utf-8') as f:
+        windows_netstat_an = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-aon.out'), 'r', encoding='utf-8') as f:
+        windows_netstat_aon = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-aonb.out'), 'r', encoding='utf-8') as f:
+        windows_netstat_aonb = f.read()
+
     # netstat -r
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/netstat-r.out'), 'r', encoding='utf-8') as f:
         centos_7_7_netstat_r = f.read()
@@ -188,6 +200,18 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/netstat-old.json'), 'r', encoding='utf-8') as f:
         generic_netstat_old_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat.json'), 'r', encoding='utf-8') as f:
+        windows_netstat_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-an.json'), 'r', encoding='utf-8') as f:
+        windows_netstat_an_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-aon.json'), 'r', encoding='utf-8') as f:
+        windows_netstat_aon_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/netstat-aonb.json'), 'r', encoding='utf-8') as f:
+        windows_netstat_aonb_json = json.loads(f.read())
+
     # netsat -r
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/netstat-r.json'), 'r', encoding='utf-8') as f:
         centos_7_7_netstat_r_json = json.loads(f.read())
@@ -449,6 +473,29 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.netstat.parse(self.freebsd12_netstat_ib, quiet=True), self.freebsd12_netstat_ib_json)
 
+    def test_netstat_windows(self):
+        """
+        Test 'netstat' on Windows
+        """
+        self.assertEqual(jc.parsers.netstat.parse(self.windows_netstat, quiet=True), self.windows_netstat_json)
+
+    def test_netstat_an_windows(self):
+        """
+        Test 'netstat -an' on Windows
+        """
+        self.assertEqual(jc.parsers.netstat.parse(self.windows_netstat_an, quiet=True), self.windows_netstat_an_json)
+
+    def test_netstat_aon_windows(self):
+        """
+        Test 'netstat -aon' on Windows
+        """
+        self.assertEqual(jc.parsers.netstat.parse(self.windows_netstat_aon, quiet=True), self.windows_netstat_aon_json)
+
+    def test_netstat_aonb_windows(self):
+        """
+        Test 'netstat -aonb' on Windows
+        """
+        self.assertEqual(jc.parsers.netstat.parse(self.windows_netstat_aonb, quiet=True), self.windows_netstat_aonb_json)
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_ping.py b/tests/test_ping.py
index 0e10d317..340437c1 100644
--- a/tests/test_ping.py
+++ b/tests/test_ping.py
@@ -50,6 +50,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-ip-O-unparsedlines.out'), 'r', encoding='utf-8') as f:
         centos_7_7_ping_ip_O_unparsedlines = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-missing-hostname.out'), 'r', encoding='utf-8') as f:
+        centos_7_7_ping_missing_hostname = f.read()
+
     # ubuntu
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ping-ip-O.out'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ping_ip_O = f.read()
@@ -251,6 +254,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-ip-O-unparsedlines.json'), 'r', encoding='utf-8') as f:
         centos_7_7_ping_ip_O_unparsedlines_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-missing-hostname.json'), 'r', encoding='utf-8') as f:
+        centos_7_7_ping_missing_hostname_json = json.loads(f.read())
+
     # ubunutu
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ping-ip-O.json'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ping_ip_O_json = json.loads(f.read())
@@ -801,6 +807,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.ping.parse(self.alpine_linux_3_13_ping_hostname, quiet=True), self.alpine_linux_3_13_ping_hostname_json)
 
+    def test_ping_missing_hostname(self):
+        """
+        Test 'ping' with missing hostname on linux
+        """
+        self.assertEqual(jc.parsers.ping.parse(self.centos_7_7_ping_missing_hostname, quiet=True), self.centos_7_7_ping_missing_hostname_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_ping_s.py b/tests/test_ping_s.py
index 55377fea..76a9bc3f 100644
--- a/tests/test_ping_s.py
+++ b/tests/test_ping_s.py
@@ -55,6 +55,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-ip-O-unparsedlines.out'), 'r', encoding='utf-8') as f:
         centos_7_7_ping_ip_O_unparsedlines = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-missing-hostname.out'), 'r', encoding='utf-8') as f:
+        centos_7_7_ping_missing_hostname = f.read()
+
     # ubuntu
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ping-ip-O.out'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ping_ip_O = f.read()
@@ -246,6 +249,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping6-ip-dup-streaming.json'), 'r', encoding='utf-8') as f:
         centos_7_7_ping6_ip_dup_streaming_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ping-missing-hostname-streaming.json'), 'r', encoding='utf-8') as f:
+        centos_7_7_ping_missing_hostname_json = json.loads(f.read())
+
     # ubunutu
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ping-ip-O-streaming.json'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ping_ip_O_streaming_json = json.loads(f.read())
@@ -799,6 +805,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(list(jc.parsers.ping_s.parse(self.pi_ping_ip_O_D.splitlines(), quiet=True)), self.pi_ping_ip_O_D_streaming_json)
 
+    def test_ping_s_missing_hostname(self):
+        """
+        Test 'ping' with missing hostname on linux
+        """
+        self.assertEqual(list(jc.parsers.ping_s.parse(self.centos_7_7_ping_missing_hostname.splitlines(), quiet=True)), self.centos_7_7_ping_missing_hostname_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_route.py b/tests/test_route.py
index 5a7c1933..5dd84813 100644
--- a/tests/test_route.py
+++ b/tests/test_route.py
@@ -30,6 +30,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/route-6-n.out'), 'r', encoding='utf-8') as f:
         centos_7_7_route_6_n = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/route.out'), 'r', encoding='utf-8') as f:
+        windows_route = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/route.json'), 'r', encoding='utf-8') as f:
         centos_7_7_route_json = json.loads(f.read())
@@ -52,6 +55,8 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/route-6-n.json'), 'r', encoding='utf-8') as f:
         centos_7_7_route_6_n_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows/windows-10/route.json'), 'r', encoding='utf-8') as f:
+        windows_route_route_json = json.loads(f.read())
 
     def test_route_nodata(self):
         """
@@ -101,6 +106,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.route.parse(self.centos_7_7_route_6_n, quiet=True), self.centos_7_7_route_6_n_json)
 
+    def test_route_windows(self):
+        """
+        Test 'route print' on Windows
+        """
+        self.assertEqual(jc.parsers.route.parse(self.windows_route, quiet=True), self.windows_route_route_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_srt.py b/tests/test_srt.py
new file mode 100644
index 00000000..a134d519
--- /dev/null
+++ b/tests/test_srt.py
@@ -0,0 +1,58 @@
+import os
+import unittest
+import json
+import jc.parsers.srt
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+
+class MyTests(unittest.TestCase):
+
+    # input
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/srt-attack_of_the_clones.srt'), 'r', encoding='utf-8') as f:
+        generic_attack_of_the_clones = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/srt-complex.srt'), 'r', encoding='utf-8') as f:
+        generic_complex = f.read()
+
+    # output
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/srt-attack_of_the_clones_raw.json'), 'r', encoding='utf-8') as f:
+        generic_attack_of_the_clones_raw_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/srt-attack_of_the_clones.json'), 'r', encoding='utf-8') as f:
+        generic_attack_of_the_clones_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/srt-complex.json'), 'r', encoding='utf-8') as f:
+        generic_complex_json = json.loads(f.read())
+
+    def test_srt_nodata(self):
+        """
+        Test srt parser with no data
+        """
+        self.assertEqual(jc.parsers.srt.parse('', quiet=True), [])
+
+    def test_srt_nodata_r(self):
+        """
+        Test srt parser with no data and raw output
+        """
+        self.assertEqual(jc.parsers.srt.parse('', raw=True, quiet=True), [])
+
+    def test_srt_attack_of_the_clones_raw(self):
+        """
+        Test the attack of the clones srt file without post processing
+        """
+        self.assertEqual(jc.parsers.srt.parse(self.generic_attack_of_the_clones, raw=True, quiet=True), self.generic_attack_of_the_clones_raw_json)
+
+    def test_srt_attack_of_the_clones(self):
+        """
+        Test the attack of the clones srt file
+        """
+        self.assertEqual(jc.parsers.srt.parse(self.generic_attack_of_the_clones, quiet=True), self.generic_attack_of_the_clones_json)
+
+    def test_srt_complex(self):
+        """
+        Test a complex srt file
+        """
+        self.assertEqual(jc.parsers.srt.parse(self.generic_complex, quiet=True), self.generic_complex_json)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/test_ss.py b/tests/test_ss.py
index fc370c4e..4d2fa92e 100644
--- a/tests/test_ss.py
+++ b/tests/test_ss.py
@@ -15,6 +15,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-a.out'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ss_sudo_a = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.out'), 'r', encoding='utf-8') as f:
+        ubuntu_18_4_ss_sudo_tulpen = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ss-sudo-a.json'), 'r', encoding='utf-8') as f:
         centos_7_7_ss_sudo_a_json = json.loads(f.read())
@@ -22,6 +25,8 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-a.json'), 'r', encoding='utf-8') as f:
         ubuntu_18_4_ss_sudo_a_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.json'), 'r', encoding='utf-8') as f:
+        ubuntu_18_4_ss_sudo_tulpen_json = json.loads(f.read())
 
     def test_ss_nodata(self):
         """
@@ -41,6 +46,11 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.ss.parse(self.ubuntu_18_4_ss_sudo_a, quiet=True), self.ubuntu_18_4_ss_sudo_a_json)
 
+    def test_ss_sudo_tulpen_ubuntu_18_4(self):
+        """
+        Test 'sudo ss -tulpen' on Ubuntu 18.4
+        """
+        self.assertEqual(jc.parsers.ss.parse(self.ubuntu_18_4_ss_sudo_tulpen, quiet=True), self.ubuntu_18_4_ss_sudo_tulpen_json)
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_stat.py b/tests/test_stat.py
index 0e748f68..00d348ad 100644
--- a/tests/test_stat.py
+++ b/tests/test_stat.py
@@ -31,6 +31,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/stat.out'), 'r', encoding='utf-8') as f:
         freebsd12_stat = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/stat-missing-data.out'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_stat_missing_data = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/stat.json'), 'r', encoding='utf-8') as f:
         centos_7_7_stat_json = json.loads(f.read())
@@ -47,6 +50,8 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/stat.json'), 'r', encoding='utf-8') as f:
         freebsd12_stat_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-20.04/stat-missing-data.json'), 'r', encoding='utf-8') as f:
+        ubuntu_20_4_stat_missing_data_json = json.loads(f.read())
 
     def test_stat_nodata(self):
         """
@@ -84,6 +89,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.stat.parse(self.freebsd12_stat, quiet=True), self.freebsd12_stat_json)
 
+    def test_stat_missing_data(self):
+        """
+        Test 'stat /etc/passwd' with missing data.
+        """
+        self.assertEqual(jc.parsers.stat.parse(self.ubuntu_20_4_stat_missing_data, quiet=True), self.ubuntu_20_4_stat_missing_data_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_veracrypt.py b/tests/test_veracrypt.py
new file mode 100644
index 00000000..1abdbf1b
--- /dev/null
+++ b/tests/test_veracrypt.py
@@ -0,0 +1,196 @@
+import json
+import re
+import unittest
+
+from jc.parsers.veracrypt import (
+    _volume_line_pattern,
+    _volume_verbose_pattern,
+    _parse_volume,
+    Volume,
+    parse,
+)
+
+
+class VeracryptTests(unittest.TestCase):
+    def test_veracrypt_nodata(self):
+        """
+        Test 'veracrypt' with no data
+        """
+
+        output=''
+        self.assertEqual(parse(output, quiet=True), [])
+
+    def test_veracrypt_invalid_call(self):
+        """
+        Test 'veracrypt' with output from invalid call
+        """
+
+        output='Invalid command: foo'
+        self.assertEqual(parse(output, quiet=True), [])
+
+    def test_veracrypt_no_mounted_volumes(self):
+        """
+        Test 'veracrypt' with no mounted volumes
+        """
+
+        output='Error: No volumes mounted.'
+        self.assertEqual(parse(output, quiet=True), [])
+
+    def test_veracrypt_list_volumes(self):
+        """
+        Test 'veracrypt' list volumes
+        """
+
+        output = "1: /dev/sdb1 /dev/mapper/veracrypt1 /home/bob/mount/encrypt/sdb1\n"
+        output += "2: /dev/sdb2 /dev/mapper/veracrypt2 /home/bob/mount/encrypt/sdb2"
+
+        actual = parse(output, quiet=True)
+
+        self.assertIsNotNone(actual)
+        self.assertIsNotNone(actual[0])
+        self.assertIsNotNone(actual[1])
+
+        expected = [
+            {
+                "slot": 1,
+                "path": "/dev/sdb1",
+                "device": "/dev/mapper/veracrypt1",
+                "mountpoint": "/home/bob/mount/encrypt/sdb1"
+            },
+            {
+                "slot": 2,
+                "path": "/dev/sdb2",
+                "device": "/dev/mapper/veracrypt2",
+                "mountpoint": "/home/bob/mount/encrypt/sdb2"
+            }
+        ]
+
+        if actual:
+            for k, v in expected[0].items():
+                self.assertEqual(v, actual[0][k], f"Volume regex failed on {k}")
+
+            for k, v in expected[1].items():
+                self.assertEqual(v, actual[1][k], f"Volume regex failed on {k}")
+
+    def test_veracrypt_verbose_list_volumes(self):
+        """
+        Test 'veracrypt' list volumes in verbose mode
+        """
+
+        with open("tests/fixtures/generic/veracrypt_verbose_list_volumes.out", "r") as f:
+            output = f.read()
+
+        actual = parse(output, quiet=True)
+
+        self.assertIsNotNone(actual)
+        self.assertIsNotNone(actual[0])
+        self.assertIsNotNone(actual[1])
+
+        expected = [
+            {
+                "slot": 1,
+                "path": "/dev/sdb1",
+                "device": "/dev/mapper/veracrypt1",
+                "mountpoint": "/home/bob/mount/encrypt/sdb1",
+                "size": "498 MiB",
+                "type": "Normal",
+                "readonly": "No",
+                "hidden_protected": "No",
+                "encryption_algo": "AES",
+                "pk_size": "256 bits",
+                "sk_size": "256 bits",
+                "block_size": "128 bits",
+                "mode": "XTS",
+                "prf": "HMAC-SHA-512",
+                "format_version": 2,
+                "backup_header": "Yes"
+            },
+            {
+                "slot": 2,
+                "path": "/dev/sdb2",
+                "device": "/dev/mapper/veracrypt2",
+                "mountpoint": "/home/bob/mount/encrypt/sdb2",
+                "size": "522 MiB",
+                "type": "Normal",
+                "readonly": "No",
+                "hidden_protected": "No",
+                "encryption_algo": "AES",
+                "pk_size": "256 bits",
+                "sk_size": "256 bits",
+                "block_size": "128 bits",
+                "mode": "XTS",
+                "prf": "HMAC-SHA-512",
+                "format_version": 2,
+                "backup_header": "Yes"
+            }
+        ]
+
+        if actual:
+            for k, v in expected[0].items():
+                self.assertEqual(v, actual[0][k], f"Volume regex failed on {k}")
+
+            for k, v in expected[1].items():
+                self.assertEqual(v, actual[1][k], f"Volume regex failed on {k}")
+
+    def test_veracrypt_verbose_list_volumes_unknown_fields(self):
+        """
+        Test 'veracrypt' list volumes with unknown fields in verbose mode
+        """
+
+        with open("tests/fixtures/generic/veracrypt_verbose_list_volumes_unknown_fields.out", "r") as f:
+            output = f.read()
+
+        actual = parse(output, quiet=True)
+
+        self.assertIsNotNone(actual)
+        self.assertIsNotNone(actual[0])
+        self.assertIsNotNone(actual[1])
+
+        expected = [
+            {
+                "slot": 1,
+                "path": "/dev/sdb1",
+                "device": "/dev/mapper/veracrypt1",
+                "mountpoint": "/home/bob/mount/encrypt/sdb1",
+                "size": "498 MiB",
+                "type": "Normal",
+                "readonly": "No",
+                "hidden_protected": "No",
+                "encryption_algo": "AES",
+                "pk_size": "256 bits",
+                "sk_size": "256 bits",
+                "block_size": "128 bits",
+                "mode": "XTS",
+                "prf": "HMAC-SHA-512",
+                "format_version": 2,
+                "backup_header": "Yes"
+            },
+            {
+                "slot": 2,
+                "path": "/dev/sdb2",
+                "device": "/dev/mapper/veracrypt2",
+                "mountpoint": "/home/bob/mount/encrypt/sdb2",
+                "size": "522 MiB",
+                "type": "Normal",
+                "readonly": "No",
+                "hidden_protected": "No",
+                "encryption_algo": "AES",
+                "pk_size": "256 bits",
+                "sk_size": "256 bits",
+                "block_size": "128 bits",
+                "mode": "XTS",
+                "prf": "HMAC-SHA-512",
+                "format_version": 2,
+                "backup_header": "Yes"
+            }
+        ]
+
+        if actual:
+            for k, v in expected[0].items():
+                self.assertEqual(v, actual[0][k], f"Volume regex failed on {k}")
+
+            for k, v in expected[1].items():
+                self.assertEqual(v, actual[1][k], f"Volume regex failed on {k}")
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/test_x509_cert.py b/tests/test_x509_cert.py
index 0695015f..995260a8 100644
--- a/tests/test_x509_cert.py
+++ b/tests/test_x509_cert.py
@@ -24,6 +24,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-string-serialnumber.der'), 'rb') as f:
         x509_string_serialnumber = f.read()
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-cert-bad-email.pem'), 'rb') as f:
+        x509_cert_bad_email = f.read()
+
     # output
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-ca-cert.json'), 'r', encoding='utf-8') as f:
         x509_ca_cert_json = json.loads(f.read())
@@ -40,6 +43,9 @@ class MyTests(unittest.TestCase):
     with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-string-serialnumber.json'), 'r', encoding='utf-8') as f:
         x509_string_serialnumber_json = json.loads(f.read())
 
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-cert-bad-email.json'), 'r', encoding='utf-8') as f:
+        x509_cert_bad_email_json = json.loads(f.read())
+
 
     def test_x509_cert_nodata(self):
         """
@@ -77,6 +83,12 @@ class MyTests(unittest.TestCase):
         """
         self.assertEqual(jc.parsers.x509_cert.parse(self.x509_multi_cert, quiet=True), self.x509_multi_cert_json)
 
+    def test_x509_cert_bad_email(self):
+        """
+        Test 'cat x509-cert-bad-email.pem' (PEM file with a non-compliant email address)
+        """
+        self.assertEqual(jc.parsers.x509_cert.parse(self.x509_cert_bad_email, quiet=True), self.x509_cert_bad_email_json)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_x509_csr.py b/tests/test_x509_csr.py
new file mode 100644
index 00000000..06e85033
--- /dev/null
+++ b/tests/test_x509_csr.py
@@ -0,0 +1,59 @@
+import os
+import unittest
+import json
+import jc.parsers.x509_csr
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+
+
+class MyTests(unittest.TestCase):
+
+    # input
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr.der'), 'rb') as f:
+        x509_csr_der = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr.pem'), 'r', encoding='utf-8') as f:
+        x509_csr_pem = f.read()
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr-windows.pem'), 'r', encoding='utf-8') as f:
+        x509_csr_windows_pem = f.read()
+
+    # output
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr-der.json'), 'r', encoding='utf-8') as f:
+        x509_csr_der_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr.json'), 'r', encoding='utf-8') as f:
+        x509_csr_pem_json = json.loads(f.read())
+
+    with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/x509-csr-windows.json'), 'r', encoding='utf-8') as f:
+        x509_csr_windows_pem_json = json.loads(f.read())
+
+
+    def test_x509_csr_nodata(self):
+        """
+        Test 'x509_csr' with no data
+        """
+        self.assertEqual(jc.parsers.x509_csr.parse('', quiet=True), [])
+
+    def test_x509_csr_der(self):
+        """
+        Test csr file in DER format
+        """
+        self.assertEqual(jc.parsers.x509_csr.parse(self.x509_csr_der, quiet=True), self.x509_csr_der_json)
+
+    def test_x509_csr_pem(self):
+        """
+        Test csr file in PEM format
+        """
+        self.assertEqual(jc.parsers.x509_csr.parse(self.x509_csr_pem, quiet=True), self.x509_csr_pem_json)
+
+    def test_x509_csr_windows(self):
+        """
+        Test Windows csr file in PEM format
+        """
+        self.maxDiff = None
+        self.assertEqual(jc.parsers.x509_csr.parse(self.x509_csr_windows_pem, quiet=True), self.x509_csr_windows_pem_json)
+
+
+if __name__ == '__main__':
+    unittest.main()