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
.
Übungsaufgaben
- Wo liegt der Fehler?
irgendeine_variable <- 10
irgendeine_varıable
- 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)
- Filtern Sie die Flüge des
flights
Datensatzes anhand
der folgenden Bedingungen:
Flüge mit einer Ankunftsverspätung arr_delay
von
über 10 Stunden
Flüge nach Seattle oder Kansas City (SEA
und
MCI
)
Flüge der Airlines United (UA
), American
(AA
) oder Delta (DL
)
Flüge im Winter (December, Januar, Februar)
Flüge mit einer Verspätung arr_delay
von mehr als 3
Stunden, wobei der Abflug nicht verspätet war
(dep_delay
)
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
Flüge am späten Abend zwischen 22 Uhr und 24 Uhr
- Betrachten Sie die Funktion
?between()
und ihre
Funktionalität. Würde diese Ihnen bei den vorherigen Aufgaben
helfen?
- 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?
- Sortieren Sie die Flüge:
Finden Sie die Flüge mit der kleinsten und größten
Abflugverspätung dep_delay
Finden Sie den kürzesten und längsten Flug (bezogen auf die
Distanz distance
)
Finden Sie den schnellsten Flug (bezogen auf die
Geschwindigkeit)
Lösungen
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:
ι).
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
Filtern Sie die
Flüge des flights
Datensatzes anhand der folgenden
Bedingungen:
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
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"))
Flüge der
Airlines United (UA
), American (AA
) oder Delta
(DL
)
filter(flights, carrier %in% c("UA", "AA", "DL"))
Flüge im ersten
Quartal (Januar, Februar, März)
filter(flights, month %in% c(1, 2, 3))
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)
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)
Flüge am späten
Abend zwischen 22 Uhr und 24 Uhr
filter(flights, hour >= 22, hour <= 24)
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
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
Sortieren Sie die
Flüge:
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
Finden Sie den
kürzesten und längsten Flug (bezogen auf die Distanz
distance
)
arrange(flights, distance)
arrange(flights, desc(distance))
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=