Data Science Stream

Topic 3B: Data Visualisation II


Example R code solutions for the Data Science Computer Lab 3, which uses data from Horst, Hill, and Gorman (2020), and the plotly (Sievert 2020) R package, are presented below.


1 Preparation

1.1

library(palmerpenguins)
library(plotly)

2 Creating Interactive Box Plots in RStudio

2.1

No answer required.

2.2

penguins_box <- plot_ly(data = penguins, y = ~body_mass_g, type = "box")
penguins_box

2.3

penguins_box <- plot_ly(data = penguins, 
                        y = ~body_mass_g, 
                        type = "box", 
                        x0 = "body mass (g)")
penguins_box

2.4

penguins_box <- plot_ly(data = penguins, 
                        y = ~body_mass_g,
                        color = ~sex, 
                        type = "box")
penguins_box

2.5

We observe that the distributions of body mass values for both male and female penguins are positively skewed, and clearly not symmetrical, as shown by the median values not being equidistant between the first and third quartile values.

2.6

penguins_box <- plot_ly(data = penguins, 
                        x = ~species, y = ~body_mass_g, 
                        color = ~sex, type = "box")
penguins_box

2.7

penguins_box %>% layout(boxmode = "group")

2.8

We observe that the male penguins for each species have much higher median body mass values. There is a particularly large difference in the distributions of body masses for male and female Gentoo penguins. The male and female Chinstrap penguins are relatively close in median body mass. Interestingly, the female Gentoo penguins are generally much heavier than both female and male penguins of the other species.

Another point of interest is that the distributions of body mass, when split across species and sex, no longer appear as skewed. The male Adelie and Chinstrap penguins have slightly skewed body mass distributions, but the other groups appear to have roughly symmetric distributions.

3 Piping

3.1

penguins_box %>% layout(title = "Box Plots of Penguin body mass Data", 
                        boxmode = "group")

3.2

penguins_box %>% layout(title = "Box Plots of Penguin body mass Data", 
                        boxmode = "group",
                        legend=list(title=list(text='Sex')))

3.3

No answer required.

3.4

penguins_box %>% layout(xaxis = list(title = "Penguin Species"),
                        yaxis = list(title = "Penguin Body Mass (grams)"),
                        boxmode = "group",
                        legend=list(title=list(text='Sex')))

3.5

No answer required.

3.6

No answer required.

4 Creating Interactive Violin Plots in RStudio

4.1

penguins_violin <- plot_ly(data = penguins, 
                           y = ~body_mass_g, 
                           type = "violin", 
                           x0 = "body mass (g)",
                           box = list(visible = T ))
penguins_violin

4.2

penguins_violin <- plot_ly(data = penguins, 
                           x = ~species,
                           y = ~body_mass_g, 
                           type = 'violin',
                           box = list(visible = T )) 
penguins_violin

4.3

# Note you could replace split = ~sex with color = ~sex here
penguins_violin <- plot_ly(data = penguins, 
                           x = ~species,
                           y = ~body_mass_g, 
                           split = ~sex, 
                           type = 'violin',
                           box = list(visible = T )) 
penguins_violin

4.4

penguins_violin  %>% layout(violinmode = "group")

4.5

penguins_violin  %>% layout(title = "Violin Plots of Penguin body mass Data",
                            violinmode = "group")

5 Extension: Creating your own plotly plots

Example code for the creation of violin plots with all the specified characteristics is shown below:

violin_fig <- plot_ly(data = penguins, 
                      x = ~sex, y = ~bill_length_mm, 
                      type = 'violin', 
                      split = ~species, 
                      color = ~island, 
                      text = ~island,
                      box = list(visible = T )) 

violin_fig %>% layout(title = "Violin Plots of Penguin bill length Data",
                      yaxis = list(title = "bill length (mm)"), 
                      violinmode = "group")


That’s everything for this lab.


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.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.


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.

LS0tDQp0aXRsZTogIlNUTTEwMDE6IENvbXB1dGVyIExhYiAzQiBTb2x1dGlvbnMiDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KYmlibGlvZ3JhcGh5OiBTVE0xMDAxX0RTX0NMX3JlZmVyZW5jZXMuYmliIA0KbGluay1jaXRhdGlvbnM6IHllcw0KLS0tDQoNCjxzdHlsZT4NCiNUT0Mgew0KICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vd3d3LmxhdHJvYmUuZWR1LmF1L19tZWRpYS9sYS10cm9iZS1hcGkvdjUvaW1nL2xvZ28uc3ZnIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgcGFkZGluZy10b3A6IDgwcHggIWltcG9ydGFudDsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCjwvc3R5bGU+DQoNCiMjIyBEYXRhIFNjaWVuY2UgU3RyZWFtIHstfQ0KDQojIyMgVG9waWMgM0I6IERhdGEgVmlzdWFsaXNhdGlvbiBJSSB7LX0NCg0KPGJyPg0KDQpFeGFtcGxlIFIgY29kZSBzb2x1dGlvbnMgZm9yIHRoZSBbRGF0YSBTY2llbmNlIENvbXB1dGVyIExhYiAzXShodHRwczovL3JwdWJzLmNvbS9MVFVfU1RNMTAwMS9EU01DTDMpLCB3aGljaCB1c2VzIGRhdGEgZnJvbSBAcGVuZ3VpbnMsIGFuZCB0aGUgYHBsb3RseWAgW0BwbG90bHldIFIgcGFja2FnZSwgYXJlIHByZXNlbnRlZCBiZWxvdy4NCg0KPGJyPg0KDQojIFByZXBhcmF0aW9uIHsjbG9hZGluZ30NCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQpsaWJyYXJ5KHBsb3RseSkNCmBgYA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGluY2x1ZGUgPSBGfQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBpbmNsdWRlID0gRn0NCnBlbmd1aW5zIDwtIG5hLm9taXQocGVuZ3VpbnMpDQpgYGANCg0KIyBDcmVhdGluZyBJbnRlcmFjdGl2ZSBCb3ggUGxvdHMgaW4gUlN0dWRpbw0KDQojIw0KDQpObyBhbnN3ZXIgcmVxdWlyZWQuDQoNCiMjIA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBmaWcuYWxpZ249J2NlbnRlcid9DQpwZW5ndWluc19ib3ggPC0gcGxvdF9seShkYXRhID0gcGVuZ3VpbnMsIHkgPSB+Ym9keV9tYXNzX2csIHR5cGUgPSAiYm94IikNCnBlbmd1aW5zX2JveA0KYGBgDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnBlbmd1aW5zX2JveCA8LSBwbG90X2x5KGRhdGEgPSBwZW5ndWlucywgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gfmJvZHlfbWFzc19nLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiYm94IiwgDQogICAgICAgICAgICAgICAgICAgICAgICB4MCA9ICJib2R5IG1hc3MgKGcpIikNCnBlbmd1aW5zX2JveA0KYGBgDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZyA9IEZ9DQpwZW5ndWluc19ib3ggPC0gcGxvdF9seShkYXRhID0gcGVuZ3VpbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IH5ib2R5X21hc3NfZywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnNleCwgDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImJveCIpDQpwZW5ndWluc19ib3gNCmBgYA0KDQojIw0KDQpXZSBvYnNlcnZlIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgYm9keSBtYXNzIHZhbHVlcyBmb3IgYm90aCBtYWxlIGFuZCBmZW1hbGUgcGVuZ3VpbnMgYXJlIHBvc2l0aXZlbHkgc2tld2VkLCBhbmQgY2xlYXJseSBub3Qgc3ltbWV0cmljYWwsIGFzIHNob3duIGJ5IHRoZSBtZWRpYW4gdmFsdWVzIG5vdCBiZWluZyBlcXVpZGlzdGFudCBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGUgdmFsdWVzLg0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmcgPSBGfQ0KcGVuZ3VpbnNfYm94IDwtIHBsb3RfbHkoZGF0YSA9IHBlbmd1aW5zLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHggPSB+c3BlY2llcywgeSA9IH5ib2R5X21hc3NfZywgDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH5zZXgsIHR5cGUgPSAiYm94IikNCnBlbmd1aW5zX2JveA0KYGBgDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZyA9IEZ9DQpwZW5ndWluc19ib3ggJT4lIGxheW91dChib3htb2RlID0gImdyb3VwIikNCmBgYA0KDQojIw0KDQpXZSBvYnNlcnZlIHRoYXQgdGhlIG1hbGUgcGVuZ3VpbnMgZm9yIGVhY2ggc3BlY2llcyBoYXZlIG11Y2ggaGlnaGVyIG1lZGlhbiBib2R5IG1hc3MgdmFsdWVzLiBUaGVyZSBpcyBhIHBhcnRpY3VsYXJseSBsYXJnZSBkaWZmZXJlbmNlIGluIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvZHkgbWFzc2VzIGZvciBtYWxlIGFuZCBmZW1hbGUgYEdlbnRvb2AgcGVuZ3VpbnMuIFRoZSBtYWxlIGFuZCBmZW1hbGUgYENoaW5zdHJhcGAgcGVuZ3VpbnMgYXJlIHJlbGF0aXZlbHkgY2xvc2UgaW4gbWVkaWFuIGJvZHkgbWFzcy4gSW50ZXJlc3RpbmdseSwgdGhlIGZlbWFsZSBgR2VudG9vYCBwZW5ndWlucyBhcmUgZ2VuZXJhbGx5IG11Y2ggaGVhdmllciB0aGFuIGJvdGggZmVtYWxlIGFuZCBtYWxlIHBlbmd1aW5zIG9mIHRoZSBvdGhlciBzcGVjaWVzLg0KDQpBbm90aGVyIHBvaW50IG9mIGludGVyZXN0IGlzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgYm9keSBtYXNzLCB3aGVuIHNwbGl0IGFjcm9zcyBzcGVjaWVzIGFuZCBzZXgsIG5vIGxvbmdlciBhcHBlYXIgYXMgc2tld2VkLiBUaGUgbWFsZSBBZGVsaWUgYW5kIENoaW5zdHJhcCBwZW5ndWlucyBoYXZlIHNsaWdodGx5IHNrZXdlZCBib2R5IG1hc3MgZGlzdHJpYnV0aW9ucywgYnV0IHRoZSBvdGhlciBncm91cHMgYXBwZWFyIHRvIGhhdmUgcm91Z2hseSBzeW1tZXRyaWMgZGlzdHJpYnV0aW9ucy4NCg0KIyBQaXBpbmcNCg0KIyMgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCB3YXJuaW5nID0gRn0NCnBlbmd1aW5zX2JveCAlPiUgbGF5b3V0KHRpdGxlID0gIkJveCBQbG90cyBvZiBQZW5ndWluIGJvZHkgbWFzcyBEYXRhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBib3htb2RlID0gImdyb3VwIikNCmBgYA0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgd2FybmluZyA9IEZ9DQpwZW5ndWluc19ib3ggJT4lIGxheW91dCh0aXRsZSA9ICJCb3ggUGxvdHMgb2YgUGVuZ3VpbiBib2R5IG1hc3MgRGF0YSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgYm94bW9kZSA9ICJncm91cCIsDQogICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQ9bGlzdCh0aXRsZT1saXN0KHRleHQ9J1NleCcpKSkNCmBgYA0KDQojIyANCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIyB7I3RpdGxlfQ0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCB3YXJuaW5nID0gRiwgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCB3YXJuaW5nID0gRn0NCnBlbmd1aW5zX2JveCAlPiUgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICJQZW5ndWluIFNwZWNpZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZW5ndWluIEJvZHkgTWFzcyAoZ3JhbXMpIiksDQogICAgICAgICAgICAgICAgICAgICAgICBib3htb2RlID0gImdyb3VwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZD1saXN0KHRpdGxlPWxpc3QodGV4dD0nU2V4JykpKQ0KYGBgDQoNCiMjDQoNCk5vIGFuc3dlciByZXF1aXJlZC4NCg0KIyMNCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIENyZWF0aW5nIEludGVyYWN0aXZlIFZpb2xpbiBQbG90cyBpbiBSU3R1ZGlvDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGfQ0KcGVuZ3VpbnNfdmlvbGluIDwtIHBsb3RfbHkoZGF0YSA9IHBlbmd1aW5zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB+Ym9keV9tYXNzX2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ2aW9saW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHgwID0gImJvZHkgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94ID0gbGlzdCh2aXNpYmxlID0gVCApKQ0KcGVuZ3VpbnNfdmlvbGluDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEZ9DQpwZW5ndWluc192aW9saW4gPC0gcGxvdF9seShkYXRhID0gcGVuZ3VpbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IH5zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IH5ib2R5X21hc3NfZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3Zpb2xpbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBib3ggPSBsaXN0KHZpc2libGUgPSBUICkpIA0KcGVuZ3VpbnNfdmlvbGluDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEZ9DQojIE5vdGUgeW91IGNvdWxkIHJlcGxhY2Ugc3BsaXQgPSB+c2V4IHdpdGggY29sb3IgPSB+c2V4IGhlcmUNCnBlbmd1aW5zX3Zpb2xpbiA8LSBwbG90X2x5KGRhdGEgPSBwZW5ndWlucywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gfnNwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gfmJvZHlfbWFzc19nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gfnNleCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3Zpb2xpbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBib3ggPSBsaXN0KHZpc2libGUgPSBUICkpIA0KcGVuZ3VpbnNfdmlvbGluDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEZ9DQpwZW5ndWluc192aW9saW4gICU+JSBsYXlvdXQodmlvbGlubW9kZSA9ICJncm91cCIpDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEZ9DQpwZW5ndWluc192aW9saW4gICU+JSBsYXlvdXQodGl0bGUgPSAiVmlvbGluIFBsb3RzIG9mIFBlbmd1aW4gYm9keSBtYXNzIERhdGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xpbm1vZGUgPSAiZ3JvdXAiKQ0KYGBgDQoNCg0KIyBFeHRlbnNpb246IENyZWF0aW5nIHlvdXIgb3duIGBwbG90bHlgIHBsb3RzIA0KDQpFeGFtcGxlIGNvZGUgZm9yIHRoZSBjcmVhdGlvbiBvZiB2aW9saW4gcGxvdHMgd2l0aCBhbGwgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJpc3RpY3MgaXMgc2hvd24gYmVsb3c6DQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBmaWcuZGltID0gYyg4LCA2KSwgZmlnLmFsaWduID0gImNlbnRlciJ9DQp2aW9saW5fZmlnIDwtIHBsb3RfbHkoZGF0YSA9IHBlbmd1aW5zLCANCiAgICAgICAgICAgICAgICAgICAgICB4ID0gfnNleCwgeSA9IH5iaWxsX2xlbmd0aF9tbSwgDQogICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICd2aW9saW4nLCANCiAgICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IH5zcGVjaWVzLCANCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH5pc2xhbmQsIA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB+aXNsYW5kLA0KICAgICAgICAgICAgICAgICAgICAgIGJveCA9IGxpc3QodmlzaWJsZSA9IFQgKSkgDQoNCnZpb2xpbl9maWcgJT4lIGxheW91dCh0aXRsZSA9ICJWaW9saW4gUGxvdHMgb2YgUGVuZ3VpbiBiaWxsIGxlbmd0aCBEYXRhIiwNCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiYmlsbCBsZW5ndGggKG1tKSIpLCANCiAgICAgICAgICAgICAgICAgICAgICB2aW9saW5tb2RlID0gImdyb3VwIikNCmBgYA0KDQo8YnI+DQoNCiMjIyMgVGhhdCdzIGV2ZXJ5dGhpbmcgZm9yIHRoaXMgbGFiLiAjIyMjIHstfQ0KDQo8YnI+DQoNCiMgUmVmZXJlbmNlcyB7LSAjUmVmfQ0KPGRpdiBpZD0icmVmcyI+PC9kaXY+DQoNCjxicj4NCg0KPGZvbnQgY29sb3IgPSAiZ3JleSI+DQpUaGVzZSBub3RlcyBoYXZlIGJlZW4gcHJlcGFyZWQgYnkgUnVwZXJ0IEt1dmVrZS4gVGhlIGNvcHlyaWdodCBmb3IgdGhlIG1hdGVyaWFsIGluIHRoZXNlIG5vdGVzIHJlc2lkZXMgd2l0aCB0aGUgYXV0aG9yIG5hbWVkIGFib3ZlLCB3aXRoIHRoZSBEZXBhcnRtZW50IG9mIE1hdGhlbWF0aWNhbCBhbmQgUGh5c2ljYWwgU2NpZW5jZXMgYW5kIHdpdGggTGEgVHJvYmUgVW5pdmVyc2l0eS4gQ29weXJpZ2h0IGluIHRoaXMgd29yayBpcyB2ZXN0ZWQgaW4gTGEgVHJvYmUgVW5pdmVyc2l0eSBpbmNsdWRpbmcgYWxsIExhIFRyb2JlIFVuaXZlcnNpdHkgYnJhbmRpbmcgYW5kIG5hbWluZy4gVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIG1hdGVyaWFsIHdpdGhpbiB0aGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbiBDb21tZXJjaWFsLU5vbiBEZXJpdmF0aXZlcyBMaWNlbnNlIA0KPGEgaHJlZiA9ICJodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMtbmQvNC4wL0NDIiB0YXJnZXQ9Il9ibGFuayI+IEJZLU5DLU5ELiA8L2E+DQo8L2ZvbnQ+