Synopsis: This analysis goes over the weather events that have the
biggest effects on population health and economic costs. Two separate
analyses are done within the same original dataset: one for population
health (injuries and fatalities), and one for economic costs (property
damage and crop damage). Both areas are examined by extracting the
weather events with the top 10 biggest effects on them. Data of the
highest contributing weather events are examined separately from the
rest to see how they affect these variables.
Data Processing
library(knitr)
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
data <- read.csv('repdata_data_StormData.csv')
#get structure of the StormData dataframe
head(str(data))
'data.frame': 902297 obs. of 37 variables:
$ STATE__ : num 1 1 1 1 1 1 1 1 1 1 ...
$ BGN_DATE : chr "4/18/1950 0:00:00" "4/18/1950 0:00:00" "2/20/1951 0:00:00" "6/8/1951 0:00:00" ...
$ BGN_TIME : chr "0130" "0145" "1600" "0900" ...
$ TIME_ZONE : chr "CST" "CST" "CST" "CST" ...
$ COUNTY : num 97 3 57 89 43 77 9 123 125 57 ...
$ COUNTYNAME: chr "MOBILE" "BALDWIN" "FAYETTE" "MADISON" ...
$ STATE : chr "AL" "AL" "AL" "AL" ...
$ EVTYPE : chr "TORNADO" "TORNADO" "TORNADO" "TORNADO" ...
$ BGN_RANGE : num 0 0 0 0 0 0 0 0 0 0 ...
$ BGN_AZI : chr "" "" "" "" ...
$ BGN_LOCATI: chr "" "" "" "" ...
$ END_DATE : chr "" "" "" "" ...
$ END_TIME : chr "" "" "" "" ...
$ COUNTY_END: num 0 0 0 0 0 0 0 0 0 0 ...
$ COUNTYENDN: logi NA NA NA NA NA NA ...
$ END_RANGE : num 0 0 0 0 0 0 0 0 0 0 ...
$ END_AZI : chr "" "" "" "" ...
$ END_LOCATI: chr "" "" "" "" ...
$ LENGTH : num 14 2 0.1 0 0 1.5 1.5 0 3.3 2.3 ...
$ WIDTH : num 100 150 123 100 150 177 33 33 100 100 ...
$ F : int 3 2 2 2 2 2 2 1 3 3 ...
$ MAG : num 0 0 0 0 0 0 0 0 0 0 ...
$ FATALITIES: num 0 0 0 0 0 0 0 0 1 0 ...
$ INJURIES : num 15 0 2 2 2 6 1 0 14 0 ...
$ PROPDMG : num 25 2.5 25 2.5 2.5 2.5 2.5 2.5 25 25 ...
$ PROPDMGEXP: chr "K" "K" "K" "K" ...
$ CROPDMG : num 0 0 0 0 0 0 0 0 0 0 ...
$ CROPDMGEXP: chr "" "" "" "" ...
$ WFO : chr "" "" "" "" ...
$ STATEOFFIC: chr "" "" "" "" ...
$ ZONENAMES : chr "" "" "" "" ...
$ LATITUDE : num 3040 3042 3340 3458 3412 ...
$ LONGITUDE : num 8812 8755 8742 8626 8642 ...
$ LATITUDE_E: num 3051 0 0 0 0 ...
$ LONGITUDE_: num 8806 0 0 0 0 ...
$ REMARKS : chr "" "" "" "" ...
$ REFNUM : num 1 2 3 4 5 6 7 8 9 10 ...
NULL
Questions to answer: - Which types of events (EVTYPE) are most
harmful relative to population health? - Which types of events have
greatest economic impact across united states?
- Popluation Health Data Processing
#for the first question, the main columns to analyze are EVTYPE, FATALATIES, INJURIES
evtype_health <- data[, c('EVTYPE','FATALITIES','INJURIES')]
#there are too many unique evtypes, so going to filter the data so that we only analyze the one's that have the top 10 most fatalities or top 10 injuries
#getting sums of fatalities and injuries for each unique event type
sum_fatalities <- aggregate(FATALITIES ~ EVTYPE, data = evtype_health, sum, na.rm=TRUE)
sum_injuries <- aggregate(INJURIES ~ EVTYPE, data=evtype_health, sum, na.rm=TRUE)
#get the top ten events from sums of fatalities
fatal_top10 <- sum_fatalities %>%
slice_max(order_by = FATALITIES, n = 10, with_ties = FALSE) %>%
pull(EVTYPE)
#get top ten events from sums of injuries
injury_top10 <- sum_injuries %>%
slice_max(order_by = INJURIES, n = 10, with_ties = FALSE) %>%
pull(EVTYPE)
#subset the first df to only have events with top ten most fatalaties
#subset again to with top 10 injuries
#subset again for events that are top 10 in both fatalities and injuries
evtype_fatalities <- evtype_health[evtype_health$EVTYPE %in% fatal_top10,]
evtype_injuries <- evtype_health[evtype_health$EVTYPE %in% injury_top10,]
evtype_top10_both <- evtype_health[evtype_health$EVTYPE %in% intersect(fatal_top10, injury_top10),]
#end with three subsetted dataframes for each category (top 10 fatalities, top 10 injuries, intersection of events in top 10 fatalities and injuries)
#see the names of events with the most fatalities and injuries
print(fatal_top10)
[1] "TORNADO" "EXCESSIVE HEAT" "FLASH FLOOD" "HEAT" "LIGHTNING" "TSTM WIND"
[7] "FLOOD" "RIP CURRENT" "HIGH WIND" "AVALANCHE"
print(injury_top10)
[1] "TORNADO" "TSTM WIND" "FLOOD" "EXCESSIVE HEAT" "LIGHTNING"
[6] "HEAT" "ICE STORM" "FLASH FLOOD" "THUNDERSTORM WIND" "HAIL"
#see names of events that are in the top 10 of both fatalities and injuries
print(intersect(fatal_top10, injury_top10))
[1] "TORNADO" "EXCESSIVE HEAT" "FLASH FLOOD" "HEAT" "LIGHTNING" "TSTM WIND"
[7] "FLOOD"
- Economic Cost Data Processing
#relevant columns from the original dataset are PROPDMG, PROPDMGEXP, CROPDMG, CROPDMGEXP, and EVTYPE
econ <- data[, c('EVTYPE','PROPDMG', 'PROPDMGEXP','CROPDMG','CROPDMGEXP')]
#Like the previous analysis, I'm going to extract the event types with the highest total Property and Crop damage
#first make a function that will use the EXP columns (PROPDMGEXP and CROPDMGEXP) to get the actual value of the DMG columns
exp_multiplier <- function(x) {
case_when(
x %in% c("H", "h") ~ 1e2,
x %in% c("K", "k") ~ 1e3,
x %in% c("M", "m") ~ 1e6,
x %in% c("B", "b") ~ 1e9,
TRUE ~ 1
)
}
#add new columns that show the DMG cost multiplied by the corresponding EXP
econ_dmg <- econ %>%
mutate(
prop_dmg_total = PROPDMG * exp_multiplier(PROPDMGEXP),
crop_dmg_total = CROPDMG * exp_multiplier(CROPDMGEXP)
)
#get sums of property damage costs for each event type
prop_dmg_by_event <- econ_dmg %>%
group_by(EVTYPE) %>%
summarise(
total_prop_damage = sum(prop_dmg_total, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(total_prop_damage))
#get sums of crop damage costs for each event type
crop_dmg_by_event <- econ_dmg %>%
group_by(EVTYPE) %>%
summarise(
total_crop_damage = sum(crop_dmg_total, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(total_crop_damage))
#from these two data frames I can get the top 10 event types for both propery and crop damage
prop_top10 <- prop_dmg_by_event[1:10,]
crop_top10 <- crop_dmg_by_event[1:10,]
#look at the names of the events with highes property and crop damage
print(prop_top10$EVTYPE)
print(crop_top10$EVTYPE)
Results
- Population Health
#to visualize population health effects, I'm going to only use the event types that are in the top 10 of BOTH fatalities and injuries
#I'll make bar plots for each of these event types that show total injuries and fatalities
#first the evtype_top10_both dataframe needs to be changed into longform. This will be done by adding a new column 'health_type' (either fatality or injury), and another column 'counts' (for fatality or injury)
# Gather fatalities and injuries into long format for stacked bars
evtype_long <- evtype_top10_both %>%
select(EVTYPE, FATALITIES, INJURIES) %>%
pivot_longer(
cols = c(FATALITIES, INJURIES),
names_to = "health_type",
values_to = "count"
)
#convert the health_type column to factors
evtype_long <- evtype_long %>%
mutate(type = factor(health_type, levels = c("INJURIES", "FATALITIES")))
#this new df will be used to make barplots for each top 10 event type, showing total counts of fatalities and injuries
ggplot(evtype_long, aes(x = reorder(EVTYPE, -count), y = count, fill = health_type)) +
geom_col() +
labs(
x = "Event Type",
y = "Count",
fill = "Type"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

It’s clear that tornado’s are the most dangerous weather events in
the united states with regard to human health. Of events that are in the
top 10 for both Injuries and fatalities, they account for the most in
each category.
- Economic Impact
#visualize the property/crop damage caused by these events
p <- ggplot(prop_top10, aes(x=reorder(EVTYPE, -total_prop_damage), y=total_prop_damage, fill=EVTYPE))
p + geom_col() + labs(x='Event Type', y='Total Cost (billions)', title='Total Property Damage by Event Type (top 10 events)') + theme(axis.text.x = element_blank()) + scale_y_continuous(labels = label_number(scale = 1e-9, suffix = "B"))

c <- ggplot(crop_top10, aes(x=reorder(EVTYPE, -total_crop_damage), y=total_crop_damage, fill=EVTYPE))
c + geom_col() + labs(x='Event Type', y='Total Cost (billions)', title='Total Crop Damage by Event Type (top 10 events)') + theme(axis.text.x = element_blank()) + scale_y_continuous(labels = label_number(scale = 1e-9, suffix = "B"))

The largest cause of property damage are floods, and the largest
cause of crop damage are droughts. The costs of each of these are nearly
double the second-most damaging.
LS0tCnRpdGxlOiAiU3Rvcm0gRXZlbnQgUG9wdWxhdGlvbiBhbmQgRWNvbm9taWMgRWZmZWN0cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU3lub3BzaXM6CiAgVGhpcyBhbmFseXNpcyBnb2VzIG92ZXIgdGhlIHdlYXRoZXIgZXZlbnRzIHRoYXQgaGF2ZSB0aGUgYmlnZ2VzdCBlZmZlY3RzIG9uIHBvcHVsYXRpb24gaGVhbHRoIGFuZCBlY29ub21pYyBjb3N0cy4gVHdvIHNlcGFyYXRlIGFuYWx5c2VzIGFyZSBkb25lIHdpdGhpbiB0aGUgc2FtZSBvcmlnaW5hbCBkYXRhc2V0OiBvbmUgZm9yIHBvcHVsYXRpb24gaGVhbHRoIChpbmp1cmllcyBhbmQgZmF0YWxpdGllcyksIGFuZCBvbmUgZm9yIGVjb25vbWljIGNvc3RzIChwcm9wZXJ0eSBkYW1hZ2UgYW5kIGNyb3AgZGFtYWdlKS4gQm90aCBhcmVhcyBhcmUgZXhhbWluZWQgYnkgZXh0cmFjdGluZyB0aGUgd2VhdGhlciBldmVudHMgd2l0aCB0aGUgdG9wIDEwIGJpZ2dlc3QgZWZmZWN0cyBvbiB0aGVtLiBEYXRhIG9mIHRoZSBoaWdoZXN0IGNvbnRyaWJ1dGluZyB3ZWF0aGVyIGV2ZW50cyBhcmUgZXhhbWluZWQgc2VwYXJhdGVseSBmcm9tIHRoZSByZXN0IHRvIHNlZSBob3cgdGhleSBhZmZlY3QgdGhlc2UgdmFyaWFibGVzLgoKCkRhdGEgUHJvY2Vzc2luZwpgYGB7ciwgZWNobz1UUlVFfQojbG9hZGluZyBsaWJyYXJpZXMgdGhhdCB3aWxsIGJlIHVzZWQgZG93bnN0cmVhbQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoc2NhbGVzKQpgYGAKCgpgYGB7ciwgZWNobz1UUlVFLCBjYWNoZT1UUlVFfQojbG9hZGluZCB0aGUgb3JpZ2luYWwgcmF3IGRhdGFmcmFtZSBpbnRvIFIKZGF0YSA8LSByZWFkLmNzdigncmVwZGF0YV9kYXRhX1N0b3JtRGF0YS5jc3YnKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUV9CiNnZXQgc3RydWN0dXJlIG9mIHRoZSBTdG9ybURhdGEgZGF0YWZyYW1lIGZvciBxdWljayByZWZlcmVuY2UgdGhyb3VnaG91dCBkYXRhIHByb2Nlc3NpbmcKc3RyKGRhdGEpCmBgYAoKUXVlc3Rpb25zIHRvIGFuc3dlcjoKLSBXaGljaCB0eXBlcyBvZiBldmVudHMgKEVWVFlQRSkgYXJlIG1vc3QgaGFybWZ1bCByZWxhdGl2ZSB0byBwb3B1bGF0aW9uIGhlYWx0aD8KLSBXaGljaCB0eXBlcyBvZiBldmVudHMgaGF2ZSBncmVhdGVzdCBlY29ub21pYyBpbXBhY3QgYWNyb3NzIHVuaXRlZCBzdGF0ZXM/CgoKCjEpIFBvcGx1YXRpb24gSGVhbHRoIERhdGEgUHJvY2Vzc2luZwoKYGBge3IsIGVjaG89VFJVRSwgY2FjaGU9VFJVRX0KI2ZvciB0aGUgZmlyc3QgcXVlc3Rpb24sIHRoZSBtYWluIGNvbHVtbnMgdG8gYW5hbHl6ZSBhcmUgRVZUWVBFLCBGQVRBTEFUSUVTLCBJTkpVUklFUwoKI2V4dHJhY3QgdGhlc2UgY29sdW1ucyBmcm9tIHRoZSBvcmlnaW5hbCBkZgpldnR5cGVfaGVhbHRoIDwtIGRhdGFbLCBjKCdFVlRZUEUnLCdGQVRBTElUSUVTJywnSU5KVVJJRVMnKV0KCgojdGhlcmUgYXJlIHRvbyBtYW55IHVuaXF1ZSBldnR5cGVzLCBzbyBnb2luZyB0byBmaWx0ZXIgdGhlIGRhdGEgc28gdGhhdCB3ZSBvbmx5IGFuYWx5emUgdGhlIG9uZSdzIHRoYXQgaGF2ZSB0aGUgdG9wIDEwIG1vc3QgZmF0YWxpdGllcyBvciB0b3AgMTAgaW5qdXJpZXMKCgojZ2V0dGluZyBzdW1zIG9mIGZhdGFsaXRpZXMgYW5kIGluanVyaWVzIGZvciBlYWNoIHVuaXF1ZSBldmVudCB0eXBlCiNtYWtlIGRhdGFmcmFtZXMgd2l0aCBvbmx5IHR3byBjb2x1bW5zIEVWVFlQRSBhbmQgc3VtIG9mIGVpdGhlciBmYXRhbGl0aWVzIG9yIGluanVyaWVzCnN1bV9mYXRhbGl0aWVzIDwtIGFnZ3JlZ2F0ZShGQVRBTElUSUVTIH4gRVZUWVBFLCBkYXRhID0gZXZ0eXBlX2hlYWx0aCwgc3VtLCBuYS5ybT1UUlVFKQpzdW1faW5qdXJpZXMgPC0gYWdncmVnYXRlKElOSlVSSUVTIH4gRVZUWVBFLCBkYXRhPWV2dHlwZV9oZWFsdGgsIHN1bSwgbmEucm09VFJVRSkKCgojZ2V0IHRoZSB0b3AgdGVuIGV2ZW50cyBmcm9tIHN1bXMgb2YgZmF0YWxpdGllcwojdGhpcyBpcyBhIGNoYXJhY3RlciB2ZWN0b3Igb2YgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgdGhhdCBjYXVzZSB0aGUgbW9zdCBmYXRhbGl0aWVzCmZhdGFsX3RvcDEwIDwtIHN1bV9mYXRhbGl0aWVzICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IEZBVEFMSVRJRVMsIG4gPSAxMCwgd2l0aF90aWVzID0gRkFMU0UpICU+JQogIHB1bGwoRVZUWVBFKQoKI2dldCB0b3AgdGVuIGV2ZW50cyBmcm9tIHN1bXMgb2YgaW5qdXJpZXMKaW5qdXJ5X3RvcDEwIDwtIHN1bV9pbmp1cmllcyAlPiUKICBzbGljZV9tYXgob3JkZXJfYnkgPSBJTkpVUklFUywgbiA9IDEwLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lCiAgcHVsbChFVlRZUEUpCgoKI3N1YnNldCB0aGUgZmlyc3QgZGYgdG8gb25seSBoYXZlIGV2ZW50cyB3aXRoIHRvcCB0ZW4gbW9zdCBmYXRhbGF0aWVzCiNzdWJzZXQgYWdhaW4gdG8gd2l0aCB0b3AgMTAgaW5qdXJpZXMKI3N1YnNldCBhZ2FpbiBmb3IgZXZlbnRzIHRoYXQgYXJlIHRvcCAxMCBpbiBib3RoIGZhdGFsaXRpZXMgYW5kIGluanVyaWVzCmV2dHlwZV9mYXRhbGl0aWVzIDwtIGV2dHlwZV9oZWFsdGhbZXZ0eXBlX2hlYWx0aCRFVlRZUEUgJWluJSBmYXRhbF90b3AxMCxdCgpldnR5cGVfaW5qdXJpZXMgPC0gZXZ0eXBlX2hlYWx0aFtldnR5cGVfaGVhbHRoJEVWVFlQRSAlaW4lIGluanVyeV90b3AxMCxdCgpldnR5cGVfdG9wMTBfYm90aCA8LSBldnR5cGVfaGVhbHRoW2V2dHlwZV9oZWFsdGgkRVZUWVBFICVpbiUgaW50ZXJzZWN0KGZhdGFsX3RvcDEwLCBpbmp1cnlfdG9wMTApLF0KCiNlbmQgd2l0aCB0aHJlZSBzdWJzZXR0ZWQgZGF0YWZyYW1lcyBmb3IgZWFjaCBjYXRlZ29yeSAodG9wIDEwIGZhdGFsaXRpZXMsIHRvcCAxMCBpbmp1cmllcywgaW50ZXJzZWN0aW9uIG9mIGV2ZW50cyBpbiB0b3AgMTAgZmF0YWxpdGllcyBhbmQgaW5qdXJpZXMpCmBgYAoKYGBge3IsIGVjaG89VFJVRX0KI3NlZSB0aGUgbmFtZXMgb2YgZXZlbnRzIHdpdGggdGhlIG1vc3QgZmF0YWxpdGllcyBhbmQgaW5qdXJpZXMKcHJpbnQoZmF0YWxfdG9wMTApCnByaW50KGluanVyeV90b3AxMCkKCiNzZWUgbmFtZXMgb2YgZXZlbnRzIHRoYXQgYXJlIGluIHRoZSB0b3AgMTAgb2YgYm90aCBmYXRhbGl0aWVzIGFuZCBpbmp1cmllcwpwcmludChpbnRlcnNlY3QoZmF0YWxfdG9wMTAsIGluanVyeV90b3AxMCkpCmBgYAoKCgoKMikgRWNvbm9taWMgQ29zdCBEYXRhIFByb2Nlc3NpbmcKYGBge3IsIGVjaG89VFJVRX0KI3JlbGV2YW50IGNvbHVtbnMgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YXNldCBhcmUgUFJPUERNRywgUFJPUERNR0VYUCwgQ1JPUERNRywgQ1JPUERNR0VYUCwgYW5kIEVWVFlQRQoKZWNvbiA8LSBkYXRhWywgYygnRVZUWVBFJywnUFJPUERNRycsICdQUk9QRE1HRVhQJywnQ1JPUERNRycsJ0NST1BETUdFWFAnKV0KYGBgCgpgYGB7ciwgZWNobz1UUlVFfQojTGlrZSB0aGUgcHJldmlvdXMgYW5hbHlzaXMsIEknbSBnb2luZyB0byBleHRyYWN0IHRoZSBldmVudCB0eXBlcyB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIFByb3BlcnR5IGFuZCBDcm9wIGRhbWFnZQoKI2ZpcnN0IG1ha2UgYSBmdW5jdGlvbiB0aGF0IHdpbGwgdXNlIHRoZSBFWFAgY29sdW1ucyAoUFJPUERNR0VYUCBhbmQgQ1JPUERNR0VYUCkgdG8gZ2V0IHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIERNRyBjb2x1bW5zCmV4cF9tdWx0aXBsaWVyIDwtIGZ1bmN0aW9uKHgpIHsKICBjYXNlX3doZW4oCiAgICB4ICVpbiUgYygiSCIsICJoIikgfiAxZTIsCiAgICB4ICVpbiUgYygiSyIsICJrIikgfiAxZTMsCiAgICB4ICVpbiUgYygiTSIsICJtIikgfiAxZTYsCiAgICB4ICVpbiUgYygiQiIsICJiIikgfiAxZTksCiAgICBUUlVFIH4gMQogICkKfQoKCiNhZGQgbmV3IGNvbHVtbnMgdGhhdCBzaG93IHRoZSBETUcgY29zdCBtdWx0aXBsaWVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIEVYUAplY29uX2RtZyA8LSBlY29uICU+JQogIG11dGF0ZSgKICAgIHByb3BfZG1nX3RvdGFsID0gUFJPUERNRyAqIGV4cF9tdWx0aXBsaWVyKFBST1BETUdFWFApLAogICAgY3JvcF9kbWdfdG90YWwgPSBDUk9QRE1HICogZXhwX211bHRpcGxpZXIoQ1JPUERNR0VYUCkKICApCgoKI2dldCBzdW1zIG9mIHByb3BlcnR5IGRhbWFnZSBjb3N0cyBmb3IgZWFjaCBldmVudCB0eXBlCnByb3BfZG1nX2J5X2V2ZW50IDwtIGVjb25fZG1nICU+JQogIGdyb3VwX2J5KEVWVFlQRSkgJT4lCiAgc3VtbWFyaXNlKAogICAgdG90YWxfcHJvcF9kYW1hZ2UgPSBzdW0ocHJvcF9kbWdfdG90YWwsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUKICBhcnJhbmdlKGRlc2ModG90YWxfcHJvcF9kYW1hZ2UpKQoKCiNnZXQgc3VtcyBvZiBjcm9wIGRhbWFnZSBjb3N0cyBmb3IgZWFjaCBldmVudCB0eXBlCmNyb3BfZG1nX2J5X2V2ZW50IDwtIGVjb25fZG1nICU+JQogIGdyb3VwX2J5KEVWVFlQRSkgJT4lCiAgc3VtbWFyaXNlKAogICAgdG90YWxfY3JvcF9kYW1hZ2UgPSBzdW0oY3JvcF9kbWdfdG90YWwsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUKICBhcnJhbmdlKGRlc2ModG90YWxfY3JvcF9kYW1hZ2UpKQoKCiNmcm9tIHRoZXNlIHR3byBkYXRhIGZyYW1lcyBJIGNhbiBnZXQgdGhlIHRvcCAxMCBldmVudCB0eXBlcyBmb3IgYm90aCBwcm9wZXJ5IGFuZCBjcm9wIGRhbWFnZQpwcm9wX3RvcDEwIDwtIHByb3BfZG1nX2J5X2V2ZW50WzE6MTAsXQpjcm9wX3RvcDEwIDwtIGNyb3BfZG1nX2J5X2V2ZW50WzE6MTAsXQoKCgoKYGBgCgoKYGBge3IsIGVjaG89VFJVRX0KI2xvb2sgYXQgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgd2l0aCBoaWdoZXMgcHJvcGVydHkgYW5kIGNyb3AgZGFtYWdlCnByaW50KHByb3BfdG9wMTAkRVZUWVBFKQpwcmludChjcm9wX3RvcDEwJEVWVFlQRSkKYGBgCgoKClJlc3VsdHMKCgoxKSBQb3B1bGF0aW9uIEhlYWx0aApgYGB7ciwgZWNobz1UUlVFfQojdG8gdmlzdWFsaXplIHBvcHVsYXRpb24gaGVhbHRoIGVmZmVjdHMsIEknbSBnb2luZyB0byBvbmx5IHVzZSB0aGUgZXZlbnQgdHlwZXMgdGhhdCBhcmUgaW4gdGhlIHRvcCAxMCBvZiBCT1RIIGZhdGFsaXRpZXMgYW5kIGluanVyaWVzCgojSSdsbCBtYWtlIGJhciBwbG90cyBmb3IgZWFjaCBvZiB0aGVzZSBldmVudCB0eXBlcyB0aGF0IHNob3cgdG90YWwgaW5qdXJpZXMgYW5kIGZhdGFsaXRpZXMKCiNmaXJzdCB0aGUgZXZ0eXBlX3RvcDEwX2JvdGggZGF0YWZyYW1lIG5lZWRzIHRvIGJlIGNoYW5nZWQgaW50byBsb25nZm9ybS4gVGhpcyB3aWxsIGJlIGRvbmUgYnkgYWRkaW5nIGEgbmV3IGNvbHVtbiAnaGVhbHRoX3R5cGUnIChlaXRoZXIgZmF0YWxpdHkgb3IgaW5qdXJ5KSwgYW5kIGFub3RoZXIgY29sdW1uICdjb3VudHMnIChmb3IgZmF0YWxpdHkgb3IgaW5qdXJ5KQoKIyBHYXRoZXIgZmF0YWxpdGllcyBhbmQgaW5qdXJpZXMgaW50byBsb25nIGZvcm1hdCBmb3Igc3RhY2tlZCBiYXJzCmV2dHlwZV9sb25nIDwtIGV2dHlwZV90b3AxMF9ib3RoICU+JQogIHNlbGVjdChFVlRZUEUsIEZBVEFMSVRJRVMsIElOSlVSSUVTKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhGQVRBTElUSUVTLCBJTkpVUklFUyksCiAgICBuYW1lc190byA9ICJoZWFsdGhfdHlwZSIsCiAgICB2YWx1ZXNfdG8gPSAiY291bnQiCiAgKQoKI2NvbnZlcnQgdGhlIGhlYWx0aF90eXBlIGNvbHVtbiB0byBmYWN0b3JzCmV2dHlwZV9sb25nIDwtIGV2dHlwZV9sb25nICU+JQogIG11dGF0ZSh0eXBlID0gZmFjdG9yKGhlYWx0aF90eXBlLCBsZXZlbHMgPSBjKCJJTkpVUklFUyIsICJGQVRBTElUSUVTIikpKQoKCmBgYAoKYGBge3IsIGVjaG89VFJVRX0KI3RoaXMgbmV3IGRmIHdpbGwgYmUgdXNlZCB0byBtYWtlIGJhcnBsb3RzIGZvciBlYWNoIHRvcCAxMCBldmVudCB0eXBlLCBzaG93aW5nIHRvdGFsIGNvdW50cyBvZiBmYXRhbGl0aWVzIGFuZCBpbmp1cmllcwoKCmdncGxvdChldnR5cGVfbG9uZywgYWVzKHggPSByZW9yZGVyKEVWVFlQRSwgLWNvdW50KSwgeSA9IGNvdW50LCBmaWxsID0gaGVhbHRoX3R5cGUpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicygKICAgIHggPSAiRXZlbnQgVHlwZSIsCiAgICB5ID0gIkNvdW50IiwKICAgIGZpbGwgPSAiVHlwZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAoKCkl0J3MgY2xlYXIgdGhhdCB0b3JuYWRvJ3MgYXJlIHRoZSBtb3N0IGRhbmdlcm91cyB3ZWF0aGVyIGV2ZW50cyBpbiB0aGUgdW5pdGVkIHN0YXRlcyB3aXRoIHJlZ2FyZCB0byBodW1hbiBoZWFsdGguIE9mIGV2ZW50cyB0aGF0IGFyZSBpbiB0aGUgdG9wIDEwIGZvciBib3RoIEluanVyaWVzIGFuZCBmYXRhbGl0aWVzLCB0aGV5IGFjY291bnQgZm9yIHRoZSBtb3N0IGluIGVhY2ggY2F0ZWdvcnkuCgoKCgoyKSBFY29ub21pYyBJbXBhY3QKCgpgYGB7ciwgZWNobz1UUlVFfQojdmlzdWFsaXplIHRoZSBwcm9wZXJ0eS9jcm9wIGRhbWFnZSBjYXVzZWQgYnkgdGhlc2UgZXZlbnRzCgpwIDwtIGdncGxvdChwcm9wX3RvcDEwLCBhZXMoeD1yZW9yZGVyKEVWVFlQRSwgLXRvdGFsX3Byb3BfZGFtYWdlKSwgeT10b3RhbF9wcm9wX2RhbWFnZSwgZmlsbD1FVlRZUEUpKQoKcCArIGdlb21fY29sKCkgKyBsYWJzKHg9J0V2ZW50IFR5cGUnLCB5PSdUb3RhbCBDb3N0IChiaWxsaW9ucyknLCB0aXRsZT0nVG90YWwgUHJvcGVydHkgRGFtYWdlIGJ5IEV2ZW50IFR5cGUgKHRvcCAxMCBldmVudHMpJykgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGFiZWxfbnVtYmVyKHNjYWxlID0gMWUtOSwgc3VmZml4ID0gIkIiKSkKCgpjIDwtIGdncGxvdChjcm9wX3RvcDEwLCBhZXMoeD1yZW9yZGVyKEVWVFlQRSwgLXRvdGFsX2Nyb3BfZGFtYWdlKSwgeT10b3RhbF9jcm9wX2RhbWFnZSwgZmlsbD1FVlRZUEUpKQoKYyArIGdlb21fY29sKCkgKyBsYWJzKHg9J0V2ZW50IFR5cGUnLCB5PSdUb3RhbCBDb3N0IChiaWxsaW9ucyknLCB0aXRsZT0nVG90YWwgQ3JvcCBEYW1hZ2UgYnkgRXZlbnQgVHlwZSAodG9wIDEwIGV2ZW50cyknKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsYWJlbF9udW1iZXIoc2NhbGUgPSAxZS05LCBzdWZmaXggPSAiQiIpKQoKYGBgCgpUaGUgbGFyZ2VzdCBjYXVzZSBvZiBwcm9wZXJ0eSBkYW1hZ2UgYXJlIGZsb29kcywgYW5kIHRoZSBsYXJnZXN0IGNhdXNlIG9mIGNyb3AgZGFtYWdlIGFyZSBkcm91Z2h0cy4gVGhlIGNvc3RzIG9mIGVhY2ggb2YgdGhlc2UgYXJlIG5lYXJseSBkb3VibGUgdGhlIHNlY29uZC1tb3N0IGRhbWFnaW5nLgoKCgoKCgoKCgo=