Exercise 1

The data below come from tidytuesday and provide information on accidents at theme parks. You can see more of these data available here. The data give you some details of where and when the accident occurred, and something about the injured party as well.

safer_parks.csv {-}

variable class description
acc_id double Unique ID
acc_date character Accident Date
acc_state character Accident State
acc_city character Accident City
fix_port character .
source character Source of injury report
bus_type character Business type
industry_sector character Industry sector
device_category character Device category
device_type character Device type
tradename_or_generic character Common name of the device
manufacturer character Manufacturer of device
num_injured double Num injured
age_youngest double Youngest individual injured
gender character Gender of individual injured
acc_desc character Description of accident
injury_desc character Injury description
report character Report URL
category character Category of accident
mechanical double Mechanical failure (binary NA/1)
op_error double Operator error (binary NA/1)
employee double Employee error (binary NA/1)
notes character Additional notes

Working with the safer_parks data, complete the following tasks.

Problem (a)

Using acc_date, create a new date variable called idate that is a proper date column generated via {lubridate}.

Problem (b)

Now create new columns for (i) the month of the accident, and (ii) the day of the week. These should not be abbreviated (i.e., we should see the values as ‘Monday’ instead of ‘Mon’, “July” instead of “Jul”). What month had the highest number of accidents? What day of the week had the highest number of accidents?

## # A tibble: 12 x 2
##    injury_month     n
##    <ord>        <int>
##  1 July          1702
##  2 August        1448
##  3 June          1322
##  4 May            706
##  5 September      575
##  6 March          493
##  7 April          484
##  8 October        461
##  9 December       320
## 10 November       302
## 11 February       281
## 12 January        257
## # A tibble: 7 x 2
##   injury_dow     n
##   <ord>      <int>
## 1 Saturday    2070
## 2 Sunday      1633
## 3 Friday      1128
## 4 Monday       985
## 5 Thursday     926
## 6 Wednesday    830
## 7 Tuesday      779

Looks like the month of July, and Saturdays, respectively.

Problem (c)

What if you look at days of the week by month? Does the same day of the week show up with the most accidents regardless of month or do we see some variation?

## # A tibble: 84 x 3
##    injury_month injury_dow     n
##    <ord>        <ord>      <int>
##  1 July         Saturday     330
##  2 August       Saturday     328
##  3 June         Saturday     316
##  4 July         Sunday       287
##  5 August       Sunday       259
##  6 July         Friday       251
##  7 July         Thursday     218
##  8 June         Sunday       217
##  9 July         Monday       216
## 10 July         Wednesday    203
## # … with 74 more rows

Well, Saturdays for the most part.

Problem (d)

What were the five dates with the most number of accidents?

## # A tibble: 1,845 x 2
##    idate          n
##    <date>     <int>
##  1 2014-08-16    23
##  2 2012-07-21    22
##  3 2015-07-11    21
##  4 2015-06-13    20
##  5 2015-06-14    20
##  6 2015-07-19    20
##  7 2016-08-06    20
##  8 2014-06-14    19
##  9 2015-07-13    19
## 10 2016-08-27    19
## # … with 1,835 more rows

Problem (e)

Using the Texas injury data, answer the following question: What ride was the safest? [Hint: For each ride (ride_name) you will need to calculate the number of days between accidents. The ride with the highest number of days is the safest.]

tx_injuries.csv

variable class description
injury_report_rec double Unique Record ID
name_of_operation character Company name
city character City
st character State (all TX)
injury_date character Injury date - note there are some different formats
ride_name character Ride Name
serial_no character Serial number of ride
gender character Gender of the injured individual
age character Age of the injured individual
body_part character Body part injured
alleged_injury character Alleged injury - type of injury
cause_of_injury character Approximate cause of the injury (free text)
other character Anecdotal information in addition to cause of injury
## # A tibble: 542 x 4
## # Groups:   ride_name [252]
##    date       ride_name          tspan tspan.days
##    <date>     <chr>              <dbl>      <dbl>
##  1 2015-04-16 iFly Austin     50025600        579
##  2 2014-07-26 Batman          36720000        425
##  3 2014-08-25 Coyote Cannon   35769600        414
##  4 2014-09-07 Tsunami Surge   35078400        406
##  5 2014-07-25 Howlin' Tornado 33696000        390
##  6 2014-08-31 Stingray Falls  33350400        386
##  7 2014-07-04 Cliffhanger     31276800        362
##  8 2014-05-16 Go Karts        29894400        346
##  9 2014-06-17 Mr. Freeze      28857600        334
## 10 2014-07-22 Dragon Blaster  28080000        325
## # … with 532 more rows

You should note that this assumes each ride was in operation for the same amount of time. If this is not true then our estimates will be unreliable.

The injury_date problem fix …

## # A tibble: 542 x 14
##    injury_report_r… name_of_operati… city  st    injury_date ride_name serial_no
##               <dbl> <chr>            <chr> <chr> <chr>       <chr>     <chr>    
##  1             2032 Skygroup Invest… Aust… TX    2/12/2013   I Fly     SV024    
##  2             1897 Willie G's Post… Galv… TX    3/2/2013    Gulf Gli… GS-11-10…
##  3              837 Great Wolf Lodge Grap… TX    3/3/2013    Howlin T… 0643-C1-…
##  4               99 Six Flags Fiest… San … TX    3/3/2013    Scooby D… n/a      
##  5               55 Ray Cammack Sho… Lave… AZ    3/11/2013   Alien Ab… 862162   
##  6              780 ZDT's Amusement… Segu… TX    3/12/2013   Go Karts  n/a      
##  7              253 Six Flags Over … Arli… TX    3/15/2013   Gold Riv… 01-0511  
##  8              253 Six Flags Over … Arli… TX    3/15/2013   Titan     COCO62   
##  9               55 Ray Cammack Sho… Lave… AZ    3/16/2013   Wild Riv… 97-05-00…
## 10               55 Ray Cammack Sho… Lave… AZ    3/16/2013   Sky Ride… A-878-B  
## # … with 532 more rows, and 7 more variables: gender <chr>, age <chr>,
## #   body_part <chr>, alleged_injury <chr>, cause_of_injury <chr>, other <chr>,
## #   new_date <dttm>

Exercise 2

These data (see below) come from this story: The next generation: The space race is dominated by new contenders. You have data on space missions over time, with dates of the launch, the launching agency/country, type of launch vehicle, and so on.

launches {-}

variable definition
tag Harvard or [COSPAR][cospar] id of launch
JD [Julian Date][jd] of launch
launch_date date of launch
launch_year year of launch
type type of launch vehicle
variant variant of launch vehicle
mission space mission
agency launching agency
state_code launching agency’s state
category success (O) or failure (F)
agency_type type of agency

Problem (a)

Create a new column called date that stores launch_date as a proper data field in ymd format from {lubridate}.

Problem (b)

Creating columns as needed, calculate and show the number of launches first by year, then by month, and then by day of the week. The result should be arranged in descending order of the number of launches.

## # A tibble: 63 x 2
##     year     n
##    <dbl> <int>
##  1  1967   139
##  2  1971   134
##  3  1975   132
##  4  1966   131
##  5  1976   131
##  6  1977   130
##  7  1982   129
##  8  1983   129
##  9  1984   129
## 10  1968   128
## # … with 53 more rows
## # A tibble: 12 x 2
##    month         n
##    <ord>     <int>
##  1 December    579
##  2 June        524
##  3 October     523
##  4 September   511
##  5 April       504
##  6 August      495
##  7 July        466
##  8 May         460
##  9 March       447
## 10 November    435
## 11 February    429
## 12 January     340
## # A tibble: 31 x 2
##      day     n
##    <int> <int>
##  1    28   248
##  2    25   227
##  3    24   217
##  4    14   213
##  5    21   211
##  6    15   210
##  7    26   208
##  8    16   206
##  9    20   205
## 10    18   204
## # … with 21 more rows
## # A tibble: 7 x 2
##   dow           n
##   <ord>     <int>
## 1 Thursday   1112
## 2 Wednesday  1102
## 3 Friday     1030
## 4 Tuesday     971
## 5 Saturday    618
## 6 Monday      534
## 7 Sunday      346

So 1967, the month of December, the 28th of a month, and Thursday have the most launches, respectively.

Problem (c)

How many launches were successful (O) versus failed (F) by country and year? The countries of interest will be state_code values of “CN”, “F”, “J”, “RU”, “SU”, “US”. You do not need to arrange your results in any order.

## # A tibble: 370 x 4
##    state_code  year category     n
##    <chr>      <dbl> <chr>    <int>
##  1 CN          1970 O            1
##  2 CN          1971 O            1
##  3 CN          1973 F            1
##  4 CN          1974 F            2
##  5 CN          1975 O            3
##  6 CN          1976 F            1
##  7 CN          1976 O            2
##  8 CN          1978 O            1
##  9 CN          1979 F            1
## 10 CN          1981 O            1
## # … with 360 more rows
LS0tCnRpdGxlOiAiTVBBIDU4MzAgLSBNb2R1bGUgMDQgRXhlcmNpc2VzIgpzdWJ0aXRsZTogIlNwcmluZyAyMDIwIgphdXRob3I6ICJQcm9mZXNzb3IgUnVoaWwiCmRhdGU6ICJVcGRhdGVkIG9uIGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgpib2R5eyAvKiBOb3JtYWwgICovCi8qICAgIGZvbnQtZmFtaWx5OiBMYXRvLCBzYW5zLXNlcmlmOyAgCiAgICAgIGZvbnQtZmFtaWx5OiBNdWt0YSwgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtZmFtaWx5OiAnTnVuaXRvIFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBmb250LWZhbWlseTogS2FybGEsIHNhbnMtc2VyaWY7ICAqLwogICAgICBmb250LWZhbWlseTogJ01lcnJpd2VhdGhlciBTYW5zJywgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtc2l6ZTogMThweDsKICB9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAzOHB4OwogIGNvbG9yOiBEYXJrUmVkOwp9CgpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDIgeyAvKiBIZWFkZXIgMiAqLwogICAgZm9udC1zaXplOiAyMnB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMThweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KCmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1mYW1pbHk6IE11a3RhLCBzYW5zLXNlcmlmOyAKICAgIGZvbnQtd2VpZ2h0OiA2MDA7ICAKICAgIGZvbnQtc2l6ZTogMThweDsKfQoKLyogcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTZweDsKfSAqLwo8L3N0eWxlPgoKCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0Ka2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScsIGNvbG9yID0gJ2Nvcm5mbG93ZXJibHVlJywgcG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZHBpID0gMzAwLCBjYWNoZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDgsIG91dC53aWR0aCA9ICIxMDAlIiwgaGlnaGxpZ2h0ID0gVFJVRSkgCmBgYAoKIyBFeGVyY2lzZSAxCgpUaGUgZGF0YSBiZWxvdyBjb21lIGZyb20gW3RpZHl0dWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L3RyZWUvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA5LTEwKSBhbmQgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhY2NpZGVudHMgYXQgdGhlbWUgcGFya3MuIFlvdSBjYW4gc2VlIG1vcmUgb2YgdGhlc2UgW2RhdGEgYXZhaWxhYmxlIGhlcmVdKGh0dHBzOi8vcmlkZXNkYXRhYmFzZS5vcmcvc2FmZXJwYXJrcy9kYXRhLykuIFRoZSBkYXRhIGdpdmUgeW91IHNvbWUgZGV0YWlscyBvZiB3aGVyZSBhbmQgd2hlbiB0aGUgYWNjaWRlbnQgb2NjdXJyZWQsIGFuZCBzb21ldGhpbmcgYWJvdXQgdGhlIGluanVyZWQgcGFydHkgYXMgd2VsbC4gCgpgYGB7ciBleDAxfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5bG9nKQoKc2FmZXJfcGFya3MgPC0gcmVhZHI6OnJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMTkvMjAxOS0wOS0xMC9zYWZlcnBhcmtzLmNzdiIpCmBgYAoKYHNhZmVyX3BhcmtzLmNzdmAgey19Cgp8dmFyaWFibGUgICAgICAgICAgICAgfGNsYXNzICAgICB8ZGVzY3JpcHRpb24gfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS18Oi0tLS0tLS0tLS0tfAp8YWNjX2lkICAgICAgICAgICAgICAgfGRvdWJsZSAgICB8IFVuaXF1ZSBJRCB8CnxhY2NfZGF0ZSAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQWNjaWRlbnQgRGF0ZSB8CnxhY2Nfc3RhdGUgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQWNjaWRlbnQgU3RhdGUgfAp8YWNjX2NpdHkgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFjY2lkZW50IENpdHkgfAp8Zml4X3BvcnQgICAgICAgICAgICAgfGNoYXJhY3RlciB8LiAgICAgICAgICAgfAp8c291cmNlICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IFNvdXJjZSBvZiBpbmp1cnkgcmVwb3J0IHwKfGJ1c190eXBlICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBCdXNpbmVzcyB0eXBlIHwKfGluZHVzdHJ5X3NlY3RvciAgICAgIHxjaGFyYWN0ZXIgfCBJbmR1c3RyeSBzZWN0b3IgfAp8ZGV2aWNlX2NhdGVnb3J5ICAgICAgfGNoYXJhY3RlciB8IERldmljZSBjYXRlZ29yeSB8CnxkZXZpY2VfdHlwZSAgICAgICAgICB8Y2hhcmFjdGVyIHwgRGV2aWNlIHR5cGUgfAp8dHJhZGVuYW1lX29yX2dlbmVyaWMgfGNoYXJhY3RlciB8IENvbW1vbiBuYW1lIG9mIHRoZSBkZXZpY2UgfAp8bWFudWZhY3R1cmVyICAgICAgICAgfGNoYXJhY3RlciB8IE1hbnVmYWN0dXJlciBvZiBkZXZpY2UgfAp8bnVtX2luanVyZWQgICAgICAgICAgfGRvdWJsZSAgICB8IE51bSBpbmp1cmVkIHwKfGFnZV95b3VuZ2VzdCAgICAgICAgIHxkb3VibGUgICAgfCBZb3VuZ2VzdCBpbmRpdmlkdWFsIGluanVyZWQgfAp8Z2VuZGVyICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEdlbmRlciBvZiBpbmRpdmlkdWFsIGluanVyZWQgfAp8YWNjX2Rlc2MgICAgICAgICAgICAgfGNoYXJhY3RlciB8IERlc2NyaXB0aW9uIG9mIGFjY2lkZW50IHwKfGluanVyeV9kZXNjICAgICAgICAgIHxjaGFyYWN0ZXIgfCBJbmp1cnkgZGVzY3JpcHRpb24gfAp8cmVwb3J0ICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IFJlcG9ydCBVUkwgfAp8Y2F0ZWdvcnkgICAgICAgICAgICAgfGNoYXJhY3RlciB8IENhdGVnb3J5IG9mIGFjY2lkZW50IHwKfG1lY2hhbmljYWwgICAgICAgICAgIHxkb3VibGUgICAgfCBNZWNoYW5pY2FsIGZhaWx1cmUgKGJpbmFyeSBOQS8xKSB8CnxvcF9lcnJvciAgICAgICAgICAgICB8ZG91YmxlICAgIHwgT3BlcmF0b3IgZXJyb3IgKGJpbmFyeSBOQS8xKXwKfGVtcGxveWVlICAgICAgICAgICAgIHxkb3VibGUgICAgfCBFbXBsb3llZSBlcnJvciAoYmluYXJ5IE5BLzEpfAp8bm90ZXMgICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFkZGl0aW9uYWwgbm90ZXN8IAoKV29ya2luZyB3aXRoIHRoZSBgc2FmZXJfcGFya3NgIGRhdGEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgdGFza3MuIAoKIyMgUHJvYmxlbSAoYSkgey19ClVzaW5nIGBhY2NfZGF0ZWAsIGNyZWF0ZSBhIG5ldyBkYXRlIHZhcmlhYmxlIGNhbGxlZCBgaWRhdGVgIHRoYXQgaXMgYSBwcm9wZXIgZGF0ZSBjb2x1bW4gZ2VuZXJhdGVkIHZpYSB7bHVicmlkYXRlfS4gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgbXV0YXRlKAogICAgaWRhdGUgPSBtZHkoYWNjX2RhdGUpCiAgICApIC0+IHNhZmVyX3BhcmtzCmBgYAoKIyMgUHJvYmxlbSAoYikgey19Ck5vdyBjcmVhdGUgbmV3IGNvbHVtbnMgZm9yIChpKSB0aGUgbW9udGggb2YgdGhlIGFjY2lkZW50LCBhbmQgKGlpKSB0aGUgZGF5IG9mIHRoZSB3ZWVrLiBUaGVzZSBzaG91bGQgbm90IGJlIGFiYnJldmlhdGVkIChpLmUuLCB3ZSBzaG91bGQgc2VlIHRoZSB2YWx1ZXMgYXMgJ01vbmRheScgaW5zdGVhZCBvZiAnTW9uJywgIkp1bHkiIGluc3RlYWQgb2YgIkp1bCIpLiBXaGF0IG1vbnRoIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgYWNjaWRlbnRzPyBXaGF0IGRheSBvZiB0aGUgd2VlayBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGFjY2lkZW50cz8gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgbXV0YXRlKAogICAgaW5qdXJ5X21vbnRoID0gbW9udGgoaWRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwKICAgIGluanVyeV9kb3cgPSB3ZGF5KGlkYXRlLCBsYWJlbCA9IFRSVUUsIGFiYnIgPSBGQUxTRSkKICApIC0+IHNhZmVyX3BhcmtzCgpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGluanVyeV9tb250aCkpICU+JQogIGNvdW50KGluanVyeV9tb250aCwgc29ydCA9IFRSVUUpCgpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGluanVyeV9kb3cpKSAlPiUKICBjb3VudChpbmp1cnlfZG93LCBzb3J0ID0gVFJVRSkKYGBgCgpMb29rcyBsaWtlIHRoZSBtb250aCBvZiBKdWx5LCBhbmQgU2F0dXJkYXlzLCByZXNwZWN0aXZlbHkuIAoKIyMgUHJvYmxlbSAoYykgey19CldoYXQgaWYgeW91IGxvb2sgYXQgZGF5cyBvZiB0aGUgd2VlayBieSBtb250aD8gRG9lcyB0aGUgc2FtZSBkYXkgb2YgdGhlIHdlZWsgc2hvdyB1cCB3aXRoIHRoZSBtb3N0IGFjY2lkZW50cyByZWdhcmRsZXNzIG9mIG1vbnRoIG9yIGRvIHdlIHNlZSBzb21lIHZhcmlhdGlvbj8gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgZmlsdGVyKCFpcy5uYShpbmp1cnlfbW9udGgpKSAlPiUKICBjb3VudChpbmp1cnlfbW9udGgsIGluanVyeV9kb3csIHNvcnQgPSBUUlVFKQpgYGAKCldlbGwsIFNhdHVyZGF5cyBmb3IgdGhlIG1vc3QgcGFydC4gCgojIyBQcm9ibGVtIChkKSB7LX0KV2hhdCB3ZXJlIHRoZSBgZml2ZWAgZGF0ZXMgd2l0aCB0aGUgbW9zdCBudW1iZXIgb2YgYWNjaWRlbnRzPyAKCmBgYHtyfQpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGlkYXRlKSkgJT4lCiAgY291bnQoaWRhdGUsIHNvcnQgPSBUUlVFKSAlPiUKICBhcnJhbmdlKC1uKQpgYGAKCiMjIGByIGZvbnRhd2Vzb21lOjpmYSgiZmlyZSIsIGZpbGwgPSAiZGFya3JlZCIpYCBQcm9ibGVtIChlKSB7LX0KVXNpbmcgdGhlIFRleGFzIGluanVyeSBkYXRhLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbjogV2hhdCByaWRlIHdhcyB0aGUgc2FmZXN0PyBbSGludDogRm9yIGVhY2ggcmlkZSAoYHJpZGVfbmFtZWApIHlvdSB3aWxsIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGFjY2lkZW50cy4gVGhlIHJpZGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGF5cyBpcyB0aGUgc2FmZXN0Ll0gCgpgYGB7ciB0eGluanVyeX0KcmVhZF9jc3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA5LTEwL3R4X2luanVyaWVzLmNzdiIKICApIC0+IHR4X2luanVyaWVzCmBgYAoKYHR4X2luanVyaWVzLmNzdmAKCnx2YXJpYWJsZSAgICAgICAgICB8Y2xhc3MgICAgIHxkZXNjcmlwdGlvbiB8Cnw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLXw6LS0tLS0tLS0tLS18Cnxpbmp1cnlfcmVwb3J0X3JlYyB8ZG91YmxlICAgIHwgVW5pcXVlIFJlY29yZCBJRCB8CnxuYW1lX29mX29wZXJhdGlvbiB8Y2hhcmFjdGVyIHwgQ29tcGFueSBuYW1lIHwKfGNpdHkgICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBDaXR5IHwKfHN0ICAgICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBTdGF0ZSAoYWxsIFRYKSB8Cnxpbmp1cnlfZGF0ZSAgICAgICB8Y2hhcmFjdGVyIHwgSW5qdXJ5IGRhdGUgLSBub3RlIHRoZXJlIGFyZSBzb21lIGRpZmZlcmVudCBmb3JtYXRzIHwKfHJpZGVfbmFtZSAgICAgICAgIHxjaGFyYWN0ZXIgfCBSaWRlIE5hbWUgfAp8c2VyaWFsX25vICAgICAgICAgfGNoYXJhY3RlciB8IFNlcmlhbCBudW1iZXIgb2YgcmlkZSB8CnxnZW5kZXIgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgR2VuZGVyIG9mIHRoZSBpbmp1cmVkIGluZGl2aWR1YWwgfAp8YWdlICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFnZSBvZiB0aGUgaW5qdXJlZCBpbmRpdmlkdWFsIHwKfGJvZHlfcGFydCAgICAgICAgIHxjaGFyYWN0ZXIgfCBCb2R5IHBhcnQgaW5qdXJlZCB8CnxhbGxlZ2VkX2luanVyeSAgICB8Y2hhcmFjdGVyIHwgQWxsZWdlZCBpbmp1cnkgLSB0eXBlIG9mIGluanVyeSB8CnxjYXVzZV9vZl9pbmp1cnkgICB8Y2hhcmFjdGVyIHwgQXBwcm94aW1hdGUgY2F1c2Ugb2YgdGhlIGluanVyeSAoZnJlZSB0ZXh0KSB8CnxvdGhlciAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQW5lY2RvdGFsIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIGNhdXNlIG9mIGluanVyeSB8CgoKYGBge3J9CnR4X2luanVyaWVzICU+JQogIG11dGF0ZShkYXRlID0gbWR5KGluanVyeV9kYXRlKSkgJT4lCiAgZ3JvdXBfYnkocmlkZV9uYW1lKSAlPiUKICBhcnJhbmdlKGRhdGUpICU+JQogIG11dGF0ZSgKICAgIHRzcGFuID0gaW50ZXJ2YWwobGFnKGRhdGUsIG9yZGVyX2J5ID0gcmlkZV9uYW1lKSwgZGF0ZSksCiAgICB0c3Bhbi5kYXlzID0gYXMuZHVyYXRpb24odHNwYW4pL2RkYXlzKDEpCiAgKSAlPiUKICBzZWxlY3QoZGF0ZSwgcmlkZV9uYW1lLCB0c3BhbiwgdHNwYW4uZGF5cykgJT4lCiAgYXJyYW5nZSgtdHNwYW4uZGF5cykKYGBgCgpZb3Ugc2hvdWxkIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgZWFjaCByaWRlIHdhcyBpbiBvcGVyYXRpb24gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lLiBJZiB0aGlzIGlzIG5vdCB0cnVlIHRoZW4gb3VyIGVzdGltYXRlcyB3aWxsIGJlIHVucmVsaWFibGUuIAoKPiBUaGUgYGluanVyeV9kYXRlYCBwcm9ibGVtIGZpeCAuLi4KCmBgYHtyIGZpeH0KdHhfaW5qdXJpZXMgJT4lCiAgbXV0YXRlKAogICAgbmV3X2RhdGUgPSBwYXJzZV9kYXRlX3RpbWUoCiAgICAgIHR4X2luanVyaWVzJGluanVyeV9kYXRlLAogICAgICBvcmRlcnMgPSBjKCJkIG0geSIsICJkIEIgWSIsICJtL2QveSIsICJ5bWQiKSkKICAgICkKCmBgYAoKCiMgRXhlcmNpc2UgMiB7LX0KVGhlc2UgZGF0YSAoc2VlIGJlbG93KSBjb21lIGZyb20gdGhpcyBzdG9yeTogW1RoZSBuZXh0IGdlbmVyYXRpb246IFRoZSBzcGFjZSByYWNlIGlzIGRvbWluYXRlZCBieSBuZXcgY29udGVuZGVyc10oaHR0cHM6Ly93d3cuZWNvbm9taXN0LmNvbS9ncmFwaGljLWRldGFpbC8yMDE4LzEwLzE4L3RoZS1zcGFjZS1yYWNlLWlzLWRvbWluYXRlZC1ieS1uZXctY29udGVuZGVycykuIFlvdSBoYXZlIGRhdGEgb24gc3BhY2UgbWlzc2lvbnMgb3ZlciB0aW1lLCB3aXRoIGRhdGVzIG9mIHRoZSBsYXVuY2gsIHRoZSBsYXVuY2hpbmcgYWdlbmN5L2NvdW50cnksIHR5cGUgb2YgbGF1bmNoIHZlaGljbGUsIGFuZCBzbyBvbi4gCgpgbGF1bmNoZXNgIHstfQoKfCB2YXJpYWJsZSAgICB8IGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgdGFnICAgICAgICAgfCBIYXJ2YXJkIG9yIFtDT1NQQVJdW2Nvc3Bhcl0gaWQgb2YgbGF1bmNoIHwKfCBKRCAgICAgICAgICB8IFtKdWxpYW4gRGF0ZV1bamRdIG9mIGxhdW5jaCAgICAgICAgICAgICAgfAp8IGxhdW5jaF9kYXRlIHwgZGF0ZSBvZiBsYXVuY2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgbGF1bmNoX3llYXIgfCB5ZWFyIG9mIGxhdW5jaCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCB0eXBlICAgICAgICB8IHR5cGUgb2YgbGF1bmNoIHZlaGljbGUgICAgICAgICAgICAgICAgICAgfAp8IHZhcmlhbnQgICAgIHwgdmFyaWFudCBvZiBsYXVuY2ggdmVoaWNsZSAgICAgICAgICAgICAgICB8CnwgbWlzc2lvbiAgICAgfCBzcGFjZSBtaXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBhZ2VuY3kgICAgICB8IGxhdW5jaGluZyBhZ2VuY3kgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IHN0YXRlX2NvZGUgIHwgbGF1bmNoaW5nIGFnZW5jeSdzIHN0YXRlICAgICAgICAgICAgICAgICB8CnwgY2F0ZWdvcnkgICAgfCBzdWNjZXNzIChPKSBvciBmYWlsdXJlIChGKSAgICAgICAgICAgICAgIHwKfCBhZ2VuY3lfdHlwZSB8IHR5cGUgb2YgYWdlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKCgpgYGB7cn0KcmVhZF9jc3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTAxLTE1L2xhdW5jaGVzLmNzdiIKICApIC0+IGxhdW5jaGVzCmBgYAoKIyMgUHJvYmxlbSAoYSkgey19CkNyZWF0ZSBhIG5ldyBjb2x1bW4gY2FsbGVkIGBkYXRlYCB0aGF0IHN0b3JlcyBgbGF1bmNoX2RhdGVgIGFzIGEgcHJvcGVyIGRhdGEgZmllbGQgaW4geW1kIGZvcm1hdCBmcm9tIHtsdWJyaWRhdGV9LiAKCmBgYHtyfQpsYXVuY2hlcyAlPiUKICBtdXRhdGUoZGF0ZSA9IHltZChsYXVuY2hfZGF0ZSkpIC0+IGxhdS5kZgpgYGAKCiMjIFByb2JsZW0gKGIpIHstfQpDcmVhdGluZyBjb2x1bW5zIGFzIG5lZWRlZCwgY2FsY3VsYXRlIGFuZCBzaG93IHRoZSBudW1iZXIgb2YgbGF1bmNoZXMgZmlyc3QgYnkgeWVhciwgdGhlbiBieSBtb250aCwgYW5kIHRoZW4gYnkgZGF5IG9mIHRoZSB3ZWVrLiBUaGUgcmVzdWx0IHNob3VsZCBiZSBhcnJhbmdlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZSBudW1iZXIgb2YgbGF1bmNoZXMuIAoKYGBge3J9CmxhdS5kZiAlPiUKICBtdXRhdGUoCiAgICB5ZWFyID0geWVhcihkYXRlKSwKICAgIG1vbnRoID0gbW9udGgoZGF0ZSwgYWJiciA9IEZBTFNFLCBsYWJlbCA9IFRSVUUpLAogICAgZGF5ID0gZGF5KGRhdGUpLAogICAgZG93ID0gd2RheShkYXRlLCBhYmJyID0gRkFMU0UsIGxhYmVsID0gVFJVRSkKICApIC0+IGxhdS5kZgoKbGF1LmRmICU+JQogIGZpbHRlcighaXMubmEoeWVhcikpICU+JQogIGNvdW50KHllYXIsIHNvcnQgPSBUUlVFKSAKCmxhdS5kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vbnRoKSkgJT4lCiAgY291bnQobW9udGgsIHNvcnQgPSBUUlVFKSAKICAKbGF1LmRmICU+JQogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lCiAgY291bnQoZGF5LCBzb3J0ID0gVFJVRSkgCgpsYXUuZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShkb3cpKSAlPiUKICBjb3VudChkb3csIHNvcnQgPSBUUlVFKSAKYGBgCgpTbyAxOTY3LCB0aGUgbW9udGggb2YgRGVjZW1iZXIsIHRoZSAyOHRoIG9mIGEgbW9udGgsIGFuZCBUaHVyc2RheSBoYXZlIHRoZSBtb3N0IGxhdW5jaGVzLCByZXNwZWN0aXZlbHkuIAoKCiMjIFByb2JsZW0gKGMpIHstfQpIb3cgbWFueSBsYXVuY2hlcyB3ZXJlIHN1Y2Nlc3NmdWwgYChPKWAgdmVyc3VzIGZhaWxlZCBgKEYpYCBieSBjb3VudHJ5IGFuZCB5ZWFyPyBUaGUgY291bnRyaWVzIG9mIGludGVyZXN0IHdpbGwgYmUgc3RhdGVfY29kZSB2YWx1ZXMgb2YgIkNOIiwgIkYiLCAiSiIsICJSVSIsICJTVSIsICJVUyIuIFlvdSBkbyBub3QgbmVlZCB0byBhcnJhbmdlIHlvdXIgcmVzdWx0cyBpbiBhbnkgb3JkZXIuIAoKYGBge3J9CmxhdS5kZiAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEoZGF0ZSksCiAgICBzdGF0ZV9jb2RlICVpbiUgYygiQ04iLCAiRiIsICJKIiwgIlJVIiwgIlNVIiwgIlVTIikKICAgICkgJT4lCiAgY291bnQoc3RhdGVfY29kZSwgeWVhciwgY2F0ZWdvcnkpCmBgYAoK