1. Just how thirsty is Thursday?
We have previously explored some breathalyzer test data from Ames, Iowa, USA, here. Now, we focus on working with the date and time information in the data. As a college town (Go Cyclones!), Ames has had its fair share of alcohol-related incidents. (For example, Google “VEISHEA riots 2014”.) In this project, we examine breath alcohol test data in Ames from January 2013 to December 2017 that is published by the State of Iowa, specifically focusing on when these tests are administered.
The data file “breathalcoholdatetimes.csv” contains 1,556 observations from breath alcohol tests collected by the Ames and Iowa State University Police Departments. The columns in this dataset are:
- DateTime - date & time of test (datetime, “America/Chicago”)
- Location - who administered the test, Ames PD or ISU PD? (char.)
- Gender - gender (M,F) of person being tested (char.)
- Res1 - first breath alcohol reading (num.)
- Res2 - second breath alcohol reading (num.)
First, we create a bar chart showing number of tests by day of the week to see when the most tests were done.
# load necessary packages
# .... YOUR CODE FOR TASK 1 ....
library(tidyverse)
library(lubridate)
# read in the data from breath_alcohol_datetimes.csv
ba_dates <- read_csv("breath_alcohol_datetimes.csv")
Parsed with column specification:
cols(
DateTime = col_datetime(format = ""),
Location = col_character(),
Gender = col_character(),
Res1 = col_double(),
Res2 = col_double()
)
# change DateTime column to America/Chicago with force_tz
ba_dates <- ba_dates %>% mutate(DateTime = force_tz(DateTime, tz = "America/Chicago"))
# create a wkday column in the ba_dates
ba_dates <- ba_dates %>% mutate(wkday = wday(DateTime, label = TRUE))
# create a bar chart of # tests by day of week
ggplot(data = ba_dates, aes(x = wkday)) +
geom_bar()

2. What makes Sunday so fun-day?
Well, that wasn’t terribly surprising: Friday and Saturday are two of the most common days of the week for breathalyzer tests in a college town. But what might be somewhat surprising is that more tests occur on Sunday than on Friday. But when on Sunday are these tests being administered? To investigate, we look at the hour of the test and compare this data for Friday, Saturday, and Sunday.
# create hour variable
ba_dates <- ba_dates %>%
mutate(hr = hour(DateTime))
# create weekend data
weekend <- ba_dates %>% filter(wkday %in% c("Sun", "Sat", "Fri"))
# plot side-by side bar charts of the distribution of hour of the day of tests in each weekend day.
ggplot(data = weekend ) +
geom_bar(aes(x = hr)) +
facet_grid(.~wkday) +
scale_x_continuous(breaks = 1:12*2-1)

3. Trends in testing over time
We learned that most of the tests administered on Sundays are during early morning, from midnight to 5am. Strangely, the same pattern also exists on Friday mornings. (This is likely because Thursdays are “Mug Nights” in Ames, where you can get discounted drinks if you bring in the designated reusable mug.) Returning to the full dataset, we now explore the pattern of alcohol tests over the years. To look at the “bigger picture,” let’s count up the number of tests per day, and visualize the resulting time series using a line plot.
# create a date column rounded to the nearest day. as.Date() is for the plot later
ba_dates <- ba_dates %>% mutate(date = as.Date(round_date(DateTime, unit = "day")))
# count number of tests per date
ba_summary <- ba_dates %>% count(date)
# pipe the result from above into ggplot() using geom_line to create a time series plot.
ba_summary %>%
ggplot() +
geom_line(aes(x = date, y = n), alpha = .7) + # change alpha for readability
scale_x_date(date_breaks = "6 months") +
theme(axis.text.x = element_text(angle = 30)) # make x-axis more readable

5. Home vs. away? Win vs. lose?
The most breathalyzer tests given on a football game day was on Sept. 24, 2016. This was a home game against San Jose State that Iowa State won 44-10. The win/loss information is in the Res column in isu_fb. Could the home game win have led to some excessive celebrations that resulted in more breathalyzer tests than an away win or a home loss?
# join ba_summary to isu_fb
isu_fb2 <- isu_fb %>% left_join(ba_summary, by = c("Date"="date"))
# change nas to 0s
isu_fb2 <- isu_fb2 %>% mutate(n = ifelse(is.na(n), 0, n))
# plot
# .... YOUR CODE FOR TASK 5 ....
ggplot(isu_fb2) +
geom_bar(aes(x = n, fill = Home)) +
facet_grid(.~Res)

6. Monthly counts
The football season typically lasts from September through November. As we just saw, Iowa State football has more losses than wins in the last few years. The men’s basketball team, however, has traditionally been very successful. The basketball season usually lasts from November through March. We now investigate the number of breathalyzer tests by month to see if the basketball months have more tests than the football months.
# create a mo and a yr column in ba_dates
ba_dates <- ba_dates %>% mutate(mo = month(date, label = TRUE), yr = year(date))
# make bar chart by mo.
# .... YOUR CODE FOR TASK 6 ....
ggplot(ba_dates) +
geom_bar(aes(x = mo))

# color by year
# .... YOUR CODE FOR TASK 6 ...
ggplot(ba_dates) +
geom_bar(aes(x = mo, fill = as.factor(yr)))

7. VEISHEA: an old tradition
The monthly bar charts show that the months with the most test per day are August and April. April is a surprise because there are no major college sports in April, and students are busy studying for finals and finishing semester projects. Well, at Iowa State, there was a historical weeklong festival known as VEISHEA held in April every year. It was cancelled in 2014 due to the many drinking-related arrests, violence, and vandalism that occurred yearly. Looking at the VEISHEA weeks and subsequent non-VEISHEA weeks, can we see the effect of the cancellation in the breathalyzer data?
# In 2013, VEISHEA was held from April 15-21. In 2014, it was held from April 7-13.
v13 <- interval(make_date(year = 2013, month = 4, day = 15) , make_date(year = 2013, month = 4, day = 21), tzone = "America/Chicago")
v14 <- interval(make_date(year = 2014, month = 4, day = 7) , make_date(year = 2014, month = 4, day = 13), tzone = "America/Chicago")
# Other comparable VEISHEA weeks in 2015-2017
v15 <- interval(make_date(2015, 4, 13) , make_date(2015, 4, 19), tzone = "America/Chicago")
v16 <- interval(make_date(2016, 4, 11) , make_date(2016, 4, 17), tzone = "America/Chicago")
v17 <- interval(make_date(2017, 4, 10) , make_date(2017, 4, 16), tzone = "America/Chicago")
# filter ba_dates for only the 5 veishea intervals
veishea <- ba_dates %>% filter(date %within% v13 | date %within% v14 | date %within% v15 | date %within% v16 | date %within% v17)
# count up years
veishea %>% count(date)
8. Looking at BAC
Finally, let’s look at the actual results of the breathalyzer tests. Based on our knowledge from Section 2, we suspect that the highest BAC results occur late and night and in the early morning, since those times are most common for tests on the weekends.
# take a mean of res1, res2
# .... YOUR CODE FOR TASK 8 ....
ba_dates <- ba_dates %>%
mutate(res = (Res1 + Res2)/2)
# library the ggridges package
# .... YOUR CODE FOR TASK 8 ....
library(ggridges)
package 㤼㸱ggridges㤼㸲 was built under R version 4.0.3
# make ridgeline plot
ggplot(data = ba_dates, aes(x = res, y = hr, group = hr)) +
# some style choices made already
geom_density_ridges(alpha = 0.7, fill = "steelblue", bandwidth = .01, rel_min_height = 0.0001) +
scale_y_continuous(breaks = 0:23)

9. A more honest plot
In the previous ridgeline plot, there are values below zero. This is impossible given the context: you cannot have negative alcohol concentration in your blood. We examine the zeroes below and make a more honest ridgeline plot.
# create a zero indicator variable
ba_dates <- ba_dates %>% mutate(zero = res == 0)
# tabulate the data by the zero column
# .... YOUR CODE FOR TASK 8 ....
count(ba_dates, zero)
# redo ridge with no 0s
ba_dates %>% filter(res > 0) %>%
ggplot(aes(x = res, y = hr, group = hr)) +
geom_density_ridges(alpha = 0.7, fill = "steelblue", bandwidth = .01, rel_min_height = 0.005) +
scale_y_continuous(breaks = 0:23)

10. The dangers of binge drinking
At a breath alcohol level of 0.16-0.30, a person will experience significant “speech, memory, coordination, attention, reaction time, [and] balance” impairment. Someone’s “driving-related skills” and “judgement and decision making” are dangerously impaired, and they may experience “blackouts, vomiting […] and loss of consciousness”. BAC of 0.31 or above is life-threatening with “significant risk of death” (source). We conclude by looking at the time of day during which the most dangerous levels of alcohol consumption appear in the Ames data. Do the dates, times, and days of week match what one would expect?
While this report has taken a fun and playful tone, it is important to be aware of the seriousness of this issue. According to research, nearly 2,000 college students die each year from alcohol-related injuries. If you or a loved one are struggling with alcohol abuse, please seek help.
# filter the ba_dates data to contain only those with the most dangerous result
danger <- ba_dates %>% filter(res > 0.31)
# print danger
print(danger)
LS0tDQp0aXRsZTogIkRydW5rZW4gRGF0ZXRpbWVzIGluIEFtZXMsIElvd2EiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyAxLiBKdXN0IGhvdyB0aGlyc3R5IGlzIFRodXJzZGF5Pw0KDQpXZSBoYXZlIHByZXZpb3VzbHkgZXhwbG9yZWQgc29tZSBicmVhdGhhbHl6ZXIgdGVzdCBkYXRhIGZyb20gQW1lcywgSW93YSwgVVNBLCBbaGVyZV0oaHR0cHM6Ly9ycHVicy5jb20vU2VyZ2lvX0dhcmNpYS93aG9pX2lzX2RydW5rX2FuZF93aGVuX2luX0FtZXNfSW93YSkuIE5vdywgd2UgZm9jdXMgb24gd29ya2luZyB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhLiBBcyBhIGNvbGxlZ2UgdG93biAoR28gW0N5Y2xvbmVzIV0oaHR0cDovL2ltYWdlLmNkbmxsbndubC54b3NuZXR3b3JrLmNvbS9waWNzLzQwMC9OTy9OT0VGWUlBR1FJUkFZTE4uMjAwOTAxMDIxODEyNTQuanBnKSksIEFtZXMgaGFzIGhhZCBpdHMgZmFpciBzaGFyZSBvZiBhbGNvaG9sLXJlbGF0ZWQgaW5jaWRlbnRzLiAoRm9yIGV4YW1wbGUsIEdvb2dsZSAiVkVJU0hFQSByaW90cyAyMDE0Ii4pIEluIHRoaXMgcHJvamVjdCwgd2UgZXhhbWluZSBicmVhdGggYWxjb2hvbCB0ZXN0IGRhdGEgaW4gQW1lcyBmcm9tIEphbnVhcnkgMjAxMyB0byBEZWNlbWJlciAyMDE3IHRoYXQgaXMgcHVibGlzaGVkIGJ5IHRoZSBTdGF0ZSBvZiBJb3dhLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gd2hlbiB0aGVzZSB0ZXN0cyBhcmUgYWRtaW5pc3RlcmVkLg0KDQpUaGUgZGF0YSBmaWxlICJicmVhdGhhbGNvaG9sZGF0ZXRpbWVzLmNzdiIgY29udGFpbnMgMSw1NTYgb2JzZXJ2YXRpb25zIGZyb20gYnJlYXRoIGFsY29ob2wgdGVzdHMgY29sbGVjdGVkIGJ5IHRoZSBBbWVzIGFuZCBJb3dhIFN0YXRlIFVuaXZlcnNpdHkgUG9saWNlIERlcGFydG1lbnRzLiBUaGUgY29sdW1ucyBpbiB0aGlzIGRhdGFzZXQgYXJlOg0KDQoxLiBEYXRlVGltZSAtIGRhdGUgJiB0aW1lIG9mIHRlc3QgKGRhdGV0aW1lLCAiQW1lcmljYS9DaGljYWdvIikNCjIuIExvY2F0aW9uIC0gd2hvIGFkbWluaXN0ZXJlZCB0aGUgdGVzdCwgQW1lcyBQRCBvciBJU1UgUEQ/IChjaGFyLikNCjMuIEdlbmRlciAtIGdlbmRlciAoTSxGKSBvZiBwZXJzb24gYmVpbmcgdGVzdGVkIChjaGFyLikNCjQuIFJlczEgLSBmaXJzdCBicmVhdGggYWxjb2hvbCByZWFkaW5nIChudW0uKQ0KNS4gUmVzMiAtIHNlY29uZCBicmVhdGggYWxjb2hvbCByZWFkaW5nIChudW0uKQ0KDQpGaXJzdCwgd2UgY3JlYXRlIGEgYmFyIGNoYXJ0IHNob3dpbmcgbnVtYmVyIG9mIHRlc3RzIGJ5IGRheSBvZiB0aGUgd2VlayB0byBzZWUgd2hlbiB0aGUgbW9zdCB0ZXN0cyB3ZXJlIGRvbmUuDQpgYGB7cn0NCiMgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMgDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDEgLi4uLg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCiMgcmVhZCBpbiB0aGUgZGF0YSBmcm9tIGJyZWF0aF9hbGNvaG9sX2RhdGV0aW1lcy5jc3YNCmJhX2RhdGVzIDwtIHJlYWRfY3N2KCJicmVhdGhfYWxjb2hvbF9kYXRldGltZXMuY3N2IikNCg0KIyBjaGFuZ2UgRGF0ZVRpbWUgY29sdW1uIHRvIEFtZXJpY2EvQ2hpY2FnbyB3aXRoIGZvcmNlX3R6DQpiYV9kYXRlcyA8LSBiYV9kYXRlcyAlPiUgbXV0YXRlKERhdGVUaW1lID0gZm9yY2VfdHooRGF0ZVRpbWUsIHR6ID0gIkFtZXJpY2EvQ2hpY2FnbyIpKQ0KDQojIGNyZWF0ZSBhIHdrZGF5IGNvbHVtbiBpbiB0aGUgYmFfZGF0ZXMgDQpiYV9kYXRlcyA8LSBiYV9kYXRlcyAlPiUgbXV0YXRlKHdrZGF5ID0gd2RheShEYXRlVGltZSwgbGFiZWwgPSBUUlVFKSkNCg0KIyBjcmVhdGUgYSBiYXIgY2hhcnQgb2YgIyB0ZXN0cyBieSBkYXkgb2Ygd2Vlaw0KZ2dwbG90KGRhdGEgPSBiYV9kYXRlcywgYWVzKHggPSB3a2RheSkpICsgDQogIGdlb21fYmFyKCkNCmBgYA0KIyAyLiBXaGF0IG1ha2VzIFN1bmRheSBzbyBmdW4tZGF5Pw0KDQpXZWxsLCB0aGF0IHdhc24ndCB0ZXJyaWJseSBzdXJwcmlzaW5nOiBGcmlkYXkgYW5kIFNhdHVyZGF5IGFyZSB0d28gb2YgdGhlIG1vc3QgY29tbW9uIGRheXMgb2YgdGhlIHdlZWsgZm9yIGJyZWF0aGFseXplciB0ZXN0cyBpbiBhIGNvbGxlZ2UgdG93bi4gQnV0IHdoYXQgbWlnaHQgYmUgc29tZXdoYXQgc3VycHJpc2luZyBpcyB0aGF0IG1vcmUgdGVzdHMgb2NjdXIgb24gU3VuZGF5IHRoYW4gb24gRnJpZGF5LiBCdXQgd2hlbiBvbiBTdW5kYXkgYXJlIHRoZXNlIHRlc3RzIGJlaW5nIGFkbWluaXN0ZXJlZD8gVG8gaW52ZXN0aWdhdGUsIHdlIGxvb2sgYXQgdGhlIGhvdXIgb2YgdGhlIHRlc3QgYW5kIGNvbXBhcmUgdGhpcyBkYXRhIGZvciBGcmlkYXksIFNhdHVyZGF5LCBhbmQgU3VuZGF5Lg0KYGBge3J9DQojIGNyZWF0ZSBob3VyIHZhcmlhYmxlDQpiYV9kYXRlcyA8LSBiYV9kYXRlcyAlPiUgDQogICAgbXV0YXRlKGhyID0gaG91cihEYXRlVGltZSkpDQoNCiMgY3JlYXRlIHdlZWtlbmQgZGF0YQ0Kd2Vla2VuZCA8LSBiYV9kYXRlcyAlPiUgZmlsdGVyKHdrZGF5ICVpbiUgYygiU3VuIiwgIlNhdCIsICJGcmkiKSkNCg0KIyBwbG90IHNpZGUtYnkgc2lkZSBiYXIgY2hhcnRzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgaG91ciBvZiB0aGUgZGF5IG9mIHRlc3RzIGluIGVhY2ggd2Vla2VuZCBkYXkuIA0KZ2dwbG90KGRhdGEgPSB3ZWVrZW5kICkgKyANCiAgICBnZW9tX2JhcihhZXMoeCA9IGhyKSkgKw0KICAgIGZhY2V0X2dyaWQoLn53a2RheSkgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMioyLTEpDQpgYGANCiMgMy4gVHJlbmRzIGluIHRlc3Rpbmcgb3ZlciB0aW1lDQoNCldlIGxlYXJuZWQgdGhhdCBtb3N0IG9mIHRoZSB0ZXN0cyBhZG1pbmlzdGVyZWQgb24gU3VuZGF5cyBhcmUgZHVyaW5nIGVhcmx5IG1vcm5pbmcsIGZyb20gbWlkbmlnaHQgdG8gNWFtLiBTdHJhbmdlbHksIHRoZSBzYW1lIHBhdHRlcm4gYWxzbyBleGlzdHMgb24gRnJpZGF5IG1vcm5pbmdzLiAoVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSBUaHVyc2RheXMgYXJlICJNdWcgTmlnaHRzIiBpbiBBbWVzLCB3aGVyZSB5b3UgY2FuIGdldCBkaXNjb3VudGVkIGRyaW5rcyBpZiB5b3UgYnJpbmcgaW4gdGhlIGRlc2lnbmF0ZWQgcmV1c2FibGUgbXVnLikgUmV0dXJuaW5nIHRvIHRoZSBmdWxsIGRhdGFzZXQsIHdlIG5vdyBleHBsb3JlIHRoZSBwYXR0ZXJuIG9mIGFsY29ob2wgdGVzdHMgb3ZlciB0aGUgeWVhcnMuIFRvIGxvb2sgYXQgdGhlICJiaWdnZXIgcGljdHVyZSwiIGxldCdzIGNvdW50IHVwIHRoZSBudW1iZXIgb2YgdGVzdHMgcGVyIGRheSwgYW5kIHZpc3VhbGl6ZSB0aGUgcmVzdWx0aW5nIHRpbWUgc2VyaWVzIHVzaW5nIGEgbGluZSBwbG90Lg0KYGBge3J9DQojIGNyZWF0ZSBhIGRhdGUgY29sdW1uIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZGF5LiBhcy5EYXRlKCkgaXMgZm9yIHRoZSBwbG90IGxhdGVyDQpiYV9kYXRlcyA8LSBiYV9kYXRlcyAlPiUgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKHJvdW5kX2RhdGUoRGF0ZVRpbWUsIHVuaXQgPSAiZGF5IikpKSANCg0KIyBjb3VudCBudW1iZXIgb2YgdGVzdHMgcGVyIGRhdGUgDQpiYV9zdW1tYXJ5IDwtIGJhX2RhdGVzICU+JSBjb3VudChkYXRlKQ0KDQojIHBpcGUgdGhlIHJlc3VsdCBmcm9tIGFib3ZlIGludG8gZ2dwbG90KCkgdXNpbmcgZ2VvbV9saW5lIHRvIGNyZWF0ZSBhIHRpbWUgc2VyaWVzIHBsb3QuDQpiYV9zdW1tYXJ5ICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9saW5lKGFlcyh4ID0gZGF0ZSwgeSA9IG4pLCBhbHBoYSA9IC43KSArICMgY2hhbmdlIGFscGhhIGZvciByZWFkYWJpbGl0eSANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjYgbW9udGhzIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCkpICMgbWFrZSB4LWF4aXMgbW9yZSByZWFkYWJsZSANCmBgYA0KIyA0LiBDb2xsZWdlIGZvb3RiYWxsDQoNCkluIHRoZSB0aW1lIHNlcmllcywgd2Ugc2VlIG1hbnkgZGF5cyB0aGF0IGhhdmUgemVybyBicmVhdGhhbHl6ZXIgdGVzdHMgYWRtaW5pc3RlcmVkLiBJbiB0aGUgZW50aXJlIGZpdmUgeWVhciBwZXJpb2QsIHRoZXJlIHdlcmUgYXQgbW9zdCBlaWdodCB0ZXN0cyBpbiBhIGRheS4gVGhlcmUgYXJlIG1hbnkgZGF5cyB3aXRoIHRocmVlIG9yIG1vcmUgdGVzdHMgaW4gYSBkYXksIGFuZCB3ZSB3b25kZXIgaWYgdGhlIElvd2EgU3RhdGUgZm9vdGJhbGwgc2NoZWR1bGUgbWF5IG1hdGNoIHVwIHdpdGggc29tZSBvZiB0aG9zZSBoaWdoIHRlc3QgZGF5cy4gV2UgbmV4dCBleHBsb3JlIHRoZSBJb3dhIFN0YXRlIGZvb3RiYWxsIHNjaGVkdWxlIGZvciAyMDEzLTIwMTcuIERhdGEgd2VyZSBkb3dubG9hZGVkIGZyb20gW3Nwb3J0cy1yZWZlcmVuY2UuY29tXShodHRwczovL3d3dy5zcG9ydHMtcmVmZXJlbmNlLmNvbS9jZmIvKS4NCmBgYHtyfQ0KIyByZWFkIGluIHRoZSBmb290YmFsbCBkYXRhIA0KaXN1X2ZiIDwtIHJlYWRfY3N2KCJpc3VfZm9vdGJhbGwuY3N2IikNCg0KIyBtYWtlIERhdGUgYSBkYXRlIHZhcmlhYmxlIA0KaXN1X2ZiIDwtIGlzdV9mYiAlPiUgbXV0YXRlKERhdGUgPSBwYXJzZV9kYXRlKERhdGUsIGZvcm1hdCA9ICIlYiAlZCwgJVkiKSkNCg0KIyBmaWx0ZXIgYmFfc3VtbWFyeQ0KIyAuLi4uIFlPVVIgQ09ERSBGT1IgVEFTSyA0IC4uLi4NCmJhX2ZiIDwtIGJhX3N1bW1hcnkgJT4lDQogICAgZmlsdGVyKGRhdGUgJWluJSBpc3VfZmIkRGF0ZSkNCiMgYXJyYW5nZSBiYV9mYiBieSBudW1iZXIgb2YgdGVzdHMgZnJvbSBoaWdoIHRvIGxvdyBhbmQgcHJpbnQgZmlyc3Qgc2l4IHJvd3MgDQpiYV9mYiAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCgpDQpgYGANCiMgNS4gSG9tZSB2cy4gYXdheT8gV2luIHZzLiBsb3NlPw0KDQpUaGUgbW9zdCBicmVhdGhhbHl6ZXIgdGVzdHMgZ2l2ZW4gb24gYSBmb290YmFsbCBnYW1lIGRheSB3YXMgb24gU2VwdC4gMjQsIDIwMTYuIFRoaXMgd2FzIGEgaG9tZSBnYW1lIGFnYWluc3QgU2FuIEpvc2UgU3RhdGUgdGhhdCBJb3dhIFN0YXRlIHdvbiA0NC0xMC4gVGhlIHdpbi9sb3NzIGluZm9ybWF0aW9uIGlzIGluIHRoZSBSZXMgY29sdW1uIGluIGlzdV9mYi4gQ291bGQgdGhlIGhvbWUgZ2FtZSB3aW4gaGF2ZSBsZWQgdG8gc29tZSBleGNlc3NpdmUgY2VsZWJyYXRpb25zIHRoYXQgcmVzdWx0ZWQgaW4gbW9yZSBicmVhdGhhbHl6ZXIgdGVzdHMgdGhhbiBhbiBhd2F5IHdpbiBvciBhIGhvbWUgbG9zcz8NCmBgYHtyfQ0KIyBqb2luIGJhX3N1bW1hcnkgdG8gaXN1X2ZiIA0KaXN1X2ZiMiA8LSBpc3VfZmIgJT4lIGxlZnRfam9pbihiYV9zdW1tYXJ5LCBieSA9IGMoIkRhdGUiPSJkYXRlIikpDQoNCiMgY2hhbmdlIG5hcyB0byAwcyANCmlzdV9mYjIgPC0gaXN1X2ZiMiAlPiUgbXV0YXRlKG4gPSBpZmVsc2UoaXMubmEobiksIDAsIG4pKQ0KDQojIHBsb3QgDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDUgLi4uLg0KZ2dwbG90KGlzdV9mYjIpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBuLCBmaWxsID0gSG9tZSkpICsNCiAgZmFjZXRfZ3JpZCguflJlcykNCmBgYA0KIyA2LiBNb250aGx5IGNvdW50cw0KDQpUaGUgZm9vdGJhbGwgc2Vhc29uIHR5cGljYWxseSBsYXN0cyBmcm9tIFNlcHRlbWJlciB0aHJvdWdoIE5vdmVtYmVyLiBBcyB3ZSBqdXN0IHNhdywgSW93YSBTdGF0ZSBmb290YmFsbCBoYXMgbW9yZSBsb3NzZXMgdGhhbiB3aW5zIGluIHRoZSBsYXN0IGZldyB5ZWFycy4gVGhlIG1lbidzIGJhc2tldGJhbGwgdGVhbSwgaG93ZXZlciwgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiB2ZXJ5IHN1Y2Nlc3NmdWwuIFRoZSBiYXNrZXRiYWxsIHNlYXNvbiB1c3VhbGx5IGxhc3RzIGZyb20gTm92ZW1iZXIgdGhyb3VnaCBNYXJjaC4gV2Ugbm93IGludmVzdGlnYXRlIHRoZSBudW1iZXIgb2YgYnJlYXRoYWx5emVyIHRlc3RzIGJ5IG1vbnRoIHRvIHNlZSBpZiB0aGUgYmFza2V0YmFsbCBtb250aHMgaGF2ZSBtb3JlIHRlc3RzIHRoYW4gdGhlIGZvb3RiYWxsIG1vbnRocy4NCg0KYGBge3J9DQojIGNyZWF0ZSBhIG1vIGFuZCBhIHlyIGNvbHVtbiBpbiBiYV9kYXRlcw0KYmFfZGF0ZXMgPC0gYmFfZGF0ZXMgJT4lIG11dGF0ZShtbyA9IG1vbnRoKGRhdGUsIGxhYmVsID0gVFJVRSksIHlyID0geWVhcihkYXRlKSkNCg0KIyBtYWtlIGJhciBjaGFydCBieSBtby4NCiMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgNiAuLi4uDQpnZ3Bsb3QoYmFfZGF0ZXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBtbykpDQojIGNvbG9yIGJ5IHllYXIgDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDYgLi4uDQpnZ3Bsb3QoYmFfZGF0ZXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBtbywgZmlsbCA9IGFzLmZhY3Rvcih5cikpKQ0KYGBgDQojIDcuIFZFSVNIRUE6IGFuIG9sZCB0cmFkaXRpb24NCg0KVGhlIG1vbnRobHkgYmFyIGNoYXJ0cyBzaG93IHRoYXQgdGhlIG1vbnRocyB3aXRoIHRoZSBtb3N0IHRlc3QgcGVyIGRheSBhcmUgQXVndXN0IGFuZCBBcHJpbC4gQXByaWwgaXMgYSBzdXJwcmlzZSBiZWNhdXNlIHRoZXJlIGFyZSBubyBtYWpvciBjb2xsZWdlIHNwb3J0cyBpbiBBcHJpbCwgYW5kIHN0dWRlbnRzIGFyZSBidXN5IHN0dWR5aW5nIGZvciBmaW5hbHMgYW5kIGZpbmlzaGluZyBzZW1lc3RlciBwcm9qZWN0cy4gV2VsbCwgYXQgSW93YSBTdGF0ZSwgdGhlcmUgd2FzIGEgaGlzdG9yaWNhbCB3ZWVrbG9uZyBmZXN0aXZhbCBrbm93biBhcyBWRUlTSEVBIGhlbGQgaW4gQXByaWwgZXZlcnkgeWVhci4gSXQgd2FzIGNhbmNlbGxlZCBpbiAyMDE0IGR1ZSB0byB0aGUgbWFueSBkcmlua2luZy1yZWxhdGVkIGFycmVzdHMsIHZpb2xlbmNlLCBhbmQgdmFuZGFsaXNtIHRoYXQgb2NjdXJyZWQgeWVhcmx5LiBMb29raW5nIGF0IHRoZSBWRUlTSEVBIHdlZWtzIGFuZCBzdWJzZXF1ZW50IG5vbi1WRUlTSEVBIHdlZWtzLCBjYW4gd2Ugc2VlIHRoZSBlZmZlY3Qgb2YgdGhlIGNhbmNlbGxhdGlvbiBpbiB0aGUgYnJlYXRoYWx5emVyIGRhdGE/DQpgYGB7cn0NCiMgSW4gMjAxMywgVkVJU0hFQSB3YXMgaGVsZCBmcm9tIEFwcmlsIDE1LTIxLiBJbiAyMDE0LCBpdCB3YXMgaGVsZCBmcm9tIEFwcmlsIDctMTMuIA0KdjEzIDwtIGludGVydmFsKG1ha2VfZGF0ZSh5ZWFyID0gMjAxMywgbW9udGggPSA0LCBkYXkgPSAxNSkgLCBtYWtlX2RhdGUoeWVhciA9IDIwMTMsIG1vbnRoID0gNCwgZGF5ID0gMjEpLCB0em9uZSA9ICJBbWVyaWNhL0NoaWNhZ28iKQ0KdjE0IDwtIGludGVydmFsKG1ha2VfZGF0ZSh5ZWFyID0gMjAxNCwgbW9udGggPSA0LCBkYXkgPSA3KSAsIG1ha2VfZGF0ZSh5ZWFyID0gMjAxNCwgbW9udGggPSA0LCBkYXkgPSAxMyksIHR6b25lID0gIkFtZXJpY2EvQ2hpY2FnbyIpDQojIE90aGVyIGNvbXBhcmFibGUgVkVJU0hFQSB3ZWVrcyBpbiAyMDE1LTIwMTcNCnYxNSA8LSBpbnRlcnZhbChtYWtlX2RhdGUoMjAxNSwgNCwgMTMpICwgbWFrZV9kYXRlKDIwMTUsIDQsIDE5KSwgdHpvbmUgPSAiQW1lcmljYS9DaGljYWdvIikNCnYxNiA8LSBpbnRlcnZhbChtYWtlX2RhdGUoMjAxNiwgNCwgMTEpICwgbWFrZV9kYXRlKDIwMTYsIDQsIDE3KSwgdHpvbmUgPSAiQW1lcmljYS9DaGljYWdvIikNCnYxNyA8LSBpbnRlcnZhbChtYWtlX2RhdGUoMjAxNywgNCwgMTApICwgbWFrZV9kYXRlKDIwMTcsIDQsIDE2KSwgdHpvbmUgPSAiQW1lcmljYS9DaGljYWdvIikNCg0KIyBmaWx0ZXIgYmFfZGF0ZXMgZm9yIG9ubHkgdGhlIDUgdmVpc2hlYSBpbnRlcnZhbHMNCnZlaXNoZWEgPC0gYmFfZGF0ZXMgJT4lIGZpbHRlcihkYXRlICV3aXRoaW4lIHYxMyB8IGRhdGUgJXdpdGhpbiUgdjE0IHwgZGF0ZSAld2l0aGluJSB2MTUgfCBkYXRlICV3aXRoaW4lIHYxNiB8IGRhdGUgJXdpdGhpbiUgdjE3KQ0KDQojIGNvdW50IHVwIHllYXJzIA0KdmVpc2hlYSAlPiUgY291bnQoZGF0ZSkNCmBgYA0KIyA4LiBMb29raW5nIGF0IEJBQw0KDQpGaW5hbGx5LCBsZXQncyBsb29rIGF0IHRoZSBhY3R1YWwgcmVzdWx0cyBvZiB0aGUgYnJlYXRoYWx5emVyIHRlc3RzLiBCYXNlZCBvbiBvdXIga25vd2xlZGdlIGZyb20gU2VjdGlvbiAyLCB3ZSBzdXNwZWN0IHRoYXQgdGhlIGhpZ2hlc3QgQkFDIHJlc3VsdHMgb2NjdXIgbGF0ZSBhbmQgbmlnaHQgYW5kIGluIHRoZSBlYXJseSBtb3JuaW5nLCBzaW5jZSB0aG9zZSB0aW1lcyBhcmUgbW9zdCBjb21tb24gZm9yIHRlc3RzIG9uIHRoZSB3ZWVrZW5kcy4NCmBgYHtyfQ0KIyB0YWtlIGEgbWVhbiBvZiByZXMxLCByZXMyDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDggLi4uLg0KYmFfZGF0ZXMgPC0gYmFfZGF0ZXMgJT4lIA0KICBtdXRhdGUocmVzID0gKFJlczEgKyBSZXMyKS8yKQ0KIyBsaWJyYXJ5IHRoZSBnZ3JpZGdlcyBwYWNrYWdlDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDggLi4uLg0KbGlicmFyeShnZ3JpZGdlcykNCiMgbWFrZSByaWRnZWxpbmUgcGxvdCANCmdncGxvdChkYXRhID0gYmFfZGF0ZXMsIGFlcyh4ID0gcmVzLCB5ID0gaHIsIGdyb3VwID0gaHIpKSArDQogICMgc29tZSBzdHlsZSBjaG9pY2VzIG1hZGUgYWxyZWFkeQ0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC43LCBmaWxsID0gInN0ZWVsYmx1ZSIsIGJhbmR3aWR0aCA9IC4wMSwgcmVsX21pbl9oZWlnaHQgPSAwLjAwMDEpICsgDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSAwOjIzKQ0KYGBgDQojIDkuIEEgbW9yZSBob25lc3QgcGxvdA0KDQpJbiB0aGUgcHJldmlvdXMgcmlkZ2VsaW5lIHBsb3QsIHRoZXJlIGFyZSB2YWx1ZXMgYmVsb3cgemVyby4gVGhpcyBpcyBpbXBvc3NpYmxlIGdpdmVuIHRoZSBjb250ZXh0OiB5b3UgY2Fubm90IGhhdmUgbmVnYXRpdmUgYWxjb2hvbCBjb25jZW50cmF0aW9uIGluIHlvdXIgYmxvb2QuIFdlIGV4YW1pbmUgdGhlIHplcm9lcyBiZWxvdyBhbmQgbWFrZSBhIG1vcmUgaG9uZXN0IHJpZGdlbGluZSBwbG90Lg0KYGBge3J9DQojIGNyZWF0ZSBhIHplcm8gaW5kaWNhdG9yIHZhcmlhYmxlIA0KYmFfZGF0ZXMgPC0gYmFfZGF0ZXMgJT4lIG11dGF0ZSh6ZXJvID0gcmVzID09IDApDQoNCiMgdGFidWxhdGUgdGhlIGRhdGEgYnkgdGhlIHplcm8gY29sdW1uDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDggLi4uLg0KY291bnQoYmFfZGF0ZXMsIHplcm8pDQoNCiMgcmVkbyByaWRnZSB3aXRoIG5vIDBzDQpiYV9kYXRlcyAlPiUgZmlsdGVyKHJlcyA+IDApICU+JSANCmdncGxvdChhZXMoeCA9IHJlcywgeSA9IGhyLCBncm91cCA9IGhyKSkgKw0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC43LCBmaWxsID0gInN0ZWVsYmx1ZSIsIGJhbmR3aWR0aCA9IC4wMSwgcmVsX21pbl9oZWlnaHQgPSAwLjAwNSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IDA6MjMpDQpgYGANCiMgMTAuIFRoZSBkYW5nZXJzIG9mIGJpbmdlIGRyaW5raW5nDQoNCkF0IGEgYnJlYXRoIGFsY29ob2wgbGV2ZWwgb2YgMC4xNi0wLjMwLCBhIHBlcnNvbiB3aWxsIGV4cGVyaWVuY2Ugc2lnbmlmaWNhbnQgInNwZWVjaCwgbWVtb3J5LCBjb29yZGluYXRpb24sIGF0dGVudGlvbiwgcmVhY3Rpb24gdGltZSwgW2FuZF0gYmFsYW5jZSIgaW1wYWlybWVudC4gU29tZW9uZSdzICJkcml2aW5nLXJlbGF0ZWQgc2tpbGxzIiBhbmQgImp1ZGdlbWVudCBhbmQgZGVjaXNpb24gbWFraW5nIiBhcmUgZGFuZ2Vyb3VzbHkgaW1wYWlyZWQsIGFuZCB0aGV5IG1heSBleHBlcmllbmNlICJibGFja291dHMsIHZvbWl0aW5nIFvigKZdIGFuZCBsb3NzIG9mIGNvbnNjaW91c25lc3MiLiBCQUMgb2YgMC4zMSBvciBhYm92ZSBpcyBsaWZlLXRocmVhdGVuaW5nIHdpdGggInNpZ25pZmljYW50IHJpc2sgb2YgZGVhdGgiIChbc291cmNlXShodHRwczovL21lZGxpbmVwbHVzLmdvdi9tYWdhemluZS9pc3N1ZXMvc3ByaW5nMTQvYXJ0aWNsZXMvc3ByaW5nMTRwZzIzLmh0bWwpKS4gV2UgY29uY2x1ZGUgYnkgbG9va2luZyBhdCB0aGUgdGltZSBvZiBkYXkgZHVyaW5nIHdoaWNoIHRoZSBtb3N0IGRhbmdlcm91cyBsZXZlbHMgb2YgYWxjb2hvbCBjb25zdW1wdGlvbiBhcHBlYXIgaW4gdGhlIEFtZXMgZGF0YS4gRG8gdGhlIGRhdGVzLCB0aW1lcywgYW5kIGRheXMgb2Ygd2VlayBtYXRjaCB3aGF0IG9uZSB3b3VsZCBleHBlY3Q/DQoNCldoaWxlIHRoaXMgcmVwb3J0IGhhcyB0YWtlbiBhIGZ1biBhbmQgcGxheWZ1bCB0b25lLCBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYXdhcmUgb2YgdGhlIHNlcmlvdXNuZXNzIG9mIHRoaXMgaXNzdWUuIEFjY29yZGluZyB0byBbcmVzZWFyY2hdKGh0dHBzOi8vd3d3Lm5pYWFhLm5paC5nb3YvcHVibGljYXRpb25zL2Jyb2NodXJlcy1hbmQtZmFjdC1zaGVldHMvYWxjb2hvbC1mYWN0cy1hbmQtc3RhdGlzdGljcyksIG5lYXJseSAyLDAwMCBjb2xsZWdlIHN0dWRlbnRzIGRpZSBlYWNoIHllYXIgZnJvbSBhbGNvaG9sLXJlbGF0ZWQgaW5qdXJpZXMuIElmIHlvdSBvciBhIGxvdmVkIG9uZSBhcmUgc3RydWdnbGluZyB3aXRoIGFsY29ob2wgYWJ1c2UsIHBsZWFzZSBzZWVrIFtoZWxwXShodHRwczovL3d3dy5uaWFhYS5uaWguZ292L3B1YmxpY2F0aW9ucy9icm9jaHVyZXMtYW5kLWZhY3Qtc2hlZXRzL3RyZWF0bWVudC1hbGNvaG9sLXByb2JsZW1zLWZpbmRpbmctYW5kLWdldHRpbmctaGVscCkuDQpgYGB7cn0NCiMgZmlsdGVyIHRoZSBiYV9kYXRlcyBkYXRhIHRvIGNvbnRhaW4gb25seSB0aG9zZSB3aXRoIHRoZSBtb3N0IGRhbmdlcm91cyByZXN1bHQNCmRhbmdlciA8LSBiYV9kYXRlcyAlPiUgZmlsdGVyKHJlcyA+IDAuMzEpDQoNCiMgcHJpbnQgZGFuZ2VyDQpwcmludChkYW5nZXIpDQpgYGANCg==