Affiliation: University of Chittagong

Loading the assigned dataset into R notebook:

Assigned dataset = diabets.csv

This dataset originates from the National Institute of Diabetes and Digestive and Kidney Diseases. The aim is to forecast, based on diagnostic measurements, whether a patient is afflicted with diabetes. Stringent criteria were applied in selecting instances from a larger database, ensuring that all patients in this dataset are females, at least 21 years old, and of Pima Indian heritage. All columns in this dataset consist of numerical values.
Pregnancies: Number of occurrences of pregnancy
Glucose: Plasma glucose concentration two hours after an oral glucose tolerance test
BloodPressure: Diastolic blood pressure (mm Hg)
SkinThickness: Triceps skin fold thickness (mm)
Insulin: 2-Hour serum insulin (mu U/ml)
BMI: Body mass index (weight in kg/(height in m)^2)
DiabetesPedigreeFunction: Diabetes pedigree function
Age: Age (years)
Outcome: Class variable (0 or 1). This serves as the target column, where ‘0’ indicates no disease, and ‘1’ indicates the presence of disease.
1. The assigned dataset “diabetes” was downloaded and moved in the working directory of R studio.
2. Then, a notebook file is created in R studio and the dataset was loaded into a variable.
Diabetes = read.csv("diabetes.csv")
print(head(Diabetes))
NA

3. Some basic information about the “Diabates” dataset

Total number of columns and their names


column_names <- colnames(Diabetes)
num_columns <- length(column_names)

# column names and the number of columns
cat("Column names of Diabetes are", column_names, "\n","\n")
Column names of Diabetes are Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome 
 
cat("Total number of columns is", num_columns)
Total number of columns is 9

a) Finding out the numerical columns


numerical_columns <- sapply(Diabetes, is.numeric) #extraction of the numerical columns

numerical_column_names <- names(numerical_columns)[numerical_columns]

print(numerical_column_names)
[1] "Pregnancies"              "Glucose"                  "BloodPressure"            "SkinThickness"           
[5] "Insulin"                  "BMI"                      "DiabetesPedigreeFunction" "Age"                     
[9] "Outcome"                 
All 9 columns of the datasets are numerical.

b) Finding out the character columns

character_columns <- sapply(Diabetes, is.character) # Extraction of the character columns

character_column_names <- names(character_columns)[character_columns]

print(character_column_names)
character(0)

So, there is no character columns in the dataset.

c) Target variable of the dataset is “Outcome”.

4. There are no categorical columns in the dataset.

5.a) Scatter plot of Pregnancies and BloodPressure

Diabetes <- na.omit(Diabetes)   # data_cleaning
print(Diabetes)
variety_color = as.numeric(factor(Diabetes$Outcome))

plot(
  x = Diabetes$Pregnancies,
  y = Diabetes$BloodPressure,
  col = variety_color,
  pch = 19,
  cex = 1.3,
  
  xlab = "Pregnancies",
  ylab = "Blood Pressure",
  main = "Scatter Plot of Pregnancies vs Blood Pressure",
)

# A legend with more descriptive labels
legend(
  "topright",
  legend = c("No Diabetes", "Diabetes"),  # Descriptive labels
  col= 1:2,
  pch = 19,
  title = "Outcome"
)

This scatter plot visualizes the relationship between Pregnancies and Blood .
Each point is colored based on the “Outcome” (0 or 1), representing different classes. The legend indicates which color corresponds to each class.

5.b) Histogram of Insulin column

hist(
  Diabetes$Insulin,
  breaks = 20,  # Increase the number of bins for better resolution
  main = "Histogram plot of Insulin Levels",
  
  col.main = "#008080",
  cex.main = 1.5,    # Adjust the size of the title
  cex.lab = 1.3,
  col.lab = c("Maroon"),
  font.main = 1,      # Use plain (non-bold) font for the title
  xlab = "Insulin",
  col = adjustcolor("purple", alpha = 0.7),  # Adjust alpha for transparency
  border = "white",  # White borders for better separation
  xlim = c(min(Diabetes$Insulin, na.rm = TRUE), max(Diabetes$Insulin, na.rm = TRUE))
)

# Add axis labels
axis(1, at = pretty(Diabetes$Insulin, n = 10), labels = TRUE, col.axis = "darkgray")
axis(2, labels = TRUE, col.axis = "darkgray")

# Addition of a grid for better readability
grid()

NA
NA
NA
This histogram plot illustrates the distribution of the “Insulin” feature in the “Diabetes” dataset.
The x-axis represents different ranges or bins of insulin values, and the y-axis shows the frequency of observations within each bin.
The color “purple” is used to fill the bars for visual distinction.

5.c) Boxplot of SkinThickness column

boxplot(
  Diabetes$SkinThickness,
  ylab = "Skin Thickness",
  col = "#48b5c4",
  pch = 19,
  border = "black",
  main = "Boxplot of Skin Thickness"
)

NA
NA
NA
This boxplot visualizes the distribution of “SkinThickness” values.
The box represents the interquartile range (IQR), the line inside the box is the median, and the whiskers extend to the minimum and maximum values providing insights into the central tendency and spread of the data.
There’s an outlier in the boxplot close to SKinThickness value, 100.

6.Using ggplot library functions to plot

a) Scatterplot of all combinations of two features- Pregnancies and Glucose



library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.2
# Scatter plot using ggplot2
ggplot(Diabetes, aes(x = Pregnancies, y = Glucose, color = factor(Outcome))) +
  geom_point(size=2.8, alpha = 1) +
  labs(
    x = "Pregnancies",
    y = "Glucose",
    title = "Scatter Plot of Pregnancies and Glucose",
    caption = "Source: Iskulghar",
    color = "Outcome"
  ) +
  theme_minimal() + 
  theme(
    text = element_text(color = "darkblue", size = 14),  # Adjust font color and size
    legend.position = "top",  # Place legends at the top
    axis.text.x = element_text(color = "#FF7F7F", size = 14),
    axis.text.y = element_text(color = "#C4A484", size = 14),
    plot.title = element_text(color= "maroon", hjust = 0.5),
  
    legend.title = element_text(color = "darkgreen")
  )

NA
This scatter plot represents all combinations of the “Glucose” and “BMI” features, with points colored based on the “Outcome” class (0 or 1).
It includes proper axis labels, title, and a caption. Font colors and sizes are adjusted for readability, and the legend is positioned at the top.

b) Boxplot of all column following all instructions

library(reshape2)
Warning: package ‘reshape2’ was built under R version 4.3.2
# Melting data into long format
melted_data <- melt(Diabetes)
No id variables; using all as measure variables
# Boxplot of all columns
ggplot(melted_data, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot() +
  labs(
    x = "Columns",
    y = "Values",
    title = "Boxplot of All Columns",
    caption = "Source: Iskulghar"
  ) +
  theme_bw() +
  theme(
    text = element_text(color = "darkblue", size = 10.5),
    legend.position = "top",
    legend.title = element_text(color = "#FF7F7F", size = 13),  # Legend title color and size
    plot.title = element_text(color= "maroon", hjust = 0.5)
  ) +
  facet_wrap(~variable, scale= "free")  # Creation of a facet grid for each column

This boxplot visualizes the distribution of values for all columns in the “Diabetes” dataset.
The data is melted into long format for easier plotting. Proper axis labels, title, and a caption are provided.
Font colors and sizes are adjusted, and the legend is positioned at the top for clarity.
DQoNCg0KLS0tDQp0aXRsZTogIkRhdGEgU2NpZW5jZSBQcm9qZWN0Ig0KYXV0aG9yOiAiU2hvYWliIElibmUgSGFtaWQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KKipBZmZpbGlhdGlvbioqOiBVbml2ZXJzaXR5IG9mIENoaXR0YWdvbmcNCiAgDQoNCiMjIyBMb2FkaW5nIHRoZSBhc3NpZ25lZCBkYXRhc2V0IGludG8gUiBub3RlYm9vazoNCiMjIyMgQXNzaWduZWQgZGF0YXNldCA9IGRpYWJldHMuY3N2DQojIyMjIyBUaGlzIGRhdGFzZXQgb3JpZ2luYXRlcyBmcm9tIHRoZSBOYXRpb25hbCBJbnN0aXR1dGUgb2YgRGlhYmV0ZXMgYW5kIERpZ2VzdGl2ZSBhbmQgS2lkbmV5IERpc2Vhc2VzLiBUaGUgYWltIGlzIHRvIGZvcmVjYXN0LCBiYXNlZCBvbiBkaWFnbm9zdGljIG1lYXN1cmVtZW50cywgd2hldGhlciBhIHBhdGllbnQgaXMgYWZmbGljdGVkIHdpdGggZGlhYmV0ZXMuIFN0cmluZ2VudCBjcml0ZXJpYSB3ZXJlIGFwcGxpZWQgaW4gc2VsZWN0aW5nIGluc3RhbmNlcyBmcm9tIGEgbGFyZ2VyIGRhdGFiYXNlLCBlbnN1cmluZyB0aGF0IGFsbCBwYXRpZW50cyBpbiB0aGlzIGRhdGFzZXQgYXJlIGZlbWFsZXMsIGF0IGxlYXN0IDIxIHllYXJzIG9sZCwgYW5kIG9mIFBpbWEgSW5kaWFuIGhlcml0YWdlLiBBbGwgY29sdW1ucyBpbiB0aGlzIGRhdGFzZXQgY29uc2lzdCBvZiBudW1lcmljYWwgdmFsdWVzLg0KIyMjIyMgUHJlZ25hbmNpZXM6IE51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBwcmVnbmFuY3kNCiMjIyMjIEdsdWNvc2U6IFBsYXNtYSBnbHVjb3NlIGNvbmNlbnRyYXRpb24gdHdvIGhvdXJzIGFmdGVyIGFuIG9yYWwgZ2x1Y29zZSB0b2xlcmFuY2UgdGVzdA0KIyMjIyMgQmxvb2RQcmVzc3VyZTogIERpYXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW0gSGcpDQojIyMjIyBTa2luVGhpY2tuZXNzOiBUcmljZXBzIHNraW4gZm9sZCB0aGlja25lc3MgKG1tKQ0KIyMjIyMgSW5zdWxpbjogMi1Ib3VyIHNlcnVtIGluc3VsaW4gKG11IFUvbWwpDQojIyMjIyBCTUk6IEJvZHkgbWFzcyBpbmRleCAod2VpZ2h0IGluIGtnLyhoZWlnaHQgaW4gbSleMikNCiMjIyMjIERpYWJldGVzUGVkaWdyZWVGdW5jdGlvbjogRGlhYmV0ZXMgcGVkaWdyZWUgZnVuY3Rpb24NCiMjIyMjIEFnZTogQWdlICh5ZWFycykNCiMjIyMjIE91dGNvbWU6ICBDbGFzcyB2YXJpYWJsZSAoMCBvciAxKS4gVGhpcyBzZXJ2ZXMgYXMgdGhlIHRhcmdldCBjb2x1bW4sIHdoZXJlICcwJyBpbmRpY2F0ZXMgbm8gZGlzZWFzZSwgYW5kICcxJyBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIGRpc2Vhc2UuDQoNCg0KDQoNCiMjIyMjIDEuIFRoZSBhc3NpZ25lZCBkYXRhc2V0ICJkaWFiZXRlcyIgd2FzIGRvd25sb2FkZWQgYW5kIG1vdmVkIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiBSIHN0dWRpby4NCg0KIyMjIyMgMi4gVGhlbiwgYSBub3RlYm9vayBmaWxlIGlzIGNyZWF0ZWQgaW4gUiBzdHVkaW8gYW5kIHRoZSBkYXRhc2V0IHdhcyBsb2FkZWQgaW50byBhIHZhcmlhYmxlLg0KDQoNCjxzdHlsZT4NCmRpdi50ZWFsIHByZSB7IGJhY2tncm91bmQtY29sb3I6IzkwZWU5MCA7IH0NCmRpdi50ZWFsIHByZS5yIHsgYmFja2dyb3VuZC1jb2xvcjojOTBlZTkwOyB9DQo8L3N0eWxlPg0KDQo8ZGl2IGNsYXNzPSJ0ZWFsIj4NCmBgYHtyfQ0KRGlhYmV0ZXMgPSByZWFkLmNzdigiZGlhYmV0ZXMuY3N2IikNCnByaW50KGhlYWQoRGlhYmV0ZXMpKQ0KDQpgYGANCg0KIyMjIDMuIFNvbWUgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlICJEaWFiYXRlcyIgZGF0YXNldA0KDQoNCiMjIyMgVG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZWlyIG5hbWVzDQo8c3R5bGU+DQpkaXYub2ZmZWUgcHJlIHsgYmFja2dyb3VuZC1jb2xvcjogIzk5ZTdmMDsgfQ0KZGl2Lm9mZmVlIHByZS5yIHsgYmFja2dyb3VuZC1jb2xvcjogIzk5ZTdmMDsgfQ0KPC9zdHlsZT4NCg0KPGRpdiBjbGFzcz0ib2ZmZWUiPg0KYGBge3J9DQoNCmNvbHVtbl9uYW1lcyA8LSBjb2xuYW1lcyhEaWFiZXRlcykNCm51bV9jb2x1bW5zIDwtIGxlbmd0aChjb2x1bW5fbmFtZXMpDQoNCiMgY29sdW1uIG5hbWVzIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMNCmNhdCgiQ29sdW1uIG5hbWVzIG9mIERpYWJldGVzIGFyZSIsIGNvbHVtbl9uYW1lcywgIlxuIiwiXG4iKQ0KY2F0KCJUb3RhbCBudW1iZXIgb2YgY29sdW1ucyBpcyIsIG51bV9jb2x1bW5zKQ0KYGBgDQoNCiMjIyBhKSBGaW5kaW5nIG91dCB0aGUgbnVtZXJpY2FsIGNvbHVtbnMNCg0KPHN0eWxlPg0KZGl2Lmx5ZWxsIHByZSB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZkYWY7IH0NCmRpdi5seWVsbCBwcmUuciB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZkYWY7IH0NCjwvc3R5bGU+DQoNCjxkaXYgY2xhc3M9Imx5ZWxsIj4NCmBgYHtyfQ0KDQpudW1lcmljYWxfY29sdW1ucyA8LSBzYXBwbHkoRGlhYmV0ZXMsIGlzLm51bWVyaWMpICNleHRyYWN0aW9uIG9mIHRoZSBudW1lcmljYWwgY29sdW1ucw0KDQpudW1lcmljYWxfY29sdW1uX25hbWVzIDwtIG5hbWVzKG51bWVyaWNhbF9jb2x1bW5zKVtudW1lcmljYWxfY29sdW1uc10NCg0KcHJpbnQobnVtZXJpY2FsX2NvbHVtbl9uYW1lcykNCg0KYGBgDQojIyMjIyBBbGwgOSBjb2x1bW5zIG9mIHRoZSBkYXRhc2V0cyBhcmUgbnVtZXJpY2FsLg0KDQojIyMgYikgRmluZGluZyBvdXQgdGhlIGNoYXJhY3RlciBjb2x1bW5zDQoNCg0KYGBge3J9DQpjaGFyYWN0ZXJfY29sdW1ucyA8LSBzYXBwbHkoRGlhYmV0ZXMsIGlzLmNoYXJhY3RlcikgIyBFeHRyYWN0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgY29sdW1ucw0KDQpjaGFyYWN0ZXJfY29sdW1uX25hbWVzIDwtIG5hbWVzKGNoYXJhY3Rlcl9jb2x1bW5zKVtjaGFyYWN0ZXJfY29sdW1uc10NCg0KcHJpbnQoY2hhcmFjdGVyX2NvbHVtbl9uYW1lcykNCmBgYA0KIyMjIyBTbywgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGNvbHVtbnMgaW4gdGhlIGRhdGFzZXQuDQoNCg0KDQojIyMjIGMpIFRhcmdldCB2YXJpYWJsZSBvZiB0aGUgZGF0YXNldCBpcyAiT3V0Y29tZSIuDQoNCg0KDQoNCiMjIyMgNC4gVGhlcmUgYXJlIG5vIGNhdGVnb3JpY2FsIGNvbHVtbnMgaW4gdGhlIGRhdGFzZXQuDQoNCg0KIyMjIDUuYSkgU2NhdHRlciBwbG90IG9mIFByZWduYW5jaWVzIGFuZCBCbG9vZFByZXNzdXJlDQoNCjxzdHlsZT4NCmRpdi5nbHVlIHByZSB7IGJhY2tncm91bmQtY29sb3I6ICAjQ0JDM0UzOyB9DQpkaXYuZ2x1ZSBwcmUuciB7IGJhY2tncm91bmQtY29sb3I6ICAjQ0JDM0UzOyB9DQo8L3N0eWxlPg0KDQo8ZGl2IGNsYXNzPSJnbHVlIj4NCmBgYHtyfQ0KRGlhYmV0ZXMgPC0gbmEub21pdChEaWFiZXRlcykgICAjIGRhdGFfY2xlYW5pbmcNCnByaW50KERpYWJldGVzKQ0KdmFyaWV0eV9jb2xvciA9IGFzLm51bWVyaWMoZmFjdG9yKERpYWJldGVzJE91dGNvbWUpKQ0KDQpwbG90KA0KICB4ID0gRGlhYmV0ZXMkUHJlZ25hbmNpZXMsDQogIHkgPSBEaWFiZXRlcyRCbG9vZFByZXNzdXJlLA0KICBjb2wgPSB2YXJpZXR5X2NvbG9yLA0KICBwY2ggPSAxOSwNCiAgY2V4ID0gMS4zLA0KICANCiAgeGxhYiA9ICJQcmVnbmFuY2llcyIsDQogIHlsYWIgPSAiQmxvb2QgUHJlc3N1cmUiLA0KICBtYWluID0gIlNjYXR0ZXIgUGxvdCBvZiBQcmVnbmFuY2llcyB2cyBCbG9vZCBQcmVzc3VyZSIsDQopDQoNCiMgQSBsZWdlbmQgd2l0aCBtb3JlIGRlc2NyaXB0aXZlIGxhYmVscw0KbGVnZW5kKA0KICAidG9wcmlnaHQiLA0KICBsZWdlbmQgPSBjKCJObyBEaWFiZXRlcyIsICJEaWFiZXRlcyIpLCAgIyBEZXNjcmlwdGl2ZSBsYWJlbHMNCiAgY29sPSAxOjIsDQogIHBjaCA9IDE5LA0KICB0aXRsZSA9ICJPdXRjb21lIg0KKQ0KYGBgDQojIyMjIyBUaGlzIHNjYXR0ZXIgcGxvdCB2aXN1YWxpemVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBQcmVnbmFuY2llcyBhbmQgQmxvb2QgLg0KIyMjIyMgRWFjaCBwb2ludCBpcyBjb2xvcmVkIGJhc2VkIG9uIHRoZSAiT3V0Y29tZSIgKDAgb3IgMSksIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgY2xhc3Nlcy4gVGhlIGxlZ2VuZCBpbmRpY2F0ZXMgd2hpY2ggY29sb3IgY29ycmVzcG9uZHMgdG8gZWFjaCBjbGFzcy4NCg0KDQoNCg0KIyMjIDUuYikgSGlzdG9ncmFtIG9mIEluc3VsaW4gY29sdW1uDQo8c3R5bGU+DQpkaXYuY29mIHByZSB7IGJhY2tncm91bmQtY29sb3I6ICNmOWYwOWE7IH0NCmRpdi5jb2YgcHJlLnIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmMDlhOyB9DQo8L3N0eWxlPg0KDQo8ZGl2IGNsYXNzPSJjb2YiPg0KYGBge3J9DQpoaXN0KA0KICBEaWFiZXRlcyRJbnN1bGluLA0KICBicmVha3MgPSAyMCwgICMgSW5jcmVhc2UgdGhlIG51bWJlciBvZiBiaW5zIGZvciBiZXR0ZXIgcmVzb2x1dGlvbg0KICBtYWluID0gIkhpc3RvZ3JhbSBwbG90IG9mIEluc3VsaW4gTGV2ZWxzIiwNCiAgDQogIGNvbC5tYWluID0gIiMwMDgwODAiLA0KICBjZXgubWFpbiA9IDEuNSwgICAgIyBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIHRpdGxlDQogIGNleC5sYWIgPSAxLjMsDQogIGNvbC5sYWIgPSBjKCJNYXJvb24iKSwNCiAgZm9udC5tYWluID0gMSwgICAgICAjIFVzZSBwbGFpbiAobm9uLWJvbGQpIGZvbnQgZm9yIHRoZSB0aXRsZQ0KICB4bGFiID0gIkluc3VsaW4iLA0KICBjb2wgPSBhZGp1c3Rjb2xvcigicHVycGxlIiwgYWxwaGEgPSAwLjcpLCAgIyBBZGp1c3QgYWxwaGEgZm9yIHRyYW5zcGFyZW5jeQ0KICBib3JkZXIgPSAid2hpdGUiLCAgIyBXaGl0ZSBib3JkZXJzIGZvciBiZXR0ZXIgc2VwYXJhdGlvbg0KICB4bGltID0gYyhtaW4oRGlhYmV0ZXMkSW5zdWxpbiwgbmEucm0gPSBUUlVFKSwgbWF4KERpYWJldGVzJEluc3VsaW4sIG5hLnJtID0gVFJVRSkpDQopDQoNCiMgQWRkIGF4aXMgbGFiZWxzDQpheGlzKDEsIGF0ID0gcHJldHR5KERpYWJldGVzJEluc3VsaW4sIG4gPSAxMCksIGxhYmVscyA9IFRSVUUsIGNvbC5heGlzID0gImRhcmtncmF5IikNCmF4aXMoMiwgbGFiZWxzID0gVFJVRSwgY29sLmF4aXMgPSAiZGFya2dyYXkiKQ0KDQojIEFkZGl0aW9uIG9mIGEgZ3JpZCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5DQpncmlkKCkNCg0KDQoNCmBgYA0KDQoNCiMjIyMjICBUaGlzIGhpc3RvZ3JhbSBwbG90IGlsbHVzdHJhdGVzIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlICJJbnN1bGluIiBmZWF0dXJlIGluIHRoZSAiRGlhYmV0ZXMiIGRhdGFzZXQuDQojIyMjIyBUaGUgeC1heGlzIHJlcHJlc2VudHMgZGlmZmVyZW50IHJhbmdlcyBvciBiaW5zIG9mIGluc3VsaW4gdmFsdWVzLCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgZnJlcXVlbmN5IG9mIG9ic2VydmF0aW9ucyB3aXRoaW4gZWFjaCBiaW4uDQojIyMjIyBUaGUgY29sb3IgInB1cnBsZSIgaXMgdXNlZCB0byBmaWxsIHRoZSBiYXJzIGZvciB2aXN1YWwgZGlzdGluY3Rpb24uDQoNCg0KDQoNCiMjIyA1LmMpIEJveHBsb3Qgb2YgU2tpblRoaWNrbmVzcyBjb2x1bW4NCjxzdHlsZT4NCmRpdi5jb2ZmZSBwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjQjZGRkJCOyB9DQpkaXYuY29mZmUgcHJlLnIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjQjZGRkJCOyB9DQo8L3N0eWxlPg0KDQo8ZGl2IGNsYXNzPSJjb2ZmZSI+DQpgYGB7cn0NCmJveHBsb3QoDQogIERpYWJldGVzJFNraW5UaGlja25lc3MsDQogIHlsYWIgPSAiU2tpbiBUaGlja25lc3MiLA0KICBjb2wgPSAiIzQ4YjVjNCIsDQogIHBjaCA9IDE5LA0KICBib3JkZXIgPSAiYmxhY2siLA0KICBtYWluID0gIkJveHBsb3Qgb2YgU2tpbiBUaGlja25lc3MiDQopDQoNCg0KICAgICAgICANCmBgYA0KIyMjIyMgVGhpcyBib3hwbG90IHZpc3VhbGl6ZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiAiU2tpblRoaWNrbmVzcyIgdmFsdWVzLg0KIyMjIyMgVGhlIGJveCByZXByZXNlbnRzIHRoZSBpbnRlcnF1YXJ0aWxlIHJhbmdlIChJUVIpLCB0aGUgbGluZSBpbnNpZGUgdGhlIGJveCBpcyB0aGUgbWVkaWFuLCBhbmQgdGhlIHdoaXNrZXJzIGV4dGVuZCB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgcHJvdmlkaW5nIGluc2lnaHRzIGludG8gdGhlIGNlbnRyYWwgdGVuZGVuY3kgYW5kIHNwcmVhZCBvZiB0aGUgZGF0YS4NCiMjIyMjIFRoZXJlJ3MgYW4gb3V0bGllciBpbiB0aGUgYm94cGxvdCBjbG9zZSB0byBTS2luVGhpY2tuZXNzIHZhbHVlLCAxMDAuDQoNCg0KDQoNCiMgNi5Vc2luZyBnZ3Bsb3QgbGlicmFyeSBmdW5jdGlvbnMgdG8gcGxvdA0KDQojIyMgYSkgU2NhdHRlcnBsb3Qgb2YgYWxsIGNvbWJpbmF0aW9ucyBvZiB0d28gZmVhdHVyZXMtIFByZWduYW5jaWVzIGFuZCBHbHVjb3NlDQo8c3R5bGU+DQpkaXYuc29yYW5nZSBwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiZTkwOyB9DQpkaXYuc29yYW5nZSBwcmUuciB7IGJhY2tncm91bmQtY29sb3I6ICNmZmJlOTA7IH0NCjwvc3R5bGU+DQoNCjxkaXYgY2xhc3M9InNvcmFuZ2UiPg0KYGBge3J9DQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFNjYXR0ZXIgcGxvdCB1c2luZyBnZ3Bsb3QyDQpnZ3Bsb3QoRGlhYmV0ZXMsIGFlcyh4ID0gUHJlZ25hbmNpZXMsIHkgPSBHbHVjb3NlLCBjb2xvciA9IGZhY3RvcihPdXRjb21lKSkpICsNCiAgZ2VvbV9wb2ludChzaXplPTIuOCwgYWxwaGEgPSAxKSArDQogIGxhYnMoDQogICAgeCA9ICJQcmVnbmFuY2llcyIsDQogICAgeSA9ICJHbHVjb3NlIiwNCiAgICB0aXRsZSA9ICJTY2F0dGVyIFBsb3Qgb2YgUHJlZ25hbmNpZXMgYW5kIEdsdWNvc2UiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBJc2t1bGdoYXIiLA0KICAgIGNvbG9yID0gIk91dGNvbWUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAxNCksICAjIEFkanVzdCBmb250IGNvbG9yIGFuZCBzaXplDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsICAjIFBsYWNlIGxlZ2VuZHMgYXQgdGhlIHRvcA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiNGRjdGN0YiLCBzaXplID0gMTQpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiNDNEE0ODQiLCBzaXplID0gMTQpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9ICJtYXJvb24iLCBoanVzdCA9IDAuNSksDQogIA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJkYXJrZ3JlZW4iKQ0KICApDQogIA0KYGBgDQojIyMjIyBUaGlzIHNjYXR0ZXIgcGxvdCByZXByZXNlbnRzIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlICJHbHVjb3NlIiBhbmQgIkJNSSIgZmVhdHVyZXMsIHdpdGggcG9pbnRzIGNvbG9yZWQgYmFzZWQgb24gdGhlICJPdXRjb21lIiBjbGFzcyAoMCBvciAxKS4NCiMjIyMjIEl0IGluY2x1ZGVzIHByb3BlciBheGlzIGxhYmVscywgdGl0bGUsIGFuZCBhIGNhcHRpb24uIEZvbnQgY29sb3JzIGFuZCBzaXplcyBhcmUgYWRqdXN0ZWQgZm9yIHJlYWRhYmlsaXR5LCBhbmQgdGhlIGxlZ2VuZCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3AuDQoNCiMjIyBiKSBCb3hwbG90IG9mIGFsbCBjb2x1bW4gZm9sbG93aW5nIGFsbCBpbnN0cnVjdGlvbnMNCjxzdHlsZT4NCmRpdi5jb2ZmZWUgcHJlIHsgYmFja2dyb3VuZC1jb2xvcjogI2Y1YzJjMjsgfQ0KZGl2LmNvZmZlZSBwcmUuciB7IGJhY2tncm91bmQtY29sb3I6ICNmNWMyYzI7IH0NCjwvc3R5bGU+DQoNCjxkaXYgY2xhc3M9ImNvZmZlZSI+DQpgYGB7cn0NCmxpYnJhcnkocmVzaGFwZTIpDQoNCg0KIyBNZWx0aW5nIGRhdGEgaW50byBsb25nIGZvcm1hdA0KbWVsdGVkX2RhdGEgPC0gbWVsdChEaWFiZXRlcykNCiMgQm94cGxvdCBvZiBhbGwgY29sdW1ucw0KZ2dwbG90KG1lbHRlZF9kYXRhLCBhZXMoeCA9IHZhcmlhYmxlLCB5ID0gdmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKA0KICAgIHggPSAiQ29sdW1ucyIsDQogICAgeSA9ICJWYWx1ZXMiLA0KICAgIHRpdGxlID0gIkJveHBsb3Qgb2YgQWxsIENvbHVtbnMiLA0KICAgIGNhcHRpb24gPSAiU291cmNlOiBJc2t1bGdoYXIiDQogICkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAxMC41KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiI0ZGN0Y3RiIsIHNpemUgPSAxMyksICAjIExlZ2VuZCB0aXRsZSBjb2xvciBhbmQgc2l6ZQ0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9ICJtYXJvb24iLCBoanVzdCA9IDAuNSkNCiAgKSArDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlLCBzY2FsZT0gImZyZWUiKSAgIyBDcmVhdGlvbiBvZiBhIGZhY2V0IGdyaWQgZm9yIGVhY2ggY29sdW1uDQoNCmBgYA0KIyMjIyMgVGhpcyBib3hwbG90IHZpc3VhbGl6ZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGluIHRoZSAiRGlhYmV0ZXMiIGRhdGFzZXQuDQojIyMjIyBUaGUgZGF0YSBpcyBtZWx0ZWQgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzaWVyIHBsb3R0aW5nLiBQcm9wZXIgYXhpcyBsYWJlbHMsIHRpdGxlLCBhbmQgYSBjYXB0aW9uIGFyZSBwcm92aWRlZC4NCiMjIyMjIEZvbnQgY29sb3JzIGFuZCBzaXplcyBhcmUgYWRqdXN0ZWQsIGFuZCB0aGUgbGVnZW5kIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBmb3IgY2xhcml0eS4NCg==