Worst health and economic harmful weather events in the USA

Synopsis: This brief analysis explores the data from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database, and tries to answer three simple questions:


1. Data Processing

1.1 Downloading and reading

The data is retrieved from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database and is read into R with the read.csv function. The coming analyses take into account the complete dataset.

# data loading into R from the raw CSV file
# Download file
if (!file.exists( "./data" )) { 
    dir.create( "./data" ) 
}
Warning messages:
1: Unknown or uninitialised column: 'PROPDMGEXPfactor'. 
2: Unknown or uninitialised column: 'PROPDMGEXPfactor'. 
3: Unknown or uninitialised column: 'PROPDMGEXPfactor'. 
4: Unknown or uninitialised column: 'CROPDMGEXPfactor'. 
5: Unknown or uninitialised column: 'CROPDMGEXPfactor'. 
6: Unknown or uninitialised column: 'CROPDMGEXPfactor'. 
file = "./data/repdata_data_StormData.csv.bz2"
fileUrl1 = "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
if ( !file.exists( file ) ) {
    download.file( fileUrl1 , destfile = file)
}   
# Read file
if ( !exists ( 'StormData.csv' ) ) {
    StormData.csv = read.csv( file  )
}   

1.2 Fatalities summary

For the number of fatalities analysis, two columns were extracted of the original data:

Column Description
EVTYPE Has the type of weather event
FATALITIES Has the number of fatalities of each record

The number of fatalities is calculated across each type of weather event and the ten with more fatalities are presented.

library( dplyr )
fatalities = 
    StormData.csv %>%
    filter( FATALITIES > 0 ) %>%
    select( EVTYPE, FATALITIES ) %>%
    group_by( EVTYPE ) %>%
    summarise( TotalFatalities = sum(FATALITIES) ) %>%
    top_n( 10, TotalFatalities )  %>%
    mutate( EVTYPE = as.character( EVTYPE ) ) %>%
    arrange( desc(TotalFatalities) ) %>%
    mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )  
    

1.3 Injuries summary

For the number of injuries analysis, two columns were extracted of the original data:

Column Description
EVTYPE Has the type of weather event
INJURIES Has the number of injuries of each record

The number of injuries is calculated across each type of weather event and the ten with more injuries are presented.

injuries = 
    StormData.csv %>%
    filter( INJURIES > 0 ) %>%
    select( EVTYPE, INJURIES ) %>%
    group_by( EVTYPE ) %>%
    summarise( TotalInjuries = sum(INJURIES) ) %>%
    ungroup() %>%
    top_n( 10, TotalInjuries )  %>%
    mutate( EVTYPE = as.character( EVTYPE ) ) %>%
    arrange( desc(TotalInjuries) ) %>%
    mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )  

1.4 Economical damage summary

According to the chapter 2.7 of the National Weather Service Storm Data Documentation, there is four columns relevant to the quantification of economic losses:

Column Description
PROPDMG Property damage
PROPDMGEXP Property damage factor: K= thousands, M= millions, B= billions
CROPDMG Crop damage
CROPDMGEXP Crop damage factor: K= thousands, M= millions, B= billions

For this analysis the economic damage, in USD, is calculated this way:

\[DamageCost ~ = ~ PROPDMG ~ * ~ PROPDMGEXP ~ + ~ CROPDMG ~ * ~ CROPDMGEXP\]

The economical damage, in USD Billions is calculated across each type of weather event and the ten more expensive are presented.

expenses = 
    StormData.csv %>%
    filter( (PROPDMG + CROPDMG) > 0 ) %>%
    select( EVTYPE, starts_with( 'PROP'), starts_with( 'CROP' ) )
expenses$PROPDMGEXPfactor = 1
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in% 
                                    c( 'K', 'k' ) ] = 1000
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in% 
                                    c( 'm', 'M' ) ] = 1000000
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in% 
                                    c( 'B', 'b' ) ] = 1000000000
expenses$CROPDMGEXPfactor = 1
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in% 
                                    c( 'K', 'k' ) ] = 1000
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in% 
                                    c( 'm', 'M' ) ] = 1000000
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in% 
                                    c( 'B', 'b' ) ] = 1000000000
expenses =
    expenses  %>%
    mutate( losses = PROPDMG * PROPDMGEXPfactor +
                CROPDMG * CROPDMGEXPfactor ) %>%
    group_by( EVTYPE ) %>%
    summarise( EconomicLosses = sum(losses) ) %>%
    ungroup() %>%
    top_n( 10, EconomicLosses )  %>%
    mutate( EVTYPE = as.character( EVTYPE ), 
            EconomicLosses = EconomicLosses / 1000000000 ) %>%
    arrange( desc(EconomicLosses) ) %>%
    mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )

2. Results

2.1 - Weather events that causes more fatalities

In the next plot, it is shown the ten weather events that have caused more fatalities across the USA.

library( ggplot2 )
# barplot( fatalities$TotalFatalities, 
#          legend.text = fatalities$EVTYPE )
ggplot( fatalities, aes( EVTYPE, TotalFatalities) ) +
    geom_col( ) + 
    theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
    labs( title = "2.1 - Weather events with more fatalities in USA" , 
          x = '' )


2.2 - Weather events that causes more injuries

In the next plot, it is shown the ten weather events that have caused more injuries across the USA.

# barplot( injuries$TotalInjuries, 
#          legend.text = injuries$EVTYPE )
ggplot( injuries, aes( EVTYPE, TotalInjuries) ) +
    geom_col( ) + 
    theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
    labs( title = "2.2 - Weather events with more injuries in USA" , 
          x = '' )


2.3 - Weather events that causes more economical expenses

In the next plot, it is shown the ten weather events that have caused the greatest economic losses across the USA.

# barplot( expenses$EconomicLosses, 
#          legend.text = expenses$EVTYPE )
ggplot( expenses, aes( EVTYPE, EconomicLosses) ) +
    geom_col( ) + 
    theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
    labs( title = "2.3 - Weather events more expensive in USA" , 
          x = '', y = 'Economic damage (USD Billions)' )


LS0tDQp0aXRsZTogIldvcnN0IGhlYWx0aCBhbmQgZWNvbm9taWMgaGFybWZ1bCB3ZWF0aGVyIGV2ZW50cyBpbiB0aGUgVVNBIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfaGVpZ2h0OiA3DQogICAgZmlnX3dpZHRoOiA5DQotLS0NCg0KLS0tDQoNCiMgV29yc3QgaGVhbHRoIGFuZCBlY29ub21pYyBoYXJtZnVsIHdlYXRoZXIgZXZlbnRzIGluIHRoZSBVU0ENCg0KKioqU3lub3BzaXMqKio6IA0KKlRoaXMgYnJpZWYgYW5hbHlzaXMgZXhwbG9yZXMgdGhlIGRhdGEgZnJvbSB0aGUgVS5TLiBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbidzIChOT0FBKSBzdG9ybSBbZGF0YWJhc2VdKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MiksIGFuZCB0cmllcyB0byBhbnN3ZXIgdGhyZWUgc2ltcGxlIHF1ZXN0aW9uczoqDQoNCi0gKldoaWNoIHR5cGVzIG9mIHdlYXRoZXIgZXZlbnRzIGNhdXNlIG1vcmUgZmF0YWxpdGllcyB0byB0aGUgVVNBIHBvcHVsYXRpb24/Kg0KLSAqV2hpY2ggdHlwZXMgb2Ygd2VhdGhlciBldmVudHMgY2F1c2VzIG1vcmUgaW5qdXJpZXMgdG8gdGhlIFVTQSBwb3B1bGF0aW9uPyoNCi0gKldoaWNoIHR5cGVzIG9mIHdlYXRoZXIgZXZlbnRzIGFyZSB0aGUgbW9zdCBleHBlbnNpdmUgdG8gVVNBPyoNCg0KLS0tDQoNCiMgMS4gRGF0YSBQcm9jZXNzaW5nDQoNCiMjIDEuMSBEb3dubG9hZGluZyBhbmQgcmVhZGluZw0KDQpUaGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgVS5TLiBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbidzIChOT0FBKSBzdG9ybSBbZGF0YWJhc2VdKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MikgYW5kIGlzIHJlYWQgaW50byBSIHdpdGggdGhlICoqYHJlYWQuY3N2YCoqIGZ1bmN0aW9uLiBUaGUgY29taW5nIGFuYWx5c2VzIHRha2UgaW50byBhY2NvdW50IHRoZSBjb21wbGV0ZSBkYXRhc2V0Lg0KDQoNCmBgYHtyIERhdGFQcm9jZXNzaW5nLCBjYWNoZT1UUlVFfQ0KDQojIGRhdGEgbG9hZGluZyBpbnRvIFIgZnJvbSB0aGUgcmF3IENTViBmaWxlDQoNCiMgRG93bmxvYWQgZmlsZQ0KDQppZiAoIWZpbGUuZXhpc3RzKCAiLi9kYXRhIiApKSB7IA0KICAgIGRpci5jcmVhdGUoICIuL2RhdGEiICkgDQp9DQoNCmZpbGUgPSAiLi9kYXRhL3JlcGRhdGFfZGF0YV9TdG9ybURhdGEuY3N2LmJ6MiINCmZpbGVVcmwxID0gImh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MiINCg0KaWYgKCAhZmlsZS5leGlzdHMoIGZpbGUgKSApIHsNCiAgICBkb3dubG9hZC5maWxlKCBmaWxlVXJsMSAsIGRlc3RmaWxlID0gZmlsZSkNCn0gICANCg0KIyBSZWFkIGZpbGUNCmlmICggIWV4aXN0cyAoICdTdG9ybURhdGEuY3N2JyApICkgew0KICAgIFN0b3JtRGF0YS5jc3YgPSByZWFkLmNzdiggZmlsZSAgKQ0KfSAgIA0KDQoNCmBgYA0KDQojIyAxLjIgRmF0YWxpdGllcyBzdW1tYXJ5DQoNCkZvciB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYW5hbHlzaXMsIHR3byBjb2x1bW5zIHdlcmUgZXh0cmFjdGVkIG9mIHRoZSBvcmlnaW5hbCBkYXRhOg0KDQpDb2x1bW4gfCBEZXNjcmlwdGlvbg0KLS0tfC0tLQ0KRVZUWVBFIHwgSGFzIHRoZSB0eXBlIG9mIHdlYXRoZXIgZXZlbnQNCkZBVEFMSVRJRVMgfCBIYXMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIG9mIGVhY2ggcmVjb3JkDQoNCg0KVGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGlzIGNhbGN1bGF0ZWQgYWNyb3NzIGVhY2ggdHlwZSBvZiB3ZWF0aGVyIGV2ZW50IGFuZCB0aGUgdGVuIHdpdGggbW9yZSBmYXRhbGl0aWVzIGFyZSBwcmVzZW50ZWQuIA0KDQoNCmBgYHtyIGZhdGFsaXRpZXN9DQoNCmxpYnJhcnkoIGRwbHlyICkNCmZhdGFsaXRpZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggRkFUQUxJVElFUyA+IDAgKSAlPiUNCiAgICBzZWxlY3QoIEVWVFlQRSwgRkFUQUxJVElFUyApICU+JQ0KICAgIGdyb3VwX2J5KCBFVlRZUEUgKSAlPiUNCiAgICBzdW1tYXJpc2UoIFRvdGFsRmF0YWxpdGllcyA9IHN1bShGQVRBTElUSUVTKSApICU+JQ0KICAgIHRvcF9uKCAxMCwgVG90YWxGYXRhbGl0aWVzICkgICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gYXMuY2hhcmFjdGVyKCBFVlRZUEUgKSApICU+JQ0KICAgIGFycmFuZ2UoIGRlc2MoVG90YWxGYXRhbGl0aWVzKSApICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gZmFjdG9yKCBFVlRZUEUsIGxldmVscyA9IEVWVFlQRSApICkgIA0KICAgIA0KDQpgYGANCg0KDQojIyAxLjMgSW5qdXJpZXMgc3VtbWFyeQ0KDQpGb3IgdGhlIG51bWJlciBvZiBpbmp1cmllcyBhbmFseXNpcywgdHdvIGNvbHVtbnMgd2VyZSBleHRyYWN0ZWQgb2YgdGhlIG9yaWdpbmFsIGRhdGE6DQoNCkNvbHVtbiB8IERlc2NyaXB0aW9uDQotLS18LS0tDQpFVlRZUEUgfCBIYXMgdGhlIHR5cGUgb2Ygd2VhdGhlciBldmVudA0KSU5KVVJJRVMgfCBIYXMgdGhlIG51bWJlciBvZiBpbmp1cmllcyBvZiBlYWNoIHJlY29yZA0KDQoNClRoZSBudW1iZXIgb2YgaW5qdXJpZXMgaXMgY2FsY3VsYXRlZCBhY3Jvc3MgZWFjaCB0eXBlIG9mIHdlYXRoZXIgZXZlbnQgYW5kIHRoZSB0ZW4gd2l0aCBtb3JlIGluanVyaWVzIGFyZSBwcmVzZW50ZWQuDQoNCg0KYGBge3IgaW5qdXJpZXN9DQoNCg0KaW5qdXJpZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggSU5KVVJJRVMgPiAwICkgJT4lDQogICAgc2VsZWN0KCBFVlRZUEUsIElOSlVSSUVTICkgJT4lDQogICAgZ3JvdXBfYnkoIEVWVFlQRSApICU+JQ0KICAgIHN1bW1hcmlzZSggVG90YWxJbmp1cmllcyA9IHN1bShJTkpVUklFUykgKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgdG9wX24oIDEwLCBUb3RhbEluanVyaWVzICkgICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gYXMuY2hhcmFjdGVyKCBFVlRZUEUgKSApICU+JQ0KICAgIGFycmFuZ2UoIGRlc2MoVG90YWxJbmp1cmllcykgKSAlPiUNCiAgICBtdXRhdGUoIEVWVFlQRSA9IGZhY3RvciggRVZUWVBFLCBsZXZlbHMgPSBFVlRZUEUgKSApICANCg0KYGBgDQoNCg0KIyMgMS40IEVjb25vbWljYWwgZGFtYWdlIHN1bW1hcnkNCg0KQWNjb3JkaW5nIHRvIHRoZSBjaGFwdGVyIDIuNyBvZiB0aGUgTmF0aW9uYWwgV2VhdGhlciBTZXJ2aWNlIFtTdG9ybSBEYXRhIERvY3VtZW50YXRpb25dKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRnBlZXIyX2RvYyUyRnBkMDEwMTYwMDVjdXJyLnBkZiksIHRoZXJlIGlzIGZvdXIgY29sdW1ucyByZWxldmFudCB0byB0aGUgcXVhbnRpZmljYXRpb24gb2YgZWNvbm9taWMgbG9zc2VzOg0KDQpDb2x1bW4gfCBEZXNjcmlwdGlvbg0KLS0tfC0tLQ0KUFJPUERNRyB8IFByb3BlcnR5IGRhbWFnZQ0KUFJPUERNR0VYUCB8IFByb3BlcnR5IGRhbWFnZSBmYWN0b3I6IEs9IHRob3VzYW5kcywgTT0gbWlsbGlvbnMsIEI9IGJpbGxpb25zDQpDUk9QRE1HIHwgQ3JvcCBkYW1hZ2UNCkNST1BETUdFWFAgfCBDcm9wIGRhbWFnZSBmYWN0b3I6IEs9IHRob3VzYW5kcywgTT0gbWlsbGlvbnMsIEI9IGJpbGxpb25zDQoNCkZvciB0aGlzIGFuYWx5c2lzIHRoZSBlY29ub21pYyBkYW1hZ2UsIGluIFVTRCwgaXMgY2FsY3VsYXRlZCB0aGlzIHdheToNCg0KJCREYW1hZ2VDb3N0IH4gPSB+IFBST1BETUcgfiAqIH4gUFJPUERNR0VYUCB+ICsgfiBDUk9QRE1HIH4gKiB+IENST1BETUdFWFAkJA0KDQpUaGUgZWNvbm9taWNhbCBkYW1hZ2UsIGluIFVTRCBCaWxsaW9ucyBpcyBjYWxjdWxhdGVkIGFjcm9zcyBlYWNoIHR5cGUgb2Ygd2VhdGhlciBldmVudCBhbmQgdGhlIHRlbiBtb3JlIGV4cGVuc2l2ZSBhcmUgcHJlc2VudGVkLiANCg0KDQpgYGB7ciBlY29ub21pY19sb3NzZXN9DQoNCg0KZXhwZW5zZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggKFBST1BETUcgKyBDUk9QRE1HKSA+IDAgKSAlPiUNCiAgICBzZWxlY3QoIEVWVFlQRSwgc3RhcnRzX3dpdGgoICdQUk9QJyksIHN0YXJ0c193aXRoKCAnQ1JPUCcgKSApDQoNCmV4cGVuc2VzJFBST1BETUdFWFBmYWN0b3IgPSAxDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnSycsICdrJyApIF0gPSAxMDAwDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnbScsICdNJyApIF0gPSAxMDAwMDAwDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnQicsICdiJyApIF0gPSAxMDAwMDAwMDAwDQoNCmV4cGVuc2VzJENST1BETUdFWFBmYWN0b3IgPSAxDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnSycsICdrJyApIF0gPSAxMDAwDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnbScsICdNJyApIF0gPSAxMDAwMDAwDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnQicsICdiJyApIF0gPSAxMDAwMDAwMDAwDQoNCmV4cGVuc2VzID0NCiAgICBleHBlbnNlcyAgJT4lDQogICAgbXV0YXRlKCBsb3NzZXMgPSBQUk9QRE1HICogUFJPUERNR0VYUGZhY3RvciArDQogICAgICAgICAgICAgICAgQ1JPUERNRyAqIENST1BETUdFWFBmYWN0b3IgKSAlPiUNCiAgICBncm91cF9ieSggRVZUWVBFICkgJT4lDQogICAgc3VtbWFyaXNlKCBFY29ub21pY0xvc3NlcyA9IHN1bShsb3NzZXMpICkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIHRvcF9uKCAxMCwgRWNvbm9taWNMb3NzZXMgKSAgJT4lDQogICAgbXV0YXRlKCBFVlRZUEUgPSBhcy5jaGFyYWN0ZXIoIEVWVFlQRSApLCANCiAgICAgICAgICAgIEVjb25vbWljTG9zc2VzID0gRWNvbm9taWNMb3NzZXMgLyAxMDAwMDAwMDAwICkgJT4lDQogICAgYXJyYW5nZSggZGVzYyhFY29ub21pY0xvc3NlcykgKSAlPiUNCiAgICBtdXRhdGUoIEVWVFlQRSA9IGZhY3RvciggRVZUWVBFLCBsZXZlbHMgPSBFVlRZUEUgKSApDQoNCg0KYGBgDQoNCg0KLS0tDQoNCiMgMi4gUmVzdWx0cw0KDQojIyAyLjEgLSBXZWF0aGVyIGV2ZW50cyB0aGF0IGNhdXNlcyBtb3JlIGZhdGFsaXRpZXMNCg0KSW4gdGhlIG5leHQgcGxvdCwgaXQgaXMgc2hvd24gdGhlIHRlbiB3ZWF0aGVyIGV2ZW50cyB0aGF0IGhhdmUgY2F1c2VkIG1vcmUgZmF0YWxpdGllcyBhY3Jvc3MgdGhlIFVTQS4NCg0KDQpgYGB7ciBwbG90MX0NCg0KbGlicmFyeSggZ2dwbG90MiApDQoNCiMgYmFycGxvdCggZmF0YWxpdGllcyRUb3RhbEZhdGFsaXRpZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGZhdGFsaXRpZXMkRVZUWVBFICkNCg0KZ2dwbG90KCBmYXRhbGl0aWVzLCBhZXMoIEVWVFlQRSwgVG90YWxGYXRhbGl0aWVzKSApICsNCiAgICBnZW9tX2NvbCggKSArIA0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgICBsYWJzKCB0aXRsZSA9ICIyLjEgLSBXZWF0aGVyIGV2ZW50cyB3aXRoIG1vcmUgZmF0YWxpdGllcyBpbiBVU0EiICwgDQogICAgICAgICAgeCA9ICcnICkNCg0KDQpgYGANCg0KDQotLS0NCg0KIyMgMi4yIC0gV2VhdGhlciBldmVudHMgdGhhdCBjYXVzZXMgbW9yZSBpbmp1cmllcw0KDQpJbiB0aGUgbmV4dCBwbG90LCBpdCBpcyBzaG93biB0aGUgdGVuIHdlYXRoZXIgZXZlbnRzIHRoYXQgaGF2ZSBjYXVzZWQgbW9yZSBpbmp1cmllcyBhY3Jvc3MgdGhlIFVTQS4NCg0KDQpgYGB7ciBwbG90Mn0NCg0KDQojIGJhcnBsb3QoIGluanVyaWVzJFRvdGFsSW5qdXJpZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGluanVyaWVzJEVWVFlQRSApDQoNCmdncGxvdCggaW5qdXJpZXMsIGFlcyggRVZUWVBFLCBUb3RhbEluanVyaWVzKSApICsNCiAgICBnZW9tX2NvbCggKSArIA0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgICBsYWJzKCB0aXRsZSA9ICIyLjIgLSBXZWF0aGVyIGV2ZW50cyB3aXRoIG1vcmUgaW5qdXJpZXMgaW4gVVNBIiAsIA0KICAgICAgICAgIHggPSAnJyApDQoNCg0KYGBgDQoNCg0KLS0tDQoNCiMjIDIuMyAtIFdlYXRoZXIgZXZlbnRzIHRoYXQgY2F1c2VzIG1vcmUgZWNvbm9taWNhbCBleHBlbnNlcw0KDQoNCg0KSW4gdGhlIG5leHQgcGxvdCwgaXQgaXMgc2hvd24gdGhlIHRlbiB3ZWF0aGVyIGV2ZW50cyB0aGF0IGhhdmUgY2F1c2VkIHRoZSBncmVhdGVzdCBlY29ub21pYyBsb3NzZXMgYWNyb3NzIHRoZSBVU0EuDQoNCg0KYGBge3IgcGxvdDN9DQoNCiMgYmFycGxvdCggZXhwZW5zZXMkRWNvbm9taWNMb3NzZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGV4cGVuc2VzJEVWVFlQRSApDQoNCmdncGxvdCggZXhwZW5zZXMsIGFlcyggRVZUWVBFLCBFY29ub21pY0xvc3NlcykgKSArDQogICAgZ2VvbV9jb2woICkgKyANCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpKSArDQogICAgbGFicyggdGl0bGUgPSAiMi4zIC0gV2VhdGhlciBldmVudHMgbW9yZSBleHBlbnNpdmUgaW4gVVNBIiAsIA0KICAgICAgICAgIHggPSAnJywgeSA9ICdFY29ub21pYyBkYW1hZ2UgKFVTRCBCaWxsaW9ucyknICkNCg0KDQpgYGANCg0KDQotLS0NCg0K