Activity Report PA1

Report

1) Read and Process Data

library(data.table)
data.table 1.10.4
  The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
  Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
  Release notes, videos and slides: http://r-datatable.com

Attaching package: ‘data.table’

The following object is masked _by_ ‘.GlobalEnv’:

    .N
webURL <- "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2Factivity.zip"
destURL <- file.path(getwd(),paste("activity_monitoring_data",".zip",sep = ""))
localFileURL <- file.path(getwd(),paste("activity",".csv",sep = ""))
download.file(webURL,destfile = destURL)
trying URL 'https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2Factivity.zip'
Content type 'application/zip' length 53559 bytes (52 KB)
==================================================
downloaded 52 KB
unzip(destURL)
#activityData <- as.data.frame(read.csv(localFileURL))
activityData <- read.csv(localFileURL, quote = "\"",stringsAsFactors = FALSE)
activityData$steps <- as.numeric(activityData$steps)
activityData$interval <- as.numeric(activityData$interval)
activityData$date <- as.Date(activityData$date,format = "%Y-%m-%d")

2) Histogram of the total number of steps taken each day

#   2) Histogram of the total number of steps taken each day
activityDataAg <- aggregate(activityData$steps,list(activityData$date),sum)
names(activityDataAg) <- c("date","totalSteps")
#activityDataAg <- activityDataAg[complete.cases(activityDataAg),]
hist(activityDataAg$totalSteps, xlab = "TotalSteps", breaks = 10)

3) Mean and median number of steps taken each day

#3) Mean and median number of steps taken each day
stepSummary <- as.table(summary(activityDataAg$totalSteps))
stepsMedian <- stepSummary[3]
stepsMean <- stepSummary[4]

The total median steps are 10765 and the mean for the total steps taken is 10766

4) Time series plot of the average number of steps taken

# 4) Time series plot of the average number of steps taken
# removed na's
actDataAg <- activityDataAg[complete.cases(activityDataAg),]
#activityTS= ts(rnorm(48), start=c(2293,6), frequency=1)
plot(actDataAg$date,actDataAg$totalSteps,type = "l", xlab = "date",ylab = "total steps")

5) The 5-minute interval that, on average, contains the maximum number of steps

# 5   The 5-minute interval that, on average, contains the maximum number of steps
activity5min <- activityData[complete.cases(activityData),]
activity5min <- aggregate(activity5min$steps,list(activity5min$interval),mean)
names(activity5min) <- c("interval","avgsteps")
activity5min$avgsteps <- round(activity5min$avgsteps,1)
plot(activity5min$interval,activity5min$avgsteps,type = "l", xlab = "5min interval", ylab = "5min Avg Steps")

The 5 minutes interval with the most steps is 835. The average number of steps at this interval is 206.2.

6 Code to describe and show a strategy for imputing missing datas
#stepSummary <- as.table(summary(activityDataAg$totalSteps))
#rowsNA <- nrow(activityData[!complete.cases(activityData),])

There are 2304 days that have NA’s

#  6 Code to describe and show a strategy for imputing missing data
stepSummary <- as.table(summary(activityDataAg$totalSteps))
rowsNA <- nrow(activityData[!complete.cases(activityData),])
#library(zoo)
activityIntMerge <- merge(activityData,activity5min, by = "interval", all.x = TRUE)
activityIntMerge$steps <- ifelse(is.na(activityIntMerge$steps) == TRUE, activityIntMerge$avgsteps, activityIntMerge$steps)
activityIntMergeSum <- aggregate(activityIntMerge$steps,list(activityIntMerge$date),sum)
names(activityIntMergeSum) <- c("date","totalSteps")
activityIntMergeSum$date <-  as.Date(activityIntMergeSum$date,format = "%Y-%m-%d")
activityIntMergeSum$totalSteps <- as.numeric(activityIntMergeSum$totalSteps)

The strategy to fill na’s included calculating the average steps per interval. Then NA’s were replaced with the average value in respect to its interval. The mean after replacing the NA’s is 10766 and the median is 10766. The total daily steps and the average per inverval had no significant changes after filling the NA’s, as can be seen on the charts.

7) Histogram of the total number of steps taken each day after missing values are imputed
hist(activityIntMergeSum$totalSteps, main = "Total Steps NA filled with Interval Avg",xlab = "TotalSteps", breaks = 10 )

NAFillStepsSummary <- as.table(summary(activityIntMergeSum$totalSteps))
activityIntMergeAvg<- aggregate(activityIntMerge$steps,list(activityIntMerge$interval),mean)
names(activityIntMergeAvg) <- c("interval","avgSteps")
activityIntMergeAvg$avgSteps <- round(activityIntMergeAvg$avgSteps,1)
plot(activityIntMergeAvg$interval,activityIntMergeAvg$avgSteps,type = "l", main = "Interval after NA Filled",xlab = "5min interval", ylab = "5min Avg Steps")

8) Panel plot comparing the average number of steps taken per 5-minute interval across weekdays and weekends
###### 8) Panel plot comparing the average number of steps taken per 5-minute interval across weekdays and weekends
activityData$wkdy <- weekdays(activityData$date)
activityData$weektype <- ifelse((activityData$wkdy == "Saturday" | activityData$wkdy == "Sunday"), "Weekend", "Weekday" )
activityWk <- activityData[complete.cases(activityData),]
activityWkend <- aggregate(activityWk[which(activityWk$weektype =="Weekend"),"steps"]
                           , list(activityWk[which(activityWk$weektype =="Weekend"),"interval"]),mean)
names(activityWkend) <- c("interval","avgSteps")
activityWkend$interval <- as.integer(activityWkend$interval)
activityWkend$avgSteps <- round(as.numeric(activityWkend$avgSteps),1)
activityWkdy <- aggregate(activityWk[which(activityWk$weektype =="Weekday"),"steps"]
                           , list(activityWk[which(activityWk$weektype =="Weekday"),"interval"]),mean)
names(activityWkdy ) <- c("interval","avgSteps")
activityWkdy$interval <- as.integer(activityWkdy$interval)
activityWkdy$avgSteps <- round(as.numeric(activityWkdy$avgSteps),1)
par(mfrow=c(2,1))
#par(mfcol=c(2,1))
plot(activityWkdy$interval, activityWkdy$avgSteps, type = "l", xlab = "", ylab = "WkDay Avg Steps")
plot(activityWkend$interval, activityWkend$avgSteps, type = "l",xlab = "interval", ylab = "WkEnd Avg Steps")
mtext("Weekend vs. Weekday Avg Steps", side=3, outer=TRUE, line=-1) 

LS0tCnRpdGxlOiAiQWN0aXZpdHkgUmVwb3J0IFBBMSIKYXV0aG9yOiAiTWljaGFlbCBHYXJjaWEiCmRhdGU6ICJBdWd1c3QgMSwgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAotLS0KIyMgQWN0aXZpdHkgUmVwb3J0IFBBMSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KIyMjIFJlcG9ydAoKIyMjIyAxKSBSZWFkIGFuZCBQcm9jZXNzIERhdGEKCmBgYHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KbGlicmFyeShkYXRhLnRhYmxlKQoKd2ViVVJMIDwtICJodHRwczovL2QzOTZxdXN6YTQwb3JjLmNsb3VkZnJvbnQubmV0L3JlcGRhdGElMkZkYXRhJTJGYWN0aXZpdHkuemlwIgpkZXN0VVJMIDwtIGZpbGUucGF0aChnZXR3ZCgpLHBhc3RlKCJhY3Rpdml0eV9tb25pdG9yaW5nX2RhdGEiLCIuemlwIixzZXAgPSAiIikpCmxvY2FsRmlsZVVSTCA8LSBmaWxlLnBhdGgoZ2V0d2QoKSxwYXN0ZSgiYWN0aXZpdHkiLCIuY3N2IixzZXAgPSAiIikpCmRvd25sb2FkLmZpbGUod2ViVVJMLGRlc3RmaWxlID0gZGVzdFVSTCkKCnVuemlwKGRlc3RVUkwpCiNhY3Rpdml0eURhdGEgPC0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdihsb2NhbEZpbGVVUkwpKQphY3Rpdml0eURhdGEgPC0gcmVhZC5jc3YobG9jYWxGaWxlVVJMLCBxdW90ZSA9ICJcIiIsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQphY3Rpdml0eURhdGEkc3RlcHMgPC0gYXMubnVtZXJpYyhhY3Rpdml0eURhdGEkc3RlcHMpCmFjdGl2aXR5RGF0YSRpbnRlcnZhbCA8LSBhcy5udW1lcmljKGFjdGl2aXR5RGF0YSRpbnRlcnZhbCkKYWN0aXZpdHlEYXRhJGRhdGUgPC0gYXMuRGF0ZShhY3Rpdml0eURhdGEkZGF0ZSxmb3JtYXQgPSAiJVktJW0tJWQiKQoKYGBgCgoKIyMjIyAyKSBIaXN0b2dyYW0gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQoKCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KIyAgIDIpIEhpc3RvZ3JhbSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5CmFjdGl2aXR5RGF0YUFnIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eURhdGEkc3RlcHMsbGlzdChhY3Rpdml0eURhdGEkZGF0ZSksc3VtKQpuYW1lcyhhY3Rpdml0eURhdGFBZykgPC0gYygiZGF0ZSIsInRvdGFsU3RlcHMiKQojYWN0aXZpdHlEYXRhQWcgPC0gYWN0aXZpdHlEYXRhQWdbY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhQWcpLF0KaGlzdChhY3Rpdml0eURhdGFBZyR0b3RhbFN0ZXBzLCB4bGFiID0gIlRvdGFsU3RlcHMiLCBicmVha3MgPSAxMCkKYGBgCgoKIyMjIyAzKSBNZWFuIGFuZCBtZWRpYW4gbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5CgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQojMykgTWVhbiBhbmQgbWVkaWFuIG51bWJlciBvZiBzdGVwcyB0YWtlbiBlYWNoIGRheQpzdGVwU3VtbWFyeSA8LSBhcy50YWJsZShzdW1tYXJ5KGFjdGl2aXR5RGF0YUFnJHRvdGFsU3RlcHMpKQpzdGVwc01lZGlhbiA8LSBzdGVwU3VtbWFyeVszXQpzdGVwc01lYW4gPC0gc3RlcFN1bW1hcnlbNF0KYGBgCgpUaGUgdG90YWwgbWVkaWFuIHN0ZXBzIGFyZSBgciBhcy5pbnRlZ2VyKHN0ZXBzTWVkaWFuKWAgYW5kIHRoZSBtZWFuIGZvciB0aGUgdG90YWwgc3RlcHMgdGFrZW4gaXMgYHIgYXMuaW50ZWdlcihzdGVwc01lYW4pYAoKCiMjIyMgNCkgVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4KCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgNCkgVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4KIyByZW1vdmVkIG5hJ3MKYWN0RGF0YUFnIDwtIGFjdGl2aXR5RGF0YUFnW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YUFnKSxdCiNhY3Rpdml0eVRTPSB0cyhybm9ybSg0OCksIHN0YXJ0PWMoMjI5Myw2KSwgZnJlcXVlbmN5PTEpCnBsb3QoYWN0RGF0YUFnJGRhdGUsYWN0RGF0YUFnJHRvdGFsU3RlcHMsdHlwZSA9ICJsIiwgeGxhYiA9ICJkYXRlIix5bGFiID0gInRvdGFsIHN0ZXBzIikKYGBgCgoKIyMjIyA1KSBUaGUgNS1taW51dGUgaW50ZXJ2YWwgdGhhdCwgb24gYXZlcmFnZSwgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsZWNobyA9IFRSVUV9CiMgNSAgIFRoZSA1LW1pbnV0ZSBpbnRlcnZhbCB0aGF0LCBvbiBhdmVyYWdlLCBjb250YWlucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMKYWN0aXZpdHk1bWluIDwtIGFjdGl2aXR5RGF0YVtjb21wbGV0ZS5jYXNlcyhhY3Rpdml0eURhdGEpLF0KYWN0aXZpdHk1bWluIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eTVtaW4kc3RlcHMsbGlzdChhY3Rpdml0eTVtaW4kaW50ZXJ2YWwpLG1lYW4pCm5hbWVzKGFjdGl2aXR5NW1pbikgPC0gYygiaW50ZXJ2YWwiLCJhdmdzdGVwcyIpCmFjdGl2aXR5NW1pbiRhdmdzdGVwcyA8LSByb3VuZChhY3Rpdml0eTVtaW4kYXZnc3RlcHMsMSkKcGxvdChhY3Rpdml0eTVtaW4kaW50ZXJ2YWwsYWN0aXZpdHk1bWluJGF2Z3N0ZXBzLHR5cGUgPSAibCIsIHhsYWIgPSAiNW1pbiBpbnRlcnZhbCIsIHlsYWIgPSAiNW1pbiBBdmcgU3RlcHMiKQpgYGAKVGhlIDUgbWludXRlcyBpbnRlcnZhbCB3aXRoIHRoZSBtb3N0IHN0ZXBzIGlzIGByIGFjdGl2aXR5NW1pblt3aGljaChhY3Rpdml0eTVtaW4kYXZnc3RlcHMgPT0gbWF4KGFjdGl2aXR5NW1pbiRhdmdzdGVwcykpLCJpbnRlcnZhbCJdYC4gVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0ZXBzIGF0IHRoaXMgaW50ZXJ2YWwgaXMgYHIgYWN0aXZpdHk1bWluW3doaWNoKGFjdGl2aXR5NW1pbiRhdmdzdGVwcyA9PSBtYXgoYWN0aXZpdHk1bWluJGF2Z3N0ZXBzKSksImF2Z3N0ZXBzIl1gLgoKCiMjIyMjIyAgNiBDb2RlIHRvIGRlc2NyaWJlIGFuZCBzaG93IGEgc3RyYXRlZ3kgZm9yIGltcHV0aW5nIG1pc3NpbmcgZGF0YXMKCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiNzdGVwU3VtbWFyeSA8LSBhcy50YWJsZShzdW1tYXJ5KGFjdGl2aXR5RGF0YUFnJHRvdGFsU3RlcHMpKQojcm93c05BIDwtIG5yb3coYWN0aXZpdHlEYXRhWyFjb21wbGV0ZS5jYXNlcyhhY3Rpdml0eURhdGEpLF0pCmBgYApUaGVyZSBhcmUgYHIgIG5yb3coYWN0aXZpdHlEYXRhWyFjb21wbGV0ZS5jYXNlcyhhY3Rpdml0eURhdGEpLF0pYCBkYXlzIHRoYXQgaGF2ZSBOQSdzCgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KIyAgNiBDb2RlIHRvIGRlc2NyaWJlIGFuZCBzaG93IGEgc3RyYXRlZ3kgZm9yIGltcHV0aW5nIG1pc3NpbmcgZGF0YQoKc3RlcFN1bW1hcnkgPC0gYXMudGFibGUoc3VtbWFyeShhY3Rpdml0eURhdGFBZyR0b3RhbFN0ZXBzKSkKCnJvd3NOQSA8LSBucm93KGFjdGl2aXR5RGF0YVshY29tcGxldGUuY2FzZXMoYWN0aXZpdHlEYXRhKSxdKQoKCgojbGlicmFyeSh6b28pCmFjdGl2aXR5SW50TWVyZ2UgPC0gbWVyZ2UoYWN0aXZpdHlEYXRhLGFjdGl2aXR5NW1pbiwgYnkgPSAiaW50ZXJ2YWwiLCBhbGwueCA9IFRSVUUpCmFjdGl2aXR5SW50TWVyZ2Ukc3RlcHMgPC0gaWZlbHNlKGlzLm5hKGFjdGl2aXR5SW50TWVyZ2Ukc3RlcHMpID09IFRSVUUsIGFjdGl2aXR5SW50TWVyZ2UkYXZnc3RlcHMsIGFjdGl2aXR5SW50TWVyZ2Ukc3RlcHMpCmFjdGl2aXR5SW50TWVyZ2VTdW0gPC0gYWdncmVnYXRlKGFjdGl2aXR5SW50TWVyZ2Ukc3RlcHMsbGlzdChhY3Rpdml0eUludE1lcmdlJGRhdGUpLHN1bSkKbmFtZXMoYWN0aXZpdHlJbnRNZXJnZVN1bSkgPC0gYygiZGF0ZSIsInRvdGFsU3RlcHMiKQphY3Rpdml0eUludE1lcmdlU3VtJGRhdGUgPC0gIGFzLkRhdGUoYWN0aXZpdHlJbnRNZXJnZVN1bSRkYXRlLGZvcm1hdCA9ICIlWS0lbS0lZCIpCmFjdGl2aXR5SW50TWVyZ2VTdW0kdG90YWxTdGVwcyA8LSBhcy5udW1lcmljKGFjdGl2aXR5SW50TWVyZ2VTdW0kdG90YWxTdGVwcykKYGBgCgpUaGUgc3RyYXRlZ3kgdG8gZmlsbCBuYSdzIGluY2x1ZGVkIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIHN0ZXBzIHBlciBpbnRlcnZhbC4gVGhlbiBOQSdzIHdlcmUgcmVwbGFjZWQgd2l0aCB0aGUgYXZlcmFnZSB2YWx1ZSBpbiByZXNwZWN0IHRvIGl0cyBpbnRlcnZhbC4gVGhlIG1lYW4gYWZ0ZXIgcmVwbGFjaW5nIHRoZSBOQSdzIGlzIGByIGFzLmludGVnZXIocm91bmQoTkFGaWxsU3RlcHNTdW1tYXJ5WzRdLDApKWAgYW5kIHRoZSBtZWRpYW4gaXMgYHIgYXMuaW50ZWdlcihyb3VuZChOQUZpbGxTdGVwc1N1bW1hcnlbM10sMCkpYC4gVGhlIHRvdGFsIGRhaWx5IHN0ZXBzIGFuZCB0aGUgYXZlcmFnZSBwZXIgaW52ZXJ2YWwgaGFkIG5vIHNpZ25pZmljYW50IGNoYW5nZXMgYWZ0ZXIgZmlsbGluZyB0aGUgTkEncywgYXMgY2FuIGJlIHNlZW4gb24gdGhlIGNoYXJ0cy4KCgoKIyMjIyMjIDcpIEhpc3RvZ3JhbSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGVhY2ggZGF5IGFmdGVyIG1pc3NpbmcgdmFsdWVzIGFyZSBpbXB1dGVkCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUgLCBlY2hvID0gVFJVRX0KaGlzdChhY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMsIG1haW4gPSAiVG90YWwgU3RlcHMgTkEgZmlsbGVkIHdpdGggSW50ZXJ2YWwgQXZnIix4bGFiID0gIlRvdGFsU3RlcHMiLCBicmVha3MgPSAxMCApCgpOQUZpbGxTdGVwc1N1bW1hcnkgPC0gYXMudGFibGUoc3VtbWFyeShhY3Rpdml0eUludE1lcmdlU3VtJHRvdGFsU3RlcHMpKQpgYGAKCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQphY3Rpdml0eUludE1lcmdlQXZnPC0gYWdncmVnYXRlKGFjdGl2aXR5SW50TWVyZ2Ukc3RlcHMsbGlzdChhY3Rpdml0eUludE1lcmdlJGludGVydmFsKSxtZWFuKQpuYW1lcyhhY3Rpdml0eUludE1lcmdlQXZnKSA8LSBjKCJpbnRlcnZhbCIsImF2Z1N0ZXBzIikKYWN0aXZpdHlJbnRNZXJnZUF2ZyRhdmdTdGVwcyA8LSByb3VuZChhY3Rpdml0eUludE1lcmdlQXZnJGF2Z1N0ZXBzLDEpCnBsb3QoYWN0aXZpdHlJbnRNZXJnZUF2ZyRpbnRlcnZhbCxhY3Rpdml0eUludE1lcmdlQXZnJGF2Z1N0ZXBzLHR5cGUgPSAibCIsIG1haW4gPSAiSW50ZXJ2YWwgYWZ0ZXIgTkEgRmlsbGVkIix4bGFiID0gIjVtaW4gaW50ZXJ2YWwiLCB5bGFiID0gIjVtaW4gQXZnIFN0ZXBzIikKYGBgCgoKIyMjIyMjIDgpIFBhbmVsIHBsb3QgY29tcGFyaW5nIHRoZSBhdmVyYWdlIG51bWJlciBvZiBzdGVwcyB0YWtlbiBwZXIgNS1taW51dGUgaW50ZXJ2YWwgYWNyb3NzIHdlZWtkYXlzIGFuZCB3ZWVrZW5kcwoKCmBgYCB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMjIyMjIyA4KSBQYW5lbCBwbG90IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4gcGVyIDUtbWludXRlIGludGVydmFsIGFjcm9zcyB3ZWVrZGF5cyBhbmQgd2Vla2VuZHMKCmFjdGl2aXR5RGF0YSR3a2R5IDwtIHdlZWtkYXlzKGFjdGl2aXR5RGF0YSRkYXRlKQphY3Rpdml0eURhdGEkd2Vla3R5cGUgPC0gaWZlbHNlKChhY3Rpdml0eURhdGEkd2tkeSA9PSAiU2F0dXJkYXkiIHwgYWN0aXZpdHlEYXRhJHdrZHkgPT0gIlN1bmRheSIpLCAiV2Vla2VuZCIsICJXZWVrZGF5IiApCmFjdGl2aXR5V2sgPC0gYWN0aXZpdHlEYXRhW2NvbXBsZXRlLmNhc2VzKGFjdGl2aXR5RGF0YSksXQphY3Rpdml0eVdrZW5kIDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eVdrW3doaWNoKGFjdGl2aXR5V2skd2Vla3R5cGUgPT0iV2Vla2VuZCIpLCJzdGVwcyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbGlzdChhY3Rpdml0eVdrW3doaWNoKGFjdGl2aXR5V2skd2Vla3R5cGUgPT0iV2Vla2VuZCIpLCJpbnRlcnZhbCJdKSxtZWFuKQpuYW1lcyhhY3Rpdml0eVdrZW5kKSA8LSBjKCJpbnRlcnZhbCIsImF2Z1N0ZXBzIikKYWN0aXZpdHlXa2VuZCRpbnRlcnZhbCA8LSBhcy5pbnRlZ2VyKGFjdGl2aXR5V2tlbmQkaW50ZXJ2YWwpCmFjdGl2aXR5V2tlbmQkYXZnU3RlcHMgPC0gcm91bmQoYXMubnVtZXJpYyhhY3Rpdml0eVdrZW5kJGF2Z1N0ZXBzKSwxKQoKYWN0aXZpdHlXa2R5IDwtIGFnZ3JlZ2F0ZShhY3Rpdml0eVdrW3doaWNoKGFjdGl2aXR5V2skd2Vla3R5cGUgPT0iV2Vla2RheSIpLCJzdGVwcyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbGlzdChhY3Rpdml0eVdrW3doaWNoKGFjdGl2aXR5V2skd2Vla3R5cGUgPT0iV2Vla2RheSIpLCJpbnRlcnZhbCJdKSxtZWFuKQpuYW1lcyhhY3Rpdml0eVdrZHkgKSA8LSBjKCJpbnRlcnZhbCIsImF2Z1N0ZXBzIikKYWN0aXZpdHlXa2R5JGludGVydmFsIDwtIGFzLmludGVnZXIoYWN0aXZpdHlXa2R5JGludGVydmFsKQphY3Rpdml0eVdrZHkkYXZnU3RlcHMgPC0gcm91bmQoYXMubnVtZXJpYyhhY3Rpdml0eVdrZHkkYXZnU3RlcHMpLDEpCnBhcihtZnJvdz1jKDIsMSkpCiNwYXIobWZjb2w9YygyLDEpKQpwbG90KGFjdGl2aXR5V2tkeSRpbnRlcnZhbCwgYWN0aXZpdHlXa2R5JGF2Z1N0ZXBzLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiV2tEYXkgQXZnIFN0ZXBzIikKcGxvdChhY3Rpdml0eVdrZW5kJGludGVydmFsLCBhY3Rpdml0eVdrZW5kJGF2Z1N0ZXBzLCB0eXBlID0gImwiLHhsYWIgPSAiaW50ZXJ2YWwiLCB5bGFiID0gIldrRW5kIEF2ZyBTdGVwcyIpCm10ZXh0KCJXZWVrZW5kIHZzLiBXZWVrZGF5IEF2ZyBTdGVwcyIsIHNpZGU9Mywgb3V0ZXI9VFJVRSwgbGluZT0tMSkgCmBgYAoKIyMjIExpY2Vuc2UgYW5kIENvcHlyaWdodCBOb3RpY2UKICAgICBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vcGltaWtleW1pa2UvcmVwcm9kdWNpYmxlLXJlc2VhcmNoCiAgICAgQ29weXJpZ2h0IDIwMTcgTWljaGFlbCBHYXJjaWEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgSW5xdWlyaWVzIG1nYXJfZGF0YXNjaWVuY2UgYXQgcHJvdG9ubWFpbC5jb20KICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgICAKICAgICBMaWNlbnNlIE1hbmFnZW1lbnQgdGhyb3VnaCBodHRwOi8vZm9zc2EuaW8vICAgICAKIyMK