1 Aufgaben

Um mit verschiedenen Daten umgehen zu können, müssen Sie auch verschiedene Daten/Datenstrukturen gesehen haben, daher betrachten wir immer unterschiedliche Datensätze.

In den folgenden Aufgaben wollen wir weiterhin den Datensatz flights betrachten, da dieser aufgrund seiner Größe etwas komplexer ist:

library(tidyverse)
flights

Machen Sie sich mit dem Datensatz und den einzelnen Variablen vertraut. Falls Sie Hilfe benötigen, verwenden Sie erneut ?flights.

1.1 Übungsaufgaben

  1. Wo liegt der Fehler?
irgendeine_variable <- 10
irgendeine_varıable
  1. Schreiben Sie die fehlenden Befehle um, sodass diese sinngemäß laufen:
lirbrary(tidyverse)

ggplot(dota = iris) +
    geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width))

filter(mpg, cyl = 7)
filter(diamond, carat != 3)
  1. Filtern Sie die Flüge des flights Datensatzes anhand der folgenden Bedingungen:
    1. Flüge mit einer Ankunftsverspätung arr_delay von über 10 Stunden

    2. Flüge nach Seattle oder Kansas City (SEA und MCI)

    3. Flüge der Airlines United (UA), American (AA) oder Delta (DL)

    4. Flüge im Winter (December, Januar, Februar)

    5. Flüge mit einer Verspätung arr_delay von mehr als 3 Stunden, wobei der Abflug nicht verspätet war (dep_delay)

    6. Flüge mit einer Abflugverspätung dep_delay von mehr als einer Stunde, die mehr als die Hälfte des Delays durch den Flug wettmachen konnten

    7. Flüge am späten Abend zwischen 22 Uhr und 24 Uhr

  2. Betrachten Sie die Funktion ?between() und ihre Funktionalität. Würde diese Ihnen bei den vorherigen Aufgaben helfen?
  3. Bei wie vielen Flügen fehlt die Ankunftszeit dep_time? Was fällt Ihnen auf und wie können Sie sich diese Einträge erklären?
  4. Sortieren Sie die Flüge:
    1. Finden Sie die Flüge mit der kleinsten und größten Abflugverspätung dep_delay

    2. Finden Sie den kürzesten und längsten Flug (bezogen auf die Distanz distance)

    3. Finden Sie den schnellsten Flug (bezogen auf die Geschwindigkeit)

1.2 Lösungen

1.2.1 Wo liegt der Fehler?

irgendeine_variable <- 10
irgendeine_variable
[1] 10

Der Fehler zeigt, dass ein Objekt nicht gefunden wurde. Dies liegt daran, dass der Variablenname zuvor falsch geschrieben wurde (das i war das griechische Iota: ι).

1.2.2 Schreiben Sie die fehlenden Befehle um, sodass diese sinngemäß laufen:

library(tidyverse) # Funktion falsch geschrieben

ggplot(data = iris) + # Parameter falsch geschrieben
    geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width))


filter(mpg, cyl == 7) # Für Vergleiche wird das "==" verwendet
filter(diamonds, carat != 3) # Der Dataframe heißt diamonds

1.2.3 Filtern Sie die Flüge des flights Datensatzes anhand der folgenden Bedingungen:

1.2.3.1 Flüge mit einer Ankunftsverspätung arr_delay von über 10 Stunden

Achten Sie darauf, dass die meisten Zeiten in Minuten angegeben sind:

filter(flights, arr_delay >= 600) # = 10 Stunden

1.2.3.2 Flüge nach Seattle oder Kansas City (SEA und MCI)

Es gibt zwei Alternativen. Entweder verwenden Sie den Vergleichsoperator für das ODER |:

filter(flights, dest == "SEA" | dest == "MCI")

Die zweite Alternative ist die Verwendung von %in%:

filter(flights, dest %in% c("SEA", "MCI"))

1.2.3.3 Flüge der Airlines United (UA), American (AA) oder Delta (DL)

filter(flights, carrier %in% c("UA", "AA", "DL"))

1.2.3.4 Flüge im ersten Quartal (Januar, Februar, März)

filter(flights, month %in% c(1, 2, 3))

1.2.3.5 Flüge mit einer Verspätung arr_delay von mehr als 3 Stunden, wobei der Abflug nicht verspätet war (dep_delay)

filter(flights, arr_delay > 180, dep_delay <= 0)

1.2.3.6 Flüge mit einer Abflugverspätung dep_delay von mehr als einer Stunde, die mehr als die Hälfte des Delays durch den Flug wettmachen konnten

filter(flights, dep_delay > 60, arr_delay < dep_delay / 2)

1.2.3.7 Flüge am späten Abend zwischen 22 Uhr und 24 Uhr

filter(flights, hour >= 22, hour <= 24)

1.2.4 Betrachten Sie die Funktion ?between() und ihre Funktionalität. Würde Ihnen diese bei den vorherigen Aufgaben helfen?

Die between() Funktion ermöglicht den Vergleich von einem Wert mit einer Unter- und Obergrenze. Das kann als Ersatz für x >= y & x <= z verwendet werden. Umgangssprachlich: “Liegt der Wert x zwischen y und z?

Verwenden können wir diese Funktion in zwei vorherigen Fällen:

filter(flights, between(month, 1, 3)) # Umgangssprachlich: "Wähle den Monat zwischen dem 1. und 3. (beides inklusive) aus"
filter(flights, between(hour, 22, 24)) # Flüge zwischen 22 und 24 Uhr

1.2.5 Bei wie vielen Flügen fehlt die Ankunftszeit dep_time? Was fällt Ihnen auf und wie können Sie sich diese Einträge erklären?

NAs können wir mit Hilfe der is.na() Funktion filtern:

filter(flights, is.na(dep_time))

Wir sehen, dass eine fehlende Ankunftszeit ebenfalls mit NAs in arr_time, dep_delay, arr_delay und air_time einhergehen:

  • Die Flüge scheinen ausgefallen zu sein

1.2.6 Sortieren Sie die Flüge:

1.2.6.1 Finden Sie die Flüge mit der kleinsten und größten Abflugverspätung dep_delay

# Aufsteigend sortiert:
arrange(flights, dep_delay)
# Absteigend sortiert:
arrange(flights, desc(dep_delay)) # desc() = descending (absteigend), um die Sortierung zu ändern

1.2.6.2 Finden Sie den kürzesten und längsten Flug (bezogen auf die Distanz distance)

arrange(flights, distance)
arrange(flights, desc(distance))

1.2.6.3 Finden Sie den schnellsten Flug (bezogen auf die Geschwindigkeit)

Um die Geschwindigkeit zu erhalten, müssen wir die Distanz distance durch die Zeit air_time teilen und danach sortieren:

arrange(flights, desc(distance / air_time))
LS0tCnRpdGxlOiAiw5xidW5nc3pldHRlbCAzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKLS0tCgojIEF1ZmdhYmVuCgpVbSBtaXQgdmVyc2NoaWVkZW5lbiBEYXRlbiB1bWdlaGVuIHp1IGvDtm5uZW4sIG3DvHNzZW4gU2llIGF1Y2gKdmVyc2NoaWVkZW5lIERhdGVuL0RhdGVuc3RydWt0dXJlbiBnZXNlaGVuIGhhYmVuLCBkYWhlciBiZXRyYWNodGVuIHdpcgppbW1lciB1bnRlcnNjaGllZGxpY2hlIERhdGVuc8OkdHplLgoKSW4gZGVuIGZvbGdlbmRlbiBBdWZnYWJlbiB3b2xsZW4gd2lyIHdlaXRlcmhpbiBkZW4gRGF0ZW5zYXR6IGBmbGlnaHRzYApiZXRyYWNodGVuLCBkYSBkaWVzZXIgYXVmZ3J1bmQgc2VpbmVyIEdyw7bDn2UgZXR3YXMga29tcGxleGVyIGlzdDoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZmxpZ2h0cwpgYGAKCk1hY2hlbiBTaWUgc2ljaCBtaXQgZGVtIERhdGVuc2F0eiB1bmQgZGVuIGVpbnplbG5lbiBWYXJpYWJsZW4gdmVydHJhdXQuCkZhbGxzIFNpZSBIaWxmZSBiZW7DtnRpZ2VuLCB2ZXJ3ZW5kZW4gU2llIGVybmV1dCBgP2ZsaWdodHNgLgoKIyMgw5xidW5nc2F1ZmdhYmVuCgoxLiAgV28gbGllZ3QgZGVyIEZlaGxlcj8KCmBgYHtyLCBldmFsID0gRkFMU0V9CmlyZ2VuZGVpbmVfdmFyaWFibGUgPC0gMTAKaXJnZW5kZWluZV92YXLEsWFibGUKYGBgCgoyLiAgU2NocmVpYmVuIFNpZSBkaWUgZmVobGVuZGVuIEJlZmVobGUgdW0sIHNvZGFzcyBkaWVzZSBzaW5uZ2Vtw6TDnwogICAgbGF1ZmVuOgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KbGlyYnJhcnkodGlkeXZlcnNlKQoKZ2dwbG90KGRvdGEgPSBpcmlzKSArCglnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgeSA9IFNlcGFsLldpZHRoKSkKCmZpbHRlcihtcGcsIGN5bCA9IDcpCmZpbHRlcihkaWFtb25kLCBjYXJhdCAhPSAzKQpgYGAKCjMuICBGaWx0ZXJuIFNpZSBkaWUgRmzDvGdlIGRlcyBgZmxpZ2h0c2AgRGF0ZW5zYXR6ZXMgYW5oYW5kIGRlciBmb2xnZW5kZW4KICAgIEJlZGluZ3VuZ2VuOgogICAgMS4gIEZsw7xnZSBtaXQgZWluZXIgQW5rdW5mdHN2ZXJzcMOkdHVuZyBgYXJyX2RlbGF5YCB2b24gw7xiZXIgMTAKICAgICAgICBTdHVuZGVuCgogICAgMi4gIEZsw7xnZSBuYWNoIFNlYXR0bGUgb2RlciBLYW5zYXMgQ2l0eSAoYFNFQWAgdW5kIGBNQ0lgKQoKICAgIDMuICBGbMO8Z2UgZGVyIEFpcmxpbmVzIFVuaXRlZCAoYFVBYCksIEFtZXJpY2FuIChgQUFgKSBvZGVyIERlbHRhCiAgICAgICAgKGBETGApCgogICAgNC4gIEZsw7xnZSBpbSBXaW50ZXIgKERlY2VtYmVyLCBKYW51YXIsIEZlYnJ1YXIpCgogICAgNS4gIEZsw7xnZSBtaXQgZWluZXIgVmVyc3DDpHR1bmcgYGFycl9kZWxheWAgdm9uIG1laHIgYWxzIDMgU3R1bmRlbiwKICAgICAgICB3b2JlaSBkZXIgQWJmbHVnIG5pY2h0IHZlcnNww6R0ZXQgd2FyIChgZGVwX2RlbGF5YCkKCiAgICA2LiAgRmzDvGdlIG1pdCBlaW5lciBBYmZsdWd2ZXJzcMOkdHVuZyBgZGVwX2RlbGF5YCB2b24gbWVociBhbHMgZWluZXIKICAgICAgICBTdHVuZGUsIGRpZSBtZWhyIGFscyBkaWUgSMOkbGZ0ZSBkZXMgRGVsYXlzIGR1cmNoIGRlbiBGbHVnCiAgICAgICAgd2V0dG1hY2hlbiBrb25udGVuCgogICAgNy4gIEZsw7xnZSBhbSBzcMOkdGVuIEFiZW5kIHp3aXNjaGVuIDIyIFVociB1bmQgMjQgVWhyCjQuICBCZXRyYWNodGVuIFNpZSBkaWUgRnVua3Rpb24gYD9iZXR3ZWVuKClgIHVuZCBpaHJlIEZ1bmt0aW9uYWxpdMOkdC4KICAgIFfDvHJkZSBkaWVzZSBJaG5lbiBiZWkgZGVuIHZvcmhlcmlnZW4gQXVmZ2FiZW4gaGVsZmVuPwo1LiAgQmVpIHdpZSB2aWVsZW4gRmzDvGdlbiBmZWhsdCBkaWUgQW5rdW5mdHN6ZWl0IGBkZXBfdGltZWA/IFdhcyBmw6RsbHQKICAgIElobmVuIGF1ZiB1bmQgd2llIGvDtm5uZW4gU2llIHNpY2ggZGllc2UgRWludHLDpGdlIGVya2zDpHJlbj8KNi4gIFNvcnRpZXJlbiBTaWUgZGllIEZsw7xnZToKICAgIDEuICBGaW5kZW4gU2llIGRpZSBGbMO8Z2UgbWl0IGRlciBrbGVpbnN0ZW4gdW5kIGdyw7bDn3RlbgogICAgICAgIEFiZmx1Z3ZlcnNww6R0dW5nIGBkZXBfZGVsYXlgCgogICAgMi4gIEZpbmRlbiBTaWUgZGVuIGvDvHJ6ZXN0ZW4gdW5kIGzDpG5nc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUKICAgICAgICBEaXN0YW56IGBkaXN0YW5jZWApCgogICAgMy4gIEZpbmRlbiBTaWUgZGVuIHNjaG5lbGxzdGVuIEZsdWcgKGJlem9nZW4gYXVmIGRpZQogICAgICAgIEdlc2Nod2luZGlna2VpdCkKCiMjIEzDtnN1bmdlbgoKIyMjIFdvIGxpZWd0IGRlciBGZWhsZXI/CgpgYGB7cn0KaXJnZW5kZWluZV92YXJpYWJsZSA8LSAxMAppcmdlbmRlaW5lX3ZhcmlhYmxlCmBgYAoKRGVyIEZlaGxlciB6ZWlndCwgZGFzcyBlaW4gT2JqZWt0IG5pY2h0IGdlZnVuZGVuIHd1cmRlLiBEaWVzIGxpZWd0CmRhcmFuLCBkYXNzIGRlciBWYXJpYWJsZW5uYW1lIHp1dm9yIGZhbHNjaCBnZXNjaHJpZWJlbiB3dXJkZSAoZGFzIGkgd2FyCmRhcyBncmllY2hpc2NoZSBbSW90YV0oaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvSW90YSk6IM65KS4KCiMjIyBTY2hyZWliZW4gU2llIGRpZSBmZWhsZW5kZW4gQmVmZWhsZSB1bSwgc29kYXNzIGRpZXNlIHNpbm5nZW3DpMOfIGxhdWZlbjoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBGdW5rdGlvbiBmYWxzY2ggZ2VzY2hyaWViZW4KCmdncGxvdChkYXRhID0gaXJpcykgKyAjIFBhcmFtZXRlciBmYWxzY2ggZ2VzY2hyaWViZW4KCWdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgpKQoKZmlsdGVyKG1wZywgY3lsID09IDcpICMgRsO8ciBWZXJnbGVpY2hlIHdpcmQgZGFzICI9PSIgdmVyd2VuZGV0CmZpbHRlcihkaWFtb25kcywgY2FyYXQgIT0gMykgIyBEZXIgRGF0YWZyYW1lIGhlacOfdCBkaWFtb25kcwpgYGAKCiMjIyBGaWx0ZXJuIFNpZSBkaWUgRmzDvGdlIGRlcyBgZmxpZ2h0c2AgRGF0ZW5zYXR6ZXMgYW5oYW5kIGRlciBmb2xnZW5kZW4gQmVkaW5ndW5nZW46CgojIyMjIEZsw7xnZSBtaXQgZWluZXIgQW5rdW5mdHN2ZXJzcMOkdHVuZyBgYXJyX2RlbGF5YCB2b24gw7xiZXIgMTAgU3R1bmRlbgoKQWNodGVuIFNpZSBkYXJhdWYsIGRhc3MgZGllIG1laXN0ZW4gWmVpdGVuIGluIE1pbnV0ZW4gYW5nZWdlYmVuIHNpbmQ6CgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGFycl9kZWxheSA+PSA2MDApICMgPSAxMCBTdHVuZGVuCmBgYAoKIyMjIyBGbMO8Z2UgbmFjaCBTZWF0dGxlIG9kZXIgS2Fuc2FzIENpdHkgKGBTRUFgIHVuZCBgTUNJYCkKCkVzIGdpYnQgendlaSBBbHRlcm5hdGl2ZW4uIEVudHdlZGVyIHZlcndlbmRlbiBTaWUgZGVuIFZlcmdsZWljaHNvcGVyYXRvcgpmw7xyIGRhcyBPREVSIGB8YDoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVzdCA9PSAiU0VBIiB8IGRlc3QgPT0gIk1DSSIpCmBgYAoKRGllIHp3ZWl0ZSBBbHRlcm5hdGl2ZSBpc3QgZGllIFZlcndlbmR1bmcgdm9uIGAlaW4lYDoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVzdCAlaW4lIGMoIlNFQSIsICJNQ0kiKSkKYGBgCgojIyMjIEZsw7xnZSBkZXIgQWlybGluZXMgVW5pdGVkIChgVUFgKSwgQW1lcmljYW4gKGBBQWApIG9kZXIgRGVsdGEgKGBETGApCgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGNhcnJpZXIgJWluJSBjKCJVQSIsICJBQSIsICJETCIpKQpgYGAKCiMjIyMgRmzDvGdlIGltIGVyc3RlbiBRdWFydGFsIChKYW51YXIsIEZlYnJ1YXIsIE3DpHJ6KQoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBtb250aCAlaW4lIGMoMSwgMiwgMykpCmBgYAoKIyMjIyBGbMO8Z2UgbWl0IGVpbmVyIFZlcnNww6R0dW5nIGBhcnJfZGVsYXlgIHZvbiBtZWhyIGFscyAzIFN0dW5kZW4sIHdvYmVpIGRlciBBYmZsdWcgbmljaHQgdmVyc3DDpHRldCB3YXIgKGBkZXBfZGVsYXlgKQoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBhcnJfZGVsYXkgPiAxODAsIGRlcF9kZWxheSA8PSAwKQpgYGAKCiMjIyMgRmzDvGdlIG1pdCBlaW5lciBBYmZsdWd2ZXJzcMOkdHVuZyBgZGVwX2RlbGF5YCB2b24gbWVociBhbHMgZWluZXIgU3R1bmRlLCBkaWUgbWVociBhbHMgZGllIEjDpGxmdGUgZGVzIERlbGF5cyBkdXJjaCBkZW4gRmx1ZyB3ZXR0bWFjaGVuIGtvbm50ZW4KCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVwX2RlbGF5ID4gNjAsIGFycl9kZWxheSA8IGRlcF9kZWxheSAvIDIpCmBgYAoKIyMjIyBGbMO8Z2UgYW0gc3DDpHRlbiBBYmVuZCB6d2lzY2hlbiAyMiBVaHIgdW5kIDI0IFVocgoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBob3VyID49IDIyLCBob3VyIDw9IDI0KQpgYGAKCiMjIyBCZXRyYWNodGVuIFNpZSBkaWUgRnVua3Rpb24gYD9iZXR3ZWVuKClgIHVuZCBpaHJlIEZ1bmt0aW9uYWxpdMOkdC4gV8O8cmRlIElobmVuIGRpZXNlIGJlaSBkZW4gdm9yaGVyaWdlbiBBdWZnYWJlbiBoZWxmZW4/CgpEaWUgYGJldHdlZW4oKWAgRnVua3Rpb24gZXJtw7ZnbGljaHQgZGVuIFZlcmdsZWljaCB2b24gZWluZW0gV2VydCBtaXQKZWluZXIgVW50ZXItIHVuZCBPYmVyZ3JlbnplLiBEYXMga2FubiBhbHMgRXJzYXR6IGbDvHIgYHggPj0geSAmIHggPD0gemAKdmVyd2VuZGV0IHdlcmRlbi4gVW1nYW5nc3NwcmFjaGxpY2g6ICJMaWVndCBkZXIgV2VydCBgeGAgendpc2NoZW4gYHlgCnVuZCBgemA/CgpWZXJ3ZW5kZW4ga8O2bm5lbiB3aXIgZGllc2UgRnVua3Rpb24gaW4gendlaSB2b3JoZXJpZ2VuIEbDpGxsZW46CgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGJldHdlZW4obW9udGgsIDEsIDMpKSAjIFVtZ2FuZ3NzcHJhY2hsaWNoOiAiV8OkaGxlIGRlbiBNb25hdCB6d2lzY2hlbiBkZW0gMS4gdW5kIDMuIChiZWlkZXMgaW5rbHVzaXZlKSBhdXMiCmBgYAoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBiZXR3ZWVuKGhvdXIsIDIyLCAyNCkpICMgRmzDvGdlIHp3aXNjaGVuIDIyIHVuZCAyNCBVaHIKYGBgCgojIyMgQmVpIHdpZSB2aWVsZW4gRmzDvGdlbiBmZWhsdCBkaWUgQW5rdW5mdHN6ZWl0IGBkZXBfdGltZWA/IFdhcyBmw6RsbHQgSWhuZW4gYXVmIHVuZCB3aWUga8O2bm5lbiBTaWUgc2ljaCBkaWVzZSBFaW50csOkZ2UgZXJrbMOkcmVuPwoKYE5Bc2Aga8O2bm5lbiB3aXIgbWl0IEhpbGZlIGRlciBgaXMubmEoKWAgRnVua3Rpb24gZmlsdGVybjoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgaXMubmEoZGVwX3RpbWUpKQpgYGAKCldpciBzZWhlbiwgZGFzcyBlaW5lIGZlaGxlbmRlIEFua3VuZnRzemVpdCBlYmVuZmFsbHMgbWl0IGBOQXNgIGluCmBhcnJfdGltZWAsIGBkZXBfZGVsYXlgLCBgYXJyX2RlbGF5YCB1bmQgYGFpcl90aW1lYCBlaW5oZXJnZWhlbjoKCi0gICBEaWUgRmzDvGdlIHNjaGVpbmVuIGF1c2dlZmFsbGVuIHp1IHNlaW4KCiMjIyBTb3J0aWVyZW4gU2llIGRpZSBGbMO8Z2U6CgojIyMjIEZpbmRlbiBTaWUgZGllIEZsw7xnZSBtaXQgZGVyIGtsZWluc3RlbiB1bmQgZ3LDtsOfdGVuIEFiZmx1Z3ZlcnNww6R0dW5nIGBkZXBfZGVsYXlgCgpgYGB7cn0KIyBBdWZzdGVpZ2VuZCBzb3J0aWVydDoKYXJyYW5nZShmbGlnaHRzLCBkZXBfZGVsYXkpCiMgQWJzdGVpZ2VuZCBzb3J0aWVydDoKYXJyYW5nZShmbGlnaHRzLCBkZXNjKGRlcF9kZWxheSkpICMgZGVzYygpID0gZGVzY2VuZGluZyAoYWJzdGVpZ2VuZCksIHVtIGRpZSBTb3J0aWVydW5nIHp1IMOkbmRlcm4KYGBgCgojIyMjIEZpbmRlbiBTaWUgZGVuIGvDvHJ6ZXN0ZW4gdW5kIGzDpG5nc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUgRGlzdGFueiBgZGlzdGFuY2VgKQoKYGBge3J9CmFycmFuZ2UoZmxpZ2h0cywgZGlzdGFuY2UpCmFycmFuZ2UoZmxpZ2h0cywgZGVzYyhkaXN0YW5jZSkpCmBgYAoKIyMjIyBGaW5kZW4gU2llIGRlbiBzY2huZWxsc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUgR2VzY2h3aW5kaWdrZWl0KQoKVW0gZGllIEdlc2Nod2luZGlna2VpdCB6dSBlcmhhbHRlbiwgbcO8c3NlbiB3aXIgZGllIERpc3RhbnogYGRpc3RhbmNlYApkdXJjaCBkaWUgWmVpdCBgYWlyX3RpbWVgIHRlaWxlbiB1bmQgZGFuYWNoIHNvcnRpZXJlbjoKCmBgYHtyfQphcnJhbmdlKGZsaWdodHMsIGRlc2MoZGlzdGFuY2UgLyBhaXJfdGltZSkpCmBgYAo=