# BEH:Wiki

# Headless sourcing-fähige Snippets

Hier werden kleine Helferscripte vorgeführt, die in Scripten included oder per if-then abgefragt werden können.

# mailer (Bash)

Dieser Mailer schickt einfach eine Mail vom System aus. Dabei muss darauf geachtet werden, dass der Server Mails versenden kann mit "mail". Es schickt je nach Einstellung eine Text-Mail oder Mail mit Anhang. Der Rückgabewert besagt, ob die Mail erfolgreich versendet wurde - oder nicht.  
Eigener Anwendungsfall: Einfacher Text, Bestätigungscode, Link, Nachricht.

HOWTO:

```bash
$0 -f "/var/file.png" -e mail@domain.tld -s "Betreff"
$0 -t "Text" -m mail@domain.tld -s "Betreff"
# -e ODER -m = Mailadresse
```

Beispiel:

```bash
# Direktaufruf (Tests)
mailer.sh -e "mail@domain.tld" -s "Testbetreff" -t "Hallo, ich bin ein Test!"

# im Script

empfaenger="mail@domain.tld"
betreff="Testbetreff"
nachricht="Hallo, ich bin ein Test!"

if bash lib/mailer.sh -e "$empfaenger" -s "$betreff" -t "$nachricht"; then
    echo "Mail erfolgreich gesendet"
else
    echo "Fehler beim Mailversand"
fi
```

Script:

```bash
#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
        -f) file="$2"; shift 2 ;;
        -t) text="$2"; shift 2 ;;
        -e|-m) mail="$2"; shift 2 ;;
        -s) subj="$2"; shift 2 ;;
    esac
done

if [ -z "$mail" ] || [ -z "$subj" ]; then
    echo "ERROR"
    exit 1
fi

if [ -n "$file" ] && [ -z "$text" ]; then
    cat "$file" | mail -s "$subj" "$mail"

elif [ -n "$text" ] && [ -z "$file" ]; then
    echo "$text" | mail -s "$subj" "$mail"

else
    echo "ERROR"
    exit 1
fi

exit 0
```

# mailer (Python3)

Dieser Mailer schickt einfach eine Mail vom System aus. Dabei muss darauf geachtet werden, dass der Server Mails versenden kann mit "mail". Es schickt je nach Einstellung eine Text-Mail oder Mail mit Anhang. Der Rückgabewert besagt, ob die Mail erfolgreich versendet wurde - oder nicht.  
Eigener Anwendungsfall: Einfacher Text, Bestätigungscode, Link, Nachricht.

HOWTO:

```python
python3 $0 -f "/var/file.png" -e mail@domain.tld -s "Betreff"
python3 $0 -t "Text" -m mail@domain.tld -s "Betreff"
# -e ODER -m = Mailadresse
```

Beispiel:

```python
import subprocess

empfaenger = "mail@domain.tld"
betreff = "Testbetreff"
nachricht = "Hallo, ich bin ein Test!"

try:
    result = subprocess.run(
        ['python3', 'lib/mailer.py', '-e', empfaenger, '-s', betreff, '-t', nachricht],
        check=True
    )
    print("Mail erfolgreich gesendet")
except subprocess.CalledProcessError:
    print("Fehler beim Mailversand")
```

Script:

```python
#!/usr/bin/env python3

import sys
import subprocess

args = sys.argv[1:]

file = None
text = None
mail = None
subj = None

# Argument-Parsing
i = 0
while i < len(args):
    if args[i] == '-f':
        file = args[i + 1]
        i += 2
    elif args[i] == '-t':
        text = args[i + 1]
        i += 2
    elif args[i] in ['-e', '-m']:
        mail = args[i + 1]
        i += 2
    elif args[i] == '-s':
        subj = args[i + 1]
        i += 2
    else:
        i += 1

# Fehlerprüfung
if not mail or not subj:
    print("ERROR")
    sys.exit(1)

# Mailversand
if file and not text:
    try:
        subprocess.run(['mail', '-s', subj, mail], input=open(file, 'rb').read(), check=True)
    except Exception as e:
        print("Fehler beim Senden:", e)
        sys.exit(1)

elif text and not file:
    try:
        subprocess.run(['mail', '-s', subj, mail], input=text.encode(), check=True)
    except Exception as e:
        print("Fehler beim Senden:", e)
        sys.exit(1)

else:
    print("ERROR")
    sys.exit(1)
```

# fillortrim.sh (Bash)

Auffüllen oder trimmen von einem Text auf X Zeichen. Es erzeugt kein typischer Rückgabewert, sondern gibt den Text bearbeitet aus.  
Klassischer Anwendungsfall: textbasierte Tabelle, bei der ein Text immer die gleiche Länge haben soll, um eine sinnvolle, visuelle Tabelle zu bilden.

HOWTO:

```bash
$0 $var $length
$0 "Hallo ich bin ein Beispiel" 24
# immer 24 Zeichen
```

Beispiel:

```bash
var="Hallo ich bin ein Beispiel"
length="24"

filltext=$(bash lib/fillortrim.sh "$var" "$length")

echo "|...|$formfilltext|...|"
```

Script:

```bash
#!/bin/bash

var="$1"
length=${#var}
	while [ $length -lt "$2" ]; do
	    var="$var "
	    ((length++))
	done
var="${var:0:$2}"

echo "$var"
exit 0
```

# fillortrim.sh (Python3)

Auffüllen oder trimmen von einem Text auf X Zeichen. Es erzeugt kein typischer Rückgabewert, sondern gibt den Text bearbeitet aus.  
Klassischer Anwendungsfall: textbasierte Tabelle, bei der ein Text immer die gleiche Länge haben soll, um eine sinnvolle, visuelle Tabelle zu bilden.

HOWTO:

```python
python3 $0 $var $length
python3 $0 "Hallo ich bin ein Beispiel" 24
# immer 24 Zeichen
```

Beispiel:

```python
var = "Hallo ich bin ein Beispiel"
length = 24

formfilltext = var.ljust(length)[:length]

print(f"|...|{formfilltext}|...|")
```

Script:

```python
import sys

def fill_or_trim(var, length):
    # Füllen bis zur gewünschten Länge
    while len(var) < length:
        var += " "
    # Abschneiden auf die gewünschte Länge
    var = var[:length]
    return var

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python fillortrim.py <string> <length>")
        sys.exit(1)
    
    var = sys.argv[1]
    length = int(sys.argv[2])
    
    result = fill_or_trim(var, length)
    print(result)
```

# dabch2hz.sh

Ausgabe von DAB-Kanal in Hertz. Ideal für Scripte, die einen Kanal übergeben und den Rückgabewert verarbeiten.  
Eigener Anwendungsfall: Frequenzumrechnung in Verbindung mit einem HackRF.

Der Rückgabewert ist Hertz.

HOWTO:

```bash
$0 12D
```

Beispiel:

```bash
ch="12D"

freq=$(bash lib/dabch2hz.sh "$ch")
# Hier kann mit $freq weitergearbeitet werden
```

Script:

```bash
#!/bin/bash

ch=$(echo "$1" | sed 's/\([A-Z]\)/\L\1/g')
	
case "$ch" in
  5a) freq="174928000" ;;
  5b) freq="176640000" ;;
  5c) freq="178352000" ;;
  5d) freq="180064000" ;;
  6a) freq="181936000" ;;
  6b) freq="183648000" ;;
  6c) freq="185360000" ;;
  6d) freq="187072000" ;;
  7a) freq="188928000" ;;
  7b) freq="190640000" ;;
  7c) freq="192352000" ;;
  7d) freq="194064000" ;;
  8a) freq="195936000" ;;
  8b) freq="197648000" ;;
  8c) freq="199360000" ;;
  8d) freq="201072000" ;;
  9a) freq="202928000" ;;
  9b) freq="204640000" ;;
  9c) freq="206352000" ;;
  9d) freq="208064000" ;;
  10a) freq="209936000" ;;
  10n) freq="210096000" ;;
  10b) freq="211648000" ;;
  10c) freq="213360000" ;;
  10d) freq="215072000" ;;
  11a) freq="216928000" ;;
  11n) freq="217088000" ;;
  11b) freq="218640000" ;;
  11c) freq="220352000" ;;
  11d) freq="222064000" ;;
  12a) freq="223936000" ;;
  12n) freq="224096000" ;;
  12b) freq="225648000" ;;
  12c) freq="227360000" ;;
  12d) freq="229072000" ;;
  13a) freq="230784000" ;;
  13b) freq="232496000" ;;
  13c) freq="234208000" ;;
  13d) freq="235776000" ;;
  13e) freq="237488000" ;;
  13f) freq="239200000" ;;
  la) freq="1452960000" ;;
  lb) freq="1454672000" ;;
  lc) freq="1456384000" ;;
  ld) freq="1458096000" ;;
  le) freq="1459808000" ;;
  lf) freq="1461520000" ;;
  lg) freq="1463232000" ;;
  lh) freq="1464944000" ;;
  li) freq="1466656000" ;;
  lj) freq="1468368000" ;;
  lk) freq="1470080000" ;;
  ll) freq="1471792000" ;;
  lm) freq="1473504000" ;;
  ln) freq="1475216000" ;;
  lo) freq="1476928000" ;;
  lp) freq="1478640000" ;;
  2a) freq="47936000" ;;
  2b) freq="49648000" ;;
  2c) freq="51360000" ;;
  2d) freq="53072000" ;;
  3a) freq="54928000" ;;
  3b) freq="56640000" ;;
  3c) freq="58352000" ;;
  3d) freq="60064000" ;;
  4a) freq="61936000" ;;
  4b) freq="63648000" ;;
  4c) freq="65360000" ;;
  4d) freq="67072000" ;;
esac

echo "$freq"
exit 0
```

# fm2hz.sh

Ausgabe einer Frequenz von FM in Hertz. Ideal für Scripte, die eine Frequenz übergeben und den Rückgabewert verarbeiten. Es ist egal, ob die Frequenz mit Punkt oder Komma geschrieben wird.  
Eigener Anwendungsfall: Frequenzumrechnung in Verbindung mit einem HackRF.

Der Rückgabewert ist Hertz.

HOWTO:

```bash
$0 89.7
```

Beispiel:

```bash
# Eingabe-Beispiele
eingabe="89.7"
eingabe="106,4"
eingabe="102.70"

freq=$(bash lib/fm2hz.sh "$eingabe")
# Hier kann mit $freq weitergearbeitet werden
```

Script:

```bash
#!/bin/bash

input=$(echo "$1" | sed 's/,/./g')

if [[ "$input" == *.* ]]; then
    integer_part=$(echo "$input" | cut -d'.' -f1)
    decimal_part=$(echo "$input" | cut -d'.' -f2)
else
    integer_part=$input
    decimal_part=""
fi

freq="${integer_part}${decimal_part}"
zeros_to_add=$((6 - ${#decimal_part}))

while [ $zeros_to_add -gt 0 ]; do
    freq="${freq}0"
    ((zeros_to_add--))
done

echo "$freq"
exit 0

```

# checkpackage.sh

Es wird geprüft, ob übergebene System-Packages installiert sind. Kann auf mehreren Distros verwendet werden: Debian, Red Hat, Arch, OpenSUSE und alle Derivate davon.

Der Rückgabewert ist 0 (true) oder 1 (false).

HOWTO:

```bash
$0 wget
```

Beispiel:

```bash
if [ "$(bash lib/checkpackage.sh wget)" = "0" ]; then
    echo "installiert"
else
    echo "nicht installiert"
fi
```

<div id="bkmrk-if-%5B-%22%24%28.%2Fcheck_inst"></div>Script:

```bash
#!/bin/bash

if [ -f /etc/debian_version ]; then
    # Debian-based
    if dpkg -s "$1" &> /dev/null; then
        echo "0"
    else
        echo "1"
    fi
elif [ -f /etc/redhat-release ]; then
    # Red Hat-based
    if rpm -q "$1" &> /dev/null; then
        echo "0"
    else
        echo "1"
    fi
elif [ -f /etc/arch-release ]; then
    # Arch-based
    if pacman -Qi "$1" &> /dev/null; then
        echo "0"
    else
        echo "1"
    fi
elif [ -f /etc/SuSE-release ]; then
    # openSUSE
    if zypper se --installed-only "$1" &> /dev/null; then
        echo "0"
    else
        echo "1"
    fi
else
    echo "Unsupported Linux distribution"
    exit 1
fi
exit 0
```

# picorvid.sh

Ausgabe des Typs einer Webcam/Kamera. Ist es ein Bild oder Video - der Rückgabewert ist zur Weiterverarbeitung.  
Dabei ist der Rückgabewert wie folgt:  
0 = Bild  
1 = Video  
2 = nicht unterstützt  
3 = Fehler/ungültig.  
Die Weiterverarbeitung ist mit ffmpeg oder wget/curl ideal, wenn man vorher einsortieren muss, um welchen Typ es sich handelt. Bilder lassen sich wie gewohnt herunterladen und ffmpeg kann Einzelbilder aus Streams extrahieren.

HOWTO:

```bash
$0 URL
```

Beispiel:

```bash
url="http://192.168.1.10/video.cgi"
typ=$(bash lib/picorvid.sh "$url")

# VARIANTE 1
case "$typ" in
    1)
        echo "MJPEG-Stream erkannt"
        ;;
    0)
        echo "Einzelbild erkannt"
        ;;
    2)
        echo "Bekannt, aber nicht unterstützt"
        ;;
    3)
        echo "Ungültige oder unbekannte URL"
        ;;
esac

# VARIANTE 2
if [ "$typ" = "1" ]; then
    echo "Video/Stream"
elif [ "$typ" = "0" ]; then
    echo "Bild"
fi
```

Script:

```bash
#!/bin/bash

# Video
if echo "$1" | grep -qE '\.mjpg|\.mjpeg|faststream|video\.cgi|GetOneShot|mjpg\.cgi|videostream\.cgi|\/image|\?action\=stream|\/cam_.\.cgi|\.r-kom\.de'; then
	echo "1"
	exit 0

# Bild
elif echo "$1" | grep -qE 'snapshot\.cgi|SnapshotJPEG|\.jpg|api\.cgi|cgi-bin\/camera|alarmimage|oneshotimage|image\/Index|CGIProxy\.fcgi|nph-jpeg\.cgi|onvif\/snapshot|GetImage\.cgi'; then
	echo "0"
	exit 0

# nicht unterstützt
elif echo "$1" | grep -qE 'GetData\.cgi|mjpeg\.cgi|\.png'; then
	echo "2"
	exit 0
else
# ansonsten ungültig
	echo "3"
	exit 0
fi
```

# port.sh

Gibt aus der übergebenen URL den Port aus. Falls keiner übergeben wurde, bezieht man sich auf den Standardport je nach HTTP oder HTTPS.  
http://abc.de:8080/test --&gt; 8080   
https://abc.de/test --&gt; 443   
http://abc.de/test --&gt; 80

HOWTO:

```bash
$0 URL
```

Beispiel:

```bash
url="http://beispiel.de:8080/snapshot.cgi"
port=$(bash src/port.sh "$url")
echo "Verwendeter Port: $port"
# --> 8080
```

Script:

```bash
#!/bin/bash

url=$(echo "$1" | sed ':a; s/\([^ ]\) /\1%20/g; ta; s/^%20//; s/%20$//' | sed s'/ //'g)

#zerlege URL in Adresse und Port
addr=$(echo "$url" | grep -oP '^https?://\K[^:/]+')
port=$(echo "$url" | grep -oP ':\K[0-9]+')

#setze Standard-Port, wenn nicht anders angegeben
if [ -z "$port" ]; then
	if echo "$url" | grep -q "https"; then
		port="443"
	else
		port="80"
	fi
fi

echo "$port"
exit 0
```

# rdm.sh

Ausgabe einer random Zahl zwischen $1 und $2. Obergrenze: 32767, da RANDOM nicht mehr verarbeiten kann.

HOWTO:

```bash
$0 100 199
```

Beispiel:

```bash
min="100"
max="199"

zahl=$(bash lib/rdm.sh "$min" "$max")
```

Script:

```bash
#!/bin/bash

min=$1
max=$2
    
echo $((RANDOM % (max - min + 1) + min))
```

# rdmfreqfm.sh

Es entstehen $1 random Frequenzen in einer vordefinierten Range (FM). Es kann auch ein Abstand $2 zwischen den Frequenzen eingegeben werden. Dies eignet sich gut für Frequenzplanlogistik oder Experimente.

HOWTO:

```bash
$0 3 5
```

Ausagabe:  
88.1  
107.5  
97.7

Der Abstand $2 besagt, dass bei Eingabe von "2" bei einer Frequenz von 90.0 MHz NICHT 89.8, 89.9 und 90.1, 90.2 generiert werden darf.

Beispiel:

```bash
anzahl="3"
abstand="5"

# BEISPIEL 1
frequenzen=$(bash lib/rdmfreqfm.sh "$anzahl" "$abstand")

# BEISPIEL 2
mapfile -t freqenzen < <(bash inc/gen_frequencies.sh "$anzahl" "$abstand")

for f in "${frequenzen[@]}"; do
    echo "Frequenz: $f MHz"
done
```

Script:

```bash
#!/bin/bash

count="$1"
scope="$2"
min="876"
max="1079"
max_attempts="500"  # Maximale Anzahl von Versuchen, um eine nicht überlappende Zufallszahl zu finden

if [ -z "$2" ]; then
    scope="3"
fi

generated_numbers=()

function is_nearby {
    local number=$1
    for n in "${generated_numbers[@]}"; do
        if (( number >= n - $scope && number <= n + $scope )); then
            return 1
        fi
    done
    return 0
}

while [ ${#generated_numbers[@]} -lt $count ]; do
    attempts=0
    while true; do
        if (( attempts >= max_attempts )); then
            echo "ERROR"
            exit 1
        fi

        random_number=$(shuf -i ${min}-${max} -n 1)

        if is_nearby $random_number; then
            generated_numbers+=($random_number)
            formatted_number=$(echo "$random_number" | sed 's/\(.*\)\(.\)$/\1.\2/')
            echo "$formatted_number"
            break
        else
            (( attempts++ ))
        fi
    done
    attempts=0
done
```

# rdsps.sh

RDS wird generiert und fix auf 8 Zeichen gesetzt. Ideal für die Weitergabe an einen RDS-Decoder. Hier kann der Name/Text an $1 übergeben werden und ein Modus für Großbuchstaben eingeschaltet werden:  
$2=0 --&gt; Großbuchstaben,  
$2=1 --&gt; normal, wie Input.  
Bei kurzen Namen/Texten wird das RDS zentriert. Bei langen Namen/Texten wird das RDS gekapert auf 8 Zeichen. Untypische Zeichen fürs RDS werden ersetzt.

HOWTO:

```bash
input="Regio 8"
mode=1  # oder 0 für erzwungene Großbuchstaben

rds=$(bash lib/rdsps.sh "$input" "$mode")
echo "RDS-PS: [$rds]"
```

Script:

```bash
#!/bin/bash

if [ "$2" = "1" ]; then
    # Entferne alle Zeichen außer Großbuchstaben, Zahlen und bestimmten Satzzeichen
    var=$(echo "$1" | sed 's/[^A-Za-z0-9.,!?*-]/_/g; s/ /_/g; s/Ä/A/g; s/Ö/O/g; s/Ü/U/g; s/ä/a/g; s/ö/o/g; s/ü/u/g')
elif [ "$2" = "0" ]; then
    # Ersetze Kleinbuchstaben durch Großbuchstaben und entferne alle anderen nicht gewünschten Zeichen
    var=$(echo "$1" | sed 's/[a-z]/\U&/g' | sed 's/[^A-Z0-9.,!?*-]/_/g; s/ /_/g; s/Ä/A/g; s/Ö/O/g; s/Ü/U/g; s/ä/a/g; s/ö/o/g; s/ü/u/g')
fi

length=${#var}

if [ "$length" = "1" ]; then
    echo "___${var}____"

elif [ "$length" = "2" ]; then
    echo "___${var}___"

elif [ "$length" = "3" ]; then
    echo "__${var}___"

elif [ "$length" = "4" ]; then
    echo "__${var}__"

elif [ "$length" = "5" ]; then
    echo "_${var}__"

elif [ "$length" = "6" ]; then
    echo "_${var}_"

elif [ "$length" = "7" ]; then
    echo "${var}_"

elif [ "$length" = "8" ]; then
    echo "${var}"

elif [ "$length" -ge "9" ]; then
    var="${var:0:8}"
    echo "$var"
fi

exit 0
```

# runtxt.sh

Hier kann ein Text $1 in einem textbasierten Programm durchlaufen. Hierbei lässt sich die Länge der anzuzeigenden Zeichen mit $2 bestimmen und die Schnelligkeit in ms in $3. Ideal für z. B. Displays mit begrenzter Ausgabelänge. Hier kann der Text ganz einfach durchlaufen.  
$1 --&gt; Text, der gescrollt wird   
$2 --&gt; Blockgröße (sichtbare Länge)   
$3 --&gt; Pausenzeit pro Schritt (in ms)

HOWTO:

```bash
$0 "Hallo Welt!" 8 100
```

Beispiel:

```bash
text="System läuft normal, keine Vorkommnisse"
display="16"
ms="120"

bash src/runtxt.sh "$text" "$display" "$ms"
```

Script:

```bash
#!/bin/bash

if [ -z "$3" ]; then
    exit 1
fi

text="$1"
block_size="$2"
sleep_time=$(echo "scale=3; $3 / 1000" | bc)

# Den Text erweitern, um eine ausreichende Anzahl von Leerzeichen für nahtloses Scrollen hinzuzufügen
padded_text="$(printf '%*s' $block_size)${text}"
padded_length=${#padded_text}

while true; do
    for (( i=0; i<padded_length; i++ )); do
        # Substring von i bis i+block_size Zeichen
        if (( i + block_size <= padded_length )); then
            substring="${padded_text:i:block_size}"
        else
            substring="${padded_text:i}"
            remaining_length=$((block_size - ${#substring}))
            substring="${substring}${padded_text:0:remaining_length}"
        fi
        echo -ne "$substring\r"
        sleep "$sleep_time"
    done
done

exit 0
```

# tvch2hzdigeu.sh

Ausgabe von TV-Kanal digital in Hertz. Ideal für Scripte, die einen Kanal übergeben und den Rückgabewert verarbeiten.  
Eigener Anwendungsfall: Frequenzumrechnung in Verbindung mit einem HackRF.  
Dieses Snippet ist ausgelegt auf Europa, da andererorts die Frequenzen hinsichtlich der Zentralfrequenz etwas verschoben sein können.  
Die Eingaben können mit Kxx, Exx, Cxx für die normalen Kanäle, Sxx für Sonderkanäle und Dxx für die Digitalkanäle (Kabelanschluss) erfolgen.  
Range: K21-K69, D73-D858, S3-S41. Die Ausgabe erfolgt auf der Grundlage der Mittenfrequenz für DVB-T und DVB-C. Keine Berücksichtigung von analogen Signalen.

Hinweis: Frequenzen oberhalb von 694 MHz dürfen nicht mehr für Rundfunkausstrahlung (z. B. DVB-T) genutzt werden, da dieser Bereich durch die sogenannte digitale Dividende II für den Mobilfunk (LTE/5G) freigegeben wurde.  
Die nachfolgenden Frequenzen sind daher ausschließlich aus historischen und dokumentarischen Gründen aufgeführt und dürfen nicht mehr für die Ausstrahlung verwendet werden außer in geschlossenen Systemen wie ein eigener Kabelanschluss.

HOWTO:

```bash
$0 K24
```

Beispiel:

```bash
ch="K24"

freq=$(bash lib/tvch2hzeu.sh "$ch")
# Hier kann mit $freq weitergearbeitet werden
```

Script:

```bash
#!/bin/bash

ch=$(echo "$1" | sed 's/\([A-Z]\)/\L\1/g' | sed -e 's/0*\([0-9]\)/\1/g')

case "$ch" in
    d73) freq="73000000" ;;
    d81) freq="81000000" ;;
    d114) freq="114000000" ;;
    d122) freq="122000000" ;;
    d130) freq="130000000" ;;
    d138) freq="138000000" ;;
    d146) freq="146000000" ;;
    d154) freq="154000000" ;;
    d162) freq="162000000" ;;
    d170) freq="170000000" ;;
    d178) freq="178000000" ;;
    d186) freq="186000000" ;;
    d194) freq="194000000" ;;
    d202) freq="202000000" ;;
    d210) freq="210000000" ;;
    d218) freq="218000000" ;;
    d226) freq="226000000" ;;
    c5|k5|e5) freq="177500000" ;;
    c6|k6|e6) freq="184500000" ;;
    c7|k7|e7) freq="191500000" ;;
    c8|k8|e8) freq="198500000" ;;
    c9|k9|e9) freq="205500000" ;;
    c10|k10|e10) freq="212500000" ;;
    c11|k11|e11) freq="219500000" ;;
    c12|k12|e12) freq="226500000" ;;
    s2) freq="114000000" ;;
    s3) freq="122000000" ;;
    s4) freq="130000000" ;;
    s6) freq="138000000" ;;
    s7) freq="146000000" ;;
    s8) freq="154000000" ;;
    s9) freq="162000000" ;;
    s10) freq="170000000" ;;
    s11|d234) freq="234000000" ;;
    s13|d242) freq="242000000" ;;
    s14|d250) freq="250000000" ;;
    s15|d258) freq="258000000" ;;
    s16|d266) freq="266000000" ;;
    s17|d274) freq="274000000" ;;
    s18|d282) freq="282000000" ;;
    s19|d290) freq="290000000" ;;
    s20|d298) freq="298000000" ;;
    s21) freq="306000000" ;;
    s22) freq="314000000" ;;
    s23) freq="322000000" ;;
    s24) freq="330000000" ;;
    s25) freq="338000000" ;;
    s26) freq="346000000" ;;
    s27) freq="354000000" ;;
    s28) freq="362000000" ;;
    s29) freq="370000000" ;;
    s30) freq="378000000" ;;
    s31) freq="386000000" ;;
    s32) freq="394000000" ;;
    s33) freq="402000000" ;;
    s34) freq="410000000" ;;
    s35) freq="418000000" ;;
    s36) freq="426000000" ;;
    s37) freq="434000000" ;;
    s38) freq="442000000" ;;
    s39) freq="450000000" ;;
    s40) freq="458000000" ;;
    s41) freq="466000000" ;;
    c21|k21|e21|d474) freq="474000000" ;;
    c22|k22|e22|d482) freq="482000000" ;;
    c23|k23|e23|d490) freq="490000000" ;;
    c24|k24|e24|d498) freq="498000000" ;;
    c25|k25|e25|d506) freq="506000000" ;;
    c26|k26|e26|d514) freq="514000000" ;;
    c27|k27|e27|d522) freq="522000000" ;;
    c28|k28|e28|d530) freq="530000000" ;;
    c29|k29|e29|d538) freq="538000000" ;;
    c30|k30|e30|d546) freq="546000000" ;;
    c31|k31|e31|d554) freq="554000000" ;;
    c32|k32|e32|d562) freq="562000000" ;;
    c33|k33|e33|d570) freq="570000000" ;;
    c34|k34|e34|d578) freq="578000000" ;;
    c35|k35|e35|d586) freq="586000000" ;;
    c36|k36|e36|d594) freq="594000000" ;;
    c37|k37|e37|d602) freq="602000000" ;;
    c38|k38|e38|d610) freq="610000000" ;;
    c39|k39|e39|d618) freq="618000000" ;;
    c40|k40|e40|d626) freq="626000000" ;;
    c41|k41|e41|d634) freq="634000000" ;;
    c42|k42|e42|d642) freq="642000000" ;;
    c43|k43|e43|d650) freq="650000000" ;;
    c44|k44|e44|d658) freq="658000000" ;;
    c45|k45|e45|d666) freq="666000000" ;;
    c46|k46|e46|d674) freq="674000000" ;;
    c47|k47|e47|d682) freq="682000000" ;;
    c48|k48|e48|d690) freq="690000000" ;;
    c49|k49|e49|d698) freq="698000000" ;;
    c50|k50|e50|d706) freq="706000000" ;;
    c51|k51|e51|d714) freq="714000000" ;;
    c52|k52|e52|d722) freq="722000000" ;;
    c53|k53|e53|d730) freq="730000000" ;;
    c54|k54|e54|d738) freq="738000000" ;;
    c55|k55|e55|d746) freq="746000000" ;;
    c56|k56|e56|d754) freq="754000000" ;;
    c57|k57|e57|d762) freq="762000000" ;;
    c58|k58|e58|d770) freq="770000000" ;;
    c59|k59|e59|d778) freq="778000000" ;;
    c60|k60|e60|d786) freq="786000000" ;;
    c61|k61|e61|d794) freq="794000000" ;;
    c62|k62|e62|d802) freq="802000000" ;;
    c63|k63|e63|d810) freq="810000000" ;;
    c64|k64|e64|d818) freq="818000000" ;;
    c65|k65|e65|d826) freq="826000000" ;;
    c66|k66|e66|d834) freq="834000000" ;;
    c67|k67|e67|d842) freq="842000000" ;;
    c68|k68|e68|d850) freq="850000000" ;;
    c69|k69|e69|d858) freq="858000000" ;;    
esac

echo "$freq"
exit 0
```

# Proxmox: VM/CT gesperrt

Manchmal kommt es in Proxmox vor, dass bei einem unterbrochenen oder fehlerhaftem Update die Maschine sich nicht mehr entsperrt. Die Maschine bleibt gesperrt und es sind keine Handlungen wie Konfiguration oder Backup möglich.  
Bemerkbar macht sich dies durch das kleine Schloss auf der Verwaltungsoberfläche.

[![Screenshot 2024-11-24 141635.png](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/scaled-1680-/screenshot-2024-11-24-141635.png)](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/screenshot-2024-11-24-141635.png)

Demnach muss die Maschine händisch entsperrt werden. Die Vorgehensweise ist bei VMs und CTs jeweils unterschiedlich, aber nicht gravierend.

Für VMs folgenden Befehl in der Proxmox-Shell absetzen:

```bash
qm unlock ID
```

Für CTs:

```bash
pct unlock ID 
```

Fertig.

# Archive unter Linux



# zip

Das Tool zip ist vor allem aus der Windows-Welt bekannt, ist aber ebenso bei Linux-basierten Betriebssystemen verfügbar.

Einzelne Dateien in einem komprimierten Archiv zusammenfassen:

<dl id="bkmrk-zip-archiv.zip-inhal"><dd>```
zip archiv.zip inhalt1 inhalt2
```

</dd></dl>Komplette Ordner in einem komprimierten Archiv zusammenfassen:

<dl id="bkmrk-zip--r-archiv.zip-or"><dd>```
zip -r archiv.zip ordner1 ordner2 ordner3
```

</dd></dl>Komprimiertes Archiv entpacken:

<dl id="bkmrk-unzip-archiv.zip"><dd>```
unzip archiv.zip
```

</dd></dl>Inhalt eines komprimierten Archivs anzeigen:

<dl id="bkmrk-unzip--l-archiv.zip"><dd>```
unzip -l archiv.zip
```

</dd></dl>

# bz2, bzip2

Neben gzip gibt es noch bzip2, es ist gzip sehr ähnlich, verwendet aber einen anderen Algorithmus.

Eine Datei komprimieren:

<dl id="bkmrk-bzip2-file-datei-dek"><dd>```
bzip2 file
```

</dd><dd>Datei dekomprimieren:</dd></dl><dl id="bkmrk-bunzip2-file.bz2"><dd>```
bunzip2 file.bz2
```

</dd></dl>Dateien in einem komprimierten Archiv zusammenfassen:

<dl id="bkmrk-tar-cfvj-archiv.tar."><dd>```
tar cfvj archiv.tar.bz2 inhalt1 inhalt2
```

</dd><dd>Archiv dekomprimieren und auspacken:</dd></dl><dl id="bkmrk-tar-xfvj-archiv.tar."><dd>```
tar xfvj archiv.tar.bz2
```

</dd></dl>

# gz, gzip

Da ein tar-Archiv, wie oben erwähnt, ohne Zusatzoptionen nicht komprimiert ist, kann dies mit der Zusatzoption gzip geschehen. gzip steht für GNU zip und dem tar-Archiv wird die Dateiendung .gz angehängt.

Eine Datei komprimieren:

<dl id="bkmrk-gzip-file"><dd>```
gzip file
```

</dd></dl>Datei dekomprimieren:

<dl id="bkmrk-gunzip-file"><dd>```
gunzip file
```

</dd></dl>Dateien in einem komprimierten Archiv zusammenfassen:

<dl id="bkmrk-tar-cfvz-archiv.tar."><dd>```
tar cfvz archiv.tar.gz inhalt1 inhalt2
```

</dd><dd>Archiv dekomprimieren und auspacken:</dd></dl><dl id="bkmrk-tar-xfvz-archiv.tar."><dd>```
tar xfvz archiv.tar.gz
```

</dd></dl>

# tar

Das Programm tar steht ursprünglich für **T**ape **Ar**chiver, es wurde verwendet um Daten auf Bandlaufwerken zu sichern. Es ist heute noch sehr beliebt und verbreitet.  
Ein reines tar-Archiv ist **nicht** komprimiert.

Entpacken eines Archivs:

<dl id="bkmrk-tar-xfv-archiv.tar-d"><dd>```
tar xfv archiv.tar
```

</dd><dd>Dateien/Ordner in ein Archiv packen:  
</dd></dl><dl id="bkmrk-tar-cfv-archiv.tar-i"><dd>```
tar cfv archiv.tar inhalt1 inhalt2 inhalt3
```

</dd><dd>Komprimierte Archive erstellen:</dd></dl><dl id="bkmrk-tar-cfzv-archiv.tar-"><dd>```
tar cfzv archiv.tar inhalt1 inhalt2 inhalt3
```

</dd><dd>Inhalt eines Archivs auflisten:</dd></dl><dl id="bkmrk-tar-tfv-archiv.tar"><dd>```
tar tfv archiv.tar
```

</dd></dl>Legende:

x = entpacken (extract)  
f = Datei (file)  
v = Details anzeigen (verbose)  
c = erstellen (create)

# VPN-Server mit Wireguard / Side-to-Side-VPN / alles tunneln

Es kann mehrere Gründe geben, einen VPN-Tunnel zu nutzen. Sei es zwecks der Anonymität, weil man geogeblockte Seiten öffnen möchte oder die normale Praxis - einfach nur, weil man auf der Gegenstelle einen Server hat, deren Dienste man sicher erreichen möchte.

In unserem Fall möchten wir als IP gerne diese externe IP haben, sodass wir geogeblockte Seiten öffnen können.

Als Server kommt ein V-Server in einem Rechenzentrum zum Einsatz (Debian), als Client ist es lokal ein LXC-Container in Proxmox (Ubuntu). Dies kann natürlich auch der lokale Rechner sein oder ein lokaler Laptop mit Linux drauf.

Wir gehen davon aus, dass wir auf beiden Systemen root sind, ansonsten ist - in diesem Fall - vor **jedem** Befehl ein sudo zu setzen.

### <span class="mw-headline" id="bkmrk-allgemein%2Fvorbereite-1">Allgemein/Vorbereiten</span>

Dieser Abschnitt ist auf beiden Systemen auszuführen.

Sollte das System recht frisch sein, ist unbedingt ein Aktualisieren der apt-Datenbank von nöten, in allen anderen Fällen kann es nicht schaden:

```bash
apt update -y && apt upgrade -y
```

Ggf. Wireguard selbst installieren - sollte es nicht vorhanden sein:

```bash
apt install wireguard
```

Als nächstes muss in der Datei */etc/sysctl.conf* unbedingt die Zeile *\#net.ipv4.ip\_forward=1* auskommentiert werden:

```bash
nano /etc/sysctl.conf
```

aus

```bash
#net.ipv4.ip_forward=1
```

wird

```bash
net.ipv4.ip_forward=1
```

Als nächstes generieren wir die Schlüssel für den gegenseitigen Austausch:

```bash
umask 077; wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
```

Diesen lassen wir uns jeweils auf beiden Systemen anzeigen für die Konfigurationsdatei nachher:

```bash
cat /etc/wireguard/privatekey && cat /etc/wireguard/publickey
```

### <span class="mw-headline" id="bkmrk-serverkonfiguration-1">Serverkonfiguration</span>

Als erstes fragen wir ab, welches Interface hardwareseitig benutzt wird. Dies ist meist eth0. Über dieses Interface soll nachher alles laufen. Dieses ist mit

```bash
ip a
```

abzufragen.

Nun beginnen wir mit der Erstellung der Konfigurationsdatei auf dem Server. Folgender Inhalt muss in die Wireguard-Konfiguration *wg0.conf*, wie wir sie hier nennen. Wenn ein anderer Name als wg0 verwendet wird, muss in allen Fällen, wo wir wg0 verwenden, natürlich der individuelle Name stehen.

```bash
nano /etc/wireguard/wg0.conf
```

```ini
[Interface] 
PrivateKey = SERVER-PRIVATEKEY
Address = 172.31.0.1/32
SaveConfig = true 
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
PublicKey = CLIENT-PUBLICKEY
AllowedIPs = 172.31.0.2/32, X.X.X.X/XX
```

Hier gibt es einiges zu beachten. Der SERVER-PRIVATEKEY und CLIENT-PUBLICKEY muss mit den Keys vom Server und Clienten ersetzt werden. Das Interface ist zu beachten, wie oben beschrieben. Die IP-Adresse 172.31.0.1/32 suggeriert ein Netz, deren /32-Subnetz technischer Weise nur 2 IP-Adressen erlaubt. Nämlich Server (172.31.0.1) und Client (172.31.0.2). Diese beiden benutzen dieses Netz und kommunizieren über den Tunnel. Der Port 51820 ist der Wireguard-Standard-Port, kann aber geändert werden, muss aber dann natürlich auf beiden Seiten gleich sein. Die PostUp und PostDown-Zeilen bilden einfach die IPtables, wie wo was geroutet wird.

Im Abschnitt Peer bei den Allowed IPs muss unbedingt die IP des Clienten enthalten sein, in diesem Fall eben 172.31.0.2/32. Für unseren Fall des Gateways ist es unbedingt erforderlich, das eigene Netz, welches wir daheim haben, dort einzusetzen.

Haben wir die 192.168.1.6 als IP in einem /24er-Netz, ist, sofern das ganze Netz geroutet werden darf, die 192.168.1.0/24 stehen. Im Falle eines 172.20.2.86 als IP bei einem /16er-Netz, ist dort auch die 172.20.0.0/16 zu wählen. Einzelne IPs können auch gewählt werden, wenn nur ein Gerät durch den Tunnel sollte.

### <span class="mw-headline" id="bkmrk-clientkonfiguration-1">Clientkonfiguration</span>

Wir legen auch auf dem Client die Konfigurationsdatei mit gleichem Namen wg0 an:

```bash
nano /etc/wireguard/wg0.conf
```

```ini
[Interface] 
PrivateKey = CLIENT-PRIVATEKEY
Address = 172.31.0.2/32

[Peer] 
PublicKey = SERVER-PUBLICKEY 
Endpoint = Adresse:51820 
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
```

Hier ist natürlich wieder zu beachten, dass die Keys entsprechend eingesetzt werden. Bei Adresse kann die IP des Servers oder auch eine Domain stehen. Die AllowedIPs mit dem Wert 0.0.0.0/0 sagt aus, dass alles über den VPN-Server geroutet wird, also auch Internet.

Und da wir hier mit Wireguard im UDP-Protokoll unterwegs sind, gibt es keine Bestätigung der Verbindung. Demzufolge muss permanent der PersistentKeepalive abgefragt werden, hier alle 25 Sekunden.

### <span class="mw-headline" id="bkmrk-abschluss-1">Abschluss</span>

<div class="thumb tright" id="bkmrk-ip-adresse-manuell-k"></div><div class="magnify" id="bkmrk--1"></div><div class="magnify" id="bkmrk--2"></div><div class="magnify" id="bkmrk--3"></div><div class="magnify" id="bkmrk--4"></div><div class="magnify" id="bkmrk--5"></div><div class="magnify" id="bkmrk--6"></div><div class="magnify" id="bkmrk--7"></div><div class="magnify" id="bkmrk--8"></div><div class="thumb tright" id="bkmrk-ip-adresse-manuell-k-1"><div class="thumbinner"><div class="thumbcaption">  
</div></div></div>Sollte der Dienst nach einem Neustart eines der beiden Systemen automatisch wieder starten, ist folgender Befehl abzusetzen:

<div class="thumb tright" id="bkmrk-war-man-erfolgreich%2C"><div class="thumbinner">[![Screenshot_2023-05-18_094530.png](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/scaled-1680-/screenshot-2023-05-18-094530.png)](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/screenshot-2023-05-18-094530.png)  
<div class="thumbcaption"><div class="magnify">  
</div>War man erfolgreich, sollte dies bei [https://wieistmeineip.de](https://wieistmeineip.de/) erscheinen.</div></div></div>```bash
systemctl enable wg-quick@wg0
```

# Zeitumstellung via timedatectl

Nach dem Installieren einiger Distributionen, insbesondere die des Raspberry Pi, kann es immer mal wieder vorkommen, dass sich die Zeitzone nicht von selbst einstellt.

Abhilfe schafft folgender Befehl:

```bash
sudo timedatectl set-timezone Europe/Berlin
```

Wobei "Europe/Berlin" dementsprechend anzupassen ist. Mit diesem Befehl

```bash
timedatectl list-timezones
```

werden alle möglichen Timezones gelistet.

<span style="color: rgb(0, 0, 0);">Sonstige Tags: timezone</span>

# Systemdienst einrichten

Um einen Systemdienst auf Linux einzurichten, um ihn als "service XYZ start" starten zu können, sind folgende Schritte nötig:

Es wird davon ausgegangen, dass diese Schritte als sudo-Mitglied gemacht werden.

`sudo nano /etc/systemd/system/dienst.service`

Im einfachsten Fall reicht folgendes aus:

```ini
[Unit]
Description=Eigener Dienst

[Service]
WorkingDirectory=/srv
ExecStart=/srv/script.sh arg1 arg2
User=scripter
Restart=always

[Install]
WantedBy=multi-user.target
```

In einigen Fällen, vor allem wenn while-Schleifen zum Einsatz kommen, kann dies auch komplexer werden:

```ini
[Unit]
Description=Eigener dienst
After=network.target
Restart=always
RestartSec=5

[Service]
ExecStart=/srv/script.sh arg1 arg2
WorkingDirectory=/srv
User=scripter
Group=scripter
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
```

Zum Schluss muss der Dienst noch aktiviert werden:

`sudo systemctl enable dienst.service`

Und anschließend kann der dienst gestartet und auf den Status geschaut werden:

`sudo service dienst start` `sudo service dienst status` `sudo service dienst stop`

# SSH Forwarding (Portweiterleitung via SSH)

Oft ist man gezwungen, z. B. auf Proxmox zuzugreifen aber aus Sicherheitsgründen wird von einer öffentlichen Portfreigabe abgesehen. Demnach wäre eine Portweiterleitung nur über SSH interessant. Voraussetzung ist hier natürlich, dass SSH öffentlich freigegeben wurde. Dabei muss es nicht einmal direkt der Proxmox-Server, sondern es kann auch ein Zwischenserver, wie hier in diesem Beispiel erklärt wird, sein.

Ein SSH Forwarding von Client zu Server funktioniert hier im Beispiel wie folgt.

Der Client (localhost) möchte einen Port auf dem Server (lokal) öffnen. Hier wird zunächst ein SSH-Tunnel aufgebaut, der den Verkehr entsprechend portiert.

```bash
ssh -N -L 443:localhost:8006 user@beispielserver.de -p 2222
```

Hier wird der lokale Port 443 (HTTPS) auf dem am SERVER.DE befindlichen Port 8006 über SSH Port 2222 weitergeleitet. In diesem konkreten Beispiel lässt sich auf den Proxmox-Server zugreifen, ohne den Port nach außen hin öffnen zu müssen.

Sollte ein Zwischenserver vorhanden sein, der vor Proxmox agiert, sodass Proxmox keinen SSH-Port öffentlich geöffnet haben muss, muss zudem sichergestellt sein, dass der Zwischenserver mit dem gleichen SSH Forwarding versehen ist, sodass am Zwischenserver der Port 8006 auch zum Proxmox-Server auf Port 8006 führt. Dieser ist mit

```bash
ssh -N -L 8006:localhost:8006 sshuser@172.16.99.10 -p 22
```

einzureichen. In diesem konkreten Beispiel wird eben der Port 8006 auf dem Zwischenserver auf die IP und ebenfalls Port 8006 weitergeleitet.

Um diesen SSH Forwarding am Zwischenserver nicht immer aufmachen zu müssen, kann alternativ eine screen-Session mit genau dieser Portweiterleitung geschaffen werden oder idealer, die SSH-Verbindung im Hintergrund auszuführen mit

```bash
ssh -f -N -L 8006:localhost:8006 sshuser@172.16.99.10 -p 22
```

Auf dem Client kann auf die gleiche Weise agiert werden.

Hinweis: Beim Standard-Port 22 kann diese Port-Angabe auch weggelassen werden.

-L: local port forwarding

-f: Hintergrund

-N: kein einloggen erforderlich.

Demzufolge kann auf dem Client mit folgender Adresse nun entfernt der Port 8006 aufgerufen werden:

```bash
https://localhost
```

```bash
https://127.0.0.1
```

Den HTTPS-Standardport :443 schenken wir uns in diesem Fall.

# Root-Login verbieten

Nach dem Installieren einiger Distributionen, insbesondere die des Raspberry Pi oder im Proxmox bei den LXC-Containern, ist es sicherheitsrelevant und deshalb erforderlich, wenn die Maschinen ans Netz gehen, dass der root-Login unterbunden wird.

Dies wird in der Datei **/etc/ssh/sshd\_config** möglich gemacht.

```bash
sudo nano /etc/ssh/sshd_config
```

Aus

```bash
PermitRootLogin yes
```

wird

```bash
PermitRootLogin no
```

und fertig.

Anschließend den SSH-Dienst neustarten mit

```bash
sudo service sshd restart
```

sshd = ssh daemon.

Der root-Login ist somit nicht mehr möglich, es kann aber weiterhin als Benutzer mit

```bash
su
```

in den root-Account gewechselt werden. Unabhängig davon kann in einigen [Distributionen](https://public.mariobeh.de/mediawiki/index.php?title=Distribution&action=edit&redlink=1 "Distribution (Seite nicht vorhanden)") mit

```bash
sudo befehl
```

interagiert werden, sofern der Benutzer in der [sudoers](https://public.mariobeh.de/mediawiki/index.php/Benutzer_zum_sudo_(sudoers)_hinzuf%C3%BCgen "Benutzer zum sudo (sudoers) hinzufügen")-Tabelle gelistet ist.

# PhpMyAdmin - Installation

Verwendet man eine Datenbank und möchte nicht alles mit dem Terminal regeln, ist es oft sinnvoller, eine Datenbankkonfigurationssoftware herbei zu ziehen. Es bietet sich PhpMyAdmin an.

In unserem Fall verwenden wir PhpMyAdmin mit MySQL8.0-Server, PHP8.3 und Apache2 als Webserver. Dateispeicherort wird der hauseigene Web-Pfad */var/www/html* verwendet.

Ferner gibt es mehrere Möglichkeiten, das ganze auf Linux mit den Rechten zu verbinden, in unserem Beispielfall läuft PhpMyAdmin unter demselben Benutzer wie der Webserver.

PHP, MySQL und Apache2 werden zuerst heruntergeladen, wenn noch nicht vorhanden:

```bash
sudo apt install mysql-server php8.3 apache2
```

Danach wechseln wir in unser Webverzeichnis:

```bash
cd /var/www/html
```

In diesem könnte es Rechteprobleme geben. Dann einfach das Verzeichnis für den Web-Benutzer freigeben:

```bash
sudo chown webuser:webuser -R /var/www/html
```

chown für *change owner* vom Verzeichnis */var/www/html*, das ganze rekursiv auf alle Unterverzeichnisse von dort, an den Benutzer *webuser* in der gleichnamigen Gruppe.

Danach laden wir uns PhpMyAdmin auf der offiziellen Seite *phpmyadmin.net* herunter, direkt auf den Server. Bitte die Versionsnummer beachten.

```bash
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
```

Dies entpacken wir dann an dieser Ort und Stelle.

  
...

# PhpMyAdmin - Fehlermeldung Konfigurationsspeicher

Bei einer recht frischen Installation von phpMyAdmin kann es vorkommen, dass folgender Fehler im Webinterface angezeigt wird:

*Der phpMyAdmin-Konfigurationsspeicher ist nicht vollständig konfiguriert, einige erweiterte Funktionen wurden deaktiviert. Finden Sie heraus warum. Oder wechseln Sie in einer beliebigen Datenbank zum Tab "Operationen", um die Einstellung dort vorzunehmen.*

*[![Screenshot_2023-05-17_214330.png](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/scaled-1680-/screenshot-2023-05-17-214330.png) ](https://wiki.mariobeh.de/uploads/images/gallery/2024-11/screenshot-2023-05-17-214330.png)  
Screenshot der Fehlermeldung (v5.2.1)*

Dieser Konfigurationsspeicher von phpMyAdmin benötigt eine eigene Datenbank oder eine eigene Tabelle auf dem MySQL-Server. Dies kann zur Abhilfe führen oder aber auch einfacher, diese Meldung ignorieren. Hierzu muss die Datei config.inc.php im root-Verzeichnis von phpMyAdmin editiert und am Ende davon folgendes eingefügt werden:

```bash
$cfg['PmaNoRelation_DisableWarning'] = true;
```

Ist die individuelle Konfigurationsdatei *config.inc.php* nicht vorhanden, dann muss im ersten Schritt die *config.sample.inc.php* umbenannt, bzw. kopiert und dann editiert werden.

  
Umbenennen:

```bash
mv config.sample.inc.php config.inc.php
```

..oder Kopieren:

```bash
cp config.sample.inc.php config.inc.php
```

..in allen Fällen bearbeiten:

```bash
nano config.inc.php
```

# Mount - HDD/SSD mounten

Um eine Festplatte/SSD im Terminal zu mounten, muss eine Voraussetzung gegeben sein.

Als erstes muss die Platte ermittelt werden, wo sie zu finden ist in */dev/*.

```bash
fdisk -l
```

bzw. - einfacher ist bei fortgeschrittenen Systemkenntnisse auch das hier:

```bash
ls /dev/ | grep sd
```

Wir gehen davon aus, dass die Platte neu ist, bzw. neu erstellt wurde und es noch keine Formatierung gegeben hat. Ansonsten kann dieser Schritt übersprungen werden.

Die Platte kann in ext4 (Linux), NTFS (Windows) oder andere Optionen formatiert werden. Hier sind zwei Beispiele:

```bash
sudo mkfs.ext4 /dev/sdX
```

```bash
sudo mkfs.ntfs /dev/sdX
```

...wobei das X in sdX ersetzt werden muss auf den Laufwerksbuchstaben, der vorher ermittelt wurde.

Jetzt kann die Platte gemountet werden:

```bash
sudo mount /dev/sdX /mnt/hdd
```

Der Zielpfad, hier */mnt/hdd*, kann natürlich individuell sein. Das Verzeichnis muss aber im Vorfeld bereits erstellt worden sein.

```bash
sudo mkdir /mnt/hdd
```

Die Verwendung von sudo im letzten Schritt ist nicht immer erforderlich, da es auch in einem Benutzerordner stattfinden kann. Hier, bei */mnt/* wird aber sudo vorausgesetzt.

# Benutzer zum sudo (sudoers) hinzufügen

Um einen Benutzer in die sudo-Administration hinzuzufügen, reicht nach dem Erstellen des Benutzers mit

```
sudo adduser BENUTZER
```

folgender Befehl aus:

```
sudo usermod -aG sudo BENUTZER
```

# Apt-get Autocomplete / Autocompletion

Teilweise kommt es unter einem frisch installiertem Linux vor, dass bei *apt* bzw. *apt-get* die Autokomplettierung mit der Tab-Taste nicht funktioniert. Um dies zu aktivieren, sind folgende Schritte nötig.

Sudo wird ggf. benötigt, wenn kein root.

```bash
sudo apt install bash-completion
```

Danach ist diese Datei ohne root-Rechte zu editieren. Diese Datei ist benutzerspezifisch und erfordert in keinem Fall sudo:

```bash
nano ~/.bashrc
```

Inhalt am Ende der Datei einfügen:

```bash
   if [ -f /etc/bash_completion ]; then
       . /etc/bash_completion
   fi
```

Fertig. Normalerweise funktioniert die Autokomplettierung ohne erneutes Einloggen.

# eigene Programme, headless

Linux, Bash, Serversysteme.
Diese Scripte nutzen ausnahmslos den Auslagerungsordner /home/$NAME/script-data/script-name/$0.Der Stand des Scripts ist in Klammern versehen der einzelnen Scripts.Die Distribution der Scripte findet sich ebenfalls in den Klammern.

# IP Logger (Debian / 04.01.2024)

Dieser IP Logger loggt die eigene IP-Adresse in eine CSV-Datei. Dies hat den Grund, dass man Vorwürfe jeder Art durch Vorlage der zu der Zeit genutzten IP-Adresse vorweisen könnte.  
Nützlich in Verbindung mit einem Cronjob.

Das Script holt via "icanhazip.com" die aktuelle IP-Adresse und speichert sie in die CSV-Datei. Wenn via Cronjob das Script ausgeführt wird, empfehle ich den Intervall auf stündlich zu setzen. Eine Zeit von-bis einzubauen halte ich für nicht sinnvoll, da das Internet zu dieser Zeit auch ausfallen könnte. Daher halte ich es für nicht sinnvoll, die IP-Adresse zu speichern und erst bei Änderung erneut zu schreiben.

### 🧾 **Was macht das Script?**

#### 📁 **Allgemeine Initialisierung:**

- Bestimme den aktuellen Benutzer (`whoami`)
- Setze `$data` auf:  
    `/home/<user>/script-data/<scriptname>`  
    (z. B. `/home/pi/script-data/iplogger.sh`)
- Setze `$ippage` auf `icanhazip.com`
- Hole aktuelle öffentliche IP via `curl`

#### **📬 Benötigte Tools:**

- `curl`
- `nc` (netcat)
- `sed`, `awk`, `grep`, `uniq`
- Bash &gt;= 4

Script:

```bash
#!/bin/bash

user=$(whoami)
data="/home/$user/script-data/$(basename "$0")"
ippage="icanhazip.com"
ipneu=$(curl -s "$ippage")

if [ ! -d "$data" ]; then
	mkdir -p "$data"
fi

if [ -n "$1" ] && [ "$1" = "suche" ]; then
	cat "$data/ipdb.csv" | sed 's/;/ /g' | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3.\2.\1/' | grep "$2" | awk '{print $1, "", "", $3}' | uniq
	exit
else
	if nc -z -w 1 "$ippage" 443 2>/dev/null; then
		echo "$(date +"%Y-%m-%d;%H:%M");$ipneu" >> "$data/ipdb.csv"
		echo "OK: $ipneu"
	else
		if nc -z -w 1 "google.de" 443 2>/dev/null; then
			echo "Fehler, $ippage nicht erreichbar."
			echo "$(date +"%Y-%m-%d;%H:%M");$ippage nicht erreichbar" >> "$data/ipdb.csv"
		else
			echo "Kein Internet."
			echo "$(date +"%Y-%m-%d;%H:%M");offline" >> "$data/ipdb.csv"
		fi
	fi
fi
```

# M4A zu MP3 Massenumwandlung (Debian / 09.04.2025)

Das Script wandelt rekursiv beginnend ab einem Pfad ($1) M4A-Audiodateien in MP3 um. Die Qualität bleibt nahezu gleich. Der Pfad ist dem $1-Argument zu übergeben.  
Die daraus entstehende MP3 ist gleichnamig wie die M4A Datei.

ffmpeg und find werden dafür benötigt.

Script:

```bash
#!/bin/bash

DIR="$1"

if [ -z "$DIR" ] || [ ! -d "$DIR" ]; then
    echo "Usage: $0 /pfad/zum/verzeichnis"
    exit 1
fi

find "$DIR" -type f -iname "*.m4a" | while read -r M4A; do
    MP3="${M4A%.m4a}.mp3"
    
    # Nur umwandeln, wenn mp3 nicht schon existiert
    if [ -f "$MP3" ]; then
        echo "Überspringe (bereits vorhanden): $MP3"
        continue
    fi

    echo "Wandle um: $M4A → $MP3"

    ffmpeg -i "$M4A" -codec:a libmp3lame -qscale:a 4 "$MP3" -y < /dev/null

    if [ $? -eq 0 ]; then
        echo "Erfolg: $MP3"
    else
        echo "Fehler bei: $M4A"
    fi
done
```

# DynDNS Updater (Debian / 10.07.2024)

Der DynDNS Updater aktualisiert eine DynDNS-Domain mit der aktuellen IP-Adresse.  
Wenn das Script zum ersten Mal ausgeführt wird, muss man die API zur Aktualisierung eingeben, die dieses Script dann aufruft.  
Diese API wird dann im script-data-Ordner gespeichert.

**Genaue Zusammenfassung:** *data=/home/$USER/script-data/$0*

Wenn noch keine IP vorhanden ist ($data/ip.txt), dann wird die IP-Adresse von "icanhazip.com" abgerufen.  
API wird aufgerufen, IP wurde aktualisiert.  
Jeder Schritt wird mitgeloggt in $data/allgemein.csv (besondere Ereignisse), tagesaktuell in $data/logs/YYYYMMTT.csv (Updates).


### 🧾 **Was macht das Script?**

#### **📁 Lade bisherigen Status:**

- Wenn `ip.txt` vorhanden ist, wird die bisherige öffentliche IP geladen.
- Wenn nicht: → erste Ausführung → IP bleibt leer, Log-Eintrag in `allgemein.csv`.

---

#### **🌐 Prüfe Update-URL:**

- Wenn `updateurl.txt` existiert → lese erste Zeile ein.
- Wenn nicht vorhanden:
    
    
    - Benutzer wird zur Eingabe einer gültigen `http(s)`-URL aufgefordert.
    - Wenn gültig: speichere in `updateurl.txt` &amp; logge es.
    - Wenn ungültig: Abbruch &amp; Fehlerlog.

---

#### **📶 Online-Check:**

- Ping an `icanhazip.com` (IPv4, 1 Paket, Timeout 3s)
- Wenn erreichbar:
    
    
    - Hole neue IP mit `curl`
    - Vergleiche mit vorheriger IP
        
        
        - Unverändert: nur Statusmeldung
        - Geändert:
            
            
            - speichere neue IP in `ip.txt`
            - rufe `updateurl` auf (z. B. DynDNS-Anbieter)
            - logge Aktualisierung in Tageslog
            - sende E-Mail-Benachrichtigung
- Wenn nicht online:
    
    
    - logge, dass keine Aktualisierung möglich ist

#### **📬 Benötigte Tools:**

- `curl`
- `ping`
- `mail`
- `sed`, `head`, `tail`
- Bash &gt;= 4

Inhalt der $data/updateurl.txt:

```
https://api.dyndns.tld/update.php?key=q12w3e4r5t6z7u8i9o0p
```

Script:

```bash
user=$(whoami)
data="/home/$user/script-data/$(basename "$0")"
ippage="icanhazip.com"

	if [ ! -d "$data" ]; then
		mkdir -p "$data"
	fi

	if [ ! -d "$data/logs" ]; then
		mkdir "$data/logs"
	fi


function ipcheck {
	echo "$(date +"[%d.%m.%Y %H:%M:%S]")"

	if [ -f "$data/ip.txt" ]; then
		ip=$(head -n1 "$data/ip.txt")
		echo "Bisherige IP: $ip"
	else
		echo "Erste Ausführung."
		ip=""
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Erste Ausführung;$1" >> "$data/logs/allgemein.csv"
	fi

	if [ -f "$data/updateurl.txt" ]; then
		updateurl=$(sed 's/ //g' "$data/updateurl.txt" | head -n1 | tail -n1)
	else
		echo "Keine Update-URL hinterlegt. URL hier einfügen:"
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL fehlt" >> "$data/logs/allgemein.csv"
		read -p "Update-URL: " updateurl

		# Überprüfe, ob die URL mit "http://" oder "https://" beginnt
		if [[ "$updateurl" =~ ^(http|https):// ]]; then
			echo "URL OK."
			echo "$updateurl" > "$data/updateurl.txt"
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL hinterlegt;$1" >> "$data/logs/allgemein.csv"
		else
			echo "Die URL ist ungültig."
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL ungültig;$1" >> "$data/logs/allgemein.csv"
			exit 1
		fi
	fi

	echo "Prüfe Online-Status"
	if ping -4 -c 1 -W 3 "$ippage" >/dev/null 2>&1; then
		echo "Anschluss Online"
		ipneu=$(curl -s "$ippage")
		echo "IP: $ipneu"

		if [ "$ip" = "$ipneu" ]; then
			echo "IP unverändert."
	#		echo "$(date +"%d.%m.%Y;%H:%M:%S");IP unverändert;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
		else
			echo "Bisherige IP: $ip"
			echo "Neue IP     : $ipneu"
			echo "Aktualisiere..."
			echo "$ipneu" > "$data/ip.txt"
			curl -sSL "$updateurl" >/dev/null
			echo "OK."
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Aktualisiert auf $ipneu;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
			echo "$(date +"[%d.%m.%Y %H:%M:%S]") IP aktualisiert auf $ipneu" | mail -s "DynDNSupdater" "mail@mariobeh.de"
		fi
	else
		echo "Client ist selbst offline, kein Aktualisieren möglich."
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Client offline;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
	fi
}


if [ -z "$1" ]; then
	ipcheck
fi

exit 0
```

# Webcamloader 🐧

**Webcamloader, Debian (+Derivate)  
*Wiki-Stand: 27.12.2025*  
*Script-Stand: 28.12.2025***

[***Download***](https://wiki.mariobeh.de/link/54#bkmrk-script-download)

---

### **🚀 Vorwort**

Der **Webcamloader** ist ein universelles Bash-Script zur automatisierten Erfassung von Kamerabildern. Es eignet sich ideal für den Einsatz bei **Baufortschrittsdokumentationen**, **Wetter- und Landschaftsbeobachtungen**, **Langzeitstudien** und ähnlichen Zeitraffer-Projekten.

Das Script lädt in regelmäßigen Intervallen **Einzelbilder von Bildquellen oder Videostreams** herunter und speichert diese lokal. Die Bilder können später zu einem Zeitraffer-Video weiterverarbeitet werden.

Unterstützte Quellen: **Bildquellen:** z. B. `snapshot.jpg`, `snapshot.cgi` und **Videostreams:** z. B. `faststream`, `motion-jpeg`, `video.cgi`.

Das Script speichert alle Daten zentral unter `/home/$USER/script-data/webcamloader/`  
Darin befinden sich: **Projektverzeichnisse, Statusdaten, Logfiles und Konfigurationen**. Optional kann ein abweichender **Medienordner** (z. B. auf einer externen Festplatte) angegeben werden. Falls keiner definiert ist, wird der Medienpfad automatisch unterhalb des `script-data/webcamloader/`-Verzeichnisses angelegt.

Bitte unbedingt Datenschutzbestimmungen beachten. Mehr dazu weiter unten im [Haftungsausschluss](https://wiki.mariobeh.de/link/54#bkmrk-disclaimer).


### **⚙️ Funktionen im Wesentlichen**

Das Script prüft zu Beginn, ob die Kamera erreichbar ist, lädt ein Testbild, errechnet anhand diesem den erforderlichen Speicher für die angegebene Gesamtbildanzahl, erstellt im nächsten Schritt Projektordner und Statusdatei und nimmt die Arbeit auf.  
Falls ein Zeitfenster angegeben wurde, wird dieses berücksichtigt.  
Im Fehlerfall wird der Benutzer benachrichtigt per Email, sofern angegeben.

Wenn ein Projekt abgeschlossen wurde, erhält man wahlweise eine Mail. Daraufhin kann man über einen Menüpunkt ein Video erstellen. Hierfür sind die FPS (Frame per second) nötig anzugeben.

Das Script bietet drei Modi zum Besorgen der Bilder, die weiter unten genauer erklärt werden:  
• **Menü**: Interaktives Menü mit allen Funktionen.  
• **Quicky**: Komplette Steuerung via Argumente, kein Menü.  
• **Cron**: Einmalaufrufe, zeitgesteuert z. B. über Crontab.  
Für die **Videoerstellung** steht ein geführter Ablauf über das Menü zur Verfügung, der Schritt für Schritt und intuitiv durch den Prozess führt.


### **☝ Technische Hinweise**

• Die **Kamera-URL muss direkt** auf ein Bild oder einen Videostream verweisen – nicht auf eine HTML-Seite oder Steueroberfläche.  
• Für **E-Mail-Benachrichtigungen** muss der Server `mail` installiert und korrekt eingerichtet haben.  
• Bei dem **Funktionsschalter** gilt: -f 0 ist Hintergrundmodus (keine Ausgabe), -f 1 ist Vordergrundmodus, komplette Ausgabe. Falls Ausgabe erwünscht ist, wird das Programm `screen` empfohlen, da beim Schließen des Terminals auch das Script beendet wird.  
• Wird keine Funktion -f angegeben, startet automatisch der Vordergrundmodus.  
• **Hinweis:** Nicht jede Kamera wird unterstützt, da manche Videostreams nicht mit dem Script kompatibel sind. In solchen Fällen liefert die Kamera entweder ungeeignetes Material oder einen endlosen Stream, der das Script dauerhaft blockiert. Dieses Verhalten ist technisch bedingt und wurde im Rahmen der Möglichkeiten umfassend getestet.  
Wenn die Kamera ein klares Einzelbild liefert, funktioniert alles reibungslos, bei Videostreams kann es jedoch zu Problemen kommen. Sollte ein inkompatibler Stream erkannt werden, verweigert das Script automatisch die weitere Verarbeitung.

Das Script ist ressourcenschonend und benötigt keine Root-Rechte. Es erzeugt keine externen Weiterleitungen außer zur Kamera selbst.  
Die heruntergeladenen Bilder werden im vorher festgelegten Medien-Ordner gespeichert und können dort jederzeit angeschaut werden. Videos landen ebenfalls dort.


### **🧭 Das Menü**

[![image.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/4oYimage.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/4oYimage.png)  
Hier sieht man das Hauptmenü, welches beim Aufruf ohne Parameter gestartet wird. Dieses ist nötig für den geführten Modus, der Videoerstellung, Projekte abzubrechen oder den Status laufender Projekte zu begutachten.

### **📷 Geführter Modus 🤝🏻**

Der geführte Modus über das Hauptmenü ist die zentrale und **benutzerfreundlichste** Funktion des Webcamloaders.  
Wird das Skript ohne Parameter aufgerufen, startet es automatisch im interaktiven Hauptmenü.

Hier erfolgt die Bedienung schrittweise und intuitiv – ganz ohne Kenntnisse über Parameter oder deren Syntax. Besonders für Einsteiger ist dieser Modus ideal: Alle Einstellungen werden nacheinander abgefragt und erklärt, sodass man sicher und zielgerichtet zum gewünschten Ergebnis kommt.

Im Menü kann zwischen verschiedenen Aktionen gewählt werden: Ein neues Projekt starten, ein bestehendes Projekt fortsetzen, Einstellungen ändern, den Status prüfen oder das Projekt abbrechen. Auch ein Video lässt sich hier erstellen, diese Funktion ist im Videosektor genauer erklärt. Der Einstieg erfolgt über die Eingabe grundlegender Informationen wie Kamera-URL, Projektname, Anzahl der Bilder und Aufnahmeintervall. Optional kann ein Zeitfenster für die aktiven Aufnahmezeiten angegeben werden. Außerdem besteht die Möglichkeit, eine Benachrichtigungs-Mailadresse zu hinterlegen und zu entscheiden, ob die Ausgabe im Vordergrund oder still im Hintergrund erfolgen soll.

Sobald alle Angaben gemacht wurden, erhält man eine Übersicht mit geschätztem Speicherbedarf und Laufzeit. Mit einem einfachen Tastendruck startet die Aufzeichnung. Auch nach Projektstart können noch Informationen zum Projektstatus abgerufen oder Einstellungen angepasst werden, etwa um das Projekt frühzeitig zu beenden oder ein neues zu beginnen.

Der Menümodus ist somit der flexibelste und komfortabelste Weg, ein Zeitraffer-Projekt zu starten, und bietet zugleich volle Kontrolle über den Ablauf – ohne direkte Kommandozeilenparameter.

***Hinweis: im geführtem Modus wird derzeit die Funktion des Zeitfensters und der Zeitzone noch nicht unterstüzt. Wird diese Funktion benötigt, bitte ich den [Quicky-Modus ](https://wiki.mariobeh.de/link/54#bkmrk-%F0%9F%93%B7-quicky-modus)zu benutzen.***

[![image.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/image.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/image.png)  
Hier sieht man die Durchführung des geführten Modus', bei dem beispielhaft Daten eingetragen wurden

### **📷 Quicky-Modus 💨**

Der Quicky-Modus ist für erfahrene Benutzer gedacht, die ein Projekt schnell starten möchten.  
Nach Übergabe aller erforderlichen Parameter zeigt der Webcamloader eine Zusammenfassung inklusive Berechnung der Aufnahmedauer. Mit ENTER kann das Projekt sofort gestartet werden.

Aufruf:

```bash
./webcamloader.sh quicky -u <URL> -n <Name> -b <Anzahl> -i <Intervall> -e <E-Mail> -f <Funktion> -t <Zeitfenster>
```

Parameter im Einzelnen:

`-u` Kamera URL komplett mit http(s).  
`-n` Projektname. Freier Name für das Projekt.  
`-b` Bilderanzahl für das Gesamtprojekt.  
`-i` Intervall für die Pausenzeiten zwischen den Bilderdownloads.  
`-e` E-Mail für die Benachrichtigung (optional).  
`-f` Funktion/Ausführung - 0 oder 1 (optional).  
`-t` Zeitfenster im Format 8-18 (optional).  
`-T` Zeitzone, [hier nachlesen](https://wiki.mariobeh.de/link/54#bkmrk-%E2%8F%B0zeitzonen) (optional).

```bash
./webcamloader.sh quicky -u "http://192.168.7.199/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=0&user=user1&password=passwort" -b 15000 -p 15 -n "Vordach" -e "name@domain.tld" -f 0 -t 7-20
./webcamloader.sh quicky -u "http://192.168.7.199/mjpg/video.mjpg" -b 15000 -p 15 -n "Vordach" -e "name@domain.tld" -f 0 -t 7-20
... -t 7-20 -T ch
... -t 7-20 -T usa-nc
```

Hier sieht man demonstrativ und beispielhaft Varianten zur Eingabe im schnellen Quicky-Modus. Hier übergibt man alles, was wichtig ist, einmal dem Script und es kann dann nach einer Bestätigung die Arbeit beginnen. Beide Varianten haben als Beispiel 15.000 Bilder mit einem Intervall von 15 Sekunden.  
Zeile 1 zeigt eine Reolink-Kamera mit Passwortschutz (via URL) und Zeile 2 zeigt einen MJPEG-Videostream ohne Passwortschutz.  
Zeile 3 und 4 zeigt jeweils eine Zeitzone, die hinten an den ganzen Webcamloader-Aufruf angehängt wird.  
Zeile 3 "ch" (stellvertretend für Europe/Zurich) und 4 "usa-nc" (North Carolina, stellvertretend für America/New\_York).

### **📷 Cron-Modus ⏰**

Der Cron-Modus ist ein Einmalaufruf, bei dem genau ein Bild gespeichert wird. Dieser ist gedacht für Langzeitaufnahmen mit Bild einmal am Tag per Crontab. Dabei können auch Folgebilder gesetzt werden. Dies ist sinnvoll, wenn der Cron-Befehl um 12:00 Uhr losgeht aber man nochmal ein Bild um 16:00 Uhr haben möchte. Klar könnte man den Crontab als *12,16* kennzeichnen - man könnte hier auch 2 Bilder definieren im Abstand von 4 Stunden. Ist Geschmackssache.

Aufruf:

```bash
./webcamloader.sh cron -u <URL> -n <Name> -b <Anzahl> -i <Intervall>
```

Parameter im Einzelnen:  
`-u` Kamera URL komplett mit http(s).  
`-n` Projektname. Freier Name für das Projekt.  
`-b` Folgebilder (optional).  
`-i` Intervall (optional).

```bash
./webcamloader.sh cron -u http://192.168.7.199/cgi-bin/faststream.jpg -n "Testkamera"
./webcamloader.sh cron -u http://192.168.7.199/cgi-bin/faststream.jpg -n "Testkamera" -b 2 -i 4h
```

Der Cron-Aufruf wie hier beispielhaft zu sehen, ist dasselbe Thema wie bei Quicky, nur einmalig ein Bild. Die Daten von Quicky sind hier auch parallel anzuwenden. In Zeile 1 sieht man einen normalen, einmaligen Aufruf wie es standard- &amp; zweckmäßig beim Script mit Cron erwartet wird, bei Zeile 2 sieht man einen Folgeauftrag, der dann 2 Bilder im Abstand von 4 Stunden macht.  
Hier wird als Beispiel um 12:00 Uhr ein Cronjob gestartet mit der Ausführung um ein Bild. Dann erfolgt nach 4 Stunden das Bild 2.  
Hier könnte man auch klassisch einen Cronjob mit einer Einmalausführung mit *00 12,16 \* \* \** anlegen, hier passiert genau dasselbe.

### **📷 Bildherstellung Zusammenfassung 📋**

Die Zusammenfassung ist bei den Varianten vom geführten Modus und des Quickys gleich. Hier eine Übersicht der Zusammenfassung, die in den Fällen bestätigt werden muss.

[![image.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/gPOimage.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/gPOimage.png)  
Hier wieder beispielhafte Daten. Zum Thema Berechnung, zum Zeitpunkt dieses Bildes ist der 25.07.25, 21:45. Mit 24/7 Aufnahme und Intervall von 25 Sekunden mit 15.000 Bildern dauert die Bildspeicherung also ca. 4,5 Tage.

### **📊 Status laufender Projekte**

Unter diesem Menüpunkt lässt sich der aktuelle Status aller laufenden Projekte einsehen. Die Übersicht ist besonders hilfreich zur Kontrolle – etwa wenn ein Projekt aufgrund von Netzwerkproblemen nur selten neue Bilder liefert.

Der Status wird visuell durch ein **✔** (alles in Ordnung) oder ein **✖** (Problem erkannt) angezeigt. Zusätzlich ist ersichtlich, ob beim Start des Projekts eine Benachrichtigungs-E-Mail aktiviert wurde.

**Wichtig:**  
Projekte, die per Cron gestartet wurden, gelten technisch als immer abgeschlossen und erscheinen **nicht** in dieser Übersicht.

Die Tabelle enthält folgende Informationen:

- Projektnummer (ID)
- Projektname
- Bilder (Bildanzahl IST / SOLL)
- Intervall
- letzte Aktion (Download oder Fehler)
- errechnete Fertigstellung
- Benachrichtigung aktiv? (als ✖ oder ✔)
- Projekt OK? (als ✖ oder ✔)
- Fertigstellung in %

Außerdem werden die Projekte aufgezählt.

[![Screenshot 2025-07-27 153814.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/HEVscreenshot-2025-07-27-153814.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/HEVscreenshot-2025-07-27-153814.png)



### **🚩 Fertige Projekte**

Sobald ein Projekt abgeschlossen ist – entweder durch Erreichen der definierten Bildanzahl oder durch manuellen Abbruch bei aktiviertem unbegrenztem Download – wird es unter dem Menüpunkt **Fertige Projekte** aufgelistet.

Hier werden alle beendeten Projekte zentral gesammelt. Dieser Schritt ist zwingend notwendig für die spätere Videoerstellung - an diesem Menü führt kein Weg vorbei.

**Wichtig:**  
Projekte, die per Cron gestartet wurden, gelten technisch als immer abgeschlossen und erscheinen **grundsätzlich** in dieser Übersicht. Sie gelten immer als fertig und können zu jeder Zeit ein weiterverarbeitet werden.

Die Tabelle enthält folgende Informationen:

- Projektnummer (ID)
- Projektname
- Bildanzahl
- Intervall (nur bei manuell gestarteten Projekten sichtbar, also nicht via Cron)
- Aufnahmedatum (als Zeitraum *von–bis*, als *einzelner Tag* oder bis *heute*).

[![Screenshot 2025-07-27 154640.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/screenshot-2025-07-27-154640.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/screenshot-2025-07-27-154640.png)

### **❌ Projekt abbrechen**

Coming soon!

### **🎥 Videoerstellung**

Im oben erwähnten Menü zur Bilderstellung ist die Videoerstellung ebenfalls ein Punkt davon. Darüber lassen sich mit fertigen, abgeschlossenen Projekten ein Video erstellen. Im geführten Ablauf wird zunächst die gewünschte Bildrate (FPS – Frames per Second) abgefragt. Danach folgt eine Zusammenfassung aller relevanten Angaben zur Kontrolle. Da FPS und Bildanzahl maßgeblich die Videolänge beeinflussen, sollte hier sorgfältig geprüft werden. Dieses landet dann ebenfalls im Medienverzeichnis, parallel zu den Bildern. Ist das Video fertig, kann man das Projekt abschließen oder die FPS erneut mit anderem Wert setzen, sollte das Ergebnis des Videos nicht befriedigend sein. Wird das Projekt abgeschlossen, wird das rohe Projekt, also die Bilder als solches, gelöscht. Das Video bleibt selbstverständlich erhalten.

[![image.png](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/scaled-1680-/SPBimage.png)](https://wiki.mariobeh.de/uploads/images/gallery/2025-07/SPBimage.png)

Hier zu sehen ist das Menü für die Videoerstellung bis hin zur 📋 Zusammenfassung.

### **⏰Zeitzonen**

Das Script kann mit frei wählbaren Zeitzonen arbeiten. Die eingestellte Zeitzone bestimmt, **in welcher lokalen Zeit** das konfigurierte Zeitfenster ausgewertet wird.

**Beispiel:**  
Ist die Zeitzone auf *New York* gesetzt und das Zeitfenster auf **9-16 Uhr**, dann arbeitet das Script zu diesen Zeiten **in New Yorker Ortszeit**. Entsprechend entspricht dies in Deutschland (MEZ/MESZ) etwa **15:00–22:00 Uhr**.

Auf diese Weise können Webcams weltweit zeitgesteuert betrieben werden, ohne Aufnahmen während der Nacht zu erzeugen.

Wird **keine Zeitzone** angegeben, verwendet das Script automatisch die **Systemzeitzone** des Hosts.

Folgene Zeitzonen sind verfügbar, bzw. eingearbeitet worden. Für Vollständigkeit möchte ich nicht garantieren, aber es können Ausweichzeiten wie UTC+X genommen werden, falls wirklich.

Aufgrund der Masse habe ich die Zeitzonen ausgelagert. Zu finden hier: [Link (intern)](https://wiki.mariobeh.de/books/behwiki/page/webcamloader-timezones). Bitte exakt so verwenden, wie sie in der linken Spalte geschrieben sind.


### **⚠️ Haftungsausschluss (Disclaimer)**

##### **Allgemein**

<div id="bkmrk-dieses-skript-ist-zu">Dieses Skript ist zur Ausführung **eigener Kamerasysteme** konzipiert. Fremdquellen wie Wetterkameras, Baustellenkameras etc. dürfen nur nach ausdrücklicher Zustimmung des Rechteinhabers genutzt werden.</div><div id="bkmrk-hinweis-zum-datensch">  
**Hinweis zum Datenschutz:**  
Die Erfassung und Speicherung von Kamerabildern unterliegt der **DSGVO** und ggf. weiteren gesetzlichen Regelungen.  
Insbesondere bei **Personenerkennbarkeit** ist eine vorherige Klärung und ggf. Meldung verpflichtend.</div><div id="bkmrk-nutze-dieses-tool-ve">Nutze dieses Tool **verantwortungsvoll** und **transparent** - ausschließlich im Rahmen geltender Gesetze.  
Oder mit anderen Worten: Die **Verantwortung** für die rechtmäßige Nutzung **liegt ausschließlich beim Anwender**.  
</div><div id="bkmrk--10"></div><div id="bkmrk--11"></div>Ich übernehme **keine Haftung** für:

<div id="bkmrk-missbr%C3%A4uchliche-verw">- missbräuchliche Verwendung
- technische Schäden
- Datenschutzverletzungen jeglicher Art

</div><div id="bkmrk--12"></div>##### **Öffentliche Kameras**

<div id="bkmrk-viele-webcams-von-ge">Viele Webcams von Gemeinden, Tourismusportalen, Stauseen oder Skigebieten dürfen ausdrücklich genutzt oder eingebunden werden. Bitte unbedingt bei der betreibenden Gesellschaft der Kamera selbst informieren.</div><div id="bkmrk--13"></div><div id="bkmrk--14"></div><div id="bkmrk--15"></div>


### **💾 Script Download**

Das Programm kann hier in immer der neuesten Version heruntergeladen werden:

##### **[Webcamloader Script](https://public.mariobeh.de/scripts/webcamloader.sh)** (via mariobeh.de)  
[Webcamloader auf Github](https://github.com/mariobeh/webcamloader)

Ich bitte um Verständnis, wenn ich das Programm selbst vertreiben möchte. Das Script gibt es auch auf Github aber auf dem Server hier ist die Version stets aktuell.

---

*Nur in Deutsch verfügbar, Umbau auf anderen Sprachen auf Anfrage.*

Vielen Dank,   
mariobeh.

# Faultnotify 🐧

<p class="callout info">**Faultnotify, Debian (+Derivate)  
*Wiki-Stand: 10.04.2026*  
*Script-Stand: 10.04.2026*** *Sprachdateien-Referenz: 24.01.2026 ([mehr...](https://wiki.mariobeh.de/link/59#bkmrk-%F0%9F%97%A3%EF%B8%8F-sprachdateien))*</p>

[***Download***](https://wiki.mariobeh.de/link/59#bkmrk-script-download)

---

### **📖 Vorwort**

Faultnotify ist ein leichtgewichtiges, modular aufgebautes Bash-Script zur Überwachung von Geräten und Diensten.  
Es wurde mit dem Ziel entwickelt, Störungen **zuverlässig und frühzeitig** zu erkennen. Dazu überprüft Faultnotify Geräte und Dienste fortlaufend und informiert im Fehlerfall automatisch per Benachrichtigung.

Alle benötigten Daten werden zentral in einem festen Verzeichnis abgelegt. Dort befinden sich unter anderem die Konfiguration, Statusinformationen sowie Steuer- und optional auch Sprachdateien. Dadurch bleibt alles übersichtlich an einem Ort.

Optional kann Faultnotify um zusätzliche Sprachdateien erweitert werden. In diesem Fall ist das Script in der Lage, Benachrichtigungen und Ausgaben in der jeweiligen Sprache bereitzustellen.

Faultnotify eignet sich sowohl für einzelne Systeme als auch für größere, verteilte Umgebungen. Es kommt bewusst ohne zusätzliche Software oder Datenbanken aus und bleibt dadurch einfach, robust und wartungsarm.

In verteilten Umgebungen können Geräte und Dienste zu Gruppen zusammengefasst werden. So wird sichergestellt, dass im Störungsfall nur gezielte und sinnvolle Benachrichtigungen ausgelöst werden.

Für den Dauerbetrieb empfiehlt sich die Einrichtung als Systemdienst. Dadurch läuft Faultnotify permanent im Hintergrund und bleibt auch nach Neustarts zuverlässig aktiv.


### **💡 Allgemein und Installation**

##### **Allgemein**

Faultnotify arbeitet in einem zentralen Arbeitsverzeichnis unter:

/home/$USER/script-data/faultnotify/

In diesem Verzeichnis werden alle relevanten Dateien abgelegt, darunter die Konfiguration, Status- und Steuerdateien sowie Protokolle. Dadurch bleiben alle Informationen übersichtlich an einem Ort.

Optional kann Faultnotify um Sprachdateien erweitert werden. Diese werden im folgenden Verzeichnis abgelegt:

/home/$USER/script-data/faultnotify/lang/faultnotify-xxx.txt

Deutsch ist die im Script integrierte Standardsprache. Weitere Sprachen können über entsprechende Sprachdateien ergänzt werden. Sprachen können im [Downloadbereich](#bkmrk-script-download) heruntergeladen werden.

##### **Installation und Ersteinrichtung**

Faultnotify wird über den Befehl **install** eingerichtet. Das Script führt dabei interaktiv durch die Ersteinrichtung und legt alle grundlegenden Einstellungen an.

Während der Installation prüft Faultnotify, ob alle benötigten Programme auf dem System vorhanden sind. Fehlende Abhängigkeiten werden klar angezeigt und müssen anschließend manuell nachinstalliert werden.

Im nächsten Schritt wird der gewünschte Benachrichtigungsweg festgelegt. Zur Auswahl stehen **E-Mail** oder **Telegram**. Je nach Auswahl werden die erforderlichen Angaben abgefragt und in der Konfiguration gespeichert.

Zum Abschluss der Einrichtung wird ein Verifizierungscode an die angegebene E-Mail-Adresse oder an den ausgewählten Telegram-Account gesendet. Dieser Code muss eingegeben werden, um sicherzustellen, dass Benachrichtigungen im Störungsfall korrekt zugestellt werden.

Wird die Verifizierung übersprungen oder schlägt sie fehl, wird die Installation dennoch fortgesetzt. Die Benachrichtigungseinstellungen können später manuell angepasst werden, jedoch ohne erneute automatische Verifizierung. In diesem Fall liegt die vollständige Verantwortung für eine funktionierende Zustellung beim Nutzer. Ein entsprechender Workaround ist separat beschrieben.

##### **Gruppenlogik und Abhängigkeiten**

Die Gruppenlogik wurde eingeführt, um Benachrichtigungsfluten gezielt zu vermeiden. Ein typisches Anwendungsbeispiel ist die Überwachung einer VPN-Verbindung mit mehreren dahinterliegenden Geräten oder Diensten.

Fällt in einem solchen Szenario die VPN-Verbindung aus, sind alle nachgelagerten Geräte ebenfalls nicht erreichbar. Ohne Gruppenlogik würde dies zu einer Vielzahl gleichzeitiger Störungsmeldungen führen, obwohl die eigentliche Ursache lediglich der VPN-Ausfall ist.

Durch die Gruppenbildung prüft Faultnotify zuerst den übergeordneten Eintrag. Ist dieser nicht erreichbar, werden die Prüfungen der abhängigen Geräte ausgesetzt und es erfolgen keine weiteren Benachrichtigungen für diese Einträge.

Erst wenn der übergeordnete Dienst wieder verfügbar ist, werden die abhängigen Geräte erneut geprüft. Dadurch bleiben Benachrichtigungen übersichtlich, aussagekräftig und auf die tatsächliche Ursache beschränkt.

### **📋 Geräteprüfung (TEST)**

Das Modul test ist die zentrale Prüffunktion von Faultnotify. Es prüft alle in der Konfiguration hinterlegten Geräte und Dienste und erkennt Störungen sowie Wiederherstellungen.

Bei direktem Aufruf führt test genau einen vollständigen Durchlauf aus. Das bedeutet:

- Alle Geräte und Dienste werden einmal geprüft.
- Im Fehlerfall werden Benachrichtigungen ausgelöst.
- Danach endet der Durchlauf automatisch.

### **🏭 Automation (RUN)**

Dies ist der Dauerschleifen-Modus. Hier werden permanent mit einem Versatz von 5 Sekunden die in der Konfiguration eingerichteten Geräte und Dienste geprüft.

**Hinweis:** Wird `run` direkt im Terminal gestartet, läuft Faultnotify im Vordergrund und blockiert das Terminal. Für den Dauerbetrieb wird die Einrichtung als Systemdienst empfohlen. Dadurch läuft Faultnotify dauerhaft im Hintergrund und der Status ist jederzeit über `systemctl status faultnotify` sichtbar.

### **<span class="x19la9d6 x1fc57z9 x6ikm8r x10wlt62 x19co3pv x11tp94h xfibh0p xiy17q3 x1xsqp64 x1lkfr7t xexx8yu xyri2b x18d9i69 x1c1uobl" style="background-image: url('https://web.whatsapp.com/emoji/v1/16/0/1/single/a/40/002795.png'); white-space: pre-wrap;"><span class="xrtxmta x1bhl96m">➕</span></span> Geräte/Dienste hinzufügen (ADD)**

Mit dem Modul **add** können neue Geräte und Dienste interaktiv zur Überwachung hinzugefügt werden. Der Vorgang ist dialoggeführt aufgebaut und kann mehrfach hintereinander ausgeführt werden, um mehrere Einträge nacheinander anzulegen.

Zu Beginn ermittelt Faultnotify automatisch die nächste freie Geräte-ID. Diese wird fortlaufend vergeben.

Im Anschluss werden Schritt für Schritt folgende Angaben abgefragt:

- **Name des Geräts oder Dienstes**  
    Der Anzeigename dient ausschließlich der Übersicht. Kritische Zeichen werden automatisch bereinigt, um die Konfigurationsdatei konsistent zu halten.
- **IP-Adresse oder Domain**  
    Es kann entweder eine IPv4-Adresse oder ein gültiger Domainname angegeben werden.
- **Dienstüberwachung (optional)**  
    Falls ein Dienst überwacht werden soll, wird der zu prüfende Port abgefragt.
- **Abhängigkeit von einem Master-Gerät (optional)**  
    Geräte und Dienste können einem bestehenden Eintrag untergeordnet werden. Dadurch lassen sich Abhängigkeiten abbilden, zum Beispiel:
    
    
    - Dienste hängen von einem Server ab
    - Untergeräte hängen von einem Hauptgerät ab
    
    Ist kein Master angegeben, wird der Eintrag automatisch der Root-Gruppe (G000) zugeordnet.

Nach Abschluss der Eingaben wird der neue Eintrag:

- in die Konfigurationsdatei geschrieben
- im internen Log protokolliert
- sofort für künftige Prüfungen berücksichtigt

Der Hinzufügen-Modus kann jederzeit durch eine leere Eingabe beim Namen beendet werden. Nach dem ersten erfolgreichen Hinzufügen wird Faultnotify als „eingerichtet“ markiert, sodass die Überwachung genutzt werden kann.

<article class="text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&:has([data-writing-block])>*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]" data-scroll-anchor="true" data-testid="conversation-turn-34" data-turn="assistant" data-turn-id="0a6a973b-0ec9-499a-8e5b-91120508ae92" dir="auto" id="bkmrk-hinweis-zur-gruppenl" tabindex="-1">**Hinweis zur Gruppenlogik:**

Die Gruppenlogik entstand aus der praktischen Anforderung heraus, Benachrichtigungsfluten zu vermeiden. Ein typisches Beispiel ist die Überwachung einer VPN-Verbindung mit mehreren dahinterliegenden Geräten oder Diensten.

Fällt in einem solchen Szenario die VPN-Verbindung aus, wären die nachgelagerten Geräte zwangsläufig ebenfalls nicht erreichbar. Ohne Gruppierung würde dies zu einer Vielzahl gleichzeitiger Störungsmeldungen führen, obwohl die eigentliche Ursache nur der VPN-Ausfall ist.

Durch die Gruppenbildung wird dieses Problem gezielt verhindert. Wird ein Gerät oder Dienst als abhängig von der VPN-Überwachung angelegt, prüft Faultnotify zuerst den übergeordneten Eintrag. Ist dieser nicht erreichbar, werden die untergeordneten Prüfungen ausgesetzt und es erfolgt keine weitere Benachrichtigung für die abhängigen Geräte.

Erst wenn die VPN-Verbindung wieder verfügbar ist, werden die nachgelagerten Geräte erneut geprüft. Auf diese Weise bleibt die Benachrichtigung aussagekräftig, übersichtlich und auf die tatsächliche Ursache beschränkt.

</article>### **✏️ Modifizierung/Bearbeitung (MOD)**

Das Modul **mod** dient zur nachträglichen Pflege und Anpassung von Faultnotify. Es ermöglicht sowohl die Verwaltung einzelner Geräte und Dienste als auch die Änderung zentraler Konfigurationseinstellungen.

Nach dem Start von mod wird zunächst abgefragt, **welcher Bereich geändert werden soll**:

- **Geräte und Dienste**
- **Zentrale Konfiguration**

**Geräte und Dienste bearbeiten**

Wird der Geräte-/Service-Bereich gewählt, zeigt Faultnotify zunächst **alle aktuell eingerichteten Einträge** in einer übersichtlichen Liste an. Jeder Eintrag enthält unter anderem:

- Geräte- bzw. Service-ID
- Gruppenzugehörigkeit
- Name
- IP-Adresse
- optional Port und Protokoll

Anschließend wird abgefragt, **welcher Eintrag geändert werden soll**. Die Auswahl kann flexibel erfolgen:

- über die Geräte-ID (z. B. `D006` oder `006`)
- über einen Teil des Namens
- über die vollständige IP-Adresse

Nach eindeutiger Zuordnung des Eintrags stehen zwei Optionen zur Verfügung:

1. **Eintrag löschen und neu definieren**  
    Der bestehende Eintrag wird entfernt, zugehörige Status- und Jail-Informationen werden bereinigt und anschließend wird automatisch der add-Dialog gestartet, um das Gerät oder den Dienst neu anzulegen.
2. **Eintrag ersatzlos löschen**  
    Der Eintrag wird vollständig aus der Konfiguration entfernt. Auch hier werden zugehörige Status- und Jail-Dateien bereinigt.

Damit lassen sich Geräte und Dienste sauber korrigieren, ersetzen oder dauerhaft entfernen.

**Konfiguration bearbeiten**

Wird die Konfiguration gewählt, zeigt Faultnotify zunächst **alle relevanten aktuellen Einstellungen** an, inklusive erklärender Hinweise. Dazu gehören unter anderem:

- Online-Ping-Prüfung (Referenz für Internet-Erreichbarkeit)
- Art der Benachrichtigung (E-Mail oder Telegram)
- E-Mail-Empfänger
- Telegram-Bot-Token
- Telegram-Chat-ID
- Nächste zu vergebende Geräte-ID

Anschließend kann gezielt ein einzelner Parameter geändert werden. Jede Änderung erfolgt interaktiv:

- Neuer Wert eingeben
- Übersicht anzeigen
- explizite Bestätigung vor dem Übernehmen

Eingaben werden dabei geprüft (z. B. Format von IP-Adressen, Domains, E-Mail-Adressen oder IDs), um fehlerhafte Konfigurationen zu vermeiden. Kommentare in der Konfigurationsdatei bleiben erhalten.

**Ziel des MOD-Moduls**

Das mod-Modul stellt sicher, dass Faultnotify auch im laufenden Betrieb **einfach, kontrolliert und konsistent gepflegt** werden kann - ohne manuelle Eingriffe in die Konfigurationsdatei und ohne das Risiko inkonsistenter Zustände.

### **📜 Übersicht (DRAW)**

Mit dem Modul draw kann die komplette Geräte- und Dienststruktur übersichtlich als Baum angezeigt werden. Dabei werden alle Abhängigkeiten berücksichtigt, sodass auf einen Blick sichtbar ist, welche Geräte oder Dienste untergeordnet sind und welche als übergeordnete „Master“-Ebene dienen.

Die Darstellung beginnt bei ROOT (G000) und zeigt darunter alle Einträge aus der Konfiguration in einer klaren Hierarchie. Zusätzlich werden die wichtigsten Informationen direkt in der Ausgabe mitgeführt:

- ID des Eintrags
- Name bzw. Beschreibung
- IP-Adresse
- optional Port

Fehlerhinweis bei ungültigen Abhängigkeiten  
Falls ein Eintrag auf ein nicht vorhandenes Master-Gerät verweist, gibt draw einen Hinweis aus und listet die betroffenen Einträge auf. Dadurch lassen sich fehlerhafte Abhängigkeiten schnell erkennen und anschließend über mod korrigieren.

[![Screenshot 2026-01-24 220734.jpg](https://wiki.mariobeh.de/uploads/images/gallery/2026-01/scaled-1680-/mRwscreenshot-2026-01-24-220734.jpg)](https://wiki.mariobeh.de/uploads/images/gallery/2026-01/mRwscreenshot-2026-01-24-220734.jpg)  
Hier zu sehen: DRAW-Auflistung mit Beispielwerten.

### **🆘 Fehler / Troubleshooting**

Wird während der Installation eine Eingabe wie die Benachrichtigung falsch getägigt oder die Verifizierung der Benachrichtigung übersprungen oder schlägt fehl, wird die Installation trotzdem weitergeführt. Die Verifizierung dient dazu, dass sichergestellt werden kann, dass im Störungsfall auch Benachrichtigungen ankommen können.  
In diesem Fall kann im Verzeichnis `script-data/faultnotify` die Datei `.installed` gelöscht werden, um die Installation erneut zu starten und die Erstkonfiguration nochmals vollständig durchzuführen.

### **🗣️ Sprachdateien**

Faultnotify ist in der Lage, in verschiedenen Sprachen zu arbeiten und Benachrichtigungen entsprechend auszugeben. Grundlage dafür sind externe Sprachdateien. Im Script wird die **I18N-Übersetzungstechnologie** eingesetzt. Diese ermöglicht eine klare Trennung zwischen Programmlogik und Textausgaben und bildet die Grundlage für die mehrsprachige Ausgabe von Meldungen und Benachrichtigungen.

Deutsch ist die im Script fest integrierte Standardsprache. Zusätzlich steht eine englische Sprachdatei zum [Download ](https://wiki.mariobeh.de/link/59#bkmrk-script-download)bereit.

Weitere Sprachen können jederzeit ergänzt werden. Die Sprachdateien sind bewusst einfach aufgebaut, sodass sie von jedermann erstellt oder erweitert werden können. Dadurch ist Faultnotify nicht auf eine feste Anzahl von Sprachen beschränkt und lässt sich flexibel an unterschiedliche Umgebungen anpassen.

Die Sprachdatei muss dann im zentralen Pfad im Ordner *lang/* eingepflegt werden. Liegen mehrere Sprachdateien im Ordner, wird die erste vom Script automatisch ausgewählt. Es ist daher ratsam, nur die benötigte Sprache herunterzuladen.

Faultnotify verwendet zur Einbindung von Sprachdateien einen SHA-256-Referenzcode, der direkt aus dem Script abgeleitet wird. Dieser Referenzcode stellt sicher, dass eine Sprachdatei eindeutig zu genau dieser Script-Version gehört. Diese Referenz ist in der ersten Zeile zu finden. Wenn eine neue Sprache integriert wird, ist dieser Referenzcode einzusetzen.

Dadurch wird verhindert, dass versehentlich eine unpassende oder fremde Sprachdatei verwendet wird, zum Beispiel aus einem anderen Script oder einer älteren Version. Stimmen Script und Sprachdatei nicht überein, wird die Sprachdatei nicht geladen.

Der zugehörige Referenzcode lautet:

```bash
9b0cdcd7cf19ab12afe54cafdbe0afaad8999c3b45d9c6024823864091cdd205
```

Bitte beachten, dass sich dieser Referenzcode mit einer neuen Version ändern kann. Hintergrund ist die Integrität zur neuen Version, falls neue Textabschnitte hinzukommen oder welche abgeändert werden.

Im Falle eines Updates wird darauf hingewiesen mit Link in der Script-Standardsprache (Deutsch) und Englisch.

[![Screenshot 2026-01-25 032123.png](https://wiki.mariobeh.de/uploads/images/gallery/2026-01/scaled-1680-/screenshot-2026-01-25-032123.png)](https://wiki.mariobeh.de/uploads/images/gallery/2026-01/screenshot-2026-01-25-032123.png)Hier zu sehen: erste Zeilen der englischen Sprachdatei.

### **💾 Download**

Das **Programm** kann hier in immer der neuesten Version heruntergeladen werden:

##### **[Faultnotify Script](https://public.mariobeh.de/scripts/faultnotify.sh)** (via mariobeh.de)

```bash
curl -s https://public.mariobeh.de/scripts/faultnotify.sh | bash
```

**Sprachdateien:**

**[Englisch](https://public.mariobeh.de/scripts/faultnotify-eng.txt)** (via mariobeh.de)

```bash
USER=$(whoami) && mkdir -p /home/$USER/script-data/faultnotify/lang/ && curl -o /home/$USER/script-data/faultnotify/lang/faultnotify-eng.txt https://public.mariobeh.de/scripts/faultnotify-eng.txt && curl -s https://public.mariobeh.de/scripts/faultnotify.sh | bash
```

*(um gleich in Englisch zu starten, ist dieser Befehl erfoderlich. Er erstellt die Verzeichnisstruktur und legt die Sprachdatei an passender Stelle ab. Dieser Befehl lädt nicht nur die Sprachdatei, sondern startet direkt das Script.)*

**Hinweis:** Deutsch ist die im Script fest integrierte Standardsprache und benötigt keine separate Sprachdatei. Daher wird Deutsch hier nicht separat angeboten. Weitere Sprachen werden folgen.

### **💾 Update**

Über ein externes Updater-Script kann Faultnotify immer geupdated werden. Link hier: Updater-Script (COMING SOON!)

Für die Sprachdatei gilt ein direktes Verfahren, einfach den Link einfügen, Sprachdatei wird automatisch an Ort und Stelle geladen. Alternativ kann oben die Datei manuell ins System eingepflegt werden.

```bash
USER=$(whoami) && mkdir -p /home/$USER/script-data/faultnotify/lang/ && curl -o /home/$USER/script-data/faultnotify/lang/faultnotify-eng.txt https://public.mariobeh.de/scripts/faultnotify-eng.txt
```

<div class="notranslate" id="bkmrk--17" style="all: initial;"></div>

# IPlogger 🐧 mit MySQL/MariaDB-Unterstützung (iplogger-db.sh)

<p class="callout info">**IPlogger, Debian (+Derivate)  
*Wiki-Stand: 12.05.2026*  
*Script-Stand: 12.05.2026*** [***Download***](https://wiki.mariobeh.de/link/61#bkmrk-script-download)</p>

# IPLogger DB – IP- und Verfügbarkeitsüberwachung

## Überblick

Der `iplogger-db.sh` ist ein datenbankgestützter IP-Logger zur dauerhaften Überwachung der eigenen Internetverbindung und der öffentlichen WAN-IP-Adresse.  
Das Script wurde dafür entwickelt, langfristig und nachvollziehbar festzuhalten:

- welche öffentliche IP-Adresse zu welchem Zeitpunkt aktiv war
- ob eine Internetverbindung vorhanden war
- ob lediglich die IP-Ermittlung fehlgeschlagen ist
- welche Prüfdienste funktioniert oder versagt haben
- wie lange einzelne IPs aktiv waren
- wann Provider oder Verbindungen ausgefallen sind

Der Fokus liegt nicht auf einer simplen „Wie ist meine IP“-Abfrage, sondern auf einer historisch nachvollziehbaren Langzeitaufzeichnung mit Auswertung und Zeiträumen.

Das System arbeitet vollständig datenbankbasiert und speichert jede einzelne Messung dauerhaft ab.

---

# Ziel des Systems

Der Logger beantwortet unter anderem folgende Fragen:

- Welche öffentliche IP war am 12.03.2024 um 14:00 Uhr aktiv?
- Wie lange blieb eine bestimmte IP bestehen?
- Wann erfolgte ein DSL-/WAN-Reconnect?
- War die Leitung tatsächlich offline oder nur ein Prüfdienst gestört?
- Welche Provider lieferten fehlerhafte Antworten?
- Welche DNS-/Connectivity-Ziele waren erreichbar?
- Wie oft kam es zu Unterbrechungen?
- Wie stabil arbeitet die Internetanbindung?

Gerade bei:

- DSL-Zwangstrennungen
- CGNAT-/Providerwechseln
- VPN-/Tunnelproblemen
- Routingfehlern
- sporadischen Ausfällen
- Providerstörungen

liefert die Historie eine klare technische Nachvollziehbarkeit.

---

# Architektur

Das System besteht aus mehreren Komponenten:

<div class="TyagGW_tableContainer" id="bkmrk-komponente-aufgabe-p"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2016" data-start="1673"><thead data-end="1697" data-start="1673"><tr data-end="1697" data-start="1673"><th class="last:pe-10" data-col-size="sm" data-end="1686" data-start="1673">Komponente</th><th class="last:pe-10" data-col-size="md" data-end="1697" data-start="1686">Aufgabe</th></tr></thead><tbody data-end="2016" data-start="1708"><tr data-end="1755" data-start="1708"><td data-col-size="sm" data-end="1722" data-start="1708">`providers`</td><td data-col-size="md" data-end="1755" data-start="1722">Öffentliche IP-Abfragedienste</td></tr><tr data-end="1831" data-start="1756"><td data-col-size="sm" data-end="1780" data-start="1756">`connectivity_checks`</td><td data-col-size="md" data-end="1831" data-start="1780">Prüft, ob Internet grundsätzlich erreichbar ist</td></tr><tr data-end="1873" data-start="1832"><td data-col-size="sm" data-end="1842" data-start="1832">`state`</td><td data-col-size="md" data-end="1873" data-start="1842">Speichert Rotationszustände</td></tr><tr data-end="1914" data-start="1874"><td data-col-size="sm" data-end="1884" data-start="1874">`iplog`</td><td data-col-size="md" data-end="1914" data-start="1884">Historische Hauptdatenbank</td></tr><tr data-end="1963" data-start="1915"><td data-col-size="sm" data-end="1929" data-start="1915">`summary_*`</td><td data-col-size="md" data-end="1963" data-start="1929">Auswertung und Zusammenfassung</td></tr><tr data-end="2016" data-start="1964"><td data-col-size="sm" data-end="1982" data-start="1964">PDF-/CSV-Export</td><td data-col-size="md" data-end="2016" data-start="1982">Archivierung und Dokumentation</td></tr></tbody></table>

</div></div>---

# Grundlogik

Der Ablauf einer Messung sieht vereinfacht so aus:

```
1. Connectivity prüfen
2. Wenn Internet vorhanden:
3. Öffentliche IP ermitteln
4. Ergebnis speichern
5. Statistiken aktualisieren
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--3"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--4"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Wichtig dabei:

Das Script unterscheidet sauber zwischen:

<div class="TyagGW_tableContainer" id="bkmrk-zustand-bedeutung-of"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2564" data-start="2291"><thead data-end="2314" data-start="2291"><tr data-end="2314" data-start="2291"><th class="last:pe-10" data-col-size="sm" data-end="2301" data-start="2291">Zustand</th><th class="last:pe-10" data-col-size="md" data-end="2314" data-start="2301">Bedeutung</th></tr></thead><tbody data-end="2564" data-start="2325"><tr data-end="2365" data-start="2325"><td data-col-size="sm" data-end="2337" data-start="2325">`OFFLINE`</td><td data-col-size="md" data-end="2365" data-start="2337">Keine Internetverbindung</td></tr><tr data-end="2432" data-start="2366"><td data-col-size="sm" data-end="2383" data-start="2366">`CHECK_FAILED`</td><td data-col-size="md" data-end="2432" data-start="2383">Internet vorhanden, aber IP nicht ermittelbar</td></tr><tr data-end="2468" data-start="2433"><td data-col-size="sm" data-end="2440" data-start="2433">`OK`</td><td data-col-size="md" data-end="2468" data-start="2440">IP erfolgreich ermittelt</td></tr><tr data-end="2529" data-start="2469"><td data-col-size="sm" data-end="2490" data-start="2469">`INVALID_RESPONSE`</td><td data-col-size="md" data-end="2529" data-start="2490">Provider lieferte ungültige Antwort</td></tr><tr data-end="2564" data-start="2530"><td data-col-size="sm" data-end="2541" data-start="2530">`NO_RUN`</td><td data-col-size="md" data-end="2564" data-start="2541">Reservierter Status</td></tr></tbody></table>

</div></div>Dadurch wird verhindert, dass ein einfacher Fehler eines einzelnen IP-Dienstes fälschlich als Internetausfall interpretiert wird.

---

# Initialisierung

## <span role="text">Einstiegspunkt: `init`</span>

```
./iplogger-db.sh init
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--6"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--7"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Dieser Befehl erstellt die komplette Datenbankstruktur.

Dabei werden automatisch angelegt:

- Tabellen
- Standardprovider
- Connectivity-Ziele
- Rotationsstatus

---

# Datenbanktabellen

Es muss vorab ein Benutzer und eine Datenbank erstellt sein. Die init-Datenbankinitialisierung erstellt dann die Tabellen.

## providers

Enthält alle IP-Ermittlungsdienste.

Standardmäßig:

- icanhazip.com
- ifconfig.me
- api.ipify.org
- checkip.amazonaws.com

Gespeichert werden zusätzlich:

- Erfolgszähler
- Fehlerzähler
- letzter Erfolg
- letzter Fehler
- Timeoutwerte

Beispiel:

<div class="TyagGW_tableContainer" id="bkmrk-name-url-icanhazip.c"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3380" data-start="3272"><thead data-end="3286" data-start="3272"><tr data-end="3286" data-start="3272"><th class="last:pe-10" data-col-size="sm" data-end="3279" data-start="3272">Name</th><th class="last:pe-10" data-col-size="sm" data-end="3286" data-start="3279">URL</th></tr></thead><tbody data-end="3380" data-start="3297"><tr data-end="3338" data-start="3297"><td data-col-size="sm" data-end="3313" data-start="3297">icanhazip.com</td><td data-col-size="sm" data-end="3338" data-start="3313">[https://icanhazip.com<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span>](https://icanhazip.com)</td></tr><tr data-end="3380" data-start="3339"><td data-col-size="sm" data-end="3355" data-start="3339">api.ipify.org</td><td data-col-size="sm" data-end="3380" data-start="3355">[https://api.ipify.org<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span>](https://api.ipify.org)</td></tr></tbody></table>

</div></div>---

## connectivity\_checks

Prüft die generelle Internetverfügbarkeit.

Standardmäßig:

- Google DNS (`8.8.8.8`)
- Quad9 (`9.9.9.9`)
- Cloudflare (`1.1.1.1`)

Die Prüfung erfolgt per Ping.

---

## state

Speichert interne Rotationsinformationen.

Dadurch wird nicht immer derselbe Provider zuerst verwendet.

Beispiele:

<div class="TyagGW_tableContainer" id="bkmrk-name-wert-next_provi"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3828" data-start="3743"><thead data-end="3758" data-start="3743"><tr data-end="3758" data-start="3743"><th class="last:pe-10" data-col-size="sm" data-end="3750" data-start="3743">Name</th><th class="last:pe-10" data-col-size="sm" data-end="3758" data-start="3750">Wert</th></tr></thead><tbody data-end="3828" data-start="3769"><tr data-end="3796" data-start="3769"><td data-col-size="sm" data-end="3791" data-start="3769">next\_provider\_index</td><td data-col-size="sm" data-end="3796" data-start="3791">2</td></tr><tr data-end="3828" data-start="3797"><td data-col-size="sm" data-end="3823" data-start="3797">next\_connectivity\_index</td><td data-col-size="sm" data-end="3828" data-start="3823">1</td></tr></tbody></table>

</div></div>---

## iplog

Die zentrale Historientabelle.

Hier wird jede Messung dauerhaft gespeichert.

Gespeichert werden unter anderem:

- Messzeitpunkt
- öffentliche IP
- Status
- verwendeter Provider
- Anzahl Versuche
- Fehlermeldungen
- Rohantworten
- Connectivity-Status

---

# Rotationssystem

## Warum Rotation?

Würde immer derselbe Provider zuerst verwendet werden:

- wäre dieser stärker belastet
- Fehler würden schwerer auffallen
- andere Provider würden kaum genutzt

Deshalb arbeitet das System rotierend.

---

## Beispiel

### Durchlauf 1

```
1. icanhazip.com
2. ifconfig.me
3. ipify
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--14"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--15"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>### Durchlauf 2

```
1. ifconfig.me
2. ipify
3. icanhazip.com
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--16"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--17"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>### Durchlauf 3

```
1. ipify
2. icanhazip.com
3. ifconfig.me
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--18"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--19"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Dadurch verteilt sich die Last gleichmäßig.

---

# Connectivity-Prüfung

## <span role="text">Einstiegspunkt: `check` oder `run`</span>

```
./iplogger-db.sh check
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--21"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--22"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>oder:

```
./iplogger-db.sh run
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--23"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--24"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Beides startet dieselbe Messlogik.

---

## Ablauf der Connectivity-Prüfung

Vor der eigentlichen IP-Ermittlung wird geprüft:

- besteht überhaupt Internet?
- ist Routing vorhanden?
- funktionieren externe Ziele?

Dazu werden mehrere bekannte Ziele angepingt.

Erst wenn mindestens eines erreichbar ist, wird die IP-Abfrage gestartet.

---

# Provider-Prüfung

Nach erfolgreicher Connectivity-Prüfung:

```
curl -> Provider -> Antwort validieren
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--27"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--28"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Dabei wird geprüft:

- ist die Antwort leer?
- ist die Antwort eine gültige IPv4?
- ist die Antwort eine gültige IPv6?

Nur dann gilt der Durchlauf als erfolgreich.

---

# Beispielabläufe

## Erfolgreicher Lauf

```
Connectivity OK
Provider erreichbar
IP gültig
→ Status OK
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--30"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--31"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Gespeichert wird beispielsweise:

```
2026-05-12 22:00:00
IP: 93.192.117.44
Status: OK
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--32"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--33"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## Internet vorhanden, aber Provider kaputt

```
Connectivity OK
Provider liefert Müll
→ CHECK_FAILED
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--35"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--36"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Beispiel:

```
Provider https://api.example liefert:
ERROR 500
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--37"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--38"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Das Internet funktioniert trotzdem.

---

## Komplett offline

```
Google DNS nicht erreichbar
Cloudflare nicht erreichbar
Quad9 nicht erreichbar
→ OFFLINE
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--40"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--41"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# Summary-System

Das eigentliche Kernstück ist die Verlaufsanalyse.

Einzelne Messungen werden zu Zeiträumen zusammengefasst.

---

# <span role="text">Einstiegspunkt: `summary`</span>

## Tabellenansicht

```
./iplogger-db.sh summary tabelle
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--44"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--45"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Beispiel:

```
BEGIN_AT           END_AT             IP               SAMPLES OFFLINE FAILS
2026-05-01 10:00  2026-05-03 02:00   93.192.117.44         91       0     0
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--46"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--47"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

## Textansicht

```
./iplogger-db.sh summary text
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--49"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--50"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Beispiel:

```
01.05.2026 10:00 Uhr - 03.05.2026 02:00 Uhr:
IP 93.192.117.44 (91x online)
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--51"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--52"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# Wie die Periodenerkennung funktioniert

Die Funktion `summary_rows()` analysiert die komplette Historie.

Sobald sich die IP ändert:

```
alte Periode schließen
neue Periode beginnen
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--54"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--55"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Zusätzlich werden innerhalb der Periode gezählt:

- Offline-Ereignisse
- Fehler
- erfolgreiche Samples

---

# Detailmodus

## Einstiegspunkt

```
./iplogger-db.sh summary export pdf details
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--57"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--58"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Der Detailmodus erzeugt eine vollständige Zeitauflistung aller erfolgreichen Messungen innerhalb einer Periode.

---

## Beispiel

```
16.02.2020 05:00 Uhr - 16.02.2020 11:00 Uhr:
IP 93.192.117.44 (24x online)

- 16.02.2020 05:00 06:00 07:00 08:00
- 16.02.2020 09:00 10:00 11:00
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--60"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--61"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Oder bei Tageswechsel:

```
07.02.2021 04:00 05:00 06:00
08.02.2021 00:00 01:00 02:00
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--62"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--63"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Dadurch werden lange Zeiträume kompakt lesbar dargestellt.

---

# PDF-Export

## Einstiegspunkt

```
./iplogger-db.sh summary export pdf
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--65"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--66"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>oder:

```
./iplogger-db.sh summary export pdf details
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--67"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--68"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Der Export erzeugt automatisch:

- TXT-Zwischendatei
- PDF-Datei
- Überschrift
- Datum
- Seitenzahlen

Verwendet werden bevorzugt:

- `enscript`
- `ps2pdf`

Alternativ:

- `pandoc`

---

# CSV-Export

## Einstiegspunkt

```
./iplogger-db.sh summary export csv
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--70"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--71"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Exportiert die zusammengefassten Perioden in maschinenlesbarer Form.

Beispiel:

```
begin_at;end_at;ip;samples;offline;fails
2026-05-01 10:00;2026-05-03 02:00;93.192.117.44;91;0;0
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--72"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--73"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# Historischer CSV-Import

## Einstiegspunkt

```
./iplogger-db.sh import ipdb.csv ";"
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--75"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--76"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Der CSV-Import dient primär zur Übernahme historischer Daten aus der ersten Generation des IPLoggers.

Dabei werden ältere Aufzeichnungen in die neue Datenbankstruktur übernommen.

Unterstützt werden:

- erfolgreiche IPs
- Offline-Einträge
- Fehlerzustände

---

# Typische Einsatzszenarien

## WAN-Reconnects nachvollziehen

```
IP 1:
01:00 - 12:00

IP 2:
12:05 - aktuell
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--78"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--79"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>→ DSL-Zwangstrennung klar sichtbar.

---

## Providerprobleme erkennen

```
15x CHECK_FAILED
aber keine OFFLINE-Zustände
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--81"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class="pe-11 pt-3"><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--82"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>→ Internet vorhanden, aber IP-Dienst gestört.

---

## VPN-/Tunnelprobleme analysieren

Wenn:

- Connectivity vorhanden
- aber bestimmte Ziele nicht erreichbar

kann nachvollzogen werden:

- wann Routingprobleme begannen
- wie lange sie bestanden
- ob WAN-Wechsel beteiligt waren

---

# Besonderheiten

## IPv4 und IPv6

Das System akzeptiert beide Varianten automatisch.

---

## Zeitbasierte Rotation

Provider und Connectivity-Checks werden nicht statisch verwendet.

Das verhindert:

- Single-Point-Abhängigkeiten
- einseitige Last
- verfälschte Statistiken

---

## Dauerhafte Historie

Die Datenbank arbeitet append-only.

Neue Einträge werden ausschließlich ergänzt.

Dadurch bleibt die komplette Historie nachvollziehbar erhalten.

---

# Beispiel für Cronjob

```bash
0 * * * * /srv/scripte/iplogger-db.sh check >/dev/null 2>&1
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--88"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr" id="bkmrk--89"><div class="cm-scroller">  
</div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Dadurch erfolgt stündlich eine neue Messung.

---

# Fazit

`iplogger-db.sh` ist kein einfacher „Wie ist meine IP“-Checker, sondern ein vollständiges Langzeit-Überwachungs- und Auswertungssystem für:

- öffentliche WAN-IPs
- Internetverfügbarkeit
- Providerstabilität
- Fehleranalysen
- historische Zeiträume
- dokumentierbare Verbindungsverläufe

Besonders wertvoll wird das System durch:

- die periodische Zusammenfassung
- die saubere Statusunterscheidung
- die rotierenden Prüfmechanismen
- die nachvollziehbare Langzeithistorie
- die Exportfunktionen für Archivierung und Dokumentation

### **💾 Download**

Das **Programm** kann hier in immer der neuesten Version heruntergeladen werden:

##### **[IPlogger Script](https://public.mariobeh.de/scripts/iplogger-db.sh)** (via mariobeh.de)

# Telegram Benachrichtigungsdienst mit einer einzigen PHP

Ein Benachrichtigungsansatz, der schnell und einfach umzusetzen ist - in nur einer Datei, mit Ausnahme einer Konfiguration, wäre ein Träumchen. Das habe ich mir gedacht und habe das telegram.php ins Leben gerufen. Die Einstellungen zum Bot und zum Chat, sowie die Nachricht selbst, werden der PHP alle übergeben, sodass es eine Konfigurationsdatei überflüssig macht.

Diese Datei ist universell ausgelegt, betriebssystemunabhängig, also rein PHP - logisch, wie der Dateiname verrät. Alles, was benötigt wird, ist PHP selbst. Falls die PHP scripttechnisch aufgerufen wird, nicht nur im Browser, dann wird auch z. B. curl benötigt.

Der PHP müssen sämtliche Daten mit GET mitübergeben werden, damit das PHP diese intern verarbeiten kann.

Die zu übergebenden Parameter **bot**, **chatid** und **msg** werden hier erklärt:

• bot=... ist der BOT:TOKEN des Botfathers von Telegram,  
• chatid=... ist der Chat, an dem die Nachricht gehen soll,  
• msg=... ist die Nachricht, die übergeben wird.

Beispielaufruf:

```bash
http(s)://sub.domain.tld/telegram.php?bot=123456789:ABCdefGhIjKlMnOpQrStUvWxYz&chatid=987654321&msg=Hallo ich bins
curl "http(s)://sub.domain.tld/telegram.php?bot=123456789:ABCdefGhIjKlMnOpQrStUvWxYz&chatid=987654321&msg=Hallo ich bins"
php -f /srv/scripts/telegram.php "?bot=123456789:ABCdefGhIjKlMnOpQrStUvWxYz&chatid=987654321&msg=Hallo ich bins"
```

Zeile 1 zeigt einen Aufruf direkt im Browser. Macht an sich keinen Sinn, nur zur Veranschaulichung und eventuell zum Testen.  
Zeile 2 zeigt einen CLI-Aufruf via curl. Ideal für Scripte.  
Zeile 3 zeigt einen direkten Aufruf via php -f - hier wird die Leier danach übergeben. Technisch okay, aber irgendwie unsauber.

Ich empfehle ganz klar Zeile 2 zur Automation, Zeile 1 und 3 sind eher zum Testen da.

Hier das Script:

```php
<?php
// Telegram Send Script - Funktioniert per CLI mit ?param=... und per HTTP-Aufruf

// Funktion zum Parsen der Query bei CLI
function getParams() {
    global $argc, $argv;

    // Wenn über HTTP aufgerufen
    if (php_sapi_name() !== 'cli') {
        return $_GET;
    }

    // CLI-Aufruf mit "?bot=...&chatid=...&msg=..."
    if ($argc >= 2) {
        parse_str(ltrim($argv[1], "?"), $params);
        return $params;
    }

    // Keine Parameter
    return [];
}

$params = getParams();

// Parameter prüfen
if (empty($params['bot']) || empty($params['chatid']) || empty($params['msg'])) {
    echo "[FEHLER] Bot, ChatID oder Nachricht fehlt.\n";
    exit(1);
}

$bot = $params['bot'];
$chatid = $params['chatid'];
$msg = urldecode($params['msg']);

// Telegram API URL
$url = "https://api.telegram.org/bot$bot/sendMessage";

// POST-Daten
$data = array(
    'chat_id' => $chatid,
    'text' => $msg
);

// cURL-Request ausführen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

echo $result . "\n";
?>

```

# Telegram Benachrichtigungsdienst mit einer einzigen Bash

Das Pendant zur [telegram.php](https://wiki.mariobeh.de/books/behwiki/page/telegram-benachrichtigungsdienst-mit-einer-einzigen-php) ist hier die telegram.sh - eine Bash, die genau das gleiche macht wie die PHP, ideal zum Scripten und zur Automation.

Ein Benachrichtigungsansatz, der schnell und einfach umzusetzen ist - in nur einer Datei, mit Ausnahme einer Konfiguration, wäre ein Träumchen. Das habe ich mir gedacht und habe das telegram.sh ins Leben gerufen. Die Einstellungen zum Bot und zum Chat, sowie die Nachricht selbst, werden der Bash alle mit Argumenten/Schaltern übergeben, sodass es eine Konfigurationsdatei überflüssig macht.

Bash-typisch wird hier ein Linux vorausgesetzt. Ich persönlich verwende Debian. Zusätzlich wird curl benötigt.

Die zu übergebenden Parameter werden hier erklärt:

• *-b oder --bot* ist der BOT:TOKEN des Botfathers von Telegram,  
• *-c oder --chat* ist der Chat, an dem die Nachricht gehen soll,  
• *-m oder --msg* ist die Nachricht, die übergeben wird.

Beispielaufruf:

```bash
./telegram.sh -b 123456789:ABCdefGhIjKlMnOpQrStUvWxYz -c 987654321 -m "Hallo ich bins"
```

Hier das Script:

```bash
#!/bin/bash

# Telegram Send Script - CLI mit Parameterübergabe

# Usage info
usage() {
    echo "Nutzung: $0 -b BOT -c CHATID -m MESSAGE"
    exit 1
}

# Parameter parsen
while [[ $# -gt 0 ]]; do
    key="$1"
    case $key in
        -b|--bot)
        BOT="$2"
        shift; shift
        ;;
        -c|--chat)
        CHATID="$2"
        shift; shift
        ;;
        -m|--msg)
        MSG="$2"
        shift; shift
        ;;
        *)
        usage
        ;;
    esac
done

# Prüfung
if [ -z "$BOT" ] || [ -z "$CHATID" ] || [ -z "$MSG" ]; then
    usage
fi

# Telegram API URL
URL="https://api.telegram.org/bot${BOT}/sendMessage"

# Senden
curl -s -X POST "$URL" -d chat_id="$CHATID" -d text="$MSG"

# Ausgabe-Status
echo
```

# Proxmox - Virtuelle Festplatte vergrößern und in der VM nutzbar machen (LVM + ext4)

**Kurzablauf:**  
Virtuelle Platte in Proxmox vergrößern → Partition erweitern → LVM erweitern → Dateisystem erweitern.

---

## Schritte

1. **Partition vergrößern (nach Proxmox-Resize):**
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`growpart /dev/sda 3`</div></div>
2. **LVM-Physical Volume anpassen:**
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`pvresize /dev/sda3`</div></div>
3. **LVM-Volume vergrößern (gesamten freien Platz nutzen):**
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`lvextend -l +100%FREE /dev/pbs/root`</div></div>
4. **Dateisystem ext4 erweitern:**
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`resize2fs /dev/pbs/root`</div></div>
5. **Erfolg prüfen:**
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-built_in">df</span> -h`</div></div>

---

## Voraussetzungen

- Festplatte wurde vorher in Proxmox über „Disk Resize“ vergrößert.
- Tools installiert:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
    </div></div></div><div class="overflow-y-auto p-4" dir="ltr">`apt install cloud-guest-utils parted`</div></div>

---

## Ergebnis

Das Root-Dateisystem wächst ohne Neustart und der zusätzliche Speicher steht sofort zur Verfügung.

# webcamloader-timezones

Die Webcamloader-Timezones sind hier zur Eingabe mit `-T`:

<table border="1" id="bkmrk-script-erwartung-ian" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>Script-Erwartung</td><td>IANA-Norm-Timezone zum Vergleich / Muster</td></tr></tbody></table>

<table border="0" cellspacing="0" id="bkmrk-adelaide-australia%2Fa" style="width: 100.119%; height: 12935.9px;"><colgroup width="271"><col></col><col></col></colgroup> <colgroup width="311"></colgroup><tbody><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "adelaide"}" height="26" style="width: 50.156%; height: 29.4667px;">adelaide</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Adelaide"}" style="width: 49.9234%; height: 29.4667px;">Australia/Adelaide</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ae"}" height="26" style="width: 50.156%; height: 29.4667px;">ae</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Dubai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Dubai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ägypten"}" height="26" style="width: 50.156%; height: 29.4667px;">aegypten</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Cairo"}" style="width: 49.9234%; height: 29.4667px;">Africa/Cairo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "alabama"}" height="26" style="width: 50.156%; height: 29.4667px;">alabama</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "alaska"}" height="26" style="width: 50.156%; height: 29.4667px;">alaska</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Anchorage"}" style="width: 49.9234%; height: 29.4667px;">America/Anchorage</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "alberta"}" height="26" style="width: 50.156%; height: 29.4667px;">alberta</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Edmonton"}" style="width: 49.9234%; height: 29.4667px;">America/Edmonton</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "aleutian"}" height="26" style="width: 50.156%; height: 29.4667px;">aleutian</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Adak"}" style="width: 49.9234%; height: 29.4667px;">America/Adak</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "american-samoa"}" height="26" style="width: 50.156%; height: 29.4667px;">american-samoa</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Pago_Pago"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Pago\_Pago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "amsamoa"}" height="26" style="width: 50.156%; height: 29.4667px;">amsamoa</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Pago_Pago"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Pago\_Pago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "anchorage"}" height="26" style="width: 50.156%; height: 29.4667px;">anchorage</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Anchorage"}" style="width: 49.9234%; height: 29.4667px;">America/Anchorage</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ar"}" height="26" style="width: 50.156%; height: 29.4667px;">ar</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Argentina\/Buenos_Aires"}" style="width: 49.9234%; height: 29.4667px;">America/Argentina/Buenos\_Aires</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "argentina"}" height="26" style="width: 50.156%; height: 29.4667px;">argentina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Argentina\/Buenos_Aires"}" style="width: 49.9234%; height: 29.4667px;">America/Argentina/Buenos\_Aires</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "argentinien"}" height="26" style="width: 50.156%; height: 29.4667px;">argentinien</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Argentina\/Buenos_Aires"}" style="width: 49.9234%; height: 29.4667px;">America/Argentina/Buenos\_Aires</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "arizona"}" height="26" style="width: 50.156%; height: 29.4667px;">arizona</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Phoenix"}" style="width: 49.9234%; height: 29.4667px;">America/Phoenix</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "arkansas"}" height="26" style="width: 50.156%; height: 29.4667px;">arkansas</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "at"}" height="26" style="width: 50.156%; height: 29.4667px;">at</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Vienna"}" style="width: 49.9234%; height: 29.4667px;">Europe/Vienna</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-act"}" height="26" style="width: 50.156%; height: 29.4667px;">au-act</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-eucla"}" height="26" style="width: 50.156%; height: 29.4667px;">au-eucla</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Eucla"}" style="width: 49.9234%; height: 29.4667px;">Australia/Eucla</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-lord-howe"}" height="26" style="width: 50.156%; height: 29.4667px;">au-lord-howe</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Lord_Howe"}" style="width: 49.9234%; height: 29.4667px;">Australia/Lord\_Howe</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-nsw"}" height="26" style="width: 50.156%; height: 29.4667px;">au-nsw</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-nt"}" height="26" style="width: 50.156%; height: 29.4667px;">au-nt</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Darwin"}" style="width: 49.9234%; height: 29.4667px;">Australia/Darwin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-qld"}" height="26" style="width: 50.156%; height: 29.4667px;">au-qld</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Brisbane"}" style="width: 49.9234%; height: 29.4667px;">Australia/Brisbane</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-sa"}" height="26" style="width: 50.156%; height: 29.4667px;">au-sa</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Adelaide"}" style="width: 49.9234%; height: 29.4667px;">Australia/Adelaide</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-tas"}" height="26" style="width: 50.156%; height: 29.4667px;">au-tas</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Hobart"}" style="width: 49.9234%; height: 29.4667px;">Australia/Hobart</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-vic"}" height="26" style="width: 50.156%; height: 29.4667px;">au-vic</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Melbourne"}" style="width: 49.9234%; height: 29.4667px;">Australia/Melbourne</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "au-wa"}" height="26" style="width: 50.156%; height: 29.4667px;">au-wa</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Perth"}" style="width: 49.9234%; height: 29.4667px;">Australia/Perth</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "australian-capital-territory"}" height="26" style="width: 50.156%; height: 29.4667px;">australian-capital-territory</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "austria"}" height="26" style="width: 50.156%; height: 29.4667px;">austria</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Vienna"}" style="width: 49.9234%; height: 29.4667px;">Europe/Vienna</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "be"}" height="26" style="width: 50.156%; height: 29.4667px;">be</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Brussels"}" style="width: 49.9234%; height: 29.4667px;">Europe/Brussels</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "belgien"}" height="26" style="width: 50.156%; height: 29.4667px;">belgien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Brussels"}" style="width: 49.9234%; height: 29.4667px;">Europe/Brussels</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "belgium"}" height="26" style="width: 50.156%; height: 29.4667px;">belgium</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Brussels"}" style="width: 49.9234%; height: 29.4667px;">Europe/Brussels</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "boise"}" height="26" style="width: 50.156%; height: 29.4667px;">boise</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "brisbane"}" height="26" style="width: 50.156%; height: 29.4667px;">brisbane</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Brisbane"}" style="width: 49.9234%; height: 29.4667px;">Australia/Brisbane</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "british-columbia"}" height="26" style="width: 50.156%; height: 29.4667px;">british-columbia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Vancouver"}" style="width: 49.9234%; height: 29.4667px;">America/Vancouver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-ab"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-ab</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Edmonton"}" style="width: 49.9234%; height: 29.4667px;">America/Edmonton</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-atikokan"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-atikokan</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Atikokan"}" style="width: 49.9234%; height: 29.4667px;">America/Atikokan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-bc"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-bc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Vancouver"}" style="width: 49.9234%; height: 29.4667px;">America/Vancouver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-creston"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-creston</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Creston"}" style="width: 49.9234%; height: 29.4667px;">America/Creston</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-dawson-creek"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-dawson-creek</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Dawson_Creek"}" style="width: 49.9234%; height: 29.4667px;">America/Dawson\_Creek</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-fort-nelson"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-fort-nelson</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Fort_Nelson"}" style="width: 49.9234%; height: 29.4667px;">America/Fort\_Nelson</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-mb"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-mb</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Winnipeg"}" style="width: 49.9234%; height: 29.4667px;">America/Winnipeg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-nb"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-nb</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Moncton"}" style="width: 49.9234%; height: 29.4667px;">America/Moncton</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-nl"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-nl</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Johns"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Johns</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-ns"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-ns</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-nt"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-nt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Yellowknife"}" style="width: 49.9234%; height: 29.4667px;">America/Yellowknife</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-nu"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-nu</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Iqaluit"}" style="width: 49.9234%; height: 29.4667px;">America/Iqaluit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-on"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-on</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-pe"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-pe</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-qc"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-qc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-sk"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-sk</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Regina"}" style="width: 49.9234%; height: 29.4667px;">America/Regina</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-swift-current"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-swift-current</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Swift_Current"}" style="width: 49.9234%; height: 29.4667px;">America/Swift\_Current</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ca-yt"}" height="26" style="width: 50.156%; height: 29.4667px;">ca-yt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Whitehorse"}" style="width: 49.9234%; height: 29.4667px;">America/Whitehorse</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "california"}" height="26" style="width: 50.156%; height: 29.4667px;">california</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "canberra"}" height="26" style="width: 50.156%; height: 29.4667px;">canberra</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ch"}" height="26" style="width: 50.156%; height: 29.4667px;">ch</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Zurich"}" style="width: 49.9234%; height: 29.4667px;">Europe/Zurich</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "chicago"}" height="26" style="width: 50.156%; height: 29.4667px;">chicago</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "chile"}" height="26" style="width: 50.156%; height: 29.4667px;">chile</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Santiago"}" style="width: 49.9234%; height: 29.4667px;">America/Santiago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "chile"}" height="26" style="width: 50.156%; height: 29.4667px;">chile</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Santiago"}" style="width: 49.9234%; height: 29.4667px;">America/Santiago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "china"}" height="26" style="width: 50.156%; height: 29.4667px;">china</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Shanghai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Shanghai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "cl"}" height="26" style="width: 50.156%; height: 29.4667px;">cl</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Santiago"}" style="width: 49.9234%; height: 29.4667px;">America/Santiago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "cn"}" height="26" style="width: 50.156%; height: 29.4667px;">cn</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Shanghai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Shanghai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "coeur-dalene"}" height="26" style="width: 50.156%; height: 29.4667px;">coeur-dalene</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "colorado"}" height="26" style="width: 50.156%; height: 29.4667px;">colorado</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "connecticut"}" height="26" style="width: 50.156%; height: 29.4667px;">connecticut</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "cz"}" height="26" style="width: 50.156%; height: 29.4667px;">cz</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Prague"}" style="width: 49.9234%; height: 29.4667px;">Europe/Prague</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "czech"}" height="26" style="width: 50.156%; height: 29.4667px;">czech</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Prague"}" style="width: 49.9234%; height: 29.4667px;">Europe/Prague</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "dänemark"}" height="26" style="width: 50.156%; height: 29.4667px;">daenemark</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Copenhagen"}" style="width: 49.9234%; height: 29.4667px;">Europe/Copenhagen</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "darwin"}" height="26" style="width: 50.156%; height: 29.4667px;">darwin</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Darwin"}" style="width: 49.9234%; height: 29.4667px;">Australia/Darwin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "dc"}" height="26" style="width: 50.156%; height: 29.4667px;">dc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "de"}" height="26" style="width: 50.156%; height: 29.4667px;">de</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Berlin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Berlin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "delaware"}" height="26" style="width: 50.156%; height: 29.4667px;">delaware</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "denmark"}" height="26" style="width: 50.156%; height: 29.4667px;">denmark</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Copenhagen"}" style="width: 49.9234%; height: 29.4667px;">Europe/Copenhagen</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "denver"}" height="26" style="width: 50.156%; height: 29.4667px;">denver</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "detroit"}" height="26" style="width: 50.156%; height: 29.4667px;">detroit</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Detroit"}" style="width: 49.9234%; height: 29.4667px;">America/Detroit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "deutschland"}" height="26" style="width: 50.156%; height: 29.4667px;">deutschland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Berlin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Berlin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "district-of-columbia"}" height="26" style="width: 50.156%; height: 29.4667px;">district-of-columbia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "dk"}" height="26" style="width: 50.156%; height: 29.4667px;">dk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Copenhagen"}" style="width: 49.9234%; height: 29.4667px;">Europe/Copenhagen</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "edmonton"}" height="26" style="width: 50.156%; height: 29.4667px;">edmonton</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Edmonton"}" style="width: 49.9234%; height: 29.4667px;">America/Edmonton</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "eg"}" height="26" style="width: 50.156%; height: 29.4667px;">eg</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Cairo"}" style="width: 49.9234%; height: 29.4667px;">Africa/Cairo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "egypt"}" height="26" style="width: 50.156%; height: 29.4667px;">egypt</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Cairo"}" style="width: 49.9234%; height: 29.4667px;">Africa/Cairo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "el-paso"}" height="26" style="width: 50.156%; height: 29.4667px;">el-paso</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "elpaso"}" height="26" style="width: 50.156%; height: 29.4667px;">elpaso</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "emirates"}" height="26" style="width: 50.156%; height: 29.4667px;">emirates</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Dubai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Dubai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "england"}" height="26" style="width: 50.156%; height: 29.4667px;">england</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/London"}" style="width: 49.9234%; height: 29.4667px;">Europe/London</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "es"}" height="26" style="width: 50.156%; height: 29.4667px;">es</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Madrid"}" style="width: 49.9234%; height: 29.4667px;">Europe/Madrid</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "eucla"}" height="26" style="width: 50.156%; height: 29.4667px;">eucla</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Eucla"}" style="width: 49.9234%; height: 29.4667px;">Australia/Eucla</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "fi"}" height="26" style="width: 50.156%; height: 29.4667px;">fi</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Helsinki"}" style="width: 49.9234%; height: 29.4667px;">Europe/Helsinki</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "finland"}" height="26" style="width: 50.156%; height: 29.4667px;">finland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Helsinki"}" style="width: 49.9234%; height: 29.4667px;">Europe/Helsinki</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "finnland"}" height="26" style="width: 50.156%; height: 29.4667px;">finnland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Helsinki"}" style="width: 49.9234%; height: 29.4667px;">Europe/Helsinki</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "fl-panhandle"}" height="26" style="width: 50.156%; height: 29.4667px;">fl-panhandle</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "florida"}" height="26" style="width: 50.156%; height: 29.4667px;">florida</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "fr"}" height="26" style="width: 50.156%; height: 29.4667px;">fr</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Paris"}" style="width: 49.9234%; height: 29.4667px;">Europe/Paris</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "france"}" height="26" style="width: 50.156%; height: 29.4667px;">france</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Paris"}" style="width: 49.9234%; height: 29.4667px;">Europe/Paris</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "frankreich"}" height="26" style="width: 50.156%; height: 29.4667px;">frankreich</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Paris"}" style="width: 49.9234%; height: 29.4667px;">Europe/Paris</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "gb"}" height="26" style="width: 50.156%; height: 29.4667px;">gb</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/London"}" style="width: 49.9234%; height: 29.4667px;">Europe/London</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "georgia"}" height="26" style="width: 50.156%; height: 29.4667px;">georgia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "germany"}" height="26" style="width: 50.156%; height: 29.4667px;">germany</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Berlin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Berlin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "gmt"}" height="26" style="width: 50.156%; height: 29.4667px;">gmt</td><td align="left" data-sheets-value="{ "1": 2, "2": "UTC"}" style="width: 49.9234%; height: 29.4667px;">UTC</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "gmt0"}" height="26" style="width: 50.156%; height: 29.4667px;">gmt0</td><td align="left" data-sheets-value="{ "1": 2, "2": "UTC"}" style="width: 49.9234%; height: 29.4667px;">UTC</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "gr"}" height="26" style="width: 50.156%; height: 29.4667px;">gr</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Athens"}" style="width: 49.9234%; height: 29.4667px;">Europe/Athens</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "greece"}" height="26" style="width: 50.156%; height: 29.4667px;">greece</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Athens"}" style="width: 49.9234%; height: 29.4667px;">Europe/Athens</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "griechenland"}" height="26" style="width: 50.156%; height: 29.4667px;">griechenland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Athens"}" style="width: 49.9234%; height: 29.4667px;">Europe/Athens</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "großbritannien"}" height="26" style="width: 50.156%; height: 29.4667px;">grossbritannien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/London"}" style="width: 49.9234%; height: 29.4667px;">Europe/London</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "guam"}" height="26" style="width: 50.156%; height: 29.4667px;">guam</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Guam"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Guam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "halifax"}" height="26" style="width: 50.156%; height: 29.4667px;">halifax</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hawaii"}" height="26" style="width: 50.156%; height: 29.4667px;">hawaii</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Honolulu"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Honolulu</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hk"}" height="26" style="width: 50.156%; height: 29.4667px;">hk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Hong_Kong"}" style="width: 49.9234%; height: 29.4667px;">Asia/Hong\_Kong</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hobart"}" height="26" style="width: 50.156%; height: 29.4667px;">hobart</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Hobart"}" style="width: 49.9234%; height: 29.4667px;">Australia/Hobart</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "holland"}" height="26" style="width: 50.156%; height: 29.4667px;">holland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Amsterdam"}" style="width: 49.9234%; height: 29.4667px;">Europe/Amsterdam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hongkong"}" height="26" style="width: 50.156%; height: 29.4667px;">hongkong</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Hong_Kong"}" style="width: 49.9234%; height: 29.4667px;">Asia/Hong\_Kong</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "honolulu"}" height="26" style="width: 50.156%; height: 29.4667px;">honolulu</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Honolulu"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Honolulu</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hu"}" height="26" style="width: 50.156%; height: 29.4667px;">hu</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Budapest"}" style="width: 49.9234%; height: 29.4667px;">Europe/Budapest</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "hungary"}" height="26" style="width: 50.156%; height: 29.4667px;">hungary</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Budapest"}" style="width: 49.9234%; height: 29.4667px;">Europe/Budapest</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "idaho"}" height="26" style="width: 50.156%; height: 29.4667px;">idaho</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "idaho-pacific"}" height="26" style="width: 50.156%; height: 29.4667px;">idaho-pacific</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ie"}" height="26" style="width: 50.156%; height: 29.4667px;">ie</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Dublin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Dublin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "il"}" height="26" style="width: 50.156%; height: 29.4667px;">il</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Jerusalem"}" style="width: 49.9234%; height: 29.4667px;">Asia/Jerusalem</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "illinois"}" height="26" style="width: 50.156%; height: 29.4667px;">illinois</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "in"}" height="26" style="width: 50.156%; height: 29.4667px;">in</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kolkata"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kolkata</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "india"}" height="26" style="width: 50.156%; height: 29.4667px;">india</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kolkata"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kolkata</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "indiana"}" height="26" style="width: 50.156%; height: 29.4667px;">indiana</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Indiana\/Indianapolis"}" style="width: 49.9234%; height: 29.4667px;">America/Indiana/Indianapolis</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "indiana-central"}" height="26" style="width: 50.156%; height: 29.4667px;">indiana-central</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "indianapolis"}" height="26" style="width: 50.156%; height: 29.4667px;">indianapolis</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Indiana\/Indianapolis"}" style="width: 49.9234%; height: 29.4667px;">America/Indiana/Indianapolis</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "indien"}" height="26" style="width: 50.156%; height: 29.4667px;">indien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kolkata"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kolkata</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "iowa"}" height="26" style="width: 50.156%; height: 29.4667px;">iowa</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "iqaluit"}" height="26" style="width: 50.156%; height: 29.4667px;">iqaluit</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Iqaluit"}" style="width: 49.9234%; height: 29.4667px;">America/Iqaluit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ir"}" height="26" style="width: 50.156%; height: 29.4667px;">ir</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Tehran"}" style="width: 49.9234%; height: 29.4667px;">Asia/Tehran</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "iran"}" height="26" style="width: 50.156%; height: 29.4667px;">iran</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Tehran"}" style="width: 49.9234%; height: 29.4667px;">Asia/Tehran</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "iran"}" height="26" style="width: 50.156%; height: 29.4667px;">iran</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Tehran"}" style="width: 49.9234%; height: 29.4667px;">Asia/Tehran</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ireland"}" height="26" style="width: 50.156%; height: 29.4667px;">ireland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Dublin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Dublin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "irkutsk"}" height="26" style="width: 50.156%; height: 29.4667px;">irkutsk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Irkutsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Irkutsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "irland"}" height="26" style="width: 50.156%; height: 29.4667px;">irland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Dublin"}" style="width: 49.9234%; height: 29.4667px;">Europe/Dublin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "israel"}" height="26" style="width: 50.156%; height: 29.4667px;">israel</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Jerusalem"}" style="width: 49.9234%; height: 29.4667px;">Asia/Jerusalem</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "israel"}" height="26" style="width: 50.156%; height: 29.4667px;">israel</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Jerusalem"}" style="width: 49.9234%; height: 29.4667px;">Asia/Jerusalem</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "it"}" height="26" style="width: 50.156%; height: 29.4667px;">it</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Rome"}" style="width: 49.9234%; height: 29.4667px;">Europe/Rome</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "italien"}" height="26" style="width: 50.156%; height: 29.4667px;">italien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Rome"}" style="width: 49.9234%; height: 29.4667px;">Europe/Rome</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "italy"}" height="26" style="width: 50.156%; height: 29.4667px;">italy</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Rome"}" style="width: 49.9234%; height: 29.4667px;">Europe/Rome</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "japan"}" height="26" style="width: 50.156%; height: 29.4667px;">japan</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Tokyo"}" style="width: 49.9234%; height: 29.4667px;">Asia/Tokyo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "jekaterinburg"}" height="26" style="width: 50.156%; height: 29.4667px;">jekaterinburg</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Yekaterinburg"}" style="width: 49.9234%; height: 29.4667px;">Asia/Yekaterinburg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "jp"}" height="26" style="width: 50.156%; height: 29.4667px;">jp</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Tokyo"}" style="width: 49.9234%; height: 29.4667px;">Asia/Tokyo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kamchatka"}" height="26" style="width: 50.156%; height: 29.4667px;">kamchatka</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kamchatka"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kamchatka</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kamtschatka"}" height="26" style="width: 50.156%; height: 29.4667px;">kamtschatka</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kamchatka"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kamchatka</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kansas"}" height="26" style="width: 50.156%; height: 29.4667px;">kansas</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kansas-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">kansas-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kentucky"}" height="26" style="width: 50.156%; height: 29.4667px;">kentucky</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kentucky-central"}" height="26" style="width: 50.156%; height: 29.4667px;">kentucky-central</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "korea"}" height="26" style="width: 50.156%; height: 29.4667px;">korea</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Seoul"}" style="width: 49.9234%; height: 29.4667px;">Asia/Seoul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "kr"}" height="26" style="width: 50.156%; height: 29.4667px;">kr</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Seoul"}" style="width: 49.9234%; height: 29.4667px;">Asia/Seoul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "krasnoyarsk"}" height="26" style="width: 50.156%; height: 29.4667px;">krasnoyarsk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Krasnoyarsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Krasnoyarsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "lord-howe"}" height="26" style="width: 50.156%; height: 29.4667px;">lord-howe</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Lord_Howe"}" style="width: 49.9234%; height: 29.4667px;">Australia/Lord\_Howe</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "los-angeles"}" height="26" style="width: 50.156%; height: 29.4667px;">los-angeles</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "losangeles"}" height="26" style="width: 50.156%; height: 29.4667px;">losangeles</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "louisiana"}" height="26" style="width: 50.156%; height: 29.4667px;">louisiana</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ma"}" height="26" style="width: 50.156%; height: 29.4667px;">ma</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Casablanca"}" style="width: 49.9234%; height: 29.4667px;">Africa/Casablanca</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "maine"}" height="26" style="width: 50.156%; height: 29.4667px;">maine</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "malheur"}" height="26" style="width: 50.156%; height: 29.4667px;">malheur</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "manitoba"}" height="26" style="width: 50.156%; height: 29.4667px;">manitoba</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Winnipeg"}" style="width: 49.9234%; height: 29.4667px;">America/Winnipeg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "marokko"}" height="26" style="width: 50.156%; height: 29.4667px;">marokko</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Casablanca"}" style="width: 49.9234%; height: 29.4667px;">Africa/Casablanca</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "maryland"}" height="26" style="width: 50.156%; height: 29.4667px;">maryland</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "massachusetts"}" height="26" style="width: 50.156%; height: 29.4667px;">massachusetts</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "melbourne"}" height="26" style="width: 50.156%; height: 29.4667px;">melbourne</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Melbourne"}" style="width: 49.9234%; height: 29.4667px;">Australia/Melbourne</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "mexico"}" height="26" style="width: 50.156%; height: 29.4667px;">mexico</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Mexico_City"}" style="width: 49.9234%; height: 29.4667px;">America/Mexico\_City</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "mexiko"}" height="26" style="width: 50.156%; height: 29.4667px;">mexiko</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Mexico_City"}" style="width: 49.9234%; height: 29.4667px;">America/Mexico\_City</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "michigan"}" height="26" style="width: 50.156%; height: 29.4667px;">michigan</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Detroit"}" style="width: 49.9234%; height: 29.4667px;">America/Detroit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "michigan-central"}" height="26" style="width: 50.156%; height: 29.4667px;">michigan-central</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "minnesota"}" height="26" style="width: 50.156%; height: 29.4667px;">minnesota</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "mississippi"}" height="26" style="width: 50.156%; height: 29.4667px;">mississippi</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "missouri"}" height="26" style="width: 50.156%; height: 29.4667px;">missouri</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicag"}" style="width: 49.9234%; height: 29.4667px;">America/Chicag</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "montana"}" height="26" style="width: 50.156%; height: 29.4667px;">montana</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "montreal"}" height="26" style="width: 50.156%; height: 29.4667px;">montreal</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "morocco"}" height="26" style="width: 50.156%; height: 29.4667px;">morocco</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Casablanca"}" style="width: 49.9234%; height: 29.4667px;">Africa/Casablanca</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "moscow"}" height="26" style="width: 50.156%; height: 29.4667px;">moscow</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Moscow"}" style="width: 49.9234%; height: 29.4667px;">Europe/Moscow</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "moskau"}" height="26" style="width: 50.156%; height: 29.4667px;">moskau</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Moscow"}" style="width: 49.9234%; height: 29.4667px;">Europe/Moscow</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "mx"}" height="26" style="width: 50.156%; height: 29.4667px;">mx</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Mexico_City"}" style="width: 49.9234%; height: 29.4667px;">America/Mexico\_City</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nebraska"}" height="26" style="width: 50.156%; height: 29.4667px;">nebraska</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nebraska-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">nebraska-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "netherlands"}" height="26" style="width: 50.156%; height: 29.4667px;">netherlands</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Amsterdam"}" style="width: 49.9234%; height: 29.4667px;">Europe/Amsterdam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "neuseeland"}" height="26" style="width: 50.156%; height: 29.4667px;">neuseeland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Auckland"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Auckland</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nevada"}" height="26" style="width: 50.156%; height: 29.4667px;">nevada</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nevada-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">nevada-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-brunswick"}" height="26" style="width: 50.156%; height: 29.4667px;">new-brunswick</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Moncton"}" style="width: 49.9234%; height: 29.4667px;">America/Moncton</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-hampshire"}" height="26" style="width: 50.156%; height: 29.4667px;">new-hampshire</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-jersey"}" height="26" style="width: 50.156%; height: 29.4667px;">new-jersey</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-mexico"}" height="26" style="width: 50.156%; height: 29.4667px;">new-mexico</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-south-wales"}" height="26" style="width: 50.156%; height: 29.4667px;">new-south-wales</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "new-york"}" height="26" style="width: 50.156%; height: 29.4667px;">new-york</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "newfoundland"}" height="26" style="width: 50.156%; height: 29.4667px;">newfoundland</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Johns"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Johns</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "newmexico"}" height="26" style="width: 50.156%; height: 29.4667px;">newmexico</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "newyork"}" height="26" style="width: 50.156%; height: 29.4667px;">newyork</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "newzealand"}" height="26" style="width: 50.156%; height: 29.4667px;">newzealand</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Auckland"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Auckland</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ng"}" height="26" style="width: 50.156%; height: 29.4667px;">ng</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Lagos"}" style="width: 49.9234%; height: 29.4667px;">Africa/Lagos</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "niederlande"}" height="26" style="width: 50.156%; height: 29.4667px;">niederlande</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Amsterdam"}" style="width: 49.9234%; height: 29.4667px;">Europe/Amsterdam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nigeria"}" height="26" style="width: 50.156%; height: 29.4667px;">nigeria</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Lagos"}" style="width: 49.9234%; height: 29.4667px;">Africa/Lagos</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nl"}" height="26" style="width: 50.156%; height: 29.4667px;">nl</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Amsterdam"}" style="width: 49.9234%; height: 29.4667px;">Europe/Amsterdam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nmi"}" height="26" style="width: 50.156%; height: 29.4667px;">nmi</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Saipan"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Saipan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "no"}" height="26" style="width: 50.156%; height: 29.4667px;">no</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Oslo"}" style="width: 49.9234%; height: 29.4667px;">Europe/Oslo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "north-carolina"}" height="26" style="width: 50.156%; height: 29.4667px;">north-carolina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "north-dakota"}" height="26" style="width: 50.156%; height: 29.4667px;">north-dakota</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "north-dakota-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">north-dakota-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "northcarolina"}" height="26" style="width: 50.156%; height: 29.4667px;">northcarolina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "northdakota"}" height="26" style="width: 50.156%; height: 29.4667px;">northdakota</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "northern-mariana-islands"}" height="26" style="width: 50.156%; height: 29.4667px;">northern-mariana-islands</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Saipan"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Saipan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "northern-territory"}" height="26" style="width: 50.156%; height: 29.4667px;">northern-territory</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Darwin"}" style="width: 49.9234%; height: 29.4667px;">Australia/Darwin</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "northwest-territories"}" height="26" style="width: 50.156%; height: 29.4667px;">northwest-territories</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Yellowknife"}" style="width: 49.9234%; height: 29.4667px;">America/Yellowknife</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "norway"}" height="26" style="width: 50.156%; height: 29.4667px;">norway</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Oslo"}" style="width: 49.9234%; height: 29.4667px;">Europe/Oslo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "norwegen"}" height="26" style="width: 50.156%; height: 29.4667px;">norwegen</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Oslo"}" style="width: 49.9234%; height: 29.4667px;">Europe/Oslo</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nova-scotia"}" height="26" style="width: 50.156%; height: 29.4667px;">nova-scotia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nunavut"}" height="26" style="width: 50.156%; height: 29.4667px;">nunavut</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Iqaluit"}" style="width: 49.9234%; height: 29.4667px;">America/Iqaluit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nwt"}" height="26" style="width: 50.156%; height: 29.4667px;">nwt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Yellowknife"}" style="width: 49.9234%; height: 29.4667px;">America/Yellowknife</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ny"}" height="26" style="width: 50.156%; height: 29.4667px;">ny</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "nz"}" height="26" style="width: 50.156%; height: 29.4667px;">nz</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Auckland"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Auckland</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ohio"}" height="26" style="width: 50.156%; height: 29.4667px;">ohio</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "oklahoma"}" height="26" style="width: 50.156%; height: 29.4667px;">oklahoma</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ontario"}" height="26" style="width: 50.156%; height: 29.4667px;">ontario</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "oregon"}" height="26" style="width: 50.156%; height: 29.4667px;">oregon</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "oregon-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">oregon-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "österreich"}" height="26" style="width: 50.156%; height: 29.4667px;">oesterreich</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Vienna"}" style="width: 49.9234%; height: 29.4667px;">Europe/Vienna</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pago-pago"}" height="26" style="width: 50.156%; height: 29.4667px;">pago-pago</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Pago_Pago"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Pago\_Pago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pagopago"}" height="26" style="width: 50.156%; height: 29.4667px;">pagopago</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Pago_Pago"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Pago\_Pago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pei"}" height="26" style="width: 50.156%; height: 29.4667px;">pei</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pennsylvania"}" height="26" style="width: 50.156%; height: 29.4667px;">pennsylvania</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pensacola"}" height="26" style="width: 50.156%; height: 29.4667px;">pensacola</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "perth"}" height="26" style="width: 50.156%; height: 29.4667px;">perth</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Perth"}" style="width: 49.9234%; height: 29.4667px;">Australia/Perth</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "phoenix"}" height="26" style="width: 50.156%; height: 29.4667px;">phoenix</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Phoenix"}" style="width: 49.9234%; height: 29.4667px;">America/Phoenix</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pl"}" height="26" style="width: 50.156%; height: 29.4667px;">pl</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Warsaw"}" style="width: 49.9234%; height: 29.4667px;">Europe/Warsaw</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "poland"}" height="26" style="width: 50.156%; height: 29.4667px;">poland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Warsaw"}" style="width: 49.9234%; height: 29.4667px;">Europe/Warsaw</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "polen"}" height="26" style="width: 50.156%; height: 29.4667px;">polen</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Warsaw"}" style="width: 49.9234%; height: 29.4667px;">Europe/Warsaw</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "polska"}" height="26" style="width: 50.156%; height: 29.4667px;">polska</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Warsaw"}" style="width: 49.9234%; height: 29.4667px;">Europe/Warsaw</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "portland"}" height="26" style="width: 50.156%; height: 29.4667px;">portland</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "portugal"}" height="26" style="width: 50.156%; height: 29.4667px;">portugal</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Lisbon"}" style="width: 49.9234%; height: 29.4667px;">Europe/Lisbon</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "prince-edward-island"}" height="26" style="width: 50.156%; height: 29.4667px;">prince-edward-island</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Halifax"}" style="width: 49.9234%; height: 29.4667px;">America/Halifax</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "pt"}" height="26" style="width: 50.156%; height: 29.4667px;">pt</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Lisbon"}" style="width: 49.9234%; height: 29.4667px;">Europe/Lisbon</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "puerto-rico"}" height="26" style="width: 50.156%; height: 29.4667px;">puerto-rico</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Puerto_Rico"}" style="width: 49.9234%; height: 29.4667px;">America/Puerto\_Rico</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "puertorico"}" height="26" style="width: 50.156%; height: 29.4667px;">puertorico</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Puerto_Rico"}" style="width: 49.9234%; height: 29.4667px;">America/Puerto\_Rico</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "quebec"}" height="26" style="width: 50.156%; height: 29.4667px;">quebec</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "québec"}" height="26" style="width: 50.156%; height: 29.4667px;">québec</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "queensland"}" height="26" style="width: 50.156%; height: 29.4667px;">queensland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Brisbane"}" style="width: 49.9234%; height: 29.4667px;">Australia/Brisbane</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "regina"}" height="26" style="width: 50.156%; height: 29.4667px;">regina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Regina"}" style="width: 49.9234%; height: 29.4667px;">America/Regina</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "rhode-island"}" height="26" style="width: 50.156%; height: 29.4667px;">rhode-island</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "rhodeisland"}" height="26" style="width: 50.156%; height: 29.4667px;">rhodeisland</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-irk"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-irk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Irkutsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Irkutsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-kam"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-kam</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Kamchatka"}" style="width: 49.9234%; height: 29.4667px;">Asia/Kamchatka</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-kras"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-kras</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Krasnoyarsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Krasnoyarsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-magadan"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-magadan</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Magadan"}" style="width: 49.9234%; height: 29.4667px;">Asia/Magadan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-msk"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-msk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Moscow"}" style="width: 49.9234%; height: 29.4667px;">Europe/Moscow</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-novosibirsk"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-novosibirsk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Novosibirsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Novosibirsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-omsk"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-omsk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Omsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Omsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-samara"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-samara</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Samara"}" style="width: 49.9234%; height: 29.4667px;">Europe/Samara</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-vlad"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-vlad</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Vladivostok"}" style="width: 49.9234%; height: 29.4667px;">Asia/Vladivostok</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-yakutsk"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-yakutsk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Yakutsk"}" style="width: 49.9234%; height: 29.4667px;">Asia/Yakutsk</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ru-ye"}" height="26" style="width: 50.156%; height: 29.4667px;">ru-ye</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Yekaterinburg"}" style="width: 49.9234%; height: 29.4667px;">Asia/Yekaterinburg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "sa"}" height="26" style="width: 50.156%; height: 29.4667px;">sa</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Riyadh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Riyadh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "saipan"}" height="26" style="width: 50.156%; height: 29.4667px;">saipan</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Saipan"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Saipan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "saskatchewan"}" height="26" style="width: 50.156%; height: 29.4667px;">saskatchewan</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Regina"}" style="width: 49.9234%; height: 29.4667px;">America/Regina</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "saudi"}" height="26" style="width: 50.156%; height: 29.4667px;">saudi</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Riyadh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Riyadh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "saudi-arabien"}" height="26" style="width: 50.156%; height: 29.4667px;">saudi-arabien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Riyadh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Riyadh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "schweden"}" height="26" style="width: 50.156%; height: 29.4667px;">schweden</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Stockholm"}" style="width: 49.9234%; height: 29.4667px;">Europe/Stockholm</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "schweiz"}" height="26" style="width: 50.156%; height: 29.4667px;">schweiz</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Zurich"}" style="width: 49.9234%; height: 29.4667px;">Europe/Zurich</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "se"}" height="26" style="width: 50.156%; height: 29.4667px;">se</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Stockholm"}" style="width: 49.9234%; height: 29.4667px;">Europe/Stockholm</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "seattle"}" height="26" style="width: 50.156%; height: 29.4667px;">seattle</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "sg"}" height="26" style="width: 50.156%; height: 29.4667px;">sg</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Singapore"}" style="width: 49.9234%; height: 29.4667px;">Asia/Singapore</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "singapore"}" height="26" style="width: 50.156%; height: 29.4667px;">singapore</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Singapore"}" style="width: 49.9234%; height: 29.4667px;">Asia/Singapore</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "singapur"}" height="26" style="width: 50.156%; height: 29.4667px;">singapur</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Singapore"}" style="width: 49.9234%; height: 29.4667px;">Asia/Singapore</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "sk"}" height="26" style="width: 50.156%; height: 29.4667px;">sk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Bratislava"}" style="width: 49.9234%; height: 29.4667px;">Europe/Bratislava</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "slovakia"}" height="26" style="width: 50.156%; height: 29.4667px;">slovakia</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Bratislava"}" style="width: 49.9234%; height: 29.4667px;">Europe/Bratislava</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "slowakei"}" height="26" style="width: 50.156%; height: 29.4667px;">slowakei</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Bratislava"}" style="width: 49.9234%; height: 29.4667px;">Europe/Bratislava</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "south-australia"}" height="26" style="width: 50.156%; height: 29.4667px;">south-australia</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Adelaide"}" style="width: 49.9234%; height: 29.4667px;">Australia/Adelaide</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "south-carolina"}" height="26" style="width: 50.156%; height: 29.4667px;">south-carolina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "south-dakota"}" height="26" style="width: 50.156%; height: 29.4667px;">south-dakota</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "south-dakota-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">south-dakota-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "southafrica"}" height="26" style="width: 50.156%; height: 29.4667px;">southafrica</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Johannesburg"}" style="width: 49.9234%; height: 29.4667px;">Africa/Johannesburg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "southcarolina"}" height="26" style="width: 50.156%; height: 29.4667px;">southcarolina</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "southdakota"}" height="26" style="width: 50.156%; height: 29.4667px;">southdakota</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "spain"}" height="26" style="width: 50.156%; height: 29.4667px;">spain</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Madrid"}" style="width: 49.9234%; height: 29.4667px;">Europe/Madrid</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "spanien"}" height="26" style="width: 50.156%; height: 29.4667px;">spanien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Madrid"}" style="width: 49.9234%; height: 29.4667px;">Europe/Madrid</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "st-johns"}" height="26" style="width: 50.156%; height: 29.4667px;">st-johns</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Johns"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Johns</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "st-thomas"}" height="26" style="width: 50.156%; height: 29.4667px;">st-thomas</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Thomas"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Thomas</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "stjohns"}" height="26" style="width: 50.156%; height: 29.4667px;">stjohns</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Johns"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Johns</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "stthomas"}" height="26" style="width: 50.156%; height: 29.4667px;">stthomas</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Thomas"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Thomas</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "südafrika"}" height="26" style="width: 50.156%; height: 29.4667px;">südafrika</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Johannesburg"}" style="width: 49.9234%; height: 29.4667px;">Africa/Johannesburg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "südkorea"}" height="26" style="width: 50.156%; height: 29.4667px;">südkorea</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Seoul"}" style="width: 49.9234%; height: 29.4667px;">Asia/Seoul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "sweden"}" height="26" style="width: 50.156%; height: 29.4667px;">sweden</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Stockholm"}" style="width: 49.9234%; height: 29.4667px;">Europe/Stockholm</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "switzerland"}" height="26" style="width: 50.156%; height: 29.4667px;">switzerland</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Zurich"}" style="width: 49.9234%; height: 29.4667px;">Europe/Zurich</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "sydney"}" height="26" style="width: 50.156%; height: 29.4667px;">sydney</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Sydney"}" style="width: 49.9234%; height: 29.4667px;">Australia/Sydney</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "taiwan"}" height="26" style="width: 50.156%; height: 29.4667px;">taiwan</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Taipei"}" style="width: 49.9234%; height: 29.4667px;">Asia/Taipei</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tasmania"}" height="26" style="width: 50.156%; height: 29.4667px;">tasmania</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Hobart"}" style="width: 49.9234%; height: 29.4667px;">Australia/Hobart</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tennessee"}" height="26" style="width: 50.156%; height: 29.4667px;">tennessee</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tennessee-eastern"}" height="26" style="width: 50.156%; height: 29.4667px;">tennessee-eastern</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "texas"}" height="26" style="width: 50.156%; height: 29.4667px;">texas</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "texas-mountain"}" height="26" style="width: 50.156%; height: 29.4667px;">texas-mountain</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "th"}" height="26" style="width: 50.156%; height: 29.4667px;">th</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Bangkok"}" style="width: 49.9234%; height: 29.4667px;">Asia/Bangkok</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "thailand"}" height="26" style="width: 50.156%; height: 29.4667px;">thailand</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Bangkok"}" style="width: 49.9234%; height: 29.4667px;">Asia/Bangkok</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "thailand"}" height="26" style="width: 50.156%; height: 29.4667px;">thailand</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Bangkok"}" style="width: 49.9234%; height: 29.4667px;">Asia/Bangkok</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "toronto"}" height="26" style="width: 50.156%; height: 29.4667px;">toronto</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Toronto"}" style="width: 49.9234%; height: 29.4667px;">America/Toronto</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tr"}" height="26" style="width: 50.156%; height: 29.4667px;">tr</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Istanbul"}" style="width: 49.9234%; height: 29.4667px;">Europe/Istanbul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tschechien"}" height="26" style="width: 50.156%; height: 29.4667px;">tschechien</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Prague"}" style="width: 49.9234%; height: 29.4667px;">Europe/Prague</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "türkei"}" height="26" style="width: 50.156%; height: 29.4667px;">tuerkei</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Istanbul"}" style="width: 49.9234%; height: 29.4667px;">Europe/Istanbul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "turkey"}" height="26" style="width: 50.156%; height: 29.4667px;">turkey</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Istanbul"}" style="width: 49.9234%; height: 29.4667px;">Europe/Istanbul</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "tw"}" height="26" style="width: 50.156%; height: 29.4667px;">tw</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Taipei"}" style="width: 49.9234%; height: 29.4667px;">Asia/Taipei</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ua"}" height="26" style="width: 50.156%; height: 29.4667px;">ua</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Kyiv"}" style="width: 49.9234%; height: 29.4667px;">Europe/Kyiv</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "uae"}" height="26" style="width: 50.156%; height: 29.4667px;">uae</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Dubai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Dubai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "uk"}" height="26" style="width: 50.156%; height: 29.4667px;">uk</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/London"}" style="width: 49.9234%; height: 29.4667px;">Europe/London</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ukraine"}" height="26" style="width: 50.156%; height: 29.4667px;">ukraine</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Kyiv"}" style="width: 49.9234%; height: 29.4667px;">Europe/Kyiv</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "ungarn"}" height="26" style="width: 50.156%; height: 29.4667px;">ungarn</td><td align="left" data-sheets-value="{ "1": 2, "2": "Europe\/Budapest"}" style="width: 49.9234%; height: 29.4667px;">Europe/Budapest</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "up-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">up-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "upper-peninsula-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">upper-peninsula-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "us-virgin-islands"}" height="26" style="width: 50.156%; height: 29.4667px;">us-virgin-islands</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Thomas"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Thomas</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-adak"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-adak</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Adak"}" style="width: 49.9234%; height: 29.4667px;">America/Adak</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ak"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ak</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Anchorage"}" style="width: 49.9234%; height: 29.4667px;">America/Anchorage</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-al"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-al</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ar"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ar</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-as"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-as</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Pago_Pago"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Pago\_Pago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-az"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-az</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Phoenix"}" style="width: 49.9234%; height: 29.4667px;">America/Phoenix</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ca"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ca</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-co"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-co</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-dc"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-dc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-de"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-de</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-fl"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-fl</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-fl-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-fl-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ga"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ga</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-gu"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-gu</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Guam"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Guam</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-hi"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-hi</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Honolulu"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Honolulu</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ia"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-id"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-id</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-id-pt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-id-pt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-il"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-il</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-in"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-in</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Indiana\/Indianapolis"}" style="width: 49.9234%; height: 29.4667px;">America/Indiana/Indianapolis</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-in-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-in-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-in-knox"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-in-knox</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Indiana\/Knox"}" style="width: 49.9234%; height: 29.4667px;">America/Indiana/Knox</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-in-tell-city"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-in-tell-city</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Indiana\/Tell_City"}" style="width: 49.9234%; height: 29.4667px;">America/Indiana/Tell\_City</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ks"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ks</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ks-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ks-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ky"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ky</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ky-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ky-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ky-louisville"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ky-louisville</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Kentucky\/Louisville"}" style="width: 49.9234%; height: 29.4667px;">America/Kentucky/Louisville</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ky-monticello"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ky-monticello</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Kentucky\/Monticello"}" style="width: 49.9234%; height: 29.4667px;">America/Kentucky/Monticello</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-la"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-la</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ma"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ma</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-md"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-md</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-me"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-me</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-metlakatla"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-metlakatla</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Metlakatla"}" style="width: 49.9234%; height: 29.4667px;">America/Metlakatla</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mi"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mi</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Detroit"}" style="width: 49.9234%; height: 29.4667px;">America/Detroit</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mi-ct"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mi-ct</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mi-menominee"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mi-menominee</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Menominee"}" style="width: 49.9234%; height: 29.4667px;">America/Menominee</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mn"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mn</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mo"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mo</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicag"}" style="width: 49.9234%; height: 29.4667px;">America/Chicag</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mp"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mp</td><td align="left" data-sheets-value="{ "1": 2, "2": "Pacific\/Saipan"}" style="width: 49.9234%; height: 29.4667px;">Pacific/Saipan</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ms"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ms</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nc"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nd"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nd</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nd-beulah"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nd-beulah</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/North_Dakota\/Beulah"}" style="width: 49.9234%; height: 29.4667px;">America/North\_Dakota/Beulah</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nd-center"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nd-center</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/North_Dakota\/Center"}" style="width: 49.9234%; height: 29.4667px;">America/North\_Dakota/Center</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nd-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nd-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nd-new-salem"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nd-new-salem</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/North_Dakota\/New_Salem"}" style="width: 49.9234%; height: 29.4667px;">America/North\_Dakota/New\_Salem</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ne"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ne</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ne-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ne-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nh"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nh</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nj"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nj</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nm"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nm</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nv"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nv</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-nv-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-nv-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ny"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ny</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-oh"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-oh</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ok"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ok</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-or"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-or</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-or-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-or-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Boise"}" style="width: 49.9234%; height: 29.4667px;">America/Boise</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-pa"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-pa</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-pr"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-pr</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Puerto_Rico"}" style="width: 49.9234%; height: 29.4667px;">America/Puerto\_Rico</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ri"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ri</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-sc"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-sc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-sd"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-sd</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-sd-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-sd-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-tn"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-tn</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-tn-et"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-tn-et</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-tx"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-tx</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-tx-mt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-tx-mt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-ut"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-ut</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-va"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-va</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-vi"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-vi</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Thomas"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Thomas</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-vt"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-vt</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-wa"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-wa</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-wi"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-wi</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-wv"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-wv</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usa-wy"}" height="26" style="width: 50.156%; height: 29.4667px;">usa-wy</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "usvi"}" height="26" style="width: 50.156%; height: 29.4667px;">usvi</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/St_Thomas"}" style="width: 49.9234%; height: 29.4667px;">America/St\_Thomas</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utah"}" height="26" style="width: 50.156%; height: 29.4667px;">utah</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc"}" height="26" style="width: 50.156%; height: 29.4667px;">utc</td><td align="left" data-sheets-value="{ "1": 2, "2": "UTC"}" style="width: 49.9234%; height: 29.4667px;">UTC</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-0"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-0</td><td align="left" data-sheets-value="{ "1": 2, "2": "UTC"}" style="width: 49.9234%; height: 29.4667px;">UTC</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-1"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-1</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+1"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+1</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-10"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-10</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+10"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+10</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-11"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-11</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+11"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+11</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-12"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-12</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+12"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+12</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-2"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-2</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+2"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+2</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-3"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-3</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+3"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+3</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-4"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-4</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+4"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+4</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-5"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-5</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+5"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+5</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-6"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-6</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+6"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+6</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-7"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-7</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+7"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+7</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-8"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-8</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+8"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+8</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc-9"}" height="26" style="width: 50.156%; height: 29.4667px;">utc-9</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT+9"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT+9</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+0"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+0</td><td align="left" data-sheets-value="{ "1": 2, "2": "UTC"}" style="width: 49.9234%; height: 29.4667px;">UTC</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+1"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+1</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-1"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-1</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+10"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+10</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-10"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-10</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+11"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+11</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-11"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-11</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+12"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+12</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-12"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-12</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+2"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+2</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-2"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-2</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+3"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+3</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-3"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-3</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+4"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+4</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-4"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-4</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+5"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+5</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-5"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-5</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+6"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+6</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-6"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-6</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+7"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+7</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-7"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-7</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+8"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+8</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-8"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-8</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "utc+9"}" height="26" style="width: 50.156%; height: 29.4667px;">utc+9</td><td align="left" data-sheets-value="{ "1": 2, "2": "Etc\/GMT-9"}" style="width: 49.9234%; height: 29.4667px;">Etc/GMT-9</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vancouver"}" height="26" style="width: 50.156%; height: 29.4667px;">vancouver</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Vancouver"}" style="width: 49.9234%; height: 29.4667px;">America/Vancouver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vereinigte-arabische-emirate"}" height="26" style="width: 50.156%; height: 29.4667px;">vereinigte-arabische-emirate</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Dubai"}" style="width: 49.9234%; height: 29.4667px;">Asia/Dubai</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vermont"}" height="26" style="width: 50.156%; height: 29.4667px;">vermont</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "victoria"}" height="26" style="width: 50.156%; height: 29.4667px;">victoria</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Melbourne"}" style="width: 49.9234%; height: 29.4667px;">Australia/Melbourne</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vietnam"}" height="26" style="width: 50.156%; height: 29.4667px;">vietnam</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Ho_Chi_Minh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Ho\_Chi\_Minh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vietnam"}" height="26" style="width: 50.156%; height: 29.4667px;">vietnam</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Ho_Chi_Minh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Ho\_Chi\_Minh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "virginia"}" height="26" style="width: 50.156%; height: 29.4667px;">virginia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vladivostok"}" height="26" style="width: 50.156%; height: 29.4667px;">vladivostok</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Vladivostok"}" style="width: 49.9234%; height: 29.4667px;">Asia/Vladivostok</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "vn"}" height="26" style="width: 50.156%; height: 29.4667px;">vn</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Ho_Chi_Minh"}" style="width: 49.9234%; height: 29.4667px;">Asia/Ho\_Chi\_Minh</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "washington"}" height="26" style="width: 50.156%; height: 29.4667px;">washington</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Los_Angeles"}" style="width: 49.9234%; height: 29.4667px;">America/Los\_Angeles</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "washington-dc"}" height="26" style="width: 50.156%; height: 29.4667px;">washington-dc</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "west-virginia"}" height="26" style="width: 50.156%; height: 29.4667px;">west-virginia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "west-wendover"}" height="26" style="width: 50.156%; height: 29.4667px;">west-wendover</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "western-australia"}" height="26" style="width: 50.156%; height: 29.4667px;">western-australia</td><td align="left" data-sheets-value="{ "1": 2, "2": "Australia\/Perth"}" style="width: 49.9234%; height: 29.4667px;">Australia/Perth</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "westvirginia"}" height="26" style="width: 50.156%; height: 29.4667px;">westvirginia</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/New_York"}" style="width: 49.9234%; height: 29.4667px;">America/New\_York</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "westwendover"}" height="26" style="width: 50.156%; height: 29.4667px;">westwendover</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "whitehorse"}" height="26" style="width: 50.156%; height: 29.4667px;">whitehorse</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Whitehorse"}" style="width: 49.9234%; height: 29.4667px;">America/Whitehorse</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "winnipeg"}" height="26" style="width: 50.156%; height: 29.4667px;">winnipeg</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Winnipeg"}" style="width: 49.9234%; height: 29.4667px;">America/Winnipeg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "wisconsin"}" height="26" style="width: 50.156%; height: 29.4667px;">wisconsin</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Chicago"}" style="width: 49.9234%; height: 29.4667px;">America/Chicago</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "wyoming"}" height="26" style="width: 50.156%; height: 29.4667px;">wyoming</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Denver"}" style="width: 49.9234%; height: 29.4667px;">America/Denver</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "yekaterinburg"}" height="26" style="width: 50.156%; height: 29.4667px;">yekaterinburg</td><td align="left" data-sheets-value="{ "1": 2, "2": "Asia\/Yekaterinburg"}" style="width: 49.9234%; height: 29.4667px;">Asia/Yekaterinburg</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "yukon"}" height="26" style="width: 50.156%; height: 29.4667px;">yukon</td><td align="left" data-sheets-value="{ "1": 2, "2": "America\/Whitehorse"}" style="width: 49.9234%; height: 29.4667px;">America/Whitehorse</td></tr><tr style="height: 29.4667px;"><td align="left" data-sheets-value="{ "1": 2, "2": "za"}" height="26" style="width: 50.156%; height: 29.4667px;">za</td><td align="left" data-sheets-value="{ "1": 2, "2": "Africa\/Johannesburg"}" style="width: 49.9234%; height: 29.4667px;">Africa/Johannesburg</td></tr></tbody></table>

# Webcamloader (🐧Debian / 08.25)

Das Projekt ist nun unter [Webcamloader](https://wiki.mariobeh.de/books/behwiki/page/webcamloader "Webcamloader 🐧") direkt zu finden.