rm(list=ls())
library(dplyr)
library(ggplot2)
library(corrplot)
library(cowplot)
data <- read.csv("Final_Project.csv")
View(data)
numdata <- select_if(data, is.numeric)
cordata <- cor(numdata)
corrplot(cordata, method = "number", bg = "brown")

I am making a corrplot to check the correlation of some of my
data.
#Making a simplified corrplot with only the variables that were able to be plotted:
simpledata <- numdata %>% select(-c(caffeine_amount, adderall_dosage, study_hrs_exam, study_hrs_no_exam, job_hrs))
simplecordata <- cor(simpledata)
corrplot(simplecordata, method = "number", bg = "brown")

ai_over_50 <- data %>% filter(ai_use > 50)
ai_under_50 <- data %>% filter(ai_use <= 50)
I want to separate the values for AI use over and under 50% just to
see the disparity between the 2 groups.
ggplot()+
geom_point(data = ai_over_50, aes(y = ai_use, x = gpa), color = "red") +
geom_point(data = ai_under_50, aes(y = ai_use, x = gpa), color = "blue") +
labs(x = "GPA", y = "AI Use (%)", title = "AI Use vs. GPA")

Here we can see that there is no real stark difference between the
GPAs of students who use AI more than 50% of the time and students use
use it less than 50% of the time. This is also reflected in our corrplot
since it said that there is practically 0 correlation between the 2.
What this probably means is that students who use AI in their studying
(remember, this variable has nothing to do with use on an exam or the
like, but rather as a primary source of information when studying),
don’t seem to be hindered by its use. This can mean that when used
properly, AI can be a helpful study tool.
a <- ggplot(data)+
geom_bar(aes(x=study_group_size), fill = "blue")
b <- ggplot(data)+
geom_bar(aes(x=gpa), fill = "blue") +
scale_x_continuous(breaks = seq(0, 4, by = 0.5))
c <- ggplot(data)+
geom_point(aes(x = study_group_size, y = gpa), color = "blue") +
labs(x = "Study Group Size", y = "GPA", title = "Study Group Size vs. GPA")
#plot_grid(a, b, c, nrow = 1)
These 2 graphs go hand in hand, since the point graph doesn’t give us
a good representation of the actual number of people who gave an answer,
the barplots do that for us. Looking at all 3 together tell us that most
people study on their own and the majority of people have a GPA of
between about 3.3 and 3.7 (between B+ and A-). If you look at our
corrplot, while they arent super highly correlated, they have a
correlation of -0.23, meaning when study group size goes dow, GPA
slightly goes up. This helps to prove our hypothesis since we predicted
that less people studying together would lead to better grades.
"study hours, gpa, study location"
[1] "study hours, gpa, study location"
"avggpa plot against study_location"
[1] "avggpa plot against study_location"
"study_location plot agasint study_hrs_exam"
[1] "study_location plot agasint study_hrs_exam"
"I am going to make a frequency table that tells me how many times each study location showed up, the create a new data set using those values. I will be creating three different data frames so as to not reuse a dataset that will not work. I aim to plot the frequency of people studying in each location against their gpa's, and additionally I would like to plot how long on average people are studying for."
[1] "I am going to make a frequency table that tells me how many times each study location showed up, the create a new data set using those values. I will be creating three different data frames so as to not reuse a dataset that will not work. I aim to plot the frequency of people studying in each location against their gpa's, and additionally I would like to plot how long on average people are studying for."
table(data$study_location)
Dorm Room/Bedroom Library Living Room/Common Room Other Establishment (Starbucks, cafe, etc)
26 16 7 6
Outside
1
table <- table(data$study_location)
table <- as.data.frame(table)
table_gpa <- table
table_exam <- table
ggplot(table_gpa, aes(x = Var1, y = Freq)) +
geom_bar(stat = "identity", fill = "skyblue") +
xlab("Category") +
ylab("Value") +
ggtitle("Bar Plot Example")

#This bar plot shows the frequency of people who study at a certain location
dorm1 <- data %>% filter(study_location == "Dorm Room/Bedroom")
dorm2 <- dorm1 %>% select( study_location, gpa)
avg_gpa_dorm <- mean(dorm2$gpa, na.rm = TRUE)
Warning: argument is not numeric or logical: returning NA
lib1 <- data %>% filter(study_location == "Library")
lib2 <- lib1 %>% select( study_location, gpa)
avg_gpa_lib <- mean(lib2$gpa, na.rm = TRUE)
Warning: argument is not numeric or logical: returning NA
cr1 <- data %>% filter(study_location == "Living Room/Common Room")
cr2 <- cr1 %>% select( study_location, gpa)
avg_gpa_cr <- mean(cr2$gpa, na.rm = TRUE)
Warning: argument is not numeric or logical: returning NA
cafe1 <- data %>% filter(study_location == "Other Establishment (Starbucks, cafe, etc)")
cafe2 <- cafe1 %>% select( study_location, gpa)
avg_gpa_cafe <- mean(cafe2$gpa, na.rm = TRUE)
Warning: argument is not numeric or logical: returning NA
out1 <- data %>% filter(study_location == "Outside")
out2 <- cafe1 %>% select( study_location, gpa)
avg_gpa_out <- mean(out2$gpa, na.rm = TRUE)
Warning: argument is not numeric or logical: returning NA
table_gpa$avg_gpa <- c(avg_gpa_dorm, avg_gpa_lib, avg_gpa_cr, avg_gpa_cafe, avg_gpa_out)
#In the code above, I used the filter function to filter out each option of study location from the main data set titled data, and then selected the gpa column so as to make it into a new dataframe. I then used the gpas of each study location to find the average using the frequency of the study location. Formula being = (sum of gpa's/frequency of study location). I then added a new column into the table_gpa data frame so I can plot everything onto one graph.
ggplot(table_gpa, aes(x = Var1)) +
geom_point(aes(y = avg_gpa), color = "red", size = 3) +
geom_bar(aes(y = Freq), stat = "identity", fill = "skyblue", alpha = 0.5) +
labs(title = "Scatter Plot and Bar Graph",
x = "Category",
y = "Value") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#This is the graph that combines frequency of study location with average gpa
https://www.dataquest.io/blog/add-column-to-dataframe-in-r/
dorm_test1 <- data %>% filter(study_location == "Dorm Room/Bedroom")
dorm_test2 <- dorm_test1 %>% select( study_hrs_exam, gpa)
study_test_dorm <- mean(dorm_test2$study_hrs_exam, na.rm = TRUE)
lib_test1 <- data %>% filter(study_location == "Library")
lib_test2 <- lib_test1 %>% select( study_hrs_exam, gpa)
study_test_lib <- mean(lib_test2$study_hrs_exam, na.rm = TRUE)
cr_test1 <- data %>% filter(study_location == "Living Room/Common Room")
cr_test2 <- cr_test1 %>% select( study_hrs_exam, gpa)
study_test_cr <- mean(cr_test2$study_hrs_exam, na.rm = TRUE)
cafe_test1 <- data %>% filter(study_location == "Other Establishment (Starbucks, cafe, etc)")
cafe_test2 <- cafe_test1 %>% select( study_hrs_exam, gpa)
study_test_cafe <- mean(cafe_test2$study_hrs_exam, na.rm = TRUE)
out_test1 <- data %>% filter(study_location == "Outside")
out_test2 <- cafe_test1 %>% select( study_hrs_exam, gpa)
study_test_out <- mean(out_test2$study_hrs_exam, na.rm = TRUE)
table
table_exam$avg_time_study <- c(study_test_dorm, study_test_lib, study_test_cr, study_test_cafe, study_test_out)
#In the code above, I did the same thing as I did with study location and G\gpa except with hours studied at each location.
ggplot(table_exam, aes(x = Var1)) +
geom_point(aes(y = avg_time_study), color = "red", size = 3) +
geom_bar(aes(y = Freq), stat = "identity", fill = "skyblue", alpha = 0.5) +
labs(title = "Scatter Plot and Bar Graph",
x = "Category",
y = "Value") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#This is the graph that combines frequency of study location with average hours studied with an exam
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpybShsaXN0PWxzKCkpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShjb3dwbG90KQpgYGAKCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCJGaW5hbF9Qcm9qZWN0LmNzdiIpClZpZXcoZGF0YSkKYGBgCgpgYGB7cn0KbnVtZGF0YSA8LSBzZWxlY3RfaWYoZGF0YSwgaXMubnVtZXJpYykKY29yZGF0YSA8LSBjb3IobnVtZGF0YSkKY29ycnBsb3QoY29yZGF0YSwgbWV0aG9kID0gIm51bWJlciIsIGJnID0gImJyb3duIikKYGBgCkkgYW0gbWFraW5nIGEgY29ycnBsb3QgdG8gY2hlY2sgdGhlIGNvcnJlbGF0aW9uIG9mIHNvbWUgb2YgbXkgZGF0YS4KCmBgYHtyfQojTWFraW5nIGEgc2ltcGxpZmllZCBjb3JycGxvdCB3aXRoIG9ubHkgdGhlIHZhcmlhYmxlcyB0aGF0IHdlcmUgYWJsZSB0byBiZSBwbG90dGVkOgpzaW1wbGVkYXRhIDwtIG51bWRhdGEgJT4lIHNlbGVjdCgtYyhjYWZmZWluZV9hbW91bnQsIGFkZGVyYWxsX2Rvc2FnZSwgc3R1ZHlfaHJzX2V4YW0sIHN0dWR5X2hyc19ub19leGFtLCBqb2JfaHJzKSkKc2ltcGxlY29yZGF0YSA8LSBjb3Ioc2ltcGxlZGF0YSkKY29ycnBsb3Qoc2ltcGxlY29yZGF0YSwgbWV0aG9kID0gIm51bWJlciIsIGJnID0gImJyb3duIikKCmBgYAoKYGBge3J9CmFpX292ZXJfNTAgPC0gZGF0YSAlPiUgZmlsdGVyKGFpX3VzZSA+IDUwKQphaV91bmRlcl81MCA8LSBkYXRhICU+JSBmaWx0ZXIoYWlfdXNlIDw9IDUwKQpgYGAKSSB3YW50IHRvIHNlcGFyYXRlIHRoZSB2YWx1ZXMgZm9yIEFJIHVzZSBvdmVyIGFuZCB1bmRlciA1MCUganVzdCB0byBzZWUgdGhlIGRpc3Bhcml0eSBiZXR3ZWVuIHRoZSAyIGdyb3Vwcy4KCgpgYGB7cn0KZ2dwbG90KCkrCiAgZ2VvbV9wb2ludChkYXRhID0gYWlfb3Zlcl81MCwgYWVzKHkgPSBhaV91c2UsIHggPSBncGEpLCBjb2xvciA9ICJyZWQiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gYWlfdW5kZXJfNTAsIGFlcyh5ID0gYWlfdXNlLCB4ID0gZ3BhKSwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKHggPSAiR1BBIiwgeSA9ICJBSSBVc2UgKCUpIiwgdGl0bGUgPSAiQUkgVXNlIHZzLiBHUEEiKQpgYGAKSGVyZSB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgaXMgbm8gcmVhbCBzdGFyayBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQQXMgb2Ygc3R1ZGVudHMgd2hvIHVzZSBBSSBtb3JlIHRoYW4gNTAlIG9mIHRoZSB0aW1lIGFuZCBzdHVkZW50cyB1c2UgdXNlIGl0IGxlc3MgdGhhbiA1MCUgb2YgdGhlIHRpbWUuIFRoaXMgaXMgYWxzbyByZWZsZWN0ZWQgaW4gb3VyIGNvcnJwbG90IHNpbmNlIGl0IHNhaWQgdGhhdCB0aGVyZSBpcyBwcmFjdGljYWxseSAwIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIDIuIFdoYXQgdGhpcyBwcm9iYWJseSBtZWFucyBpcyB0aGF0IHN0dWRlbnRzIHdobyB1c2UgQUkgaW4gdGhlaXIgc3R1ZHlpbmcgKHJlbWVtYmVyLCB0aGlzIHZhcmlhYmxlIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdXNlIG9uIGFuIGV4YW0gb3IgdGhlIGxpa2UsIGJ1dCByYXRoZXIgYXMgYSBwcmltYXJ5IHNvdXJjZSBvZiBpbmZvcm1hdGlvbiB3aGVuIHN0dWR5aW5nKSwgZG9uJ3Qgc2VlbSB0byBiZSBoaW5kZXJlZCBieSBpdHMgdXNlLiBUaGlzIGNhbiBtZWFuIHRoYXQgd2hlbiB1c2VkIHByb3Blcmx5LCBBSSBjYW4gYmUgYSBoZWxwZnVsIHN0dWR5IHRvb2wuCgpgYGB7cn0KYSA8LSBnZ3Bsb3QoZGF0YSkrCiAgZ2VvbV9iYXIoYWVzKHg9c3R1ZHlfZ3JvdXBfc2l6ZSksIGZpbGwgPSAiYmx1ZSIpCgpiIDwtIGdncGxvdChkYXRhKSsKICBnZW9tX2JhcihhZXMoeD1ncGEpLCBmaWxsID0gImJsdWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0LCBieSA9IDAuNSkpCgpjIDwtIGdncGxvdChkYXRhKSsKICBnZW9tX3BvaW50KGFlcyh4ID0gc3R1ZHlfZ3JvdXBfc2l6ZSwgeSA9IGdwYSksIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh4ID0gIlN0dWR5IEdyb3VwIFNpemUiLCB5ID0gIkdQQSIsIHRpdGxlID0gIlN0dWR5IEdyb3VwIFNpemUgdnMuIEdQQSIpCgojcGxvdF9ncmlkKGEsIGIsIGMsIG5yb3cgPSAxKQoKYGBgClRoZXNlIDIgZ3JhcGhzIGdvIGhhbmQgaW4gaGFuZCwgc2luY2UgdGhlIHBvaW50IGdyYXBoIGRvZXNuJ3QgZ2l2ZSB1cyBhIGdvb2QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGVvcGxlIHdobyBnYXZlIGFuIGFuc3dlciwgdGhlIGJhcnBsb3RzIGRvIHRoYXQgZm9yIHVzLiBMb29raW5nIGF0IGFsbCAzIHRvZ2V0aGVyIHRlbGwgdXMgdGhhdCBtb3N0IHBlb3BsZSBzdHVkeSBvbiB0aGVpciBvd24gYW5kIHRoZSBtYWpvcml0eSBvZiBwZW9wbGUgaGF2ZSBhIEdQQSBvZiBiZXR3ZWVuIGFib3V0IDMuMyBhbmQgMy43IChiZXR3ZWVuIEIrIGFuZCBBLSkuIElmIHlvdSBsb29rIGF0IG91ciBjb3JycGxvdCwgd2hpbGUgdGhleSBhcmVudCBzdXBlciBoaWdobHkgY29ycmVsYXRlZCwgdGhleSBoYXZlIGEgY29ycmVsYXRpb24gb2YgLTAuMjMsIG1lYW5pbmcgd2hlbiBzdHVkeSBncm91cCBzaXplIGdvZXMgZG93LCBHUEEgc2xpZ2h0bHkgZ29lcyB1cC4gVGhpcyBoZWxwcyB0byBwcm92ZSBvdXIgaHlwb3RoZXNpcyBzaW5jZSB3ZSBwcmVkaWN0ZWQgdGhhdCBsZXNzIHBlb3BsZSBzdHVkeWluZyB0b2dldGhlciB3b3VsZCBsZWFkIHRvIGJldHRlciBncmFkZXMuCgpgYGB7cn0KInN0dWR5IGhvdXJzLCBncGEsIHN0dWR5IGxvY2F0aW9uIgoKImF2Z2dwYSBwbG90IGFnYWluc3Qgc3R1ZHlfbG9jYXRpb24iCgoic3R1ZHlfbG9jYXRpb24gcGxvdCBhZ2FzaW50IHN0dWR5X2hyc19leGFtIgoKIkkgYW0gZ29pbmcgdG8gbWFrZSBhIGZyZXF1ZW5jeSB0YWJsZSB0aGF0IHRlbGxzIG1lIGhvdyBtYW55IHRpbWVzIGVhY2ggc3R1ZHkgbG9jYXRpb24gc2hvd2VkIHVwLCB0aGUgY3JlYXRlIGEgbmV3IGRhdGEgc2V0IHVzaW5nIHRob3NlIHZhbHVlcy4gSSB3aWxsIGJlIGNyZWF0aW5nIHRocmVlIGRpZmZlcmVudCBkYXRhIGZyYW1lcyBzbyBhcyB0byBub3QgcmV1c2UgYSBkYXRhc2V0IHRoYXQgd2lsbCBub3Qgd29yay4gSSBhaW0gdG8gcGxvdCB0aGUgZnJlcXVlbmN5IG9mIHBlb3BsZSBzdHVkeWluZyBpbiBlYWNoIGxvY2F0aW9uIGFnYWluc3QgdGhlaXIgZ3BhJ3MsIGFuZCBhZGRpdGlvbmFsbHkgSSB3b3VsZCBsaWtlIHRvIHBsb3QgaG93IGxvbmcgb24gYXZlcmFnZSBwZW9wbGUgYXJlIHN0dWR5aW5nIGZvci4iCgp0YWJsZShkYXRhJHN0dWR5X2xvY2F0aW9uKQoKdGFibGUgPC0gdGFibGUoZGF0YSRzdHVkeV9sb2NhdGlvbikKCnRhYmxlIDwtIGFzLmRhdGEuZnJhbWUodGFibGUpCnRhYmxlX2dwYSA8LSB0YWJsZQp0YWJsZV9leGFtIDwtIHRhYmxlCgpgYGAKCmBgYHtyfQpnZ3Bsb3QodGFibGVfZ3BhLCBhZXMoeCA9IFZhcjEsIHkgPSBGcmVxKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArCiAgeGxhYigiQ2F0ZWdvcnkiKSArCiAgeWxhYigiVmFsdWUiKSArCiAgZ2d0aXRsZSgiQmFyIFBsb3QgRXhhbXBsZSIpIAogIAojVGhpcyBiYXIgcGxvdCBzaG93cyB0aGUgZnJlcXVlbmN5IG9mIHBlb3BsZSB3aG8gc3R1ZHkgYXQgYSBjZXJ0YWluIGxvY2F0aW9uCmBgYAoKCgoKYGBge3J9CmRvcm0xIDwtIGRhdGEgJT4lIGZpbHRlcihzdHVkeV9sb2NhdGlvbiA9PSAiRG9ybSBSb29tL0JlZHJvb20iKQpkb3JtMiA8LSBkb3JtMSAlPiUgc2VsZWN0KCBzdHVkeV9sb2NhdGlvbiwgZ3BhKQphdmdfZ3BhX2Rvcm0gPC0gbWVhbihkb3JtMiRncGEsIG5hLnJtID0gVFJVRSkKCmxpYjEgPC0gZGF0YSAlPiUgZmlsdGVyKHN0dWR5X2xvY2F0aW9uID09ICJMaWJyYXJ5IikKbGliMiA8LSBsaWIxICU+JSBzZWxlY3QoIHN0dWR5X2xvY2F0aW9uLCBncGEpCmF2Z19ncGFfbGliIDwtIG1lYW4obGliMiRncGEsIG5hLnJtID0gVFJVRSkKCmNyMSA8LSBkYXRhICU+JSBmaWx0ZXIoc3R1ZHlfbG9jYXRpb24gPT0gIkxpdmluZyBSb29tL0NvbW1vbiBSb29tIikKY3IyIDwtIGNyMSAlPiUgc2VsZWN0KCBzdHVkeV9sb2NhdGlvbiwgZ3BhKQphdmdfZ3BhX2NyIDwtIG1lYW4oY3IyJGdwYSwgbmEucm0gPSBUUlVFKQoKY2FmZTEgPC0gZGF0YSAlPiUgZmlsdGVyKHN0dWR5X2xvY2F0aW9uID09ICJPdGhlciBFc3RhYmxpc2htZW50IChTdGFyYnVja3MsIGNhZmUsIGV0YykiKQpjYWZlMiA8LSBjYWZlMSAlPiUgc2VsZWN0KCBzdHVkeV9sb2NhdGlvbiwgZ3BhKQphdmdfZ3BhX2NhZmUgPC0gbWVhbihjYWZlMiRncGEsIG5hLnJtID0gVFJVRSkKCm91dDEgPC0gZGF0YSAlPiUgZmlsdGVyKHN0dWR5X2xvY2F0aW9uID09ICJPdXRzaWRlIikKb3V0MiA8LSBjYWZlMSAlPiUgc2VsZWN0KCBzdHVkeV9sb2NhdGlvbiwgZ3BhKQphdmdfZ3BhX291dCA8LSBtZWFuKG91dDIkZ3BhLCBuYS5ybSA9IFRSVUUpCgoKdGFibGVfZ3BhJGF2Z19ncGEgPC0gYyhhdmdfZ3BhX2Rvcm0sIGF2Z19ncGFfbGliLCBhdmdfZ3BhX2NyLCBhdmdfZ3BhX2NhZmUsIGF2Z19ncGFfb3V0KQoKI0luIHRoZSBjb2RlIGFib3ZlLCBJIHVzZWQgdGhlIGZpbHRlciBmdW5jdGlvbiB0byBmaWx0ZXIgb3V0IGVhY2ggb3B0aW9uIG9mIHN0dWR5IGxvY2F0aW9uIGZyb20gdGhlIG1haW4gZGF0YSBzZXQgdGl0bGVkIGRhdGEsIGFuZCB0aGVuIHNlbGVjdGVkIHRoZSBncGEgY29sdW1uIHNvIGFzIHRvIG1ha2UgaXQgaW50byBhIG5ldyBkYXRhZnJhbWUuIEkgdGhlbiB1c2VkIHRoZSBncGFzIG9mIGVhY2ggc3R1ZHkgbG9jYXRpb24gdG8gZmluZCB0aGUgYXZlcmFnZSB1c2luZyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzdHVkeSBsb2NhdGlvbi4gRm9ybXVsYSBiZWluZyA9IChzdW0gb2YgZ3BhJ3MvZnJlcXVlbmN5IG9mIHN0dWR5IGxvY2F0aW9uKS4gSSB0aGVuIGFkZGVkIGEgbmV3IGNvbHVtbiBpbnRvIHRoZSB0YWJsZV9ncGEgZGF0YSBmcmFtZSBzbyBJIGNhbiBwbG90IGV2ZXJ5dGhpbmcgb250byBvbmUgZ3JhcGguCgpnZ3Bsb3QodGFibGVfZ3BhLCBhZXMoeCA9IFZhcjEpKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19ncGEpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMykgKwogIGdlb21fYmFyKGFlcyh5ID0gRnJlcSksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiLCBhbHBoYSA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IGFuZCBCYXIgR3JhcGgiLAogICAgICAgeCA9ICJDYXRlZ29yeSIsCiAgICAgICB5ID0gIlZhbHVlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKI1RoaXMgaXMgdGhlIGdyYXBoIHRoYXQgY29tYmluZXMgZnJlcXVlbmN5IG9mIHN0dWR5IGxvY2F0aW9uIHdpdGggYXZlcmFnZSBncGEKYGBgCmh0dHBzOi8vd3d3LmRhdGFxdWVzdC5pby9ibG9nL2FkZC1jb2x1bW4tdG8tZGF0YWZyYW1lLWluLXIvIAoKCmBgYHtyfQpkb3JtX3Rlc3QxIDwtIGRhdGEgJT4lIGZpbHRlcihzdHVkeV9sb2NhdGlvbiA9PSAiRG9ybSBSb29tL0JlZHJvb20iKQpkb3JtX3Rlc3QyIDwtIGRvcm1fdGVzdDEgJT4lIHNlbGVjdCggc3R1ZHlfaHJzX2V4YW0sIGdwYSkKc3R1ZHlfdGVzdF9kb3JtIDwtIG1lYW4oZG9ybV90ZXN0MiRzdHVkeV9ocnNfZXhhbSwgbmEucm0gPSBUUlVFKQoKbGliX3Rlc3QxIDwtIGRhdGEgJT4lIGZpbHRlcihzdHVkeV9sb2NhdGlvbiA9PSAiTGlicmFyeSIpCmxpYl90ZXN0MiA8LSBsaWJfdGVzdDEgJT4lIHNlbGVjdCggc3R1ZHlfaHJzX2V4YW0sIGdwYSkKc3R1ZHlfdGVzdF9saWIgPC0gbWVhbihsaWJfdGVzdDIkc3R1ZHlfaHJzX2V4YW0sIG5hLnJtID0gVFJVRSkKCmNyX3Rlc3QxIDwtIGRhdGEgJT4lIGZpbHRlcihzdHVkeV9sb2NhdGlvbiA9PSAiTGl2aW5nIFJvb20vQ29tbW9uIFJvb20iKQpjcl90ZXN0MiA8LSBjcl90ZXN0MSAlPiUgc2VsZWN0KCBzdHVkeV9ocnNfZXhhbSwgZ3BhKQpzdHVkeV90ZXN0X2NyIDwtIG1lYW4oY3JfdGVzdDIkc3R1ZHlfaHJzX2V4YW0sIG5hLnJtID0gVFJVRSkKCmNhZmVfdGVzdDEgPC0gZGF0YSAlPiUgZmlsdGVyKHN0dWR5X2xvY2F0aW9uID09ICJPdGhlciBFc3RhYmxpc2htZW50IChTdGFyYnVja3MsIGNhZmUsIGV0YykiKQpjYWZlX3Rlc3QyIDwtIGNhZmVfdGVzdDEgJT4lIHNlbGVjdCggc3R1ZHlfaHJzX2V4YW0sIGdwYSkKc3R1ZHlfdGVzdF9jYWZlIDwtIG1lYW4oY2FmZV90ZXN0MiRzdHVkeV9ocnNfZXhhbSwgbmEucm0gPSBUUlVFKQoKb3V0X3Rlc3QxIDwtIGRhdGEgJT4lIGZpbHRlcihzdHVkeV9sb2NhdGlvbiA9PSAiT3V0c2lkZSIpCm91dF90ZXN0MiA8LSBjYWZlX3Rlc3QxICU+JSBzZWxlY3QoIHN0dWR5X2hyc19leGFtLCBncGEpCnN0dWR5X3Rlc3Rfb3V0IDwtIG1lYW4ob3V0X3Rlc3QyJHN0dWR5X2hyc19leGFtLCBuYS5ybSA9IFRSVUUpCgp0YWJsZQp0YWJsZV9leGFtJGF2Z190aW1lX3N0dWR5IDwtIGMoc3R1ZHlfdGVzdF9kb3JtLCBzdHVkeV90ZXN0X2xpYiwgc3R1ZHlfdGVzdF9jciwgc3R1ZHlfdGVzdF9jYWZlLCBzdHVkeV90ZXN0X291dCkKCiNJbiB0aGUgY29kZSBhYm92ZSwgSSBkaWQgdGhlIHNhbWUgdGhpbmcgYXMgSSBkaWQgd2l0aCBzdHVkeSBsb2NhdGlvbiBhbmQgR1xncGEgZXhjZXB0IHdpdGggaG91cnMgc3R1ZGllZCBhdCBlYWNoIGxvY2F0aW9uLgoKZ2dwbG90KHRhYmxlX2V4YW0sIGFlcyh4ID0gVmFyMSkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gYXZnX3RpbWVfc3R1ZHkpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMykgKwogIGdlb21fYmFyKGFlcyh5ID0gRnJlcSksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiLCBhbHBoYSA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IGFuZCBCYXIgR3JhcGgiLAogICAgICAgeCA9ICJDYXRlZ29yeSIsCiAgICAgICB5ID0gIlZhbHVlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKI1RoaXMgaXMgdGhlIGdyYXBoIHRoYXQgY29tYmluZXMgZnJlcXVlbmN5IG9mIHN0dWR5IGxvY2F0aW9uIHdpdGggYXZlcmFnZSBob3VycyBzdHVkaWVkIHdpdGggYW4gZXhhbQpgYGAKCgo=