Student Details
Priya Krishnamurthi Chandra (s3939191)
Su Myat Noe Yee (s3913797)
Usman Khalid (s3914769)
Problem Statement
The objective of the analysis is to investigate the distribution in data for certain variables related to climate in Melbourne and Sydney.
The variables considered are ‘Maximum temperature’, which records the highest temperature in a day, and ‘Solar exposure’, which records the total solar energy falling on a horizontal surface in a day. Both variables are inspected separately in both cities and the distribution of data is visualized and studied.
The tests of normality include graphical visualizations such as histogram and density plots, QQ-plot and Shapiro-Wilk statistical test.
Load Packages
Loaded the necessary packages needed for the analysis.
knitr::opts_knit$set(root.dir = normalizePath("~/Desktop/RMIT_Year1_Semester 1/Applied Analytics/Assignments"))
library(readr) #Used for reading data
library(magrittr) #Used for Forward-pipe operator
library(dplyr) #Used for data manipulation
Data
- Imported the climate data
- Subset the imported data to consider only the variables of interest- Maximum temperature and Solar exposure
# This is a chunk for your Data section.
setwd("~/Desktop/RMIT_Year1_Semester 1/Applied Analytics/Assignments")
mel<- read_csv("Climate data-Melbourne.csv")
Rows: 90 Columns: 7
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (7): station number, Year, Month, Day, Maximum temperature (Degree C), solar exposure, max wind speed
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
syd<- read_csv("Climate data-Sydney.csv")
Rows: 90 Columns: 7
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (7): station number, Year, Month, Day, Maximum temperature (Degree C), solar exposure, max wind speed
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
mel_subset <- mel %>% select(-7)
syd_subset <- syd %>% select(-7)
total <- rbind(mel_subset, syd_subset)
Summary Statistics
Calculate descriptive statistics (i.e., mean, median, standard deviation, first and third quartile, interquartile range, minimum and maximum values) of the selected variable grouped by city.
# This is a chunk for your Summary Statistics section
# Summary Statistics of Maximum temperature group by city
total %>%
group_by(`station number`) %>%
summarise(`Mean Maximum temperature (Degree C)` = mean(`Maximum temperature (Degree C)`),
median = median(`Maximum temperature (Degree C)`),
sd = sd(`Maximum temperature (Degree C)`),
`First Quantile` = quantile(`Maximum temperature (Degree C)`, 0.25),
`Third Quantile` = quantile(`Maximum temperature (Degree C)`, 0.75),
`Inter quartile Range` = `Third Quantile`-`First Quantile`,
`Minimum Value` = min(`Maximum temperature (Degree C)`),
`Maximumm Value` = max(`Maximum temperature (Degree C)`)
)
# Summary Statistics of solar exposure group by city
total %>%
group_by(`station number`) %>%
summarise(`Mean solar exposure` = mean(`solar exposure`),
median = median(`solar exposure`),
sd = sd(`solar exposure`),
`First Quantile` = quantile(`solar exposure`, 0.25),
`Third Quantile` = quantile(`solar exposure`, 0.75),
`Inter quartile Range` = `Third Quantile`-`First Quantile`,
`Minimum Value` = min(`solar exposure`),
`Maximumm Value` = max(`solar exposure`)
)
Distribution Fitting
Compared the empirical distribution of selected variables to normal distribution separately in Melbourne and Sydney.
Plotted the histogram with normal distribution overlay.
Also performed the shapiro-wilk test on variables to see if the follow the normal distribution ( A p-value less than 0.05 indicates that the variable doesnot follow the normal distribution)
Quantile quantile plots were also drawn to observe if the quantiles of empirical observation plotted against quantiles of the normal distribution gives data points lying on the 45 degree line. If the points lie along that line then the distribution followed by the sample variable is normal.
Checking Normality of Maximum temperature (Degree C) variable of Melbourne dataset
# This is a chunk for your Distribution Fitting section.
mel_temp<-mel_subset$`Maximum temperature (Degree C)`
mel_solar<-mel_subset$`solar exposure`
syd_temp<-syd_subset$`Maximum temperature (Degree C)`
syd_solar<-syd_subset$`solar exposure`
Melbourne Maximum temperature
# Histogram of Melbourne maximum temperature
h<-hist(mel_temp, breaks=15, col="yellow", xlab="Maximum temperature",
main="Histogram of Melbourne Maximum temperature", prob=TRUE)
lines(density(mel_temp))
xfit<-seq(min(mel_temp),max(mel_temp),length=40)
yfit<-dnorm(xfit,mean=mean(mel_temp),sd=sd(mel_temp))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Melbourne maximum temperature
boxplot(mel_temp, horizontal = TRUE)

#Shapiro test for Melbourne maximum temperature
shapiro.test(mel_temp)
Shapiro-Wilk normality test
data: mel_temp
W = 0.97913, p-value = 0.157
#QQplot test of Melbourne maximum temperature
qqnorm(mel_temp);
qqline(mel_temp);

Melbourne Solar Exposure
#Histogram of Melbourne solar exposure
h<-hist(mel_solar, breaks=15, col="tomato", xlab="Solar exposure",
main="Histogram of Melbourne solar exposure", prob=TRUE)
lines(density(mel_solar))
xfit<-seq(min(mel_solar),max(mel_solar),length=40)
yfit<-dnorm(xfit,mean=mean(mel_solar),sd=sd(mel_solar))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Melbourne solar exposure
boxplot(mel_solar, horizontal = TRUE)

#Shapiro test of Melbourne solar exposure
shapiro.test(mel_solar)
Shapiro-Wilk normality test
data: mel_solar
W = 0.93519, p-value = 0.0002275
#QQplot test of Melbourne solar exposure
qqnorm(mel_solar);
qqline(mel_solar);

Sydney Maximum temperature
#Histogram of Sydney maximum temperature
h<-hist(syd_temp, breaks=15, col="skyblue", xlab="Maximum temperature",
main="Histogram of Sydney maximum temperature", prob=TRUE)
lines(density(syd_temp))
xfit<-seq(min(syd_temp),max(syd_temp),length=40)
yfit<-dnorm(xfit,mean=mean(syd_temp),sd=sd(syd_temp))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Sydney maximum temperature
boxplot(syd_temp, horizontal = TRUE)

#Shapiro test of Sydney maximum temperature
shapiro.test(syd_temp)
Shapiro-Wilk normality test
data: syd_temp
W = 0.98213, p-value = 0.2533
#QQplot test of Sydney maximum temperature
qqnorm(syd_temp);
qqline(syd_temp);

Sydney Solar exposure
#Histogram of Sydney solar exposure
h<-hist(syd_solar, breaks=15, col="lightgreen", xlab="Solar exposure",
main="Histogram of Sydney solar exposure", prob=TRUE)
lines(density(syd_solar))
xfit<-seq(min(syd_solar),max(syd_solar),length=40)
yfit<-dnorm(xfit,mean=mean(syd_solar),sd=sd(syd_solar))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot test of Sydney solar exposure
boxplot(syd_solar, horizontal = TRUE)

#QQplot test of Sydney solar exposure
qqnorm(syd_solar);
qqline(syd_solar);

#Shapiro test of Sydney solar exposure
shapiro.test(syd_solar)
Shapiro-Wilk normality test
data: syd_solar
W = 0.97075, p-value = 0.03994
Interpretation
From descriptive statistics it can be observed that Sydney (station number 66212) and Melbourne (station number 86282) have about the same mean maximum temeratures but tghe stqandard deviation is greater for Melbourne which indicates a slightly higher variability in maximum temperatures observed in Melbourne. The maximum temperature for both the cities follows approximately normal distribution as indicated by the histogram overlays, quantile-quantile plots, and Shapiro-Wilks test ( p-values greater than 0.05).
The mean solar exposure for Melbourne is higher for Melbourne i.e., 21.90 as compared to Sydney (21.90). The box plot of sydney solar explosure indicates that the data is left skewed. Similarly the box plot shows left skewednesss in Melbourne data for solar exposure. The Shapiro-Wilks test also indicates the significat departure from normality with p-values of 0.0002275 for Melbourne solar exposure and 0.03394 for Sydney solar exposure. Thus solar exposure variable doesnot follow the norml distribution. The maximum temperature
LS0tCnRpdGxlOiAiTUFUSDEzMjQgQXNzaWdubWVudCAxIgpzdWJ0aXRsZTogU3RhdGlzdGljYWwgYW5hbHlzaXMgb2YgQ2xpbWF0ZSBkYXRhCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMgU3R1ZGVudCBEZXRhaWxzClByaXlhIEtyaXNobmFtdXJ0aGkgQ2hhbmRyYSAoczM5MzkxOTEpICAKU3UgTXlhdCBOb2UgWWVlIChzMzkxMzc5NykgIApVc21hbiBLaGFsaWQgKHMzOTE0NzY5KSAgCgoKIyMgUHJvYmxlbSBTdGF0ZW1lbnQKVGhlIG9iamVjdGl2ZSBvZiB0aGUgYW5hbHlzaXMgaXMgdG8gaW52ZXN0aWdhdGUgdGhlIGRpc3RyaWJ1dGlvbiBpbiBkYXRhIGZvciBjZXJ0YWluIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNsaW1hdGUgaW4gTWVsYm91cm5lIGFuZCBTeWRuZXkuICAKVGhlIHZhcmlhYmxlcyBjb25zaWRlcmVkIGFyZSAnTWF4aW11bSB0ZW1wZXJhdHVyZScsIHdoaWNoIHJlY29yZHMgdGhlIGhpZ2hlc3QgdGVtcGVyYXR1cmUgaW4gYSBkYXksIGFuZCAnU29sYXIgZXhwb3N1cmUnLCB3aGljaCByZWNvcmRzIHRoZSB0b3RhbCBzb2xhciBlbmVyZ3kgZmFsbGluZyBvbiBhIGhvcml6b250YWwgc3VyZmFjZSBpbiBhIGRheS4gQm90aCB2YXJpYWJsZXMgYXJlIGluc3BlY3RlZCBzZXBhcmF0ZWx5IGluIGJvdGggY2l0aWVzIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRhdGEgaXMgdmlzdWFsaXplZCBhbmQgc3R1ZGllZC4gIApUaGUgdGVzdHMgb2Ygbm9ybWFsaXR5IGluY2x1ZGUgZ3JhcGhpY2FsIHZpc3VhbGl6YXRpb25zIHN1Y2ggYXMgaGlzdG9ncmFtIGFuZCBkZW5zaXR5IHBsb3RzLCBRUS1wbG90IGFuZCBTaGFwaXJvLVdpbGsgc3RhdGlzdGljYWwgdGVzdC4KCiMjIExvYWQgUGFja2FnZXMKTG9hZGVkIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgbmVlZGVkIGZvciB0aGUgYW5hbHlzaXMuCgpgYGB7ciBzZXR1cH0KICAgIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gbm9ybWFsaXplUGF0aCgifi9EZXNrdG9wL1JNSVRfWWVhcjFfU2VtZXN0ZXIgMS9BcHBsaWVkIEFuYWx5dGljcy9Bc3NpZ25tZW50cyIpKSAKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkcikgI1VzZWQgZm9yIHJlYWRpbmcgZGF0YQpsaWJyYXJ5KG1hZ3JpdHRyKSAjVXNlZCBmb3IgRm9yd2FyZC1waXBlIG9wZXJhdG9yCmxpYnJhcnkoZHBseXIpICNVc2VkIGZvciBkYXRhIG1hbmlwdWxhdGlvbgpgYGAKCiMjIERhdGEKKiBJbXBvcnRlZCB0aGUgY2xpbWF0ZSBkYXRhCiogU3Vic2V0IHRoZSBpbXBvcnRlZCBkYXRhIHRvIGNvbnNpZGVyIG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdC0gTWF4aW11bSB0ZW1wZXJhdHVyZSBhbmQgU29sYXIgZXhwb3N1cmUKCgpgYGB7cn0KIyBUaGlzIGlzIGEgY2h1bmsgZm9yIHlvdXIgRGF0YSBzZWN0aW9uLiAKc2V0d2QoIn4vRGVza3RvcC9STUlUX1llYXIxX1NlbWVzdGVyIDEvQXBwbGllZCBBbmFseXRpY3MvQXNzaWdubWVudHMiKQptZWw8LSByZWFkX2NzdigiQ2xpbWF0ZSBkYXRhLU1lbGJvdXJuZS5jc3YiKSAKc3lkPC0gcmVhZF9jc3YoIkNsaW1hdGUgZGF0YS1TeWRuZXkuY3N2IikKCm1lbF9zdWJzZXQgPC0gbWVsICU+JSBzZWxlY3QoLTcpCnN5ZF9zdWJzZXQgPC0gc3lkICU+JSBzZWxlY3QoLTcpIAp0b3RhbCA8LSByYmluZChtZWxfc3Vic2V0LCBzeWRfc3Vic2V0KQpgYGAKCgojIyBTdW1tYXJ5IFN0YXRpc3RpY3MKQ2FsY3VsYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKGkuZS4sIG1lYW4sIG1lZGlhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGUsIGludGVycXVhcnRpbGUgcmFuZ2UsIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzKSBvZiB0aGUgc2VsZWN0ZWQgdmFyaWFibGUgZ3JvdXBlZCBieSBjaXR5LgoKYGBge3J9CiMgVGhpcyBpcyBhIGNodW5rIGZvciB5b3VyIFN1bW1hcnkgU3RhdGlzdGljcyBzZWN0aW9uCiMgU3VtbWFyeSBTdGF0aXN0aWNzIG9mIE1heGltdW0gdGVtcGVyYXR1cmUgZ3JvdXAgYnkgY2l0eQp0b3RhbCAlPiUKICBncm91cF9ieShgc3RhdGlvbiBudW1iZXJgKSAlPiUKICBzdW1tYXJpc2UoYE1lYW4gTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYCA9IG1lYW4oYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWApLAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWApLAogICAgICAgICAgICBzZCA9IHNkKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgKSwKICAgICAgICAgICAgYEZpcnN0IFF1YW50aWxlYCA9IHF1YW50aWxlKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgLCAwLjI1KSwKICAgICAgICAgICAgYFRoaXJkIFF1YW50aWxlYCA9IHF1YW50aWxlKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgLCAwLjc1KSwKICAgICAgICAgICAgYEludGVyIHF1YXJ0aWxlIFJhbmdlYCA9IGBUaGlyZCBRdWFudGlsZWAtYEZpcnN0IFF1YW50aWxlYCwKICAgICAgICAgICAgYE1pbmltdW0gVmFsdWVgID0gbWluKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgKSwKICAgICAgICAgICAgYE1heGltdW1tIFZhbHVlYCA9IG1heChgTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYCkKICAgICAgICAgICAgKQojIFN1bW1hcnkgU3RhdGlzdGljcyBvZiBzb2xhciBleHBvc3VyZSBncm91cCBieSBjaXR5CnRvdGFsICU+JQogIGdyb3VwX2J5KGBzdGF0aW9uIG51bWJlcmApICU+JQogIHN1bW1hcmlzZShgTWVhbiBzb2xhciBleHBvc3VyZWAgPSBtZWFuKGBzb2xhciBleHBvc3VyZWApLAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIHNkID0gc2QoYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIGBGaXJzdCBRdWFudGlsZWAgPSBxdWFudGlsZShgc29sYXIgZXhwb3N1cmVgLCAwLjI1KSwKICAgICAgICAgICAgYFRoaXJkIFF1YW50aWxlYCA9IHF1YW50aWxlKGBzb2xhciBleHBvc3VyZWAsIDAuNzUpLAogICAgICAgICAgICBgSW50ZXIgcXVhcnRpbGUgUmFuZ2VgID0gYFRoaXJkIFF1YW50aWxlYC1gRmlyc3QgUXVhbnRpbGVgLAogICAgICAgICAgICBgTWluaW11bSBWYWx1ZWAgPSBtaW4oYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIGBNYXhpbXVtbSBWYWx1ZWAgPSBtYXgoYHNvbGFyIGV4cG9zdXJlYCkKICAgICAgICAgICAgKQpgYGAKIyMgRGlzdHJpYnV0aW9uIEZpdHRpbmcKKiBDb21wYXJlZCB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiBvZiBzZWxlY3RlZCB2YXJpYWJsZXMgdG8gbm9ybWFsIGRpc3RyaWJ1dGlvbiBzZXBhcmF0ZWx5IGluIE1lbGJvdXJuZSBhbmQgU3lkbmV5LgoqIFBsb3R0ZWQgdGhlIGhpc3RvZ3JhbSB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb3ZlcmxheS4KKiBBbHNvIHBlcmZvcm1lZCB0aGUgc2hhcGlyby13aWxrIHRlc3Qgb24gdmFyaWFibGVzIHRvIHNlZSBpZiB0aGUgZm9sbG93IHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uICggQSBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1IGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZSBkb2Vzbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbikKKiBRdWFudGlsZSBxdWFudGlsZSBwbG90cyB3ZXJlIGFsc28gZHJhd24gdG8gb2JzZXJ2ZSBpZiB0aGUgcXVhbnRpbGVzIG9mIGVtcGlyaWNhbCBvYnNlcnZhdGlvbiBwbG90dGVkIGFnYWluc3QgcXVhbnRpbGVzIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGdpdmVzIGRhdGEgcG9pbnRzIGx5aW5nIG9uIHRoZSA0NSBkZWdyZWUgbGluZS4gSWYgdGhlIHBvaW50cyBsaWUgYWxvbmcgdGhhdCBsaW5lIHRoZW4gdGhlIGRpc3RyaWJ1dGlvbiBmb2xsb3dlZCBieSB0aGUgc2FtcGxlIHZhcmlhYmxlIGlzIG5vcm1hbC4KCiogQ2hlY2tpbmcgTm9ybWFsaXR5IG9mIE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKSB2YXJpYWJsZSBvZiBNZWxib3VybmUgZGF0YXNldAoKCmBgYHtyfQojIFRoaXMgaXMgYSBjaHVuayBmb3IgeW91ciBEaXN0cmlidXRpb24gRml0dGluZyBzZWN0aW9uLiAKbWVsX3RlbXA8LW1lbF9zdWJzZXQkYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWAgCm1lbF9zb2xhcjwtbWVsX3N1YnNldCRgc29sYXIgZXhwb3N1cmVgIApzeWRfdGVtcDwtc3lkX3N1YnNldCRgTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYApzeWRfc29sYXI8LXN5ZF9zdWJzZXQkYHNvbGFyIGV4cG9zdXJlYCAKYGBgCgojIyBNZWxib3VybmUgTWF4aW11bSB0ZW1wZXJhdHVyZQoKYGBge3J9CiMgSGlzdG9ncmFtIG9mIE1lbGJvdXJuZSBtYXhpbXVtIHRlbXBlcmF0dXJlCmg8LWhpc3QobWVsX3RlbXAsIGJyZWFrcz0xNSwgIGNvbD0ieWVsbG93IiwgeGxhYj0iTWF4aW11bSB0ZW1wZXJhdHVyZSIsCiAgICAgICAgbWFpbj0iSGlzdG9ncmFtIG9mIE1lbGJvdXJuZSBNYXhpbXVtIHRlbXBlcmF0dXJlIiwgcHJvYj1UUlVFKQpsaW5lcyhkZW5zaXR5KG1lbF90ZW1wKSkKeGZpdDwtc2VxKG1pbihtZWxfdGVtcCksbWF4KG1lbF90ZW1wKSxsZW5ndGg9NDApCnlmaXQ8LWRub3JtKHhmaXQsbWVhbj1tZWFuKG1lbF90ZW1wKSxzZD1zZChtZWxfdGVtcCkpCmxpbmVzKHhmaXQsIHlmaXQsIGNvbD0iYmx1ZSIsIGx3ZD0yKQpgYGAKCmBgYHtyfQojQm94cGxvdCBvZiBNZWxib3VybmUgbWF4aW11bSB0ZW1wZXJhdHVyZQpib3hwbG90KG1lbF90ZW1wLCBob3Jpem9udGFsID0gVFJVRSkKYGBgCgpgYGB7cn0KI1NoYXBpcm8gdGVzdCBmb3IgTWVsYm91cm5lIG1heGltdW0gdGVtcGVyYXR1cmUKc2hhcGlyby50ZXN0KG1lbF90ZW1wKQpgYGAKYGBge3J9CiNRUXBsb3QgdGVzdCBvZiAgTWVsYm91cm5lIG1heGltdW0gdGVtcGVyYXR1cmUKcXFub3JtKG1lbF90ZW1wKTsKcXFsaW5lKG1lbF90ZW1wKTsKYGBgCgojIyBNZWxib3VybmUgU29sYXIgRXhwb3N1cmUKYGBge3J9CiNIaXN0b2dyYW0gb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlCmg8LWhpc3QobWVsX3NvbGFyLCBicmVha3M9MTUsICBjb2w9InRvbWF0byIsIHhsYWI9IlNvbGFyIGV4cG9zdXJlIiwKICAgICAgICBtYWluPSJIaXN0b2dyYW0gb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlIiwgcHJvYj1UUlVFKQpsaW5lcyhkZW5zaXR5KG1lbF9zb2xhcikpCnhmaXQ8LXNlcShtaW4obWVsX3NvbGFyKSxtYXgobWVsX3NvbGFyKSxsZW5ndGg9NDApCnlmaXQ8LWRub3JtKHhmaXQsbWVhbj1tZWFuKG1lbF9zb2xhciksc2Q9c2QobWVsX3NvbGFyKSkKbGluZXMoeGZpdCwgeWZpdCwgY29sPSJibHVlIiwgbHdkPTIpCmBgYApgYGB7cn0KI0JveHBsb3Qgb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlCmJveHBsb3QobWVsX3NvbGFyLCBob3Jpem9udGFsID0gVFJVRSkKYGBgCmBgYHtyfQojU2hhcGlybyB0ZXN0IG9mIE1lbGJvdXJuZSBzb2xhciBleHBvc3VyZQpzaGFwaXJvLnRlc3QobWVsX3NvbGFyKQpgYGAKYGBge3J9CiNRUXBsb3QgdGVzdCBvZiBNZWxib3VybmUgc29sYXIgZXhwb3N1cmUKcXFub3JtKG1lbF9zb2xhcik7CnFxbGluZShtZWxfc29sYXIpOwpgYGAKCiMjIFN5ZG5leSBNYXhpbXVtIHRlbXBlcmF0dXJlCmBgYHtyfQojSGlzdG9ncmFtIG9mIFN5ZG5leSBtYXhpbXVtIHRlbXBlcmF0dXJlIApoPC1oaXN0KHN5ZF90ZW1wLCBicmVha3M9MTUsICBjb2w9InNreWJsdWUiLCB4bGFiPSJNYXhpbXVtIHRlbXBlcmF0dXJlIiwKICAgICAgICBtYWluPSJIaXN0b2dyYW0gb2YgU3lkbmV5IG1heGltdW0gdGVtcGVyYXR1cmUiLCBwcm9iPVRSVUUpCmxpbmVzKGRlbnNpdHkoc3lkX3RlbXApKQp4Zml0PC1zZXEobWluKHN5ZF90ZW1wKSxtYXgoc3lkX3RlbXApLGxlbmd0aD00MCkKeWZpdDwtZG5vcm0oeGZpdCxtZWFuPW1lYW4oc3lkX3RlbXApLHNkPXNkKHN5ZF90ZW1wKSkKbGluZXMoeGZpdCwgeWZpdCwgY29sPSJibHVlIiwgbHdkPTIpCmBgYApgYGB7cn0KI0JveHBsb3Qgb2YgU3lkbmV5IG1heGltdW0gdGVtcGVyYXR1cmUKYm94cGxvdChzeWRfdGVtcCwgaG9yaXpvbnRhbCA9IFRSVUUpCmBgYApgYGB7cn0KI1NoYXBpcm8gdGVzdCBvZiBTeWRuZXkgbWF4aW11bSB0ZW1wZXJhdHVyZQpzaGFwaXJvLnRlc3Qoc3lkX3RlbXApCmBgYApgYGB7cn0KI1FRcGxvdCB0ZXN0IG9mIFN5ZG5leSBtYXhpbXVtIHRlbXBlcmF0dXJlCnFxbm9ybShzeWRfdGVtcCk7CnFxbGluZShzeWRfdGVtcCk7CmBgYAoKIyMgU3lkbmV5IFNvbGFyIGV4cG9zdXJlCmBgYHtyfQojSGlzdG9ncmFtIG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpoPC1oaXN0KHN5ZF9zb2xhciwgYnJlYWtzPTE1LCAgY29sPSJsaWdodGdyZWVuIiwgeGxhYj0iU29sYXIgZXhwb3N1cmUiLAogICAgICAgIG1haW49Ikhpc3RvZ3JhbSBvZiBTeWRuZXkgc29sYXIgZXhwb3N1cmUiLCBwcm9iPVRSVUUpCmxpbmVzKGRlbnNpdHkoc3lkX3NvbGFyKSkKeGZpdDwtc2VxKG1pbihzeWRfc29sYXIpLG1heChzeWRfc29sYXIpLGxlbmd0aD00MCkKeWZpdDwtZG5vcm0oeGZpdCxtZWFuPW1lYW4oc3lkX3NvbGFyKSxzZD1zZChzeWRfc29sYXIpKQpsaW5lcyh4Zml0LCB5Zml0LCBjb2w9ImJsdWUiLCBsd2Q9MikKYGBgCmBgYHtyfQojQm94cGxvdCB0ZXN0IG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpib3hwbG90KHN5ZF9zb2xhciwgaG9yaXpvbnRhbCA9IFRSVUUpCmBgYApgYGB7cn0KI1FRcGxvdCB0ZXN0IG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpxcW5vcm0oc3lkX3NvbGFyKTsKcXFsaW5lKHN5ZF9zb2xhcik7CmBgYApgYGB7cn0KI1NoYXBpcm8gdGVzdCBvZiBTeWRuZXkgc29sYXIgZXhwb3N1cmUKc2hhcGlyby50ZXN0KHN5ZF9zb2xhcikKYGBgCgojIyBJbnRlcnByZXRhdGlvbgpGcm9tIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgaXQgY2FuIGJlIG9ic2VydmVkIHRoYXQgU3lkbmV5IChzdGF0aW9uIG51bWJlciA2NjIxMikgYW5kIE1lbGJvdXJuZSAoc3RhdGlvbiBudW1iZXIgODYyODIpIGhhdmUgYWJvdXQgdGhlIHNhbWUgbWVhbiBtYXhpbXVtIHRlbWVyYXR1cmVzIGJ1dCB0Z2hlIHN0cWFuZGFyZCBkZXZpYXRpb24gaXMgZ3JlYXRlciBmb3IgTWVsYm91cm5lIHdoaWNoIGluZGljYXRlcyBhIHNsaWdodGx5IGhpZ2hlciB2YXJpYWJpbGl0eSBpbiBtYXhpbXVtIHRlbXBlcmF0dXJlcyBvYnNlcnZlZCBpbiBNZWxib3VybmUuIApUaGUgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgYm90aCB0aGUgY2l0aWVzIGZvbGxvd3MgYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIGluZGljYXRlZCBieSB0aGUgaGlzdG9ncmFtIG92ZXJsYXlzLCBxdWFudGlsZS1xdWFudGlsZSBwbG90cywgYW5kIFNoYXBpcm8tV2lsa3MgdGVzdCAoIHAtdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjA1KS4gCgpUaGUgbWVhbiBzb2xhciBleHBvc3VyZSBmb3IgTWVsYm91cm5lIGlzIGhpZ2hlciBmb3IgTWVsYm91cm5lIGkuZS4sIDIxLjkwIGFzIGNvbXBhcmVkIHRvIFN5ZG5leSAoMjEuOTApLiBUaGUgYm94IHBsb3Qgb2Ygc3lkbmV5IHNvbGFyIGV4cGxvc3VyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBsZWZ0IHNrZXdlZC4gU2ltaWxhcmx5IHRoZSBib3ggcGxvdCBzaG93cyBsZWZ0IHNrZXdlZG5lc3NzIGluIE1lbGJvdXJuZSBkYXRhIGZvciBzb2xhciBleHBvc3VyZS4gVGhlIFNoYXBpcm8tV2lsa3MgdGVzdCBhbHNvIGluZGljYXRlcyB0aGUgc2lnbmlmaWNhdCBkZXBhcnR1cmUgZnJvbSBub3JtYWxpdHkgd2l0aCBwLXZhbHVlcyBvZiAwLjAwMDIyNzUgZm9yIE1lbGJvdXJuZSBzb2xhciBleHBvc3VyZSBhbmQgIDAuMDMzOTQgZm9yIFN5ZG5leSBzb2xhciBleHBvc3VyZS4gVGh1cyBzb2xhciBleHBvc3VyZSB2YXJpYWJsZSBkb2Vzbm90IGZvbGxvdyB0aGUgbm9ybWwgZGlzdHJpYnV0aW9uLgpUaGUgbWF4aW11bSB0ZW1wZXJhdHVyZQoKCg==