1 Introduction

In this assignment, we are looking at tidyverse which has collection of R packages that can help us loading the dataset to R, cleaning, transforming and visuzalizing of the data.The goal of this assignment is to create a sample dataset that shows the capabilities of tidyverse with and example dataset. The example dataset I selected is “Wine Data” from Kaggle. Since, we are selecting an example dataset, we might as well select an example business obsective. The business problem in question that I choose to answer at the end of this analysis is “What are the top ranked wines from US?” Can we determine what type of wine we can select based on their origin?".

2 About the Data Set

The data set we chose for this assignment is wine reviews. The variable descriptions are outlined below

  • Country: The country that the wine is from.

  • Description: The description of the variable.

  • Designation: The vineyard within the winery where the grapes that made the wine are from.

  • Points: The number of points Wine Enthusiast rated the wine on a scale of 1-100 (though they say they only post reviews for wines that score >=80)

  • Price: The cost for a bottle of the wine

  • Province: The province or state that the wine is from

  • Region 1: The wine growing area in a province or state (ie Napa)

  • Region 2: Sometimes there are more specific regions specified within a wine growing area (ie Rutherford inside the Napa Valley), but this value can sometimes be blank

3 Loading Tidyverse

installed.packages("tidyverse")
##      Package LibPath Version Priority Depends Imports LinkingTo Suggests
##      Enhances License License_is_FOSS License_restricts_use OS_type Archs
##      MD5sum NeedsCompilation Built
library(tidyverse)
## -- Attaching packages -------------------------------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.2.1     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.3
## v tidyr   1.0.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.4.0
## -- Conflicts ----------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

When we install and load the tidyverse, we see that we loaded below packages

  • ggplot2

  • tibble

  • tidyr

  • readr

  • purr

  • dplyr

  • stringr

  • forcats

4 Data Collection

We can use read_csv function from readr package within tidyverse to read the data from csv.

wine <- read_csv("https://raw.githubusercontent.com/anilak1978/tidyverse/master/winemag-data_first150k.csv")
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
##   X1 = col_double(),
##   country = col_character(),
##   description = col_character(),
##   designation = col_character(),
##   points = col_double(),
##   price = col_double(),
##   province = col_character(),
##   region_1 = col_character(),
##   region_2 = col_character(),
##   variety = col_character(),
##   winery = col_character()
## )
head(wine)
## # A tibble: 6 x 11
##      X1 country description designation points price province region_1
##   <dbl> <chr>   <chr>       <chr>        <dbl> <dbl> <chr>    <chr>   
## 1     0 US      This treme~ Martha's V~     96   235 Califor~ Napa Va~
## 2     1 Spain   Ripe aroma~ Carodorum ~     96   110 Norther~ Toro    
## 3     2 US      Mac Watson~ Special Se~     96    90 Califor~ Knights~
## 4     3 US      This spent~ Reserve         96    65 Oregon   Willame~
## 5     4 France  This is th~ La Brûlade      95    66 Provence Bandol  
## 6     5 Spain   Deep, dens~ Numanthia       95    73 Norther~ Toro    
## # ... with 3 more variables: region_2 <chr>, variety <chr>, winery <chr>

We can use as_tibble function from tibble package within tidyverse. This will change the class of the wine dataframe to tibble. With data frame being tibble we can further leverage dplyr package within tidyverse.

wine <- as_tibble(wine)
head(wine)
## # A tibble: 6 x 11
##      X1 country description designation points price province region_1
##   <dbl> <chr>   <chr>       <chr>        <dbl> <dbl> <chr>    <chr>   
## 1     0 US      This treme~ Martha's V~     96   235 Califor~ Napa Va~
## 2     1 Spain   Ripe aroma~ Carodorum ~     96   110 Norther~ Toro    
## 3     2 US      Mac Watson~ Special Se~     96    90 Califor~ Knights~
## 4     3 US      This spent~ Reserve         96    65 Oregon   Willame~
## 5     4 France  This is th~ La Brûlade      95    66 Provence Bandol  
## 6     5 Spain   Deep, dens~ Numanthia       95    73 Norther~ Toro    
## # ... with 3 more variables: region_2 <chr>, variety <chr>, winery <chr>

5 Data Cleaning and Transformation

When we look at the dataset, we see there are many columns that may not be neccesary for our analysis. For example our business objective is to only look at the wines that are from US. In this case we can group based on selected columns using select function in dplyr package. We can further filter the dataset for the wines that are from US by using filter() function. We can also arrange the dataset to display points by decreasing order by using arrange function. Since we are using multiple functions to the data, we might as well use pipe for code efficiency.

#filter, select the needed columns and arrange 
wine_df <- wine %>%
  filter(country=="US") %>%
  select(country, province, region_1, variety, points, price) %>%
  arrange(desc(points))

head(wine_df)
## # A tibble: 6 x 6
##   country province   region_1                variety           points price
##   <chr>   <chr>      <chr>                   <chr>              <dbl> <dbl>
## 1 US      Oregon     Walla Walla Valley (OR) Syrah                100    65
## 2 US      Oregon     Walla Walla Valley (OR) Syrah                100    65
## 3 US      California Napa Valley             Cabernet Sauvign~    100   200
## 4 US      California Stags Leap District     Cabernet Sauvign~    100   215
## 5 US      California Russian River Valley    Pinot Noir           100   100
## 6 US      California Rutherford              Cabernet Blend       100   245

Since we are looking for the top ranked wines based on their origin, we can group them based on their variety. We can use group_by function in dplyr package.

wine_group<- wine_df %>%
  group_by(variety)

wine_group
## # A tibble: 62,397 x 6
## # Groups:   variety [218]
##    country province   region_1               variety           points price
##    <chr>   <chr>      <chr>                  <chr>              <dbl> <dbl>
##  1 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  2 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  3 US      California Napa Valley            Cabernet Sauvign~    100   200
##  4 US      California Stags Leap District    Cabernet Sauvign~    100   215
##  5 US      California Russian River Valley   Pinot Noir           100   100
##  6 US      California Rutherford             Cabernet Blend       100   245
##  7 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  8 US      California Russian River Valley   Pinot Noir           100   100
##  9 US      California Napa Valley            Cabernet Sauvign~    100   200
## 10 US      California Rutherford             Cabernet Blend       100   245
## # ... with 62,387 more rows

We can look at an overview of our latest dataset by using glimpse function.

glimpse(wine_group)
## Observations: 62,397
## Variables: 6
## Groups: variety [218]
## $ country  <chr> "US", "US", "US", "US", "US", "US", "US", "US", "US",...
## $ province <chr> "Oregon", "Oregon", "California", "California", "Cali...
## $ region_1 <chr> "Walla Walla Valley (OR)", "Walla Walla Valley (OR)",...
## $ variety  <chr> "Syrah", "Syrah", "Cabernet Sauvignon", "Cabernet Sau...
## $ points   <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99,...
## $ price    <dbl> 65, 65, 200, 215, 100, 245, 65, 100, 200, 245, 65, 14...

We have 62,397 observations, grouped by variety of 218 wines.

We should look for missing values and handle them as needed.

sum(is.na(wine_group))
## [1] 394
sum(is.na(wine_group$country))
## [1] 0
sum(is.na(wine_group$province))
## [1] 0
sum(is.na(wine_group$region_1))
## [1] 136
sum(is.na(wine_group$variety))
## [1] 0
sum(is.na(wine_group$points))
## [1] 0
sum(is.na(wine_group$price))
## [1] 258

We have total of 394 missing values. 136 missing values in region_1 column and 258 missing values in price column. COnsidering we have 62,397 observations, we can remove the 394 missing values from our dataset. We can use drop_na function from dplyr function to do this.

wine_final <- wine_group %>%
  drop_na()

wine_final
## # A tibble: 62,003 x 6
## # Groups:   variety [217]
##    country province   region_1               variety           points price
##    <chr>   <chr>      <chr>                  <chr>              <dbl> <dbl>
##  1 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  2 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  3 US      California Napa Valley            Cabernet Sauvign~    100   200
##  4 US      California Stags Leap District    Cabernet Sauvign~    100   215
##  5 US      California Russian River Valley   Pinot Noir           100   100
##  6 US      California Rutherford             Cabernet Blend       100   245
##  7 US      Oregon     Walla Walla Valley (O~ Syrah                100    65
##  8 US      California Russian River Valley   Pinot Noir           100   100
##  9 US      California Napa Valley            Cabernet Sauvign~    100   200
## 10 US      California Rutherford             Cabernet Blend       100   245
## # ... with 61,993 more rows

We have loaded and cleaned our data by using tibble, dplyr packages from tidyverse. Our data set is ready for analysis.

6 Data Exploration and Visualization

We can use ggplot package from tidyverser to visualize the top ranking wine in the US.

theme_set(theme_bw())
ggplot(wine_final, aes(province, points))+
  geom_bar(stat="identity", width=5, fill="tomato3")+
  theme(axis.text.x=element_text(angle=65, vjust=0.6))
## Warning: position_stack requires non-overlapping x intervals

7 Conclusion

In this assignment, we were able to read the data, clean and transform and visualize by using tidyverse packages, dplyr, tibble and ggplot. Based on our analysis, we were able to find the origin of the top ranking wine within US. We can extend this analysis further and look to see if there are correlations between variables such as points vs price. We can also explore ways to create a simple or multiple linear predictive model.

LS0tDQp0aXRsZTogIkRvY3VtZW50IENsYXNzaWZpY2F0aW9uIg0KYXV0aG9yOiBBbmlsIEFreWlsZGlyaW0NCmRhdGU6ICIxMC8xOS8yMDE5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KSW4gdGhpcyBhc3NpZ25tZW50LCB3ZSBhcmUgbG9va2luZyBhdCB0aWR5dmVyc2Ugd2hpY2ggaGFzIGNvbGxlY3Rpb24gb2YgUiBwYWNrYWdlcyB0aGF0IGNhbiBoZWxwIHVzIGxvYWRpbmcgdGhlIGRhdGFzZXQgdG8gUiwgY2xlYW5pbmcsIHRyYW5zZm9ybWluZyBhbmQgdmlzdXphbGl6aW5nIG9mIHRoZSBkYXRhLlRoZSBnb2FsIG9mIHRoaXMgYXNzaWdubWVudCBpcyB0byBjcmVhdGUgYSBzYW1wbGUgZGF0YXNldCB0aGF0IHNob3dzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGlkeXZlcnNlIHdpdGggYW5kIGV4YW1wbGUgZGF0YXNldC4gVGhlIGV4YW1wbGUgZGF0YXNldCBJIHNlbGVjdGVkIGlzICJXaW5lIERhdGEiIGZyb20gS2FnZ2xlLiBTaW5jZSwgd2UgYXJlIHNlbGVjdGluZyBhbiBleGFtcGxlIGRhdGFzZXQsIHdlIG1pZ2h0IGFzIHdlbGwgc2VsZWN0IGFuIGV4YW1wbGUgYnVzaW5lc3Mgb2JzZWN0aXZlLiBUaGUgYnVzaW5lc3MgcHJvYmxlbSBpbiBxdWVzdGlvbiB0aGF0IEkgY2hvb3NlIHRvIGFuc3dlciBhdCB0aGUgZW5kIG9mIHRoaXMgYW5hbHlzaXMgaXMgIldoYXQgYXJlIHRoZSB0b3AgcmFua2VkIHdpbmVzIGZyb20gVVM/IiBDYW4gd2UgZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB3aW5lIHdlIGNhbiBzZWxlY3QgYmFzZWQgb24gdGhlaXIgb3JpZ2luPyIuIA0KDQojIEFib3V0IHRoZSBEYXRhIFNldA0KDQpUaGUgZGF0YSBzZXQgd2UgY2hvc2UgZm9yIHRoaXMgYXNzaWdubWVudCBpcyB3aW5lIHJldmlld3MuIFRoZSB2YXJpYWJsZSBkZXNjcmlwdGlvbnMgYXJlIG91dGxpbmVkIGJlbG93DQoNCiogQ291bnRyeTogVGhlIGNvdW50cnkgdGhhdCB0aGUgd2luZSBpcyBmcm9tLg0KDQoqIERlc2NyaXB0aW9uOiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlLg0KDQoqIERlc2lnbmF0aW9uOiBUaGUgdmluZXlhcmQgd2l0aGluIHRoZSB3aW5lcnkgd2hlcmUgdGhlIGdyYXBlcyB0aGF0IG1hZGUgdGhlIHdpbmUgYXJlIGZyb20uDQoNCiogUG9pbnRzOiBUaGUgbnVtYmVyIG9mIHBvaW50cyBXaW5lIEVudGh1c2lhc3QgcmF0ZWQgdGhlIHdpbmUgb24gYSBzY2FsZSBvZiAxLTEwMCAodGhvdWdoIHRoZXkgc2F5IHRoZXkgb25seSBwb3N0IHJldmlld3MgZm9yIHdpbmVzIHRoYXQgc2NvcmUgPj04MCkNCg0KKiBQcmljZTogVGhlIGNvc3QgZm9yIGEgYm90dGxlIG9mIHRoZSB3aW5lDQoNCiogUHJvdmluY2U6IFRoZSBwcm92aW5jZSBvciBzdGF0ZSB0aGF0IHRoZSB3aW5lIGlzIGZyb20NCg0KKiBSZWdpb24gMTogVGhlIHdpbmUgZ3Jvd2luZyBhcmVhIGluIGEgcHJvdmluY2Ugb3Igc3RhdGUgKGllIE5hcGEpDQoNCiogUmVnaW9uIDI6IFNvbWV0aW1lcyB0aGVyZSBhcmUgbW9yZSBzcGVjaWZpYyByZWdpb25zIHNwZWNpZmllZCB3aXRoaW4gYSB3aW5lIGdyb3dpbmcgYXJlYSAoaWUgUnV0aGVyZm9yZCBpbnNpZGUgdGhlIE5hcGEgVmFsbGV5KSwgYnV0IHRoaXMgdmFsdWUgY2FuIHNvbWV0aW1lcyBiZSBibGFuaw0KDQojIExvYWRpbmcgVGlkeXZlcnNlDQoNCmBgYHtyfQ0KaW5zdGFsbGVkLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KV2hlbiB3ZSBpbnN0YWxsIGFuZCBsb2FkIHRoZSB0aWR5dmVyc2UsIHdlIHNlZSB0aGF0IHdlIGxvYWRlZCBiZWxvdyBwYWNrYWdlcw0KDQoqIGdncGxvdDINCg0KKiB0aWJibGUNCg0KKiB0aWR5cg0KDQoqIHJlYWRyDQoNCiogcHVycg0KDQoqIGRwbHlyIA0KDQoqIHN0cmluZ3INCg0KKiBmb3JjYXRzIA0KDQojIERhdGEgQ29sbGVjdGlvbg0KDQpXZSBjYW4gdXNlIHJlYWRfY3N2IGZ1bmN0aW9uIGZyb20gcmVhZHIgcGFja2FnZSB3aXRoaW4gdGlkeXZlcnNlIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSBjc3YuDQoNCmBgYHtyfQ0KDQp3aW5lIDwtIHJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5pbGFrMTk3OC90aWR5dmVyc2UvbWFzdGVyL3dpbmVtYWctZGF0YV9maXJzdDE1MGsuY3N2IikNCg0KaGVhZCh3aW5lKQ0KDQpgYGANCg0KV2UgY2FuIHVzZSBhc190aWJibGUgZnVuY3Rpb24gZnJvbSB0aWJibGUgcGFja2FnZSB3aXRoaW4gdGlkeXZlcnNlLiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjbGFzcyBvZiB0aGUgd2luZSBkYXRhZnJhbWUgdG8gdGliYmxlLiBXaXRoIGRhdGEgZnJhbWUgYmVpbmcgdGliYmxlIHdlIGNhbiBmdXJ0aGVyIGxldmVyYWdlIGRwbHlyIHBhY2thZ2Ugd2l0aGluIHRpZHl2ZXJzZS4gDQoNCmBgYHtyfQ0KDQp3aW5lIDwtIGFzX3RpYmJsZSh3aW5lKQ0KaGVhZCh3aW5lKQ0KDQpgYGANCg0KIyBEYXRhIENsZWFuaW5nIGFuZCBUcmFuc2Zvcm1hdGlvbg0KDQpXaGVuIHdlIGxvb2sgYXQgdGhlIGRhdGFzZXQsIHdlIHNlZSB0aGVyZSBhcmUgbWFueSBjb2x1bW5zIHRoYXQgbWF5IG5vdCBiZSBuZWNjZXNhcnkgZm9yIG91ciBhbmFseXNpcy4gRm9yIGV4YW1wbGUgb3VyIGJ1c2luZXNzIG9iamVjdGl2ZSBpcyB0byBvbmx5IGxvb2sgYXQgdGhlIHdpbmVzIHRoYXQgYXJlIGZyb20gVVMuIEluIHRoaXMgY2FzZSB3ZSBjYW4gZ3JvdXAgYmFzZWQgb24gc2VsZWN0ZWQgY29sdW1ucyB1c2luZyBzZWxlY3QgZnVuY3Rpb24gaW4gZHBseXIgcGFja2FnZS4gV2UgY2FuIGZ1cnRoZXIgZmlsdGVyIHRoZSBkYXRhc2V0IGZvciB0aGUgd2luZXMgdGhhdCBhcmUgZnJvbSBVUyBieSB1c2luZyBmaWx0ZXIoKSBmdW5jdGlvbi4gV2UgY2FuIGFsc28gYXJyYW5nZSB0aGUgZGF0YXNldCB0byBkaXNwbGF5IHBvaW50cyBieSBkZWNyZWFzaW5nIG9yZGVyIGJ5IHVzaW5nIGFycmFuZ2UgZnVuY3Rpb24uIFNpbmNlIHdlIGFyZSB1c2luZyBtdWx0aXBsZSBmdW5jdGlvbnMgdG8gdGhlIGRhdGEsIHdlIG1pZ2h0IGFzIHdlbGwgdXNlIHBpcGUgZm9yIGNvZGUgZWZmaWNpZW5jeS4gDQoNCmBgYHtyfQ0KI2ZpbHRlciwgc2VsZWN0IHRoZSBuZWVkZWQgY29sdW1ucyBhbmQgYXJyYW5nZSANCndpbmVfZGYgPC0gd2luZSAlPiUNCiAgZmlsdGVyKGNvdW50cnk9PSJVUyIpICU+JQ0KICBzZWxlY3QoY291bnRyeSwgcHJvdmluY2UsIHJlZ2lvbl8xLCB2YXJpZXR5LCBwb2ludHMsIHByaWNlKSAlPiUNCiAgYXJyYW5nZShkZXNjKHBvaW50cykpDQoNCmhlYWQod2luZV9kZikNCg0KYGBgDQoNClNpbmNlIHdlIGFyZSBsb29raW5nIGZvciB0aGUgdG9wIHJhbmtlZCB3aW5lcyBiYXNlZCBvbiB0aGVpciBvcmlnaW4sIHdlIGNhbiBncm91cCB0aGVtIGJhc2VkIG9uIHRoZWlyIHZhcmlldHkuIFdlIGNhbiB1c2UgZ3JvdXBfYnkgZnVuY3Rpb24gaW4gZHBseXIgcGFja2FnZS4gDQoNCmBgYHtyfQ0KDQp3aW5lX2dyb3VwPC0gd2luZV9kZiAlPiUNCiAgZ3JvdXBfYnkodmFyaWV0eSkNCg0Kd2luZV9ncm91cA0KDQoNCmBgYA0KDQpXZSBjYW4gbG9vayBhdCBhbiBvdmVydmlldyBvZiBvdXIgbGF0ZXN0IGRhdGFzZXQgYnkgdXNpbmcgZ2xpbXBzZSBmdW5jdGlvbi4NCg0KYGBge3J9DQoNCmdsaW1wc2Uod2luZV9ncm91cCkNCg0KYGBgDQoNCldlIGhhdmUgNjIsMzk3IG9ic2VydmF0aW9ucywgZ3JvdXBlZCBieSB2YXJpZXR5IG9mIDIxOCB3aW5lcy4gDQoNCldlIHNob3VsZCBsb29rIGZvciBtaXNzaW5nIHZhbHVlcyBhbmQgaGFuZGxlIHRoZW0gYXMgbmVlZGVkLg0KDQpgYGB7cn0NCg0Kc3VtKGlzLm5hKHdpbmVfZ3JvdXApKQ0Kc3VtKGlzLm5hKHdpbmVfZ3JvdXAkY291bnRyeSkpDQpzdW0oaXMubmEod2luZV9ncm91cCRwcm92aW5jZSkpDQpzdW0oaXMubmEod2luZV9ncm91cCRyZWdpb25fMSkpDQpzdW0oaXMubmEod2luZV9ncm91cCR2YXJpZXR5KSkNCnN1bShpcy5uYSh3aW5lX2dyb3VwJHBvaW50cykpDQpzdW0oaXMubmEod2luZV9ncm91cCRwcmljZSkpDQoNCmBgYA0KDQoNCldlIGhhdmUgdG90YWwgb2YgMzk0IG1pc3NpbmcgdmFsdWVzLiAxMzYgbWlzc2luZyB2YWx1ZXMgaW4gcmVnaW9uXzEgY29sdW1uIGFuZCAyNTggbWlzc2luZyB2YWx1ZXMgaW4gcHJpY2UgY29sdW1uLiBDT25zaWRlcmluZyB3ZSBoYXZlIDYyLDM5NyBvYnNlcnZhdGlvbnMsIHdlIGNhbiByZW1vdmUgdGhlIDM5NCBtaXNzaW5nIHZhbHVlcyBmcm9tIG91ciBkYXRhc2V0LiBXZSBjYW4gdXNlIGRyb3BfbmEgZnVuY3Rpb24gZnJvbSBkcGx5ciBmdW5jdGlvbiB0byBkbyB0aGlzLiANCg0KYGBge3J9DQoNCndpbmVfZmluYWwgPC0gd2luZV9ncm91cCAlPiUNCiAgZHJvcF9uYSgpDQoNCndpbmVfZmluYWwNCg0KDQpgYGANCg0KV2UgaGF2ZSBsb2FkZWQgYW5kIGNsZWFuZWQgb3VyIGRhdGEgYnkgdXNpbmcgdGliYmxlLCBkcGx5ciBwYWNrYWdlcyBmcm9tIHRpZHl2ZXJzZS4gT3VyIGRhdGEgc2V0IGlzIHJlYWR5IGZvciBhbmFseXNpcy4NCg0KIyBEYXRhIEV4cGxvcmF0aW9uIGFuZCBWaXN1YWxpemF0aW9uDQoNCldlIGNhbiB1c2UgZ2dwbG90IHBhY2thZ2UgZnJvbSB0aWR5dmVyc2VyIHRvIHZpc3VhbGl6ZSB0aGUgdG9wIHJhbmtpbmcgd2luZSBpbiB0aGUgVVMuIA0KDQpgYGB7cn0NCg0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpnZ3Bsb3Qod2luZV9maW5hbCwgYWVzKHByb3ZpbmNlLCBwb2ludHMpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD01LCBmaWxsPSJ0b21hdG8zIikrDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkNCg0KYGBgDQoNCiMgQ29uY2x1c2lvbg0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIHdlcmUgYWJsZSB0byByZWFkIHRoZSBkYXRhLCBjbGVhbiBhbmQgdHJhbnNmb3JtIGFuZCB2aXN1YWxpemUgYnkgdXNpbmcgdGlkeXZlcnNlIHBhY2thZ2VzLCBkcGx5ciwgdGliYmxlIGFuZCBnZ3Bsb3QuIEJhc2VkIG9uIG91ciBhbmFseXNpcywgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgdGhlIG9yaWdpbiBvZiB0aGUgdG9wIHJhbmtpbmcgd2luZSB3aXRoaW4gVVMuIFdlIGNhbiBleHRlbmQgdGhpcyBhbmFseXNpcyBmdXJ0aGVyIGFuZCBsb29rIHRvIHNlZSBpZiB0aGVyZSBhcmUgY29ycmVsYXRpb25zIGJldHdlZW4gdmFyaWFibGVzIHN1Y2ggYXMgcG9pbnRzIHZzIHByaWNlLiBXZSBjYW4gYWxzbyBleHBsb3JlIHdheXMgdG8gY3JlYXRlIGEgc2ltcGxlIG9yIG11bHRpcGxlIGxpbmVhciBwcmVkaWN0aXZlIG1vZGVsLiAgDQoNCg0KDQoNCg==