Data Science Stream

Topic 1B: Using RStudio


Example R code solutions for the Data Science Computer Lab 1, which uses the packages meme (Yu 2021), magick (Ooms 2021), and palmerpenguins (Horst, Hill, and Gorman 2020), are presented below.


Checklist

No answer required. Just make sure you have completed the tasks listed in the dot-points.

1 Installing new R packages

1.1

install.packages("meme")

1.2

No answer required.

1.3

library(meme)

2 Making memes in RStudio

2.1

hagrid <- "https://i.imgflip.com/13wb2t.jpg"

2.2

meme(hagrid, "Yer a wizard", "with coding", font = "sans")

Note: Some warnings may appear in your R Console as this code is executing. Don’t worry about it, it is safe to ignore these warnings.

2.3 How to save RStudio images

success_kid <- "http://i0.kym-cdn.com/entries/icons/mobile/000/000/745/success.jpg"
success <- meme(success_kid, "Using R", "to make memes", font = "sans")
success

2.3.1 Option A: Base R function

windows() # or quartz, if you are a Mac user
success # render the image in the graphics device
savePlot(filename = "successkid", type = "png") 

2.3.2 Option B: A function from a specific package

An example command to save the success object to the imaginary filepath "STM1001/Data Science/success_kid_R_meme.png" is shown below.

meme_save(success, file="STM1001/Data Science/success_kid_R_meme.png") 

2.3.3 Option C: Via the RStudio Plots window

No answer required.

2.4

Please refer to the previous steps of 2 for a guide on loading an image, adding text, and then saving your creation.

3 Customizing GIFs in RStudio

Please note that for this question, while the code to present the GIFs is included, the GIFs themselves are not reproduced in the documentation below.

3.1

install.packages("magick")
library(magick)

3.2

Earth <- image_read("https://i.giphy.com/media/mf8UbIDew7e8g/giphy.gif")
Earth

3.3

rev(Earth) %>% 
           image_flip() %>% 
           image_annotate("      Meanwhile, in Australia", size = 40, color = "white")

4 Palmer Penguins Data Set

4.1

install.packages("palmerpenguins")
library(palmerpenguins)
## 
## Attaching package: 'palmerpenguins'
## The following objects are masked from 'package:datasets':
## 
##     penguins, penguins_raw

4.2

# This code checks the dimensions of the data in the `palmerpenguins` package
dim(penguins)
## [1] 344   8
nrow(penguins)
## [1] 344
ncol(penguins)
## [1] 8

4.3

# This code summarises the data in the `palmerpenguins` package
summary(penguins)
##       species          island    bill_length_mm  bill_depth_mm  
##  Adelie   :152   Biscoe   :168   Min.   :32.10   Min.   :13.10  
##  Chinstrap: 68   Dream    :124   1st Qu.:39.23   1st Qu.:15.60  
##  Gentoo   :124   Torgersen: 52   Median :44.45   Median :17.30  
##                                  Mean   :43.92   Mean   :17.15  
##                                  3rd Qu.:48.50   3rd Qu.:18.70  
##                                  Max.   :59.60   Max.   :21.50  
##                                  NA's   :2       NA's   :2      
##  flipper_length_mm  body_mass_g       sex           year     
##  Min.   :172.0     Min.   :2700   female:165   Min.   :2007  
##  1st Qu.:190.0     1st Qu.:3550   male  :168   1st Qu.:2007  
##  Median :197.0     Median :4050   NA's  : 11   Median :2008  
##  Mean   :200.9     Mean   :4202                Mean   :2008  
##  3rd Qu.:213.0     3rd Qu.:4750                3rd Qu.:2009  
##  Max.   :231.0     Max.   :6300                Max.   :2009  
##  NA's   :2         NA's   :2

4.4

# This code checks the first 6 rows of data in the `palmerpenguins` package
head(penguins)
## # A tibble: 6 × 8
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           NA            NA                  NA          NA
## 5 Adelie  Torgersen           36.7          19.3               193        3450
## 6 Adelie  Torgersen           39.3          20.6               190        3650
## # ℹ 2 more variables: sex <fct>, year <int>

4.5

Note that the code for this question is shown below, but the output is omitted, for brevity.

penguins$bill_length_mm

4.6

Note that the code for this question is shown below, but the output is omitted, for brevity.

penguins$bill_depth_mm
penguins$body_mass_g


Well done, that’s everything covered.


References

Horst, Allison Marie, Alison Presmanes Hill, and Kristen B Gorman. 2020. Palmerpenguins: Palmer Archipelago (Antarctica) Penguin Data. https://doi.org/10.5281/zenodo.3960218.
Ooms, Jeroen. 2021. magick: advanced graphics and image-processing in R. https://docs.ropensci.org/magick/.
Yu, Guangchuang. 2021. meme: create memes in R. https://github.com/GuangchuangYu/meme/.


These notes have been prepared by Rupert Kuveke. The copyright for the material in these notes resides with the author named above, with the Department of Mathematical and Physical Sciences and with La Trobe University. Copyright in this work is vested in La Trobe University including all La Trobe University branding and naming. Unless otherwise stated, material within this work is licensed under a Creative Commons Attribution-Non Commercial-Non Derivatives License BY-NC-ND.

LS0tDQp0aXRsZTogIlNUTTEwMDE6IENvbXB1dGVyIExhYiAxQiBTb2x1dGlvbnMiDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KYmlibGlvZ3JhcGh5OiBTVE0xMDAxX0RTX0NMX3JlZmVyZW5jZXMuYmliIA0KbGluay1jaXRhdGlvbnM6IHllcw0KLS0tDQoNCjxzdHlsZT4NCiNUT0Mgew0KICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vd3d3LmxhdHJvYmUuZWR1LmF1L19tZWRpYS9sYS10cm9iZS1hcGkvdjUvaW1nL2xvZ28uc3ZnIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgcGFkZGluZy10b3A6IDgwcHggIWltcG9ydGFudDsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCjwvc3R5bGU+DQoNCiMjIyBEYXRhIFNjaWVuY2UgU3RyZWFtIHstfQ0KDQojIyMgVG9waWMgMUI6IFVzaW5nIFJTdHVkaW8gey19DQoNCjxicj4NCg0KRXhhbXBsZSBSIGNvZGUgc29sdXRpb25zIGZvciB0aGUgW0RhdGEgU2NpZW5jZSBDb21wdXRlciBMYWIgMV0oaHR0cHM6Ly9ycHVicy5jb20vTFRVX1NUTTEwMDEvRFNNQ0wxKSwgd2hpY2ggdXNlcyB0aGUgcGFja2FnZXMgYG1lbWVgIFtAbWVtZXNdLCBgbWFnaWNrYCBbQG1hZ2lja10sDQo8IS0tIGByZmlzaGRyYXdgIFtAcmZpc2hkcmF3XSAgLS0+DQphbmQgYHBhbG1lcnBlbmd1aW5zYCBbQHBlbmd1aW5zXSwgYXJlIHByZXNlbnRlZCBiZWxvdy4NCg0KPGJyPg0KDQojIENoZWNrbGlzdCB7LX0NCg0KTm8gYW5zd2VyIHJlcXVpcmVkLiBKdXN0IG1ha2Ugc3VyZSB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHRhc2tzIGxpc3RlZCBpbiB0aGUgZG90LXBvaW50cy4NCg0KIyBJbnN0YWxsaW5nIG5ldyBSIHBhY2thZ2VzDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcygibWVtZSIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQppbnN0YWxsLnBhY2thZ2VzKCJtZW1lIikNCmBgYA0KDQojIw0KDQpObyBhbnN3ZXIgcmVxdWlyZWQuDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IEYsIGluY2x1ZGUgPSBGfQ0KbGlicmFyeShtZW1lKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQpsaWJyYXJ5KG1lbWUpDQpgYGANCg0KDQojIE1ha2luZyBtZW1lcyBpbiBSU3R1ZGlvIHsjbWVtZXN9DQoNCiMjIA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfQ0KaGFncmlkIDwtICJodHRwczovL2kuaW1nZmxpcC5jb20vMTN3YjJ0LmpwZyINCmBgYA0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCm1lbWUoaGFncmlkLCAiWWVyIGEgd2l6YXJkIiwgIndpdGggY29kaW5nIiwgZm9udCA9ICJzYW5zIikNCmBgYA0KDQoqTm90ZTogU29tZSB3YXJuaW5ncyBtYXkgYXBwZWFyIGluIHlvdXIgUiBDb25zb2xlIGFzIHRoaXMgY29kZSBpcyBleGVjdXRpbmcuIERvbid0IHdvcnJ5IGFib3V0IGl0LCBpdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGVzZSB3YXJuaW5ncy4qIA0KDQojIyBIb3cgdG8gc2F2ZSBSU3R1ZGlvIGltYWdlcw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCnN1Y2Nlc3Nfa2lkIDwtICJodHRwOi8vaTAua3ltLWNkbi5jb20vZW50cmllcy9pY29ucy9tb2JpbGUvMDAwLzAwMC83NDUvc3VjY2Vzcy5qcGciDQpzdWNjZXNzIDwtIG1lbWUoc3VjY2Vzc19raWQsICJVc2luZyBSIiwgInRvIG1ha2UgbWVtZXMiLCBmb250ID0gInNhbnMiKQ0Kc3VjY2Vzcw0KYGBgDQoNCiMjIyBPcHRpb24gQTogQmFzZSBSIGZ1bmN0aW9uDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQp3aW5kb3dzKCkgIyBvciBxdWFydHosIGlmIHlvdSBhcmUgYSBNYWMgdXNlcg0Kc3VjY2VzcyAjIHJlbmRlciB0aGUgaW1hZ2UgaW4gdGhlIGdyYXBoaWNzIGRldmljZQ0Kc2F2ZVBsb3QoZmlsZW5hbWUgPSAic3VjY2Vzc2tpZCIsIHR5cGUgPSAicG5nIikgDQpgYGANCg0KIyMjIE9wdGlvbiBCOiBBIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBwYWNrYWdlDQoNCkFuIGV4YW1wbGUgY29tbWFuZCB0byBzYXZlIHRoZSBgc3VjY2Vzc2Agb2JqZWN0IHRvIHRoZSAqKmltYWdpbmFyeSBmaWxlcGF0aCoqIGAiU1RNMTAwMS9EYXRhIFNjaWVuY2Uvc3VjY2Vzc19raWRfUl9tZW1lLnBuZyJgIGlzIHNob3duIGJlbG93Lg0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IEYsIGVjaG8gPSBUfQ0KbWVtZV9zYXZlKHN1Y2Nlc3MsIGZpbGU9IlNUTTEwMDEvRGF0YSBTY2llbmNlL3N1Y2Nlc3Nfa2lkX1JfbWVtZS5wbmciKSANCmBgYA0KDQojIyMgT3B0aW9uIEM6IFZpYSB0aGUgUlN0dWRpbyBQbG90cyB3aW5kb3cNCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIw0KDQpQbGVhc2UgcmVmZXIgdG8gdGhlIHByZXZpb3VzIHN0ZXBzIG9mIFxAcmVmKG1lbWVzKSBmb3IgYSBndWlkZSBvbiBsb2FkaW5nIGFuIGltYWdlLCBhZGRpbmcgdGV4dCwgYW5kIHRoZW4gc2F2aW5nIHlvdXIgY3JlYXRpb24uDQoNCiMgQ3VzdG9taXppbmcgR0lGcyBpbiBSU3R1ZGlvDQoNCipQbGVhc2Ugbm90ZSB0aGF0IGZvciB0aGlzIHF1ZXN0aW9uLCB3aGlsZSB0aGUgY29kZSB0byBwcmVzZW50IHRoZSBHSUZzIGlzIGluY2x1ZGVkLCB0aGUgR0lGcyB0aGVtc2VsdmVzIGFyZSBub3QgcmVwcm9kdWNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBiZWxvdy4qDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIiwgcmVwb3MgPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCmluc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9DQpsaWJyYXJ5KG1hZ2ljaykNCmBgYA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IEYsIGVjaG8gPSBUfQ0KbGlicmFyeShtYWdpY2spDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgZmlnLmFsaWduID0gImNlbnRlciJ9DQpFYXJ0aCA8LSBpbWFnZV9yZWFkKCJodHRwczovL2kuZ2lwaHkuY29tL21lZGlhL21mOFViSURldzdlOGcvZ2lwaHkuZ2lmIikNCkVhcnRoDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgZmlnLmFsaWduID0gImNlbnRlciJ9DQpyZXYoRWFydGgpICU+JSANCiAgICAgICAgICAgaW1hZ2VfZmxpcCgpICU+JSANCiAgICAgICAgICAgaW1hZ2VfYW5ub3RhdGUoIiAgICAgIE1lYW53aGlsZSwgaW4gQXVzdHJhbGlhIiwgc2l6ZSA9IDQwLCBjb2xvciA9ICJ3aGl0ZSIpDQpgYGANCg0KPCEtLSAjIERyYXdpbmcgYSBmaXNoIGluIFJTdHVkaW8gLS0+DQoNCjwhLS0gIyMgLS0+DQoNCjwhLS0gYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgaW5jbHVkZSA9IEZ9IC0tPg0KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJyZmlzaGRyYXciLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikgLS0+DQo8IS0tIGluc3RhbGwucGFja2FnZXMoInBhdGNod29yayIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKSAtLT4NCjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSAjIE1haW4gcGFja2FnZSAtLT4NCjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicmZpc2hkcmF3IikgLS0+DQo8IS0tICMgRGVwZW5kZW5jaWVzIC0tPg0KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJwYXRjaHdvcmsiKTsgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpIC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9IC0tPg0KPCEtLSBsaWJyYXJ5KCJyZmlzaGRyYXciKTsgbGlicmFyeSgicGF0Y2h3b3JrIik7IGxpYnJhcnkoImdncGxvdDIiKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSBsaWJyYXJ5KCJyZmlzaGRyYXciKTsgbGlicmFyeSgicGF0Y2h3b3JrIik7IGxpYnJhcnkoImdncGxvdDIiKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tICMjIC0tPg0KDQo8IS0tIEFuIGV4YW1wbGUgc29sdXRpb24gZm9yIFdpbmRvd3MgdXNlcnMgaXMgc2hvd24gYmVsb3c6IC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGfSAtLT4NCjwhLS0gZ2V0X3BvbHlsaW5lcyhwYXRoID0gImluc3QvZmlzaGRyYXcuanMiLCBmb3JtYXQgPSAic21pbCIsIC0tPg0KPCEtLSAgICAgICAgICAgICAgIG91dHB1dCA9ICJhbmltYXRlZC5zdmciLCBkcmF3X3R5cGUgPSAicmFuZG9tIikgLS0+DQoNCjwhLS0gd2luZG93cygpIC0tPg0KPCEtLSBmaXNoX2RyYXcoKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IEYsIHdhcm5pbmcgPSBGLCBpbmNsdWRlID0gRn0gLS0+DQo8IS0tIGdldF9wb2x5bGluZXMocGF0aCA9ICJpbnN0L2Zpc2hkcmF3LmpzIiwgZm9ybWF0ID0gInNtaWwiLCAtLT4NCjwhLS0gICAgICAgICAgICAgICBvdXRwdXQgPSAiYW5pbWF0ZWQuc3ZnIiwgZHJhd190eXBlID0gInJhbmRvbSIpIC0tPg0KDQo8IS0tIHdpbmRvd3MoKSAtLT4NCjwhLS0gZmlzaF9kcmF3KCkgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSAjIyAtLT4NCg0KPCEtLSBgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfSAtLT4NCjwhLS0gZmlzaF9kcmF3KGNvbCA9ICJibHVlIikgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSBBcyBhbiBleGFtcGxlLCB5b3UgbWF5IGhhdmUgY2hhbmdlZCB0aGUgZmlzaCBjb2xvdXIgdG8gcmVkLCBpbiB3aGljaCBjYXNlIHlvdXIgY29kZSB3b3VsZCBsb29rIGxpa2UgdGhpczogLS0+DQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSBmaXNoX2RyYXcoY29sID0gInJlZCIpIC0tPg0KPCEtLSBgYGAgLS0+DQoNCiMgUGFsbWVyIFBlbmd1aW5zIERhdGEgU2V0IHsjcGVuZ3VpbnN9DQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IEYsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcyhzZXRkaWZmKCJwYWxtZXJwZW5ndWlucyIsIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSksIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQppbnN0YWxsLnBhY2thZ2VzKCJwYWxtZXJwZW5ndWlucyIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVH0NCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVH0NCiMgVGhpcyBjb2RlIGNoZWNrcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSBpbiB0aGUgYHBhbG1lcnBlbmd1aW5zYCBwYWNrYWdlDQpkaW0ocGVuZ3VpbnMpDQpucm93KHBlbmd1aW5zKQ0KbmNvbChwZW5ndWlucykNCmBgYA0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfQ0KIyBUaGlzIGNvZGUgc3VtbWFyaXNlcyB0aGUgZGF0YSBpbiB0aGUgYHBhbG1lcnBlbmd1aW5zYCBwYWNrYWdlDQpzdW1tYXJ5KHBlbmd1aW5zKQ0KYGBgDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFR9DQojIFRoaXMgY29kZSBjaGVja3MgdGhlIGZpcnN0IDYgcm93cyBvZiBkYXRhIGluIHRoZSBgcGFsbWVycGVuZ3VpbnNgIHBhY2thZ2UNCmhlYWQocGVuZ3VpbnMpDQpgYGANCg0KIyMNCg0KTm90ZSB0aGF0IHRoZSBjb2RlIGZvciB0aGlzIHF1ZXN0aW9uIGlzIHNob3duIGJlbG93LCBidXQgdGhlIG91dHB1dCBpcyBvbWl0dGVkLCBmb3IgYnJldml0eS4NCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCnBlbmd1aW5zJGJpbGxfbGVuZ3RoX21tDQpgYGANCg0KIyMNCg0KTm90ZSB0aGF0IHRoZSBjb2RlIGZvciB0aGlzIHF1ZXN0aW9uIGlzIHNob3duIGJlbG93LCBidXQgdGhlIG91dHB1dCBpcyBvbWl0dGVkLCBmb3IgYnJldml0eS4NCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCnBlbmd1aW5zJGJpbGxfZGVwdGhfbW0NCnBlbmd1aW5zJGJvZHlfbWFzc19nDQpgYGANCg0KPGJyPg0KDQojIyMjIFdlbGwgZG9uZSwgdGhhdCdzIGV2ZXJ5dGhpbmcgY292ZXJlZC4gIyMjIyB7LX0NCg0KPGJyPg0KDQojIFJlZmVyZW5jZXMgey0gI1JlZn0NCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pg0KDQo8YnI+DQoNCjxmb250IGNvbG9yID0gImdyZXkiPg0KVGhlc2Ugbm90ZXMgaGF2ZSBiZWVuIHByZXBhcmVkIGJ5IFJ1cGVydCBLdXZla2UuIFRoZSBjb3B5cmlnaHQgZm9yIHRoZSBtYXRlcmlhbCBpbiB0aGVzZSBub3RlcyByZXNpZGVzIHdpdGggdGhlIGF1dGhvciBuYW1lZCBhYm92ZSwgd2l0aCB0aGUgRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljYWwgYW5kIFBoeXNpY2FsIFNjaWVuY2VzIGFuZCB3aXRoIExhIFRyb2JlIFVuaXZlcnNpdHkuIENvcHlyaWdodCBpbiB0aGlzIHdvcmsgaXMgdmVzdGVkIGluIExhIFRyb2JlIFVuaXZlcnNpdHkgaW5jbHVkaW5nIGFsbCBMYSBUcm9iZSBVbml2ZXJzaXR5IGJyYW5kaW5nIGFuZCBuYW1pbmcuIFVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBtYXRlcmlhbCB3aXRoaW4gdGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob24gQ29tbWVyY2lhbC1Ob24gRGVyaXZhdGl2ZXMgTGljZW5zZSANCjxhIGhyZWYgPSAiaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLW5kLzQuMC9DQyIgdGFyZ2V0PSJfYmxhbmsiPiBCWS1OQy1ORC4gPC9hPg0KPC9mb250Pg==