Base R has many built in functions that can be used to create different type of plots. Some of them are discussed here.

Get help on your problems from experienced statisticians at homeworkhelponline.net.


Pie Chart

> food <- c("Burger","Pasta","Pizza","Rice","Chicken")
> price <- c(200,150,600,100,90)
> # to find percentage amount
> par <- round(price/sum(price)*100)    
> # to define Food object in pie chart with percentage sign and value
> labs <- paste(food,par,"%")
> pie(price,
+     labels = labs, 
+     col=1:5,
+     main="Pie Chart of Food Price")

> pie(price,
+     labels = labs, col=1:5,
+     main="Pie Chart of Food Price",
+     radius=0.4)

Barplot

> barplot(price,main="Barplot", xlab="Food", ylab="Price",
+         names.arg=food)

> barplot(price,main="Barplot", xlab="Price", ylab="Food Item",
+         names.arg=food,col=1:5)

> barplot(price, ylab="Food", xlab="Price", main="Barplot of Foods",
+         horiz=F, names.arg=food,
+         border="blue",
+         col="lightblue",
+         density=30)

Using legend -

> barplot(price,
+         main="Barplot", xlab="Price", ylab="Food Item",
+         col=1:5)
> legend(x = "topright",food,lty="solid",col=1:5, bg = "gray90", text.col = "blue4")

Histogram

> N <- 100
> set.seed(11)
> x <- rnorm(1000, 10, 3)   # to draw 1000 normal random numebrs
> hist(x, breaks=N,
+      main="Histogram of Sampling DIstribution",xlab="Samples Range",ylab="Frequency")

Reducing the number of breaks -

> N <- 30
> hist(x, breaks=N,
+      main="Histogram of Sampling DIstribution",xlab="Samples Range",ylab="Frequency")

Increasing the number of breaks -

> N <- 200
> hist(x, breaks=N,
+      main="Histogram of Sampling DIstribution",xlab="Samples Range",ylab="Frequency")

Sturges formula can be used for breaks using “Sturges” -

> hist(x, breaks="Sturges",
+      main="Histogram of Sampling DIstribution",xlab="Samples Range",ylab="Frequency")

To set probabilities in the y-axis set probability=T -

> hist(x, breaks="Sturges",
+      main="Histogram of Sampling Distribution",xlab="Samples Range",ylab="Probability",
+      probability = T)

Y and X axis’s range can be changed using xlim and ylim -

> hist(x, breaks=100,
+      main="Histogram of Sampling Distribution",xlab="Samples Range",ylab="Probability",
+      probability = T, xlim=c(-5,25), ylim= c(0,0.2))

Density Plot

Using the function density() we can find kernal density -

> set.seed(11)
> a <- rnorm(1000, 10, 3)   # to draw 1000 normal random numbers
> x <- density(a)
> plot(x,
+      main="Histogram of Sampling DIstribution",xlab="Samples Range",ylab="Frequency")

Using polygon() we can customize it-

> plot(x,
+      main="Histogram of Sampling DIstribution",
+      xlab="Samples Range",ylab="Frequency")
> polygon(x, col = "steelblue", border="black")

Boxplot

> set.seed(10)
> norm.number <- rnorm(100, 10, 3)
> pois.number <- rpois(10, 10)
> unif.number <- runif(n = 100, min = 0, max = 20)
> boxplot(norm.number, pois.number, unif.number,
+         main="Boxplot of different distributions")

Passing data frame to boxplot and using horizontal = T-

> dists <- data.frame(Normal=norm.number,
+                     Poisson=pois.number,
+                     Uniform=unif.number)
> boxplot(dists,
+         main="Boxplot of different distributions", horizontal = T)

> boxplot(dists,
+         main="Boxplot of different distributions", horizontal = T,
+         xlab="Frequiency", ylab="Distributions", col=1:3, las=1)

Scatter plot

This is the simplest way to graph a scatter plot -

> x <- 1:20
> y <- log10(x)*10
> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis")

Changing the type of points -

> x <- 1:20
> y <- log10(x)*10
> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      pch=20)

> x <- 1:20
> y <- log10(x)*10
> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      pch=10)

See the effect of using the argument las=1. It rotates the value of y-axis when las=1, rotates the value of x-axis when las=2 and rotates both when las=3. las=1 is pretty good to see:

> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      las=1)

Adding a fitted line to the graph -

> x <- 1:20
> y <- log10(x)*10
> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      pch=20)
> abline(lm(y ~ x), col="red")  # regression line
> lines(lowess(x,y), col="blue")  # draws a smooth line through the plot

Using cex to change the size of dots:

> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      cex=0.55)

> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis",
+      cex=1.4)

Let’s use the built-in USArrests data set-

> head(USArrests)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

Now -

> plot(USArrests$Murder, USArrests$Assault,
+      main="Relationship between Assault and Murder",
+      xlab="No. of Murder", ylab="Np. of Assault")
> abline(lm(USArrests$Assault ~ USArrests$Murder), col="red")
> lines(lowess(USArrests$Murder, USArrests$Assault), col="blue")

Multiple Scatterplots

Let’s use the built-in USArrests data set-

> head(USArrests)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

Let’s see the relationships through graph and correlation matrix -

> pairs(~Murder+UrbanPop+Rape,data=USArrests,
+    main="Simple Scatterplot Matrix")

> round(cor(USArrests[,c(1,3,4)]),2)
         Murder UrbanPop Rape
Murder     1.00     0.07 0.56
UrbanPop   0.07     1.00 0.41
Rape       0.56     0.41 1.00

Line plot

In plot() the argument type takes the values: “p” for points
“l” for lines
“b” for both points and lines
“c” for empty points joined by lines
“o” for overplotted points and lines
“s” and “S” for stair steps
“n” does not produce any points or lines

lty is for line type. Line types can either be specified as an integer (0=blank, 1=solid (default), 2=dashed, 3=dotted, 4=dotdash, 5=longdash, 6=twodash) or as one of the character strings “blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, or “twodash” -

> x <- 1:20
> y <- log10(x)*10
> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis", 
+      type="l",lty=1)

Using type=b and pch=20 -

> plot(x,y,
+      main="Relationship between X and Y",
+      xlab="X-axis", ylab="Y-axis", 
+      type="b",lty=1, pch=20)

LS0tDQp0aXRsZTogIkJhc2ljIFBsb3R0aW5nIg0KYXV0aG9yOiAiTUQgQUhTQU5VTCBJU0xBTSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBmYWxzZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQotLS0NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNvbW1lbnQgPSAiIiwgcHJvbXB0ID0gVFJVRSwgbWVzc2FnZT1GLCB3YXJuaW5nID0gRg0KKQ0KYGBgDQojIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KQmFzZSBSIGhhcyBtYW55IGJ1aWx0IGluIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBkaWZmZXJlbnQgdHlwZSBvZiBwbG90cy4gU29tZSBvZiB0aGVtIGFyZSBkaXNjdXNzZWQgaGVyZS4NCg0KR2V0IGhlbHAgb24geW91ciBwcm9ibGVtcyBmcm9tIGV4cGVyaWVuY2VkIHN0YXRpc3RpY2lhbnMgYXQgW2hvbWV3b3JraGVscG9ubGluZS5uZXRdKGh0dHBzOi8vd3d3LmhvbWV3b3JraGVscG9ubGluZS5uZXQvcHJvZ3JhbW1pbmcvci1wcm9ncmFtbWluZykuDQoNCi0tLS0tLQ0KDQojIyMgUGllIENoYXJ0DQoNCmBgYHtyfQ0KZm9vZCA8LSBjKCJCdXJnZXIiLCJQYXN0YSIsIlBpenphIiwiUmljZSIsIkNoaWNrZW4iKQ0KcHJpY2UgPC0gYygyMDAsMTUwLDYwMCwxMDAsOTApDQojIHRvIGZpbmQgcGVyY2VudGFnZSBhbW91bnQNCnBhciA8LSByb3VuZChwcmljZS9zdW0ocHJpY2UpKjEwMCkJDQojIHRvIGRlZmluZSBGb29kIG9iamVjdCBpbiBwaWUgY2hhcnQgd2l0aCBwZXJjZW50YWdlIHNpZ24gYW5kIHZhbHVlDQpsYWJzIDwtIHBhc3RlKGZvb2QscGFyLCIlIikNCnBpZShwcmljZSwNCiAgICBsYWJlbHMgPSBsYWJzLCANCiAgICBjb2w9MTo1LA0KICAgIG1haW49IlBpZSBDaGFydCBvZiBGb29kIFByaWNlIikNCmBgYA0KDQoNCmBgYHtyfQ0KcGllKHByaWNlLA0KICAgIGxhYmVscyA9IGxhYnMsIGNvbD0xOjUsDQogICAgbWFpbj0iUGllIENoYXJ0IG9mIEZvb2QgUHJpY2UiLA0KICAgIHJhZGl1cz0wLjQpDQpgYGANCg0KDQoNCiMjIyBCYXJwbG90DQoNCmBgYHtyfQ0KYmFycGxvdChwcmljZSxtYWluPSJCYXJwbG90IiwgeGxhYj0iRm9vZCIsIHlsYWI9IlByaWNlIiwNCiAgICAgICAgbmFtZXMuYXJnPWZvb2QpDQpgYGANCg0KYGBge3J9DQpiYXJwbG90KHByaWNlLG1haW49IkJhcnBsb3QiLCB4bGFiPSJQcmljZSIsIHlsYWI9IkZvb2QgSXRlbSIsDQogICAgICAgIG5hbWVzLmFyZz1mb29kLGNvbD0xOjUpDQpgYGANCmBgYHtyfQ0KYmFycGxvdChwcmljZSwgeWxhYj0iRm9vZCIsIHhsYWI9IlByaWNlIiwgbWFpbj0iQmFycGxvdCBvZiBGb29kcyIsDQogICAgICAgIGhvcml6PUYsIG5hbWVzLmFyZz1mb29kLA0KICAgICAgICBib3JkZXI9ImJsdWUiLA0KICAgICAgICBjb2w9ImxpZ2h0Ymx1ZSIsDQogICAgICAgIGRlbnNpdHk9MzApDQpgYGANCg0KVXNpbmcgbGVnZW5kIC0NCmBgYHtyfQ0KYmFycGxvdChwcmljZSwNCiAgICAgICAgbWFpbj0iQmFycGxvdCIsIHhsYWI9IlByaWNlIiwgeWxhYj0iRm9vZCBJdGVtIiwNCiAgICAgICAgY29sPTE6NSkNCmxlZ2VuZCh4ID0gInRvcHJpZ2h0Iixmb29kLGx0eT0ic29saWQiLGNvbD0xOjUsIGJnID0gImdyYXk5MCIsIHRleHQuY29sID0gImJsdWU0IikNCmBgYA0KDQoNCiMjIyBIaXN0b2dyYW0NCg0KYGBge3J9DQpOIDwtIDEwMA0Kc2V0LnNlZWQoMTEpDQp4IDwtIHJub3JtKDEwMDAsIDEwLCAzKQkjIHRvIGRyYXcgMTAwMCBub3JtYWwgcmFuZG9tIG51bWVicnMNCmhpc3QoeCwgYnJlYWtzPU4sDQogICAgIG1haW49Ikhpc3RvZ3JhbSBvZiBTYW1wbGluZyBESXN0cmlidXRpb24iLHhsYWI9IlNhbXBsZXMgUmFuZ2UiLHlsYWI9IkZyZXF1ZW5jeSIpDQpgYGANCg0KUmVkdWNpbmcgdGhlIG51bWJlciBvZiBicmVha3MgLQ0KYGBge3J9DQpOIDwtIDMwDQpoaXN0KHgsIGJyZWFrcz1OLA0KICAgICBtYWluPSJIaXN0b2dyYW0gb2YgU2FtcGxpbmcgRElzdHJpYnV0aW9uIix4bGFiPSJTYW1wbGVzIFJhbmdlIix5bGFiPSJGcmVxdWVuY3kiKQ0KYGBgDQoNCkluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBicmVha3MgLQ0KYGBge3J9DQpOIDwtIDIwMA0KaGlzdCh4LCBicmVha3M9TiwNCiAgICAgbWFpbj0iSGlzdG9ncmFtIG9mIFNhbXBsaW5nIERJc3RyaWJ1dGlvbiIseGxhYj0iU2FtcGxlcyBSYW5nZSIseWxhYj0iRnJlcXVlbmN5IikNCmBgYA0KDQpTdHVyZ2VzIGZvcm11bGEgY2FuIGJlIHVzZWQgZm9yIGJyZWFrcyB1c2luZyAiU3R1cmdlcyIgLQ0KYGBge3J9DQpoaXN0KHgsIGJyZWFrcz0iU3R1cmdlcyIsDQogICAgIG1haW49Ikhpc3RvZ3JhbSBvZiBTYW1wbGluZyBESXN0cmlidXRpb24iLHhsYWI9IlNhbXBsZXMgUmFuZ2UiLHlsYWI9IkZyZXF1ZW5jeSIpDQpgYGANCg0KVG8gc2V0IHByb2JhYmlsaXRpZXMgaW4gdGhlIHktYXhpcyBzZXQgYHByb2JhYmlsaXR5PVRgIC0NCmBgYHtyfQ0KaGlzdCh4LCBicmVha3M9IlN0dXJnZXMiLA0KICAgICBtYWluPSJIaXN0b2dyYW0gb2YgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIix4bGFiPSJTYW1wbGVzIFJhbmdlIix5bGFiPSJQcm9iYWJpbGl0eSIsDQogICAgIHByb2JhYmlsaXR5ID0gVCkNCmBgYA0KDQpZIGFuZCBYIGF4aXMncyByYW5nZSBjYW4gYmUgY2hhbmdlZCB1c2luZyBgeGxpbWAgYW5kIGB5bGltYCAtDQpgYGB7cn0NCmhpc3QoeCwgYnJlYWtzPTEwMCwNCiAgICAgbWFpbj0iSGlzdG9ncmFtIG9mIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiIseGxhYj0iU2FtcGxlcyBSYW5nZSIseWxhYj0iUHJvYmFiaWxpdHkiLA0KICAgICBwcm9iYWJpbGl0eSA9IFQsIHhsaW09YygtNSwyNSksIHlsaW09IGMoMCwwLjIpKQ0KYGBgDQoNCg0KIyMjIERlbnNpdHkgUGxvdA0KDQpVc2luZyB0aGUgZnVuY3Rpb24gYGRlbnNpdHkoKWAgd2UgY2FuIGZpbmQga2VybmFsIGRlbnNpdHkgLQ0KYGBge3J9DQpzZXQuc2VlZCgxMSkNCmEgPC0gcm5vcm0oMTAwMCwgMTAsIDMpCSMgdG8gZHJhdyAxMDAwIG5vcm1hbCByYW5kb20gbnVtYmVycw0KeCA8LSBkZW5zaXR5KGEpDQpwbG90KHgsDQogICAgIG1haW49Ikhpc3RvZ3JhbSBvZiBTYW1wbGluZyBESXN0cmlidXRpb24iLHhsYWI9IlNhbXBsZXMgUmFuZ2UiLHlsYWI9IkZyZXF1ZW5jeSIpDQpgYGANCg0KVXNpbmcgYHBvbHlnb24oKWAgd2UgY2FuIGN1c3RvbWl6ZSBpdC0NCmBgYHtyfQ0KcGxvdCh4LA0KICAgICBtYWluPSJIaXN0b2dyYW0gb2YgU2FtcGxpbmcgRElzdHJpYnV0aW9uIiwNCiAgICAgeGxhYj0iU2FtcGxlcyBSYW5nZSIseWxhYj0iRnJlcXVlbmN5IikNCnBvbHlnb24oeCwgY29sID0gInN0ZWVsYmx1ZSIsIGJvcmRlcj0iYmxhY2siKQ0KYGBgDQoNCiMjIyBCb3hwbG90DQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTApDQpub3JtLm51bWJlciA8LSBybm9ybSgxMDAsIDEwLCAzKQ0KcG9pcy5udW1iZXIgPC0gcnBvaXMoMTAsIDEwKQ0KdW5pZi5udW1iZXIgPC0gcnVuaWYobiA9IDEwMCwgbWluID0gMCwgbWF4ID0gMjApDQpib3hwbG90KG5vcm0ubnVtYmVyLCBwb2lzLm51bWJlciwgdW5pZi5udW1iZXIsDQogICAgICAgIG1haW49IkJveHBsb3Qgb2YgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMiKQ0KYGBgDQoNClBhc3NpbmcgZGF0YSBmcmFtZSB0byBib3hwbG90IGFuZCB1c2luZyBgaG9yaXpvbnRhbCA9IFRgLQ0KYGBge3J9DQpkaXN0cyA8LSBkYXRhLmZyYW1lKE5vcm1hbD1ub3JtLm51bWJlciwNCiAgICAgICAgICAgICAgICAgICAgUG9pc3Nvbj1wb2lzLm51bWJlciwNCiAgICAgICAgICAgICAgICAgICAgVW5pZm9ybT11bmlmLm51bWJlcikNCmJveHBsb3QoZGlzdHMsDQogICAgICAgIG1haW49IkJveHBsb3Qgb2YgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMiLCBob3Jpem9udGFsID0gVCkNCmBgYA0KDQpgYGB7cn0NCmJveHBsb3QoZGlzdHMsDQogICAgICAgIG1haW49IkJveHBsb3Qgb2YgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMiLCBob3Jpem9udGFsID0gVCwNCiAgICAgICAgeGxhYj0iRnJlcXVpZW5jeSIsIHlsYWI9IkRpc3RyaWJ1dGlvbnMiLCBjb2w9MTozLCBsYXM9MSkNCmBgYA0KDQojIyMgU2NhdHRlciBwbG90DQoNClRoaXMgaXMgdGhlIHNpbXBsZXN0IHdheSB0byBncmFwaCBhIHNjYXR0ZXIgcGxvdCAtDQpgYGB7cn0NCnggPC0gMToyMA0KeSA8LSBsb2cxMCh4KSoxMA0KcGxvdCh4LHksDQogICAgIG1haW49IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggYW5kIFkiLA0KICAgICB4bGFiPSJYLWF4aXMiLCB5bGFiPSJZLWF4aXMiKQ0KYGBgDQoNCkNoYW5naW5nIHRoZSB0eXBlIG9mIHBvaW50cyAtDQpgYGB7cn0NCnggPC0gMToyMA0KeSA8LSBsb2cxMCh4KSoxMA0KcGxvdCh4LHksDQogICAgIG1haW49IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggYW5kIFkiLA0KICAgICB4bGFiPSJYLWF4aXMiLCB5bGFiPSJZLWF4aXMiLA0KICAgICBwY2g9MjApDQpgYGANCg0KYGBge3J9DQp4IDwtIDE6MjANCnkgPC0gbG9nMTAoeCkqMTANCnBsb3QoeCx5LA0KICAgICBtYWluPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBYIGFuZCBZIiwNCiAgICAgeGxhYj0iWC1heGlzIiwgeWxhYj0iWS1heGlzIiwNCiAgICAgcGNoPTEwKQ0KYGBgDQoNCg0KU2VlIHRoZSBlZmZlY3Qgb2YgdXNpbmcgdGhlIGFyZ3VtZW50IGBsYXM9MWAuIEl0IHJvdGF0ZXMgdGhlIHZhbHVlIG9mIHktYXhpcyB3aGVuIGBsYXM9MWAsIHJvdGF0ZXMgdGhlIHZhbHVlIG9mIHgtYXhpcyB3aGVuIGBsYXM9MmAgYW5kIHJvdGF0ZXMgYm90aCB3aGVuIGBsYXM9M2AuIGBsYXM9MWAgaXMgcHJldHR5IGdvb2QgdG8gc2VlOg0KYGBge3J9DQpwbG90KHgseSwNCiAgICAgbWFpbj0iUmVsYXRpb25zaGlwIGJldHdlZW4gWCBhbmQgWSIsDQogICAgIHhsYWI9IlgtYXhpcyIsIHlsYWI9IlktYXhpcyIsDQogICAgIGxhcz0xKQ0KYGBgDQoNCkFkZGluZyBhIGZpdHRlZCBsaW5lIHRvIHRoZSBncmFwaCAtIA0KYGBge3J9DQp4IDwtIDE6MjANCnkgPC0gbG9nMTAoeCkqMTANCnBsb3QoeCx5LA0KICAgICBtYWluPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBYIGFuZCBZIiwNCiAgICAgeGxhYj0iWC1heGlzIiwgeWxhYj0iWS1heGlzIiwNCiAgICAgcGNoPTIwKQ0KYWJsaW5lKGxtKHkgfiB4KSwgY29sPSJyZWQiKSAgIyByZWdyZXNzaW9uIGxpbmUNCmxpbmVzKGxvd2Vzcyh4LHkpLCBjb2w9ImJsdWUiKSAgIyBkcmF3cyBhIHNtb290aCBsaW5lIHRocm91Z2ggdGhlIHBsb3QNCmBgYA0KDQpVc2luZyBgY2V4YCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgZG90czoNCmBgYHtyfQ0KcGxvdCh4LHksDQogICAgIG1haW49IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggYW5kIFkiLA0KICAgICB4bGFiPSJYLWF4aXMiLCB5bGFiPSJZLWF4aXMiLA0KICAgICBjZXg9MC41NSkNCmBgYA0KDQpgYGB7cn0NCnBsb3QoeCx5LA0KICAgICBtYWluPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBYIGFuZCBZIiwNCiAgICAgeGxhYj0iWC1heGlzIiwgeWxhYj0iWS1heGlzIiwNCiAgICAgY2V4PTEuNCkNCmBgYA0KDQoNCkxldCdzIHVzZSB0aGUgYnVpbHQtaW4gVVNBcnJlc3RzIGRhdGEgc2V0LQ0KYGBge3J9DQpoZWFkKFVTQXJyZXN0cykNCmBgYA0KDQpOb3cgLQ0KYGBge3J9DQpwbG90KFVTQXJyZXN0cyRNdXJkZXIsIFVTQXJyZXN0cyRBc3NhdWx0LA0KICAgICBtYWluPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBBc3NhdWx0IGFuZCBNdXJkZXIiLA0KICAgICB4bGFiPSJOby4gb2YgTXVyZGVyIiwgeWxhYj0iTnAuIG9mIEFzc2F1bHQiKQ0KYWJsaW5lKGxtKFVTQXJyZXN0cyRBc3NhdWx0IH4gVVNBcnJlc3RzJE11cmRlciksIGNvbD0icmVkIikNCmxpbmVzKGxvd2VzcyhVU0FycmVzdHMkTXVyZGVyLCBVU0FycmVzdHMkQXNzYXVsdCksIGNvbD0iYmx1ZSIpDQpgYGANCg0KIyMjIE11bHRpcGxlIFNjYXR0ZXJwbG90cw0KDQpMZXQncyB1c2UgdGhlIGJ1aWx0LWluIFVTQXJyZXN0cyBkYXRhIHNldC0NCmBgYHtyfQ0KaGVhZChVU0FycmVzdHMpDQpgYGANCg0KTGV0J3Mgc2VlIHRoZSByZWxhdGlvbnNoaXBzIHRocm91Z2ggZ3JhcGggYW5kIGNvcnJlbGF0aW9uIG1hdHJpeCAtDQpgYGB7cn0NCnBhaXJzKH5NdXJkZXIrVXJiYW5Qb3ArUmFwZSxkYXRhPVVTQXJyZXN0cywNCiAgIG1haW49IlNpbXBsZSBTY2F0dGVycGxvdCBNYXRyaXgiKQ0Kcm91bmQoY29yKFVTQXJyZXN0c1ssYygxLDMsNCldKSwyKQ0KYGBgDQoNCiMjIyBMaW5lIHBsb3QgDQoNCkluIGBwbG90KClgIHRoZSBhcmd1bWVudCBgdHlwZWAgdGFrZXMgdGhlIHZhbHVlczogDQrigJxw4oCdIGZvciBwb2ludHMgICANCuKAnGzigJ0gZm9yIGxpbmVzICAgDQrigJxi4oCdIGZvciBib3RoIHBvaW50cyBhbmQgbGluZXMgICANCuKAnGPigJ0gZm9yIGVtcHR5IHBvaW50cyBqb2luZWQgYnkgbGluZXMgICANCuKAnG/igJ0gZm9yIG92ZXJwbG90dGVkIHBvaW50cyBhbmQgbGluZXMgICANCuKAnHPigJ0gYW5kIOKAnFPigJ0gZm9yIHN0YWlyIHN0ZXBzICAgDQrigJxu4oCdIGRvZXMgbm90IHByb2R1Y2UgYW55IHBvaW50cyBvciBsaW5lcyAgIA0KDQpgbHR5YCBpcyBmb3IgbGluZSB0eXBlLiBMaW5lIHR5cGVzIGNhbiBlaXRoZXIgYmUgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgKDA9YmxhbmssIDE9c29saWQgKGRlZmF1bHQpLCAyPWRhc2hlZCwgMz1kb3R0ZWQsIDQ9ZG90ZGFzaCwgNT1sb25nZGFzaCwgNj10d29kYXNoKSBvciBhcyBvbmUgb2YgdGhlIGNoYXJhY3RlciBzdHJpbmdzIOKAnGJsYW5r4oCdLCDigJxzb2xpZOKAnSwg4oCcZGFzaGVk4oCdLCDigJxkb3R0ZWTigJ0sIOKAnGRvdGRhc2jigJ0sIOKAnGxvbmdkYXNo4oCdLCBvciDigJx0d29kYXNo4oCdIC0NCmBgYHtyfQ0KeCA8LSAxOjIwDQp5IDwtIGxvZzEwKHgpKjEwDQpwbG90KHgseSwNCiAgICAgbWFpbj0iUmVsYXRpb25zaGlwIGJldHdlZW4gWCBhbmQgWSIsDQogICAgIHhsYWI9IlgtYXhpcyIsIHlsYWI9IlktYXhpcyIsIA0KICAgICB0eXBlPSJsIixsdHk9MSkNCmBgYA0KDQpVc2luZyB0eXBlPWIgYW5kIHBjaD0yMCAtDQpgYGB7cn0NCnBsb3QoeCx5LA0KICAgICBtYWluPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBYIGFuZCBZIiwNCiAgICAgeGxhYj0iWC1heGlzIiwgeWxhYj0iWS1heGlzIiwgDQogICAgIHR5cGU9ImIiLGx0eT0xLCBwY2g9MjApDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=