library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
library(openintro)
## Warning: package 'openintro' was built under R version 4.4.3

##Introduction

In this vignette, we will use lubridate package from the Tidyverse to parse and manipulate data that uses date and time. The data we will use is flights dataset in nycflights13 package. We will calculate departure delays and visualize the results.

###Load Data and Perform Analysis

First, lets install and load the necessary libraries.

Let’s load the flight dataset and get a glimpse of the dataset.

## Rows: 336,776
## Columns: 19
## $ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
## $ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
## $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
## $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
## $ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
## $ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
## $ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
## $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
## $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
## $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
## $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
## $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
## $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
## $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
## $ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…

After the glimpse of the dataset, we will use functions in the lubridate package to convert date and time columns into proper datetime objects.

Step 1: Preprocess Arrival Times

With this, The date is combined into one column and the times are combined into one column for easier readability and analysis.

## Rows: 336,776
## Columns: 23
## $ year                  <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
## $ month                 <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ day                   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ dep_time              <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558…
## $ sched_dep_time        <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600…
## $ dep_delay             <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2,…
## $ arr_time              <chr> "0830", "0850", "0923", "1004", "0812", "0740", …
## $ sched_arr_time        <chr> "0819", "0830", "0850", "1022", "0837", "0728", …
## $ arr_delay             <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3…
## $ carrier               <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", …
## $ flight                <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79,…
## $ tailnum               <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN"…
## $ origin                <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR",…
## $ dest                  <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL",…
## $ air_time              <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138,…
## $ distance              <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944…
## $ hour                  <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, …
## $ minute                <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ time_hour             <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-…
## $ flight_date           <date> 2013-01-01, 2013-01-01, 2013-01-01, 2013-01-01,…
## $ actual_arrival_time   <time> 08:30:00, 08:50:00, 09:23:00, 10:04:00, 08:12:0…
## $ sched_arrival_time    <time> 08:19:00, 08:30:00, 08:50:00, 10:22:00, 08:37:0…
## $ arrival_delay_minutes <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3…

Next, we will convert the departure delay values into a numeric format for easier analysis. Then we will summarize the average departure delay for each day of the week and create a visualization to present the findings.

We will use wday function from the lubridate package to figure out what day of the week the date of departure fell on.

Analyze Delays by Carrier and Day of the Week

## Explore Delay Distribution by Origin Airport

## # A tibble: 1 × 3
##   na_count nan_count inf_count
##      <int>     <int>     <int>
## 1     8255         0         0
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  -43.00   -5.00   -2.00   12.64   11.00 1301.00    8255
## # A tibble: 1 × 2
##   below_limit above_limit
##         <int>       <int>
## 1          41       13346

##  [1]  5  6  7  8 18  9 10 11 12 13 14 15 16 17 19 20 21 22 23  1

Investigate Hourly Delay Patterns

To compare departure and arrival delays

## # A tibble: 673,552 × 3
##    day_of_week delay_type              delay_minutes
##    <ord>       <chr>                           <dbl>
##  1 Tue         departure_delay_minutes             2
##  2 Tue         arrival_delay_minutes              11
##  3 Tue         departure_delay_minutes             4
##  4 Tue         arrival_delay_minutes              20
##  5 Tue         departure_delay_minutes             2
##  6 Tue         arrival_delay_minutes              33
##  7 Tue         departure_delay_minutes            -1
##  8 Tue         arrival_delay_minutes             -18
##  9 Tue         departure_delay_minutes            -6
## 10 Tue         arrival_delay_minutes             -25
## # ℹ 673,542 more rows

##Conclusion In this analysis, we demonstrated how the Tidyverse, particularly the lubridate, dplyr, and ggplot2 packages, can be used to efficiently manipulate, clean, and visualize flight delay data. By transforming raw date and time information into structured formats, we were able to explore patterns in both departure and arrival delays across different days of the week, airports, and hours of the day. Using visualizations like bar charts, boxplots, and line graphs, we uncovered meaningful trends — for example, average delays fluctuating by weekday and departure hour.

This workflow highlights the power of tidy data principles: with a consistent and organized dataset, we can gain valuable insights quickly and clearly. The tools and techniques used here can be easily extended to other real-world datasets involving dates, times, and delay analysis.

LS0tDQp0aXRsZTogIlRhbnppbF9NUCB0aWR5dmVyc2UgZXh0ZW5kIg0KYXV0aG9yOiAiTWQuIFRhbnppbCBFaHNhbiINCmRhdGU6ICIwNC8yNy8yNSINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpgYGANCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCmBgYA0KDQoNCg0KIyNJbnRyb2R1Y3Rpb24NCg0KSW4gdGhpcyB2aWduZXR0ZSwgd2Ugd2lsbCB1c2UgbHVicmlkYXRlIHBhY2thZ2UgZnJvbSB0aGUgVGlkeXZlcnNlIHRvIHBhcnNlIGFuZCBtYW5pcHVsYXRlIGRhdGEgdGhhdCB1c2VzIGRhdGUgYW5kIHRpbWUuIFRoZSBkYXRhIHdlIHdpbGwgdXNlIGlzIGZsaWdodHMgZGF0YXNldCBpbiBueWNmbGlnaHRzMTMgcGFja2FnZS4gV2Ugd2lsbCBjYWxjdWxhdGUgZGVwYXJ0dXJlIGRlbGF5cyBhbmQgdmlzdWFsaXplIHRoZSByZXN1bHRzLiANCg0KIyMjTG9hZCBEYXRhIGFuZCBQZXJmb3JtIEFuYWx5c2lzDQoNCkZpcnN0LCBsZXRzIGluc3RhbGwgYW5kIGxvYWQgdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMuIA0KDQpgYGB7cn0NCmlmICghcmVxdWlyZU5hbWVzcGFjZSgidGlkeXZlcnNlIiwgcXVpZXRseSA9IFRSVUUpKSB7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIil9DQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImx1YnJpZGF0ZSIsIHF1aWV0bHkgPSBUUlVFKSkge2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpfQ0KDQojIEluc3RhbGwgbnljZmxpZ2h0czEzIGlmIG5vdCBhbHJlYWR5IGluc3RhbGxlZA0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJueWNmbGlnaHRzMTMiLCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygibnljZmxpZ2h0czEzIikNCn0NCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KG55Y2ZsaWdodHMxMykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpMZXQncyBsb2FkIHRoZSBmbGlnaHQgZGF0YXNldCBhbmQgZ2V0IGEgZ2xpbXBzZSBvZiB0aGUgZGF0YXNldC4gDQoNCmBgYHtyfQ0KZmxpZ2h0cyA8LSBueWNmbGlnaHRzMTM6OmZsaWdodHMNCmdsaW1wc2UoZmxpZ2h0cykNCmBgYA0KDQpBZnRlciB0aGUgZ2xpbXBzZSBvZiB0aGUgZGF0YXNldCwgd2Ugd2lsbCB1c2UgZnVuY3Rpb25zIGluIHRoZSBsdWJyaWRhdGUgcGFja2FnZSB0byBjb252ZXJ0IGRhdGUgYW5kIHRpbWUgY29sdW1ucyBpbnRvIHByb3BlciBkYXRldGltZSBvYmplY3RzLg0KDQoNCiMjIFN0ZXAgMTogUHJlcHJvY2VzcyBBcnJpdmFsIFRpbWVzDQoNCmBgYHtyfQ0KZmxpZ2h0cyA8LSBmbGlnaHRzICU+JQ0KICBtdXRhdGUoDQogICAgZmxpZ2h0X2RhdGUgPSBtYWtlX2RhdGUoeWVhciwgbW9udGgsIGRheSksDQogICAgIyBQYWQgYW5kIGNsZWFuIGFycl90aW1lIGFuZCBzY2hlZF9hcnJfdGltZQ0KICAgIGFycl90aW1lID0gc3RyX3BhZChhcnJfdGltZSwgNCwgcGFkID0gIjAiKSwNCiAgICBzY2hlZF9hcnJfdGltZSA9IHN0cl9wYWQoc2NoZWRfYXJyX3RpbWUsIDQsIHBhZCA9ICIwIiksDQogICAgIyBSZXBsYWNlICIyNDAwIiB3aXRoICIwMDAwIiBmb3IgdmFsaWQgcGFyc2luZw0KICAgIGFycl90aW1lID0gaWZfZWxzZShhcnJfdGltZSA9PSAiMjQwMCIsICIwMDAwIiwgYXJyX3RpbWUpLA0KICAgIHNjaGVkX2Fycl90aW1lID0gaWZfZWxzZShzY2hlZF9hcnJfdGltZSA9PSAiMjQwMCIsICIwMDAwIiwgc2NoZWRfYXJyX3RpbWUpLA0KICAgICMgUGFyc2UgdG8gdGltZSBvYmplY3RzDQogICAgYWN0dWFsX2Fycml2YWxfdGltZSA9IHBhcnNlX3RpbWUoYXMuY2hhcmFjdGVyKGFycl90aW1lKSwgZm9ybWF0ID0gIiVIJU0iKSwNCiAgICBzY2hlZF9hcnJpdmFsX3RpbWUgPSBwYXJzZV90aW1lKGFzLmNoYXJhY3RlcihzY2hlZF9hcnJfdGltZSksIGZvcm1hdCA9ICIlSCVNIiksDQogICAgIyBDb252ZXJ0IGFycl9kZWxheSB0byBudW1lcmljIChyZWR1bmRhbnQgYnV0IGZvciBjb25zaXN0ZW5jeSkNCiAgICBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgPSBhcy5udW1lcmljKGFycl9kZWxheSkNCiAgKQ0KYGBgDQoNCg0KDQpXaXRoIHRoaXMsICBUaGUgZGF0ZSBpcyBjb21iaW5lZCBpbnRvIG9uZSBjb2x1bW4gYW5kIHRoZSB0aW1lcyBhcmUgY29tYmluZWQgaW50byBvbmUgY29sdW1uIGZvciBlYXNpZXIgcmVhZGFiaWxpdHkgYW5kIGFuYWx5c2lzLiANCmBgYHtyfQ0KI2NoZWNrIHRoZSBuZXcgZGF0YXNldA0KDQpnbGltcHNlKGZsaWdodHMpDQoNCmBgYA0KDQoNCg0KTmV4dCwgd2Ugd2lsbCBjb252ZXJ0IHRoZSBkZXBhcnR1cmUgZGVsYXkgdmFsdWVzIGludG8gYSBudW1lcmljIGZvcm1hdCBmb3IgZWFzaWVyIGFuYWx5c2lzLiBUaGVuIHdlIHdpbGwgc3VtbWFyaXplIHRoZSBhdmVyYWdlIGRlcGFydHVyZSBkZWxheSBmb3IgZWFjaCBkYXkgb2YgdGhlIHdlZWsgYW5kIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gdG8gcHJlc2VudCB0aGUgZmluZGluZ3MuIA0KDQpXZSB3aWxsIHVzZSB3ZGF5IGZ1bmN0aW9uIGZyb20gdGhlIGx1YnJpZGF0ZSBwYWNrYWdlIHRvIGZpZ3VyZSBvdXQgd2hhdCBkYXkgb2YgdGhlIHdlZWsgdGhlIGRhdGUgb2YgZGVwYXJ0dXJlIGZlbGwgb24uIA0KDQpgYGB7cn0NCiNDYWxjdWxhdGUgZGVsYXkgaW4gbWludXRlcw0KZmxpZ2h0cyA8LSBmbGlnaHRzICU+JQ0KICBtdXRhdGUoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMgPSBhcy5udW1lcmljKGRlcF9kZWxheSkpDQoNCiNBZGQgYSBkYXkgb2YgdGhlIHdlZWsgY29sdW1uDQpmbGlnaHRzIDwtIGZsaWdodHMgJT4lDQogIG11dGF0ZShkYXlfb2Zfd2VlayA9IHdkYXkoZmxpZ2h0X2RhdGUsIGxhYmVsID0gVFJVRSkpDQpgYGANCg0KDQojIyBBbmFseXplIERlbGF5cyBieSBDYXJyaWVyIGFuZCBEYXkgb2YgdGhlIFdlZWsNCg0KYGBge3J9DQojU3VtbWFyaXplIGF2ZXJhZ2UgZGVsYXkgYnkgZGF5IG9mIHRoZSB3ZWVrIA0KYXZlcmFnZV9kZWxheSA8LSBmbGlnaHRzICU+JQ0KICBncm91cF9ieShkYXlfb2Zfd2VlaykgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlX2RlbGF5ID0gbWVhbihkZXBhcnR1cmVfZGVsYXlfbWludXRlcywgbmEucm0gPSBUUlVFKSkNCg0KI1Bsb3QgdGhlIHJlc3VsdHMNCmdncGxvdChhdmVyYWdlX2RlbGF5LCBhZXMoeCA9IGRheV9vZl93ZWVrLCB5ID0gYXZlcmFnZV9kZWxheSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsZmlsbCA9J29yYW5nZScpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBdmVyYWdlIERlcGFydHVyZSBEZWxheSBieSBEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHggPSAiRGF5IG9mIHRoZSBXZWVrIiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChtaW51dGVzKSINCiAgKQ0KDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYXZlcmFnZV9kZWxheSwgYWVzKHggPSByZW9yZGVyKGRheV9vZl93ZWVrLCBhdmVyYWdlX2RlbGF5KSwgeSA9IGF2ZXJhZ2VfZGVsYXkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChhdmVyYWdlX2RlbGF5LCAxKSksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IGJ5IERheSBvZiB0aGUgV2VlayIsDQogICAgeCA9ICJEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHkgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgKG1pbnV0ZXMpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiMjIEV4cGxvcmUgRGVsYXkgRGlzdHJpYnV0aW9uIGJ5IE9yaWdpbiBBaXJwb3J0DQoNCmBgYHtyfQ0KIyBDaGVjayBmb3Igbm9uLWZpbml0ZSB2YWx1ZXMgLWZpbml0ZSB2YWx1ZXMNCmZsaWdodHMgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuYV9jb3VudCA9IHN1bShpcy5uYShkZXBhcnR1cmVfZGVsYXlfbWludXRlcykpLA0KICAgIG5hbl9jb3VudCA9IHN1bShpcy5uYW4oZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKSwNCiAgICBpbmZfY291bnQgPSBzdW0oaXMuaW5maW5pdGUoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKQ0KICApDQoNCiMgQ2hlY2sgcmFuZ2Ugb2YgZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMNCnN1bW1hcnkoZmxpZ2h0cyRkZXBhcnR1cmVfZGVsYXlfbWludXRlcykNCg0KIyBDb3VudCByb3dzIG91dHNpZGUgeS1saW1pdA0KZmxpZ2h0cyAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGJlbG93X2xpbWl0ID0gc3VtKGRlcGFydHVyZV9kZWxheV9taW51dGVzIDwgLTIwLCBuYS5ybSA9IFRSVUUpLA0KICAgIGFib3ZlX2xpbWl0ID0gc3VtKGRlcGFydHVyZV9kZWxheV9taW51dGVzID4gMTAwLCBuYS5ybSA9IFRSVUUpDQogICkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBCb3hwbG90IG9mIGRlcGFydHVyZSBkZWxheXMgYnkgb3JpZ2luIGFpcnBvcnQsIGV4Y2x1ZGluZyBub24tZmluaXRlIHZhbHVlcw0KZ2dwbG90KGZsaWdodHMgJT4lIGZpbHRlcighaXMubmEoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpICYgaXMuZmluaXRlKGRlcGFydHVyZV9kZWxheV9taW51dGVzKSksIA0KICAgICAgIGFlcyh4ID0gb3JpZ2luLCB5ID0gZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKSArDQogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Z3JlZW4iLCBvdXRsaWVyLmNvbG9yID0gInJlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRGVwYXJ0dXJlIERlbGF5cyBieSBPcmlnaW4gQWlycG9ydCIsDQogICAgc3VidGl0bGUgPSAiRXhjbHVkZXMgOCwyNTUgZmxpZ2h0cyB3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBkZWxheSBkYXRhIiwNCiAgICB4ID0gIk9yaWdpbiBBaXJwb3J0IiwNCiAgICB5ID0gIkRlcGFydHVyZSBEZWxheSAobWludXRlcykiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIwLCAxMDApKSAjIExpbWl0IHktYXhpcyB0byBmb2N1cyBvbiB0eXBpY2FsIGRlbGF5cw0KYGBgDQoNCg0KYGBge3J9DQojIENoZWNrIHVuaXF1ZSBob3VyIHZhbHVlcyBpbiBmbGlnaHRzDQp1bmlxdWUoZmxpZ2h0cyRob3VyKQ0KYGBgDQojIyBJbnZlc3RpZ2F0ZSBIb3VybHkgRGVsYXkgUGF0dGVybnMNCmBgYHtyfQ0KDQojIENsZWFuIHRoZSBob3VyIGNvbHVtbiBpbiBmbGlnaHRzDQpmbGlnaHRzIDwtIGZsaWdodHMgJT4lDQogIG11dGF0ZShob3VyID0gaWZfZWxzZShob3VyID09IDI0LCAwLCBob3VyKSkNCg0KIyBTdW1tYXJpemUgYXZlcmFnZSBkZXBhcnR1cmUgZGVsYXkgYnkgaG91cg0KaG91cmx5X2RlbGF5IDwtIGZsaWdodHMgJT4lDQogIGdyb3VwX2J5KGhvdXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX2RlcF9kZWxheSA9IG1lYW4oZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMsIG5hLnJtID0gVFJVRSksDQogICAgbl9mbGlnaHRzID0gbigpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgIyBSZW1vdmUgYW55IHJvd3Mgd2l0aCBOQSBvciBpbnZhbGlkIHZhbHVlcw0KICBmaWx0ZXIoIWlzLm5hKGhvdXIpICYgIWlzLm5hKGF2Z19kZXBfZGVsYXkpICYgaXMuZmluaXRlKGF2Z19kZXBfZGVsYXkpKQ0KDQojIExpbmUgcGxvdCBvZiBhdmVyYWdlIGRlbGF5IGJ5IGhvdXINCmdncGxvdChob3VybHlfZGVsYXksIGFlcyh4ID0gaG91ciwgeSA9IGF2Z19kZXBfZGVsYXkpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgYnkgU2NoZWR1bGVkIERlcGFydHVyZSBIb3VyIiwNCiAgICB4ID0gIkhvdXIgb2YgRGF5IiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChtaW51dGVzKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIFRvIGNvbXBhcmUgZGVwYXJ0dXJlIGFuZCBhcnJpdmFsIGRlbGF5cw0KYGBge3J9DQojIFBpdm90IGRlcGFydHVyZSBhbmQgYXJyaXZhbCBkZWxheXMgaW50byBhIGxvbmcgZm9ybWF0DQpkZWxheV90eXBlcyA8LSBmbGlnaHRzICU+JQ0KICBzZWxlY3QoZGF5X29mX3dlZWssIGRlcGFydHVyZV9kZWxheV9taW51dGVzLCBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBjKGRlcGFydHVyZV9kZWxheV9taW51dGVzLCBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgKSwNCiAgICBuYW1lc190byA9ICJkZWxheV90eXBlIiwNCiAgICB2YWx1ZXNfdG8gPSAiZGVsYXlfbWludXRlcyINCiAgKQ0KDQojIFN1bW1hcml6ZSBhdmVyYWdlIGRlbGF5cyBieSBkYXkgb2YgdGhlIHdlZWsgYW5kIGRlbGF5IHR5cGUNCmRlbGF5X3R5cGVzX3N1bW1hcnkgPC0gZGVsYXlfdHlwZXMgJT4lDQogIGdyb3VwX2J5KGRheV9vZl93ZWVrLCBkZWxheV90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGF2Z19kZWxheSA9IG1lYW4oZGVsYXlfbWludXRlcywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCmBgYA0KDQpgYGB7cn0NCmRlbGF5X3R5cGVzIA0KDQpgYGANCg0KYGBge3J9DQojIEdyb3VwZWQgYmFyIHBsb3QgZm9yIGRlcGFydHVyZSB2cy4gYXJyaXZhbCBkZWxheXMNCmdncGxvdChkZWxheV90eXBlc19zdW1tYXJ5LCBhZXMoeCA9IGRheV9vZl93ZWVrLCB5ID0gYXZnX2RlbGF5LCBmaWxsID0gZGVsYXlfdHlwZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIHZzLiBBcnJpdmFsIERlbGF5cyBieSBEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHggPSAiRGF5IG9mIHRoZSBXZWVrIiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVsYXkgKG1pbnV0ZXMpIiwNCiAgICBmaWxsID0gIkRlbGF5IFR5cGUiDQogICkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkZXBhcnR1cmVfZGVsYXlfbWludXRlcyIgPSAib3JhbmdlIiwgImFycml2YWxfZGVsYXlfbWludXRlcyIgPSAicHVycGxlIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQojI0NvbmNsdXNpb24gSW4gdGhpcyBhbmFseXNpcywgd2UgZGVtb25zdHJhdGVkIGhvdyB0aGUgVGlkeXZlcnNlLCBwYXJ0aWN1bGFybHkgdGhlIGx1YnJpZGF0ZSwgZHBseXIsIGFuZCBnZ3Bsb3QyIHBhY2thZ2VzLCBjYW4gYmUgdXNlZCB0byBlZmZpY2llbnRseSBtYW5pcHVsYXRlLCBjbGVhbiwgYW5kIHZpc3VhbGl6ZSBmbGlnaHQgZGVsYXkgZGF0YS4NCkJ5IHRyYW5zZm9ybWluZyByYXcgZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbiBpbnRvIHN0cnVjdHVyZWQgZm9ybWF0cywgd2Ugd2VyZSBhYmxlIHRvIGV4cGxvcmUgcGF0dGVybnMgaW4gYm90aCBkZXBhcnR1cmUgYW5kIGFycml2YWwgZGVsYXlzIGFjcm9zcyBkaWZmZXJlbnQgZGF5cyBvZiB0aGUgd2VlaywgYWlycG9ydHMsIGFuZCBob3VycyBvZiB0aGUgZGF5Lg0KVXNpbmcgdmlzdWFsaXphdGlvbnMgbGlrZSBiYXIgY2hhcnRzLCBib3hwbG90cywgYW5kIGxpbmUgZ3JhcGhzLCB3ZSB1bmNvdmVyZWQgbWVhbmluZ2Z1bCB0cmVuZHMg4oCUIGZvciBleGFtcGxlLCBhdmVyYWdlIGRlbGF5cyBmbHVjdHVhdGluZyBieSB3ZWVrZGF5IGFuZCBkZXBhcnR1cmUgaG91ci4NCg0KVGhpcyB3b3JrZmxvdyBoaWdobGlnaHRzIHRoZSBwb3dlciBvZiB0aWR5IGRhdGEgcHJpbmNpcGxlczogd2l0aCBhIGNvbnNpc3RlbnQgYW5kIG9yZ2FuaXplZCBkYXRhc2V0LCB3ZSBjYW4gZ2FpbiB2YWx1YWJsZSBpbnNpZ2h0cyBxdWlja2x5IGFuZCBjbGVhcmx5Lg0KVGhlIHRvb2xzIGFuZCB0ZWNobmlxdWVzIHVzZWQgaGVyZSBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIHRvIG90aGVyIHJlYWwtd29ybGQgZGF0YXNldHMgaW52b2x2aW5nIGRhdGVzLCB0aW1lcywgYW5kIGRlbGF5IGFuYWx5c2lzLg0KDQo=