Nathania Karina Anggraini - 5003251181

A. Quiz Answers

Question 1

A researcher collected a monthly household expenditures from 12 respondents. They wanted to find the ordinary mean and the 10% trimmed mean of the collected data.

a) Make an R Function to Calculate the Trimmed_Mean with Arguments (x, alpha)

trimmed_mean <- function(x, alpha = 0.1) {

  # validation
  if (alpha < 0 || alpha > 0.5 ) {
    stop("alpha must be between 0 and 0.5")
  }
  
  # 1. compute n, k, and sort the data
  n <- length(x)
  k <- floor(n*alpha)
  sorted_data <- sort(x)
  
  # 2. find the sum of the data manually from (k+1) until (n-k)
  sum_x <- 0
  for (i in (k+1):(n-k)) {
    sum_x <- sum_x + x[i]
  }
  
  # 3. return the value of the trimmed_mean
  return(sum_x/(n-2*k))
  
}

b) Calculate the Trimmed_Mean of the Collected Data

# Collected Data
x <- c(850, 920, 1100, 1250, 1300, 1400, 1500, 1550, 1600, 1750, 2100, 8500)

Trimmed mean (alpha = 0)

mean_alpha_0 <- trimmed_mean(x, 0)
cat("The ordinary mean of data (", x, ") is ", mean_alpha_0, "\n")
The ordinary mean of data ( 850 920 1100 1250 1300 1400 1500 1550 1600 1750 2100 8500 ) is  1985 

Trimmed mean (alpha = 0.1)

mean_alpha_0.1 <- trimmed_mean(x, 0.1)
cat("The 10% trimmed mean of data (", x, ") is ", mean_alpha_0.1, "\n")
The 10% trimmed mean of data ( 850 920 1100 1250 1300 1400 1500 1550 1600 1750 2100 8500 ) is  1447 

Question 2

The Surabaya City Government conducts a household welfare survey across all 31 kecamatan (sub-districts). Three variables are recorded as district-level averages: monthly income, monthly expenditure, and household size. Each kecamatan is weighted by its population, reflecting how many households that kecamatan represents.

With the weighted multivariate descriptive statistics function, find the diagonal weight matrix, weighted mean vector, weighted covariance, and the weighted standard deviation vector.

a) Make an Weighted Multivariate Descriptive Statistics Function


weighted_multi_desc <- function(X, w) {
  
  # 1. define n, p, and n by 1 vector
  n <- nrow(X)
  p <- ncol(X)
  vector1 <- matrix(1, nrow = n, ncol = 1)
  
  # 2. Diagonal weight matrix (W)
  W <- diag(w)
  
  # 3. Total weight (n_w)
  n_w <- 0
  for (i in 1:n) {
    n_w <- n_w + w[i]
  }
  
  # 4. Weighted mean vector (X_bar_w)
  x_bar_w <- (1/n_w)* t(X) %*% W %*% vector1
  
  # 5. Deviation matrix (D)
  D <- X - vector1 %*% t(x_bar_w)
  
  # 6. Weighted covariance matrix (S_w)
  S_w <- (1 / (n_w - 1)) * t(D) %*% W %*% D
  
  # 7. Weighted standard deviation vector (Std_w)
  Std_w <- sqrt(diag(S_w))
  
  #8. return W, x_bar_w, S_w, Std_w
  return(list(
    W = W,
    x_bar_w = x_bar_w,
    S_w = S_w,
    Std_w = Std_w
  ))
  
}

b) Apply the Multivariate Descriptive Statistics Function to the Data

Collected data

# Collected data from 31 kecamatan in Surabaya
data <- read.csv("https://raw.githubusercontent.com/nia1408/data_quiz/main/data_quiz.csv", header = TRUE, sep = ",")

X <- as.matrix(data[, c("Income", "Expenditure", "HH_Size")])

w <- data$Weight
print(data)
          Kecamatan Income Expenditure HH_Size Weight
1          Asemrowo    3.1         2.5     4.2      5
2            Benowo    3.8         3.0     4.0      7
3           Bubutan    4.2         3.4     3.5     10
4             Bulak    3.5         2.8     4.1      5
5       Dukuh Pakis    6.5         5.2     3.0      6
6          Gayungan    5.8         4.6     3.1      4
7           Genteng    5.5         4.4     2.8      6
8            Gubeng    5.9         4.7     2.9     13
9      Gunung Anyar    4.8         3.8     3.6      6
10        Jambangan    4.3         3.4     3.8      5
11     Karangpilang    4.5         3.6     3.7      7
12         Kenjeran    3.0         2.4     4.5     18
13       Krembangan    3.4         2.7     4.3     11
14      Lakarsantri    4.0         3.2     3.9      6
15        Mulyorejo    5.2         4.1     3.2      9
16  Pabean Cantikan    3.3         2.6     4.4      7
17            Pakal    3.6         2.9     4.1      6
18          Rungkut    5.0         4.0     3.3     12
19       Sambikerep    4.1         3.3     3.8      7
20          Sawahan    3.7         3.0     4.2     20
21         Semampir    2.8         2.3     4.7     18
22        Simokerto    3.2         2.6     4.3      9
23         Sukolilo    5.6         4.5     3.0     11
24    Sukomanunggal    4.6         3.7     3.5     10
25       Tambaksari    3.5         2.8     4.4     23
26           Tandes    4.0         3.2     3.9      9
27        Tegalsari    4.1         3.3     3.7     10
28 Tenggilis Mejoyo    5.3         4.2     3.1      6
29           Wiyung    4.7         3.7     3.6      7
30         Wonocolo    4.9         3.9     3.4      8
31        Wonokromo    4.4         3.5     3.8     16

Apply the data to the multivariate descriptive function

answer <- weighted_multi_desc(X,w)

Weighted mean vector:

print(answer$x_bar_w)
                [,1]
Income      4.186869
Expenditure 3.350505
HH_Size     3.832997

Weighted covariance matrix:

print(answer$S_w)
                Income Expenditure    HH_Size
Income       0.8703337   0.6840776 -0.4882477
Expenditure  0.6840776   0.5384541 -0.3843073
HH_Size     -0.4882477  -0.3843073  0.2926238

Weighted standard deviation vector:

print(answer$Std_w)
     Income Expenditure     HH_Size 
  0.9329168   0.7337943   0.5409471 

B. Data Visualization

Question 1

a) Histogram

By visualizing using histogram we could see that most expenditure values are concentrated between 850 and 2100, while the value 8500 is far from the rest, makes it an outlier

hist(x,
     breaks = 15,
     col = "steelblue",
     border = "white",
     main = "Histogram of Expenditure",
     xlab = "Expenditure",
     freq = TRUE
     )

b) Boxplot

In this case, boxplot is important because it clearly identifies 8500 as an outlier.

boxplot(x, 
        main = "Boxplot of Expenditure", 
        ylab = "Expenditure", 
        col = "#2196F3")

c) Density Plot (ggplot)

The density plot shows the distribution of the expenditures by shape smoothly. It does not only show the outliers (8500), but also the mean and the trimmed mean.

library(ggplot2)

data_frame_x <- data.frame(x = x)

ggplot(data_frame_x, aes(x = x)) +
  geom_density(fill = "hotpink3", alpha = 0.5) +
  geom_vline(aes(xintercept = mean_alpha_0), 
             color = "blue", linetype = "dashed", size = 1) + 
  geom_vline(aes(xintercept = mean_alpha_0.1,), 
             color = "red", linetype = "dashed", size = 1 ) +
  labs(title = "Density Plot of Expenditure", 
       x = "Expenditure", y = "Density")

Question 2

a) Scatter Plot

Visualizing with scatter plot shows a positive relationship between income and expenditure. It indicates that districts with higher income tend to have higher expenditure.

ggplot(data, aes(x = Income, y = Expenditure)) +
  geom_point(color = "darkgreen", size = 2) +
  labs(title = "Income vs Expenditure")

b) Trend lines Plot

This type of plot show’s the regression line of Income and Expenditure. The regression line confirms the upward trend where the higher income, the higher the expenditure and this supports the covariance results too.

ggplot(data, aes(x = Income, y = Expenditure)) +
  geom_point(color = "blue", size = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "red", size = 0.5) +
  labs(title = "Income vs Expenditure with Regression line") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

c) Bubble lines

The bubble plot adds population weights, this shows that some districts contribute more significantly to the overall statistics. Larger bubble represents districts with larger population, tells the use of weighted statistics rather than basic statistics.

ggplot(data, aes(x = Income, y = Expenditure, size = Weight)) +
  geom_point(alpha = 0.5, color = "steelblue") +
  labs(title="Income vs Expenditure (Weighted by Population)")

d) Correlation heatmap

The correlation heatmap summarize the relationships numerically. This makes it easier to identify strong and weak correlations between data.

library(corrplot)

cor_matrix <- cor(data[, c("Income", "Expenditure", "HH_Size")])

corrplot(cor_matrix, 
         method = "color",  
         addCoef.col = "white")

e) Pair Plot

Using pair plot provides a detailed view of relationships among all variables. This help suggest potential associations between household size and both income and the expenditure.

library(GGally)

ggpairs(data[, c("Income","Expenditure","HH_Size")],
        title = "Pair Plot Household Welfare survey",
)

f) QQ plot

QQ plot is a supporting plot in this case. This plot helps to indicate whether the income variable follows a normal distribution.

ggplot(data, aes(sample = Income)) +
  stat_qq() +
  stat_qq_line(color = "blue") +
  labs(title = "Q-Q Plot Income",
       x = "Theoretical Quantiles", 
       y = "Observed/Sample Quantiles")

LS0tDQp0aXRsZTogIioqRGF0YSBWaXN1YWxpemF0aW9uIGFuZCBBbnN3ZXJzIG9mIFF1aXogMSoqIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCl8qKk5hdGhhbmlhIEthcmluYSBBbmdncmFpbmkgLSA1MDAzMjUxMTgxKipfDQoNCiMgKipBLiBRdWl6IEFuc3dlcnMqKg0KDQojIyAqKlF1ZXN0aW9uIDEqKg0KQSByZXNlYXJjaGVyIGNvbGxlY3RlZCBhIG1vbnRobHkgaG91c2Vob2xkIGV4cGVuZGl0dXJlcyBmcm9tIDEyIHJlc3BvbmRlbnRzLiBUaGV5IHdhbnRlZCB0byBmaW5kIHRoZSBvcmRpbmFyeSBtZWFuIGFuZCB0aGUgMTAlIHRyaW1tZWQgbWVhbiBvZiB0aGUgY29sbGVjdGVkIGRhdGEuIA0KDQojIyMgX2EpIE1ha2UgYW4gUiBGdW5jdGlvbiB0byBDYWxjdWxhdGUgdGhlIFRyaW1tZWRfTWVhbiB3aXRoIEFyZ3VtZW50cyAoeCwgYWxwaGEpXw0KYGBge3J9DQp0cmltbWVkX21lYW4gPC0gZnVuY3Rpb24oeCwgYWxwaGEgPSAwLjEpIHsNCg0KICAjIHZhbGlkYXRpb24NCiAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDAuNSApIHsNCiAgICBzdG9wKCJhbHBoYSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMC41IikNCiAgfQ0KICANCiAgIyAxLiBjb21wdXRlIG4sIGssIGFuZCBzb3J0IHRoZSBkYXRhDQogIG4gPC0gbGVuZ3RoKHgpDQogIGsgPC0gZmxvb3IobiphbHBoYSkNCiAgc29ydGVkX2RhdGEgPC0gc29ydCh4KQ0KICANCiAgIyAyLiBmaW5kIHRoZSBzdW0gb2YgdGhlIGRhdGEgbWFudWFsbHkgZnJvbSAoaysxKSB1bnRpbCAobi1rKQ0KICBzdW1feCA8LSAwDQogIGZvciAoaSBpbiAoaysxKToobi1rKSkgew0KICAgIHN1bV94IDwtIHN1bV94ICsgeFtpXQ0KICB9DQogIA0KICAjIDMuIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyaW1tZWRfbWVhbg0KICByZXR1cm4oc3VtX3gvKG4tMiprKSkNCiAgDQp9DQpgYGANCg0KIyMjIGIpIF9DYWxjdWxhdGUgdGhlIFRyaW1tZWRfTWVhbiBvZiB0aGUgQ29sbGVjdGVkIERhdGFfDQoNCmBgYHtyfQ0KIyBDb2xsZWN0ZWQgRGF0YQ0KeCA8LSBjKDg1MCwgOTIwLCAxMTAwLCAxMjUwLCAxMzAwLCAxNDAwLCAxNTAwLCAxNTUwLCAxNjAwLCAxNzUwLCAyMTAwLCA4NTAwKQ0KYGBgDQoNCiMjIyMgVHJpbW1lZCBtZWFuIChhbHBoYSA9IDApDQoNCmBgYHtyfQ0KbWVhbl9hbHBoYV8wIDwtIHRyaW1tZWRfbWVhbih4LCAwKQ0KY2F0KCJUaGUgb3JkaW5hcnkgbWVhbiBvZiBkYXRhICgiLCB4LCAiKSBpcyAiLCBtZWFuX2FscGhhXzAsICJcbiIpDQpgYGANCiMjIyMgVHJpbW1lZCBtZWFuIChhbHBoYSA9IDAuMSkNCmBgYHtyfQ0KbWVhbl9hbHBoYV8wLjEgPC0gdHJpbW1lZF9tZWFuKHgsIDAuMSkNCmNhdCgiVGhlIDEwJSB0cmltbWVkIG1lYW4gb2YgZGF0YSAoIiwgeCwgIikgaXMgIiwgbWVhbl9hbHBoYV8wLjEsICJcbiIpDQpgYGANCg0KIyMgKipRdWVzdGlvbiAyKioNClRoZSBTdXJhYmF5YSBDaXR5IEdvdmVybm1lbnQgY29uZHVjdHMgYSBob3VzZWhvbGQgd2VsZmFyZSBzdXJ2ZXkgYWNyb3NzIGFsbCAzMSBrZWNhbWF0YW4gKHN1Yi1kaXN0cmljdHMpLg0KVGhyZWUgdmFyaWFibGVzIGFyZSByZWNvcmRlZCBhcyBkaXN0cmljdC1sZXZlbCBhdmVyYWdlczogbW9udGhseSBpbmNvbWUsIG1vbnRobHkgZXhwZW5kaXR1cmUsIGFuZCBob3VzZWhvbGQgc2l6ZS4gRWFjaCBrZWNhbWF0YW4gaXMgd2VpZ2h0ZWQgYnkgaXRzIHBvcHVsYXRpb24sIHJlZmxlY3RpbmcgaG93IG1hbnkgaG91c2Vob2xkcyB0aGF0IGtlY2FtYXRhbiByZXByZXNlbnRzLiANCg0KV2l0aCB0aGUgd2VpZ2h0ZWQgbXVsdGl2YXJpYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZnVuY3Rpb24sIGZpbmQgdGhlIGRpYWdvbmFsIHdlaWdodCBtYXRyaXgsIHdlaWdodGVkIG1lYW4gdmVjdG9yLCB3ZWlnaHRlZCBjb3ZhcmlhbmNlLCBhbmQgdGhlIHdlaWdodGVkIHN0YW5kYXJkIGRldmlhdGlvbiB2ZWN0b3IuIA0KDQojIyMgYSkgTWFrZSBhbiBXZWlnaHRlZCBNdWx0aXZhcmlhdGUgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyBGdW5jdGlvbg0KYGBge3J9DQoNCndlaWdodGVkX211bHRpX2Rlc2MgPC0gZnVuY3Rpb24oWCwgdykgew0KICANCiAgIyAxLiBkZWZpbmUgbiwgcCwgYW5kIG4gYnkgMSB2ZWN0b3INCiAgbiA8LSBucm93KFgpDQogIHAgPC0gbmNvbChYKQ0KICB2ZWN0b3IxIDwtIG1hdHJpeCgxLCBucm93ID0gbiwgbmNvbCA9IDEpDQogIA0KICAjIDIuIERpYWdvbmFsIHdlaWdodCBtYXRyaXggKFcpDQogIFcgPC0gZGlhZyh3KQ0KICANCiAgIyAzLiBUb3RhbCB3ZWlnaHQgKG5fdykNCiAgbl93IDwtIDANCiAgZm9yIChpIGluIDE6bikgew0KICAgIG5fdyA8LSBuX3cgKyB3W2ldDQogIH0NCiAgDQogICMgNC4gV2VpZ2h0ZWQgbWVhbiB2ZWN0b3IgKFhfYmFyX3cpDQogIHhfYmFyX3cgPC0gKDEvbl93KSogdChYKSAlKiUgVyAlKiUgdmVjdG9yMQ0KICANCiAgIyA1LiBEZXZpYXRpb24gbWF0cml4IChEKQ0KICBEIDwtIFggLSB2ZWN0b3IxICUqJSB0KHhfYmFyX3cpDQogIA0KICAjIDYuIFdlaWdodGVkIGNvdmFyaWFuY2UgbWF0cml4IChTX3cpDQogIFNfdyA8LSAoMSAvIChuX3cgLSAxKSkgKiB0KEQpICUqJSBXICUqJSBEDQogIA0KICAjIDcuIFdlaWdodGVkIHN0YW5kYXJkIGRldmlhdGlvbiB2ZWN0b3IgKFN0ZF93KQ0KICBTdGRfdyA8LSBzcXJ0KGRpYWcoU193KSkNCiAgDQogICM4LiByZXR1cm4gVywgeF9iYXJfdywgU193LCBTdGRfdw0KICByZXR1cm4obGlzdCgNCiAgICBXID0gVywNCiAgICB4X2Jhcl93ID0geF9iYXJfdywNCiAgICBTX3cgPSBTX3csDQogICAgU3RkX3cgPSBTdGRfdw0KICApKQ0KICANCn0NCg0KYGBgDQoNCiMjIyBiKSBBcHBseSB0aGUgTXVsdGl2YXJpYXRlIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgRnVuY3Rpb24gdG8gdGhlIERhdGENCg0KDQojIyMjIF8qKkNvbGxlY3RlZCBkYXRhKipfDQpgYGB7cn0NCiMgQ29sbGVjdGVkIGRhdGEgZnJvbSAzMSBrZWNhbWF0YW4gaW4gU3VyYWJheWENCmRhdGEgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9uaWExNDA4L2RhdGFfcXVpei9tYWluL2RhdGFfcXVpei5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQoNClggPC0gYXMubWF0cml4KGRhdGFbLCBjKCJJbmNvbWUiLCAiRXhwZW5kaXR1cmUiLCAiSEhfU2l6ZSIpXSkNCg0KdyA8LSBkYXRhJFdlaWdodA0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoZGF0YSkNCmBgYA0KDQoNCl9BcHBseSB0aGUgZGF0YSB0byB0aGUgbXVsdGl2YXJpYXRlIGRlc2NyaXB0aXZlIGZ1bmN0aW9uXw0KDQpgYGB7cn0NCmFuc3dlciA8LSB3ZWlnaHRlZF9tdWx0aV9kZXNjKFgsdykNCmBgYA0KDQojIyMjIF9XZWlnaHRlZCBtZWFuIHZlY3RvcjpfDQpgYGB7cn0NCnByaW50KGFuc3dlciR4X2Jhcl93KQ0KYGBgDQojIyMjIF9XZWlnaHRlZCBjb3ZhcmlhbmNlIG1hdHJpeDpfDQpgYGB7cn0NCnByaW50KGFuc3dlciRTX3cpDQpgYGANCiMjIyMgX1dlaWdodGVkIHN0YW5kYXJkIGRldmlhdGlvbiB2ZWN0b3I6Xw0KYGBge3J9DQpwcmludChhbnN3ZXIkU3RkX3cpDQpgYGANCiMgKipCLiBEYXRhIFZpc3VhbGl6YXRpb24qKg0KDQojIyAqKlF1ZXN0aW9uIDEqKg0KDQojIyMgKiphKSBIaXN0b2dyYW0qKg0KQnkgdmlzdWFsaXppbmcgdXNpbmcgaGlzdG9ncmFtIHdlIGNvdWxkIHNlZSB0aGF0IG1vc3QgZXhwZW5kaXR1cmUgdmFsdWVzIGFyZSBjb25jZW50cmF0ZWQgYmV0d2VlbiA4NTAgYW5kIDIxMDAsIHdoaWxlIHRoZSB2YWx1ZSA4NTAwIGlzIGZhciBmcm9tIHRoZSByZXN0LCBtYWtlcyBpdCBhbiBvdXRsaWVyDQpgYGB7cn0NCmhpc3QoeCwNCiAgICAgYnJlYWtzID0gMTUsDQogICAgIGNvbCA9ICJzdGVlbGJsdWUiLA0KICAgICBib3JkZXIgPSAid2hpdGUiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBvZiBFeHBlbmRpdHVyZSIsDQogICAgIHhsYWIgPSAiRXhwZW5kaXR1cmUiLA0KICAgICBmcmVxID0gVFJVRQ0KICAgICApDQpgYGANCg0KIyMjICoqYikgQm94cGxvdCoqDQpJbiB0aGlzIGNhc2UsIGJveHBsb3QgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgY2xlYXJseSBpZGVudGlmaWVzIDg1MDAgYXMgYW4gb3V0bGllci4gDQpgYGB7cn0NCmJveHBsb3QoeCwgDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBvZiBFeHBlbmRpdHVyZSIsIA0KICAgICAgICB5bGFiID0gIkV4cGVuZGl0dXJlIiwgDQogICAgICAgIGNvbCA9ICIjMjE5NkYzIikNCmBgYA0KIyMjICoqYykgRGVuc2l0eSBQbG90IChnZ3Bsb3QpKioNClRoZSBkZW5zaXR5IHBsb3Qgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZXhwZW5kaXR1cmVzIGJ5IHNoYXBlIHNtb290aGx5LiBJdCBkb2VzIG5vdCBvbmx5IHNob3cgdGhlIG91dGxpZXJzICg4NTAwKSwgYnV0IGFsc28gdGhlIG1lYW4gYW5kIHRoZSB0cmltbWVkIG1lYW4uIA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmRhdGFfZnJhbWVfeCA8LSBkYXRhLmZyYW1lKHggPSB4KQ0KDQpnZ3Bsb3QoZGF0YV9mcmFtZV94LCBhZXMoeCA9IHgpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gImhvdHBpbmszIiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW5fYWxwaGFfMCksIA0KICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKyANCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW5fYWxwaGFfMC4xLCksIA0KICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxICkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCBvZiBFeHBlbmRpdHVyZSIsIA0KICAgICAgIHggPSAiRXhwZW5kaXR1cmUiLCB5ID0gIkRlbnNpdHkiKQ0KYGBgDQoNCg0KDQojIyAqKlF1ZXN0aW9uIDIqKg0KIyMjICoqYSkgU2NhdHRlciBQbG90KioNClZpc3VhbGl6aW5nIHdpdGggc2NhdHRlciBwbG90IHNob3dzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5jb21lIGFuZCBleHBlbmRpdHVyZS4gSXQgaW5kaWNhdGVzIHRoYXQgZGlzdHJpY3RzIHdpdGggaGlnaGVyIGluY29tZSB0ZW5kIHRvIGhhdmUgaGlnaGVyIGV4cGVuZGl0dXJlLg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBJbmNvbWUsIHkgPSBFeHBlbmRpdHVyZSkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gMikgKw0KICBsYWJzKHRpdGxlID0gIkluY29tZSB2cyBFeHBlbmRpdHVyZSIpDQpgYGANCg0KIyMjICoqYikgVHJlbmQgbGluZXMgUGxvdCoqDQpUaGlzIHR5cGUgb2YgcGxvdCBzaG93J3MgdGhlIHJlZ3Jlc3Npb24gbGluZSBvZiBJbmNvbWUgYW5kIEV4cGVuZGl0dXJlLiBUaGUgcmVncmVzc2lvbiBsaW5lIGNvbmZpcm1zIHRoZSB1cHdhcmQgdHJlbmQgd2hlcmUgdGhlIGhpZ2hlciBpbmNvbWUsIHRoZSBoaWdoZXIgdGhlIGV4cGVuZGl0dXJlIGFuZCB0aGlzIHN1cHBvcnRzIHRoZSBjb3ZhcmlhbmNlIHJlc3VsdHMgdG9vLiANCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gSW5jb21lLCB5ID0gRXhwZW5kaXR1cmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAyKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gInJlZCIsIHNpemUgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJJbmNvbWUgdnMgRXhwZW5kaXR1cmUgd2l0aCBSZWdyZXNzaW9uIGxpbmUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpDQpgYGANCg0KIyMjICoqYykgQnViYmxlIGxpbmVzKioNClRoZSBidWJibGUgcGxvdCBhZGRzIHBvcHVsYXRpb24gd2VpZ2h0cywgdGhpcyBzaG93cyB0aGF0IHNvbWUgZGlzdHJpY3RzIGNvbnRyaWJ1dGUgbW9yZSBzaWduaWZpY2FudGx5IHRvIHRoZSBvdmVyYWxsIHN0YXRpc3RpY3MuIExhcmdlciBidWJibGUgcmVwcmVzZW50cyBkaXN0cmljdHMgd2l0aCBsYXJnZXIgcG9wdWxhdGlvbiwgdGVsbHMgdGhlIHVzZSBvZiB3ZWlnaHRlZCBzdGF0aXN0aWNzIHJhdGhlciB0aGFuIGJhc2ljIHN0YXRpc3RpY3MuIA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBJbmNvbWUsIHkgPSBFeHBlbmRpdHVyZSwgc2l6ZSA9IFdlaWdodCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSwgY29sb3IgPSAic3RlZWxibHVlIikgKw0KICBsYWJzKHRpdGxlPSJJbmNvbWUgdnMgRXhwZW5kaXR1cmUgKFdlaWdodGVkIGJ5IFBvcHVsYXRpb24pIikNCmBgYA0KDQojIyMgKipkKSBDb3JyZWxhdGlvbiBoZWF0bWFwKioNClRoZSBjb3JyZWxhdGlvbiBoZWF0bWFwIHN1bW1hcml6ZSB0aGUgcmVsYXRpb25zaGlwcyBudW1lcmljYWxseS4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gaWRlbnRpZnkgc3Ryb25nIGFuZCB3ZWFrIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGRhdGEuIA0KYGBge3J9DQpsaWJyYXJ5KGNvcnJwbG90KQ0KDQpjb3JfbWF0cml4IDwtIGNvcihkYXRhWywgYygiSW5jb21lIiwgIkV4cGVuZGl0dXJlIiwgIkhIX1NpemUiKV0pDQoNCmNvcnJwbG90KGNvcl9tYXRyaXgsIA0KICAgICAgICAgbWV0aG9kID0gImNvbG9yIiwgIA0KICAgICAgICAgYWRkQ29lZi5jb2wgPSAid2hpdGUiKQ0KYGBgDQoNCiMjIyAqKmUpIFBhaXIgUGxvdCoqDQpVc2luZyBwYWlyIHBsb3QgcHJvdmlkZXMgYSBkZXRhaWxlZCB2aWV3IG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgYWxsIHZhcmlhYmxlcy4gVGhpcyBoZWxwIHN1Z2dlc3QgcG90ZW50aWFsIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGhvdXNlaG9sZCBzaXplIGFuZCBib3RoIGluY29tZSBhbmQgdGhlIGV4cGVuZGl0dXJlLiANCmBgYHtyfQ0KbGlicmFyeShHR2FsbHkpDQoNCmdncGFpcnMoZGF0YVssIGMoIkluY29tZSIsIkV4cGVuZGl0dXJlIiwiSEhfU2l6ZSIpXSwNCiAgICAgICAgdGl0bGUgPSAiUGFpciBQbG90IEhvdXNlaG9sZCBXZWxmYXJlIHN1cnZleSIsDQopDQpgYGANCiMjIyAqKmYpIFFRIHBsb3QqKg0KUVEgcGxvdCBpcyBhIHN1cHBvcnRpbmcgcGxvdCBpbiB0aGlzIGNhc2UuIFRoaXMgcGxvdCBoZWxwcyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmFyaWFibGUgZm9sbG93cyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHNhbXBsZSA9IEluY29tZSkpICsNCiAgc3RhdF9xcSgpICsNCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gImJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiUS1RIFBsb3QgSW5jb21lIiwNCiAgICAgICB4ID0gIlRoZW9yZXRpY2FsIFF1YW50aWxlcyIsIA0KICAgICAgIHkgPSAiT2JzZXJ2ZWQvU2FtcGxlIFF1YW50aWxlcyIpDQpgYGANCg0KDQo=