Data Science Stream
Preparation
library(palmerpenguins)
library(plotly)
Creating Interactive Box Plots in RStudio
penguins_box <- plot_ly(data = penguins, y = ~body_mass_g, type = "box")
penguins_box
penguins_box <- plot_ly(data = penguins,
y = ~body_mass_g,
type = "box",
x0 = "body mass (g)")
penguins_box
penguins_box <- plot_ly(data = penguins,
y = ~body_mass_g,
color = ~sex,
type = "box")
penguins_box
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.
penguins_box <- plot_ly(data = penguins,
x = ~species, y = ~body_mass_g,
color = ~sex, type = "box")
penguins_box
penguins_box %>% layout(boxmode = "group")
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.
Piping
penguins_box %>% layout(title = "Box Plots of Penguin body mass Data",
boxmode = "group")
penguins_box %>% layout(title = "Box Plots of Penguin body mass Data",
boxmode = "group",
legend=list(title=list(text='Sex')))
penguins_box %>% layout(xaxis = list(title = "Penguin Species"),
yaxis = list(title = "Penguin Body Mass (grams)"),
boxmode = "group",
legend=list(title=list(text='Sex')))
Creating Interactive Violin Plots in RStudio
penguins_violin <- plot_ly(data = penguins,
y = ~body_mass_g,
type = "violin",
x0 = "body mass (g)",
box = list(visible = T ))
penguins_violin
penguins_violin <- plot_ly(data = penguins,
x = ~species,
y = ~body_mass_g,
type = 'violin',
box = list(visible = T ))
penguins_violin
# 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
penguins_violin %>% layout(violinmode = "group")
penguins_violin %>% layout(title = "Violin Plots of Penguin body mass Data",
violinmode = "group")
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+