1 Basic Syntax

Question 1 \begin{aligned} &3^4-\frac{2^6}{4}+\sqrt{225}-\ln \left(e^5\right)+\frac{\left(\lceil 7.2 \rceil \times \lfloor 9.9 \rfloor -(29 \bmod 6)^2\right)}{5} \end{aligned}

3^4 - 2^6/4 + sqrt(225) - log(exp(5)) + (ceiling(7.2) * floor(9.9) - (29%%6)^2)/5
[1] 84.4

Question 2 \begin{aligned} &\sin (\pi / 2)+\cos (\pi / 3)-\tan (\pi / 4)+2^{1.5}-9^{1 / 2}+\frac{5^3-4^4}{3^2+2^5} \end{aligned}

sin(pi/2) + cos(pi/3) - tan(pi/4) + 2^1.5 - 9^(1/2) + (5^3-4^4)/(3^2+2^5)
[1] -2.866695

Question 3 \begin{aligned} &\sqrt{2^{10}+3^6}-\ln \left(\frac{e^8}{e^3}\right)+\frac{\ln (1000)}{\ln (10)}+e^0+\frac{\lfloor 123.99\rfloor-\lceil 45.01\rceil}{7} \end{aligned}

sqrt(2^10+3^6) - log(exp(8)/exp(3)) + (log(1000)/log(10)) + exp(0) + (floor(123.99-ceiling(45.01)))/7
[1] 51.86884

Question 4 \begin{aligned} &\frac{7^5-6^4+5^3-4^2+3}{\frac{2^8-1}{3^3-1}+(10 \bmod 6)+\sqrt{144}}+\frac{\ln \left(e^{12}\right)-\ln \left(e^7\right)}{\lceil 19.01\rceil-\lfloor 3.99\rfloor}-\left(\frac{1+2+3+\cdots+30}{1 \times 2 \times 3 \times \cdots \times 10}\right)^2 \end{aligned}

q4_1 <- (7^5-6^4+5^3-4^2+3) / ((2^8-1)/(3^3-1) + (10 %% 6) + sqrt(144))
q4_2 <- (log(exp(12)) - log(exp(7))) / (ceiling(19.01) - floor(3.99))
q4_3 <- (sum(1:30) / factorial(30))^2

q4_1 + q4_2 - q4_3
[1] 605.6563

Question 5 \begin{aligned} &\int_{-\infty}^{1.96} \frac{1}{\sqrt{2 \pi}} e^{-\frac{1}{2} x^2} d x \end{aligned}

pnorm(q = 1.96, mean = 0, sd = 1)
[1] 0.9750021

Question 6

Given \begin{aligned} &\mathbf{A}=\left[\begin{array}{lll} 2 & 1 & 3 \\ 1 & 0 & 2 \\ 4 & 1 & 1 \end{array}\right] \text { and } \mathbf{B}=\left[\begin{array}{lll} 1 & 2 & 0 \\ 3 & 1 & 4 \\ 2 & 5 & 1 \end{array}\right] \end{aligned}

Then, calculate

\mathbf{C} = \mathbf{A} \mathbf{B}

\mathbf{C}^\top \mathbf{C}

(\mathbf{C}^\top \mathbf{C})^{-1}

A <- matrix(c(2,1,4, 1,0,1, 3,2,1), ncol = 3, nrow = 3)
print(A)
     [,1] [,2] [,3]
[1,]    2    1    3
[2,]    1    0    2
[3,]    4    1    1
B <- matrix(c(1,3,2, 2,1,5, 0,4,1), ncol = 3, nrow = 3)
print(B)
     [,1] [,2] [,3]
[1,]    1    2    0
[2,]    3    1    4
[3,]    2    5    1
C <- A %*% B
print(C)
     [,1] [,2] [,3]
[1,]   11   20    7
[2,]    5   12    2
[3,]    9   14    5
t(C) %*% C
     [,1] [,2] [,3]
[1,]  227  406  132
[2,]  406  740  234
[3,]  132  234   78
solve(t(C) %*% C)
           [,1]        [,2]       [,3]
[1,]  1.0164609 -0.26748971 -0.9176955
[2,] -0.2674897  0.09670782  0.1625514
[3,] -0.9176955  0.16255144  1.0781893

2 Data Structure in R

2.1 Basic Data Types in R

my_integer <- 42
class(my_integer)
[1] "numeric"
my_integer2 <- 42L
class(my_integer2)
[1] "integer"
my_numeric <- 42.5
class(my_numeric)
[1] "numeric"
my_character <- "some text"
class(my_character)
[1] "character"
my_character2 <- "42"
class(my_character2)
[1] "character"
my_logical <- TRUE
class(my_logical)
[1] "logical"

2.2 Data Frame

data <- iris
class(data)
[1] "data.frame"
names(data)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
head(data, 10)

2.3 Array and Matrices

x_vec <- 1:24
print(x)
[1] 25 24 30 78 21 30 37
x_mat <- matrix(1:24, nrow=4, ncol=6)
print(x_mat)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    5    9   13   17   21
[2,]    2    6   10   14   18   22
[3,]    3    7   11   15   19   23
[4,]    4    8   12   16   20   24
x_arr <- array (1:24, c(3, 4, 2))
print(x_arr)
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2

     [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

2.4 List

set.seed(123)
n <- 1000
x <- rbinom(n, size = 1, prob = 0.5)
table(x)
x
  0   1 
507 493 
head(x, 30)
 [1] 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0
r <- rle(x)
str(r)
List of 2
 $ lengths: int [1:489] 1 1 1 2 1 3 1 1 1 2 ...
 $ values : int [1:489] 0 1 0 1 0 1 0 1 0 1 ...
 - attr(*, "class")= chr "rle"
head(r$lengths, 10)
 [1] 1 1 1 2 1 3 1 1 1 2
head(r[[1]], 10)
 [1] 1 1 1 2 1 3 1 1 1 2

2.5 Factor

gender_vector <- c("Male", "Female", "Female", "Male", "Male")
class(gender_vector)
[1] "character"
class(gender_vector)
[1] "character"
factor_gender_vector <- factor(gender_vector)
factor_gender_vector
[1] Male   Female Female Male   Male  
Levels: Female Male
class(factor_gender_vector)
[1] "factor"

3 Operators, Conditions & Loops

3.1 Relational Operators

TRUE == TRUE
[1] TRUE
"hello" == "goodbye"
[1] FALSE
TRUE == FALSE
[1] FALSE
3 == 2
[1] FALSE
TRUE != TRUE
[1] FALSE
"hello" != "goodbye"
[1] TRUE
TRUE != FALSE
[1] TRUE
3 != 2
[1] TRUE
3 > 5
[1] FALSE
4 <= 4
[1] TRUE
# Alphabetical Order!
"Hello" > "Goodbye"
[1] TRUE
# TRUE coerces to 1
# FALSE coerces to 0
TRUE < FALSE
[1] FALSE
linkedin <- c (16, 9, 13, 5, 2, 17, 14)
linkedin > 10
[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE
x <- 17
x > 5 & x < 15
[1] FALSE
y <- 14
y < 5 | y > 15
[1] FALSE
c(TRUE, TRUE, FALSE) & c(TRUE, FALSE, FALSE)
[1]  TRUE FALSE FALSE

3.2 IF-ELSE Statement

Convert Nilai Angka to Nilai Huruf

Nilai Angka Nilai Huruf
86–100 A
76–85 AB
66–75 B
61–65 BC
56–60 C
41–55 D
0–40 E
convert_score <- function(x){
  x <- round(x,0)
  if (x >= 86 & x <= 100){
    return("A")
  } else if (x >= 76 & x <= 85){
    return("AB")
  } else if (x >= 66 & x <= 75){
    return("B")
  } else if (x >= 61 & x <= 65){
    return("BC")
  } else if (x >= 56 & x <= 60){
    return("C")
  } else if (x >= 41 & x <= 55){
    return("D")
  } else if (x >= 0 & x <= 40){
    return("E")
  } else{
    return(NA)
  }
}

x <- c(85.5)
convert_score(x)
[1] "A"

3.3 WHILE Loop

ctr <- 1
while(ctr <= 7) {
  print(paste("ctr is set to" , ctr))
  ctr <- ctr + 1
}
[1] "ctr is set to 1"
[1] "ctr is set to 2"
[1] "ctr is set to 3"
[1] "ctr is set to 4"
[1] "ctr is set to 5"
[1] "ctr is set to 6"
[1] "ctr is set to 7"

3.4 FOR Loop

cities <- c("New York", "Paris",
            "London", "Tokyo",
            "Rio de Janeiro", "Cape Town")
for (city in cities){
  print(city)
}
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Rio de Janeiro"
[1] "Cape Town"
cities <- c("New York", "Paris",
            "London", "Tokyo",
            "Rio de Janeiro", "Cape Town")
for (i in 1:length(cities)){
  print(cities[i])
}
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Rio de Janeiro"
[1] "Cape Town"

4 Functions

average <- function(x){
  n <- length(x)
  sumX <- 0
  for (i in 1:n){
    sumX <- sumX + x[i]
    }
  return (sumX/n)
}
x <- c(25,24,30, 78, 21, 30, 37)
average(x)
[1] 35
mean(x)
[1] 35

Question

Create a function for sample variance

S^2=\frac{1}{n-1} \sum_{i=1}^n\left(x_i-\bar{x}\right)^2

sample_var <- function(x){
  n <- length(x)
  
  sumX <- 0
  for (i in 1:n){
    sumX <- sumX + x[i]
  }
  meanX <- sumX /n
  
  varX <- 0
  for (i in 1:n){
    varX <- varX + (x[i]-meanX)^2
  }
  
  return(varX/(n-1))
}

sample_var(x)
[1] 386.6667
var(x)
[1] 386.6667

5 Workspace and Files

5.1 Read CSV files

link_url <- "https://github.com/novrisuhermi/dataset/raw/refs/heads/main/data.csv"

data <- read.csv(link_url, header = TRUE, sep = ",")
head(data, 10)

5.2 Read Excel files

library(readxl)
download.file(
  "https://raw.githubusercontent.com/novrisuhermi/dataset/main/data.xlsx",
  destfile = "data.xlsx",
  mode = "wb"
)
trying URL 'https://raw.githubusercontent.com/novrisuhermi/dataset/main/data.xlsx'
Content type 'application/octet-stream' length 13255 bytes (12 KB)
==================================================
downloaded 12 KB
data2 <- read_excel("data.xlsx")
head(data2, 10)

5.3 Write CSV files

library(summarytools)
summaryData <- descr(data)
print(summaryData)
Descriptive Statistics  
data  
N: 32  

                        am     carb      cyl     disp     drat     gear       hp      mpg     qsec
----------------- -------- -------- -------- -------- -------- -------- -------- -------- --------
             Mean     0.41     2.81     6.19   230.72     3.60     3.69   146.69    20.09    17.85
          Std.Dev     0.50     1.62     1.79   123.94     0.53     0.74    68.56     6.03     1.79
              Min     0.00     1.00     4.00    71.10     2.76     3.00    52.00    10.40    14.50
               Q1     0.00     2.00     4.00   120.65     3.08     3.00    96.00    15.35    16.88
           Median     0.00     2.00     6.00   196.30     3.70     4.00   123.00    19.20    17.71
               Q3     1.00     4.00     8.00   334.00     3.92     4.00   180.00    22.80    18.90
              Max     1.00     8.00     8.00   472.00     4.93     5.00   335.00    33.90    22.90
              MAD     0.00     1.48     2.97   140.48     0.70     1.48    77.10     5.41     1.42
              IQR     1.00     2.00     4.00   205.18     0.84     1.00    83.50     7.38     2.01
               CV     1.23     0.57     0.29     0.54     0.15     0.20     0.47     0.30     0.10
         Skewness     0.36     1.05    -0.17     0.38     0.27     0.53     0.73     0.61     0.37
      SE.Skewness     0.41     0.41     0.41     0.41     0.41     0.41     0.41     0.41     0.41
         Kurtosis    -1.92     1.26    -1.76    -1.21    -0.71    -1.07    -0.14    -0.37     0.34
          N.Valid    32.00    32.00    32.00    32.00    32.00    32.00    32.00    32.00    32.00
                N    32.00    32.00    32.00    32.00    32.00    32.00    32.00    32.00    32.00
        Pct.Valid   100.00   100.00   100.00   100.00   100.00   100.00   100.00   100.00   100.00

Table: Table continues below

 

                        vs       wt
----------------- -------- --------
             Mean     0.44     3.22
          Std.Dev     0.50     0.98
              Min     0.00     1.51
               Q1     0.00     2.54
           Median     0.00     3.33
               Q3     1.00     3.65
              Max     1.00     5.42
              MAD     0.00     0.77
              IQR     1.00     1.03
               CV     1.15     0.30
         Skewness     0.24     0.42
      SE.Skewness     0.41     0.41
         Kurtosis    -2.00    -0.02
          N.Valid    32.00    32.00
                N    32.00    32.00
        Pct.Valid   100.00   100.00
write.csv(summaryData, "summary_data.csv")
LS0tCnRpdGxlOiAiQ29tcHV0YXRpb25hbCBTdGF0aXN0aWNzIFdlZWsgMSIKCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbWF0aF9tZXRob2Q6IGthdGV4CiAgICB0aGVtZTogeWV0aQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyBCYXNpYyBTeW50YXgKClF1ZXN0aW9uIDEKJCQKXGJlZ2lue2FsaWduZWR9CiYzXjQtXGZyYWN7Ml42fXs0fStcc3FydHsyMjV9LVxsbiBcbGVmdChlXjVccmlnaHQpK1xmcmFje1xsZWZ0KFxsY2VpbCA3LjIgXHJjZWlsIFx0aW1lcyBcbGZsb29yIDkuOSBccmZsb29yIC0oMjkgXGJtb2QgNileMlxyaWdodCl9ezV9ClxlbmR7YWxpZ25lZH0KJCQKYGBge3J9CjNeNCAtIDJeNi80ICsgc3FydCgyMjUpIC0gbG9nKGV4cCg1KSkgKyAoY2VpbGluZyg3LjIpICogZmxvb3IoOS45KSAtICgyOSUlNileMikvNQpgYGAKClF1ZXN0aW9uIDIKJCQKXGJlZ2lue2FsaWduZWR9CiZcc2luIChccGkgLyAyKStcY29zIChccGkgLyAzKS1cdGFuIChccGkgLyA0KSsyXnsxLjV9LTleezEgLyAyfStcZnJhY3s1XjMtNF40fXszXjIrMl41fQpcZW5ke2FsaWduZWR9CiQkCmBgYHtyfQpzaW4ocGkvMikgKyBjb3MocGkvMykgLSB0YW4ocGkvNCkgKyAyXjEuNSAtIDleKDEvMikgKyAoNV4zLTReNCkvKDNeMisyXjUpCmBgYAoKUXVlc3Rpb24gMwokJApcYmVnaW57YWxpZ25lZH0KJlxzcXJ0ezJeezEwfSszXjZ9LVxsbiBcbGVmdChcZnJhY3tlXjh9e2VeM31ccmlnaHQpK1xmcmFje1xsbiAoMTAwMCl9e1xsbiAoMTApfStlXjArXGZyYWN7XGxmbG9vciAxMjMuOTlccmZsb29yLVxsY2VpbCA0NS4wMVxyY2VpbH17N30KXGVuZHthbGlnbmVkfQokJAoKYGBge3J9CnNxcnQoMl4xMCszXjYpIC0gbG9nKGV4cCg4KS9leHAoMykpICsgKGxvZygxMDAwKS9sb2coMTApKSArIGV4cCgwKSArIChmbG9vcigxMjMuOTktY2VpbGluZyg0NS4wMSkpKS83CmBgYAoKUXVlc3Rpb24gNAokJApcYmVnaW57YWxpZ25lZH0KJlxmcmFjezdeNS02XjQrNV4zLTReMiszfXtcZnJhY3syXjgtMX17M14zLTF9KygxMCBcYm1vZCA2KStcc3FydHsxNDR9fStcZnJhY3tcbG4gXGxlZnQoZV57MTJ9XHJpZ2h0KS1cbG4gXGxlZnQoZV43XHJpZ2h0KX17XGxjZWlsIDE5LjAxXHJjZWlsLVxsZmxvb3IgMy45OVxyZmxvb3J9LVxsZWZ0KFxmcmFjezErMiszK1xjZG90cyszMH17MSBcdGltZXMgMiBcdGltZXMgMyBcdGltZXMgXGNkb3RzIFx0aW1lcyAxMH1ccmlnaHQpXjIKXGVuZHthbGlnbmVkfQokJApgYGB7cn0KcTRfMSA8LSAoN141LTZeNCs1XjMtNF4yKzMpIC8gKCgyXjgtMSkvKDNeMy0xKSArICgxMCAlJSA2KSArIHNxcnQoMTQ0KSkKcTRfMiA8LSAobG9nKGV4cCgxMikpIC0gbG9nKGV4cCg3KSkpIC8gKGNlaWxpbmcoMTkuMDEpIC0gZmxvb3IoMy45OSkpCnE0XzMgPC0gKHN1bSgxOjMwKSAvIGZhY3RvcmlhbCgzMCkpXjIKCnE0XzEgKyBxNF8yIC0gcTRfMwpgYGAKClF1ZXN0aW9uIDUKJCQKXGJlZ2lue2FsaWduZWR9CiZcaW50X3stXGluZnR5fV57MS45Nn0gXGZyYWN7MX17XHNxcnR7MiBccGl9fSBlXnstXGZyYWN7MX17Mn0geF4yfSBkIHgKXGVuZHthbGlnbmVkfQokJAoKYGBge3J9CnBub3JtKHEgPSAxLjk2LCBtZWFuID0gMCwgc2QgPSAxKQpgYGAKClF1ZXN0aW9uIDYKCkdpdmVuCiQkClxiZWdpbnthbGlnbmVkfQomXG1hdGhiZntBfT1cbGVmdFtcYmVnaW57YXJyYXl9e2xsbH0KMiAmIDEgJiAzIFxcCjEgJiAwICYgMiBcXAo0ICYgMSAmIDEKXGVuZHthcnJheX1ccmlnaHRdIFx0ZXh0IHsgYW5kIH0gXG1hdGhiZntCfT1cbGVmdFtcYmVnaW57YXJyYXl9e2xsbH0KMSAmIDIgJiAwIFxcCjMgJiAxICYgNCBcXAoyICYgNSAmIDEKXGVuZHthcnJheX1ccmlnaHRdClxlbmR7YWxpZ25lZH0KJCQKClRoZW4sIGNhbGN1bGF0ZQoKJFxtYXRoYmZ7Q30gPSBcbWF0aGJme0F9IFxtYXRoYmZ7Qn0kCgokXG1hdGhiZntDfV5cdG9wIFxtYXRoYmZ7Q30kCgokKFxtYXRoYmZ7Q31eXHRvcCBcbWF0aGJme0N9KV57LTF9JAoKCmBgYHtyfQpBIDwtIG1hdHJpeChjKDIsMSw0LCAxLDAsMSwgMywyLDEpLCBuY29sID0gMywgbnJvdyA9IDMpCnByaW50KEEpCmBgYAoKYGBge3J9CkIgPC0gbWF0cml4KGMoMSwzLDIsIDIsMSw1LCAwLDQsMSksIG5jb2wgPSAzLCBucm93ID0gMykKcHJpbnQoQikKYGBgCgpgYGB7cn0KQyA8LSBBICUqJSBCCnByaW50KEMpCmBgYAoKYGBge3J9CnQoQykgJSolIEMKYGBgCgpgYGB7cn0Kc29sdmUodChDKSAlKiUgQykKYGBgCgojIERhdGEgU3RydWN0dXJlIGluIFIKCiMjIEJhc2ljIERhdGEgVHlwZXMgaW4gUgoKYGBge3J9Cm15X2ludGVnZXIgPC0gNDIKY2xhc3MobXlfaW50ZWdlcikKYGBgCgpgYGB7cn0KbXlfaW50ZWdlcjIgPC0gNDJMCmNsYXNzKG15X2ludGVnZXIyKQpgYGAKCmBgYHtyfQpteV9udW1lcmljIDwtIDQyLjUKY2xhc3MobXlfbnVtZXJpYykKYGBgCgpgYGB7cn0KbXlfY2hhcmFjdGVyIDwtICJzb21lIHRleHQiCmNsYXNzKG15X2NoYXJhY3RlcikKYGBgCgpgYGB7cn0KbXlfY2hhcmFjdGVyMiA8LSAiNDIiCmNsYXNzKG15X2NoYXJhY3RlcjIpCmBgYAoKYGBge3J9Cm15X2xvZ2ljYWwgPC0gVFJVRQpjbGFzcyhteV9sb2dpY2FsKQpgYGAKCiMjIERhdGEgRnJhbWUKCmBgYHtyfQpkYXRhIDwtIGlyaXMKY2xhc3MoZGF0YSkKYGBgCgpgYGB7cn0KbmFtZXMoZGF0YSkKYGBgCgoKYGBge3J9CmhlYWQoZGF0YSwgMTApCmBgYAoKIyMgQXJyYXkgYW5kIE1hdHJpY2VzCgpgYGB7cn0KeF92ZWMgPC0gMToyNApwcmludCh4KQpgYGAKCmBgYHtyfQp4X21hdCA8LSBtYXRyaXgoMToyNCwgbnJvdz00LCBuY29sPTYpCnByaW50KHhfbWF0KQpgYGAKCmBgYHtyfQp4X2FyciA8LSBhcnJheSAoMToyNCwgYygzLCA0LCAyKSkKcHJpbnQoeF9hcnIpCmBgYAoKIyMgTGlzdAoKYGBge3J9CnNldC5zZWVkKDEyMykKbiA8LSAxMDAwCnggPC0gcmJpbm9tKG4sIHNpemUgPSAxLCBwcm9iID0gMC41KQp0YWJsZSh4KQpgYGAKCmBgYHtyfQpoZWFkKHgsIDMwKQpgYGAKCmBgYHtyfQpyIDwtIHJsZSh4KQpzdHIocikKYGBgCgpgYGB7cn0KaGVhZChyJGxlbmd0aHMsIDEwKQpgYGAKCmBgYHtyfQpoZWFkKHJbWzFdXSwgMTApCmBgYAoKIyMgRmFjdG9yCmBgYHtyfQpnZW5kZXJfdmVjdG9yIDwtIGMoIk1hbGUiLCAiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKQpjbGFzcyhnZW5kZXJfdmVjdG9yKQpgYGAKCmBgYHtyfQpjbGFzcyhnZW5kZXJfdmVjdG9yKQpgYGAKCmBgYHtyfQpmYWN0b3JfZ2VuZGVyX3ZlY3RvciA8LSBmYWN0b3IoZ2VuZGVyX3ZlY3RvcikKZmFjdG9yX2dlbmRlcl92ZWN0b3IKYGBgCgpgYGB7cn0KY2xhc3MoZmFjdG9yX2dlbmRlcl92ZWN0b3IpCmBgYAoKIyBPcGVyYXRvcnMsIENvbmRpdGlvbnMgJiBMb29wcwoKIyMgUmVsYXRpb25hbCBPcGVyYXRvcnMKCmBgYHtyfQpUUlVFID09IFRSVUUKYGBgCgpgYGB7cn0KImhlbGxvIiA9PSAiZ29vZGJ5ZSIKYGBgCgpgYGB7cn0KVFJVRSA9PSBGQUxTRQpgYGAKCmBgYHtyfQozID09IDIKYGBgCgpgYGB7cn0KVFJVRSAhPSBUUlVFCmBgYAoKYGBge3J9CiJoZWxsbyIgIT0gImdvb2RieWUiCmBgYAoKYGBge3J9ClRSVUUgIT0gRkFMU0UKYGBgCgpgYGB7cn0KMyAhPSAyCmBgYAoKYGBge3J9CjMgPiA1CmBgYAoKYGBge3J9CjQgPD0gNApgYGAKCmBgYHtyfQojIEFscGhhYmV0aWNhbCBPcmRlciEKIkhlbGxvIiA+ICJHb29kYnllIgpgYGAKCmBgYHtyfQojIFRSVUUgY29lcmNlcyB0byAxCiMgRkFMU0UgY29lcmNlcyB0byAwClRSVUUgPCBGQUxTRQpgYGAKCmBgYHtyfQpsaW5rZWRpbiA8LSBjICgxNiwgOSwgMTMsIDUsIDIsIDE3LCAxNCkKbGlua2VkaW4gPiAxMApgYGAKCmBgYHtyfQp4IDwtIDE3CnggPiA1ICYgeCA8IDE1CmBgYAoKYGBge3J9CnkgPC0gMTQKeSA8IDUgfCB5ID4gMTUKYGBgCgpgYGB7cn0KYyhUUlVFLCBUUlVFLCBGQUxTRSkgJiBjKFRSVUUsIEZBTFNFLCBGQUxTRSkKYGBgCgojIyBJRi1FTFNFIFN0YXRlbWVudAoKQ29udmVydCBgTmlsYWkgQW5na2FgIHRvIGBOaWxhaSBIdXJ1ZmAKCnwgTmlsYWkgQW5na2EgfCBOaWxhaSBIdXJ1ZnwgCnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwKfCA4NuKAkzEwMCAgICAgIHwgQSAgICAgICAgICB8IAp8IDc24oCTODUgICAgICAgfCBBQiAgICAgICAgIHwgCnwgNjbigJM3NSAgICAgICB8IEIgICAgICAgICAgfCAKfCA2MeKAkzY1ICAgICAgIHwgQkMgICAgICAgICB8IAp8IDU24oCTNjAgICAgICAgfCBDICAgICAgICAgIHwgCnwgNDHigJM1NSAgICAgICB8IEQgICAgICAgICAgfCAKfCAw4oCTNDAgICAgICAgIHwgRSAgICAgICAgICB8IAoKYGBge3J9CmNvbnZlcnRfc2NvcmUgPC0gZnVuY3Rpb24oeCl7CiAgeCA8LSByb3VuZCh4LDApCiAgaWYgKHggPj0gODYgJiB4IDw9IDEwMCl7CiAgICByZXR1cm4oIkEiKQogIH0gZWxzZSBpZiAoeCA+PSA3NiAmIHggPD0gODUpewogICAgcmV0dXJuKCJBQiIpCiAgfSBlbHNlIGlmICh4ID49IDY2ICYgeCA8PSA3NSl7CiAgICByZXR1cm4oIkIiKQogIH0gZWxzZSBpZiAoeCA+PSA2MSAmIHggPD0gNjUpewogICAgcmV0dXJuKCJCQyIpCiAgfSBlbHNlIGlmICh4ID49IDU2ICYgeCA8PSA2MCl7CiAgICByZXR1cm4oIkMiKQogIH0gZWxzZSBpZiAoeCA+PSA0MSAmIHggPD0gNTUpewogICAgcmV0dXJuKCJEIikKICB9IGVsc2UgaWYgKHggPj0gMCAmIHggPD0gNDApewogICAgcmV0dXJuKCJFIikKICB9IGVsc2V7CiAgICByZXR1cm4oTkEpCiAgfQp9Cgp4IDwtIGMoODUuNSkKY29udmVydF9zY29yZSh4KQpgYGAKCiMjIFdISUxFIExvb3AKCmBgYHtyfQpjdHIgPC0gMQp3aGlsZShjdHIgPD0gNykgewogIHByaW50KHBhc3RlKCJjdHIgaXMgc2V0IHRvIiAsIGN0cikpCiAgY3RyIDwtIGN0ciArIDEKfQpgYGAKCiMjIEZPUiBMb29wCgpgYGB7cn0KY2l0aWVzIDwtIGMoIk5ldyBZb3JrIiwgIlBhcmlzIiwKICAgICAgICAgICAgIkxvbmRvbiIsICJUb2t5byIsCiAgICAgICAgICAgICJSaW8gZGUgSmFuZWlybyIsICJDYXBlIFRvd24iKQpmb3IgKGNpdHkgaW4gY2l0aWVzKXsKICBwcmludChjaXR5KQp9CmBgYAoKYGBge3J9CmNpdGllcyA8LSBjKCJOZXcgWW9yayIsICJQYXJpcyIsCiAgICAgICAgICAgICJMb25kb24iLCAiVG9reW8iLAogICAgICAgICAgICAiUmlvIGRlIEphbmVpcm8iLCAiQ2FwZSBUb3duIikKZm9yIChpIGluIDE6bGVuZ3RoKGNpdGllcykpewogIHByaW50KGNpdGllc1tpXSkKfQpgYGAKCiMgRnVuY3Rpb25zCgpgYGB7cn0KYXZlcmFnZSA8LSBmdW5jdGlvbih4KXsKICBuIDwtIGxlbmd0aCh4KQogIHN1bVggPC0gMAogIGZvciAoaSBpbiAxOm4pewogICAgc3VtWCA8LSBzdW1YICsgeFtpXQogICAgfQogIHJldHVybiAoc3VtWC9uKQp9CmBgYAoKYGBge3J9CnggPC0gYygyNSwyNCwzMCwgNzgsIDIxLCAzMCwgMzcpCmF2ZXJhZ2UoeCkKYGBgCgpgYGB7cn0KbWVhbih4KQpgYGAKClF1ZXN0aW9uCgpDcmVhdGUgYSBmdW5jdGlvbiBmb3Igc2FtcGxlIHZhcmlhbmNlCgokJApTXjI9XGZyYWN7MX17bi0xfSBcc3VtX3tpPTF9Xm5cbGVmdCh4X2ktXGJhcnt4fVxyaWdodCleMgokJAoKYGBge3J9CnNhbXBsZV92YXIgPC0gZnVuY3Rpb24oeCl7CiAgbiA8LSBsZW5ndGgoeCkKICAKICBzdW1YIDwtIDAKICBmb3IgKGkgaW4gMTpuKXsKICAgIHN1bVggPC0gc3VtWCArIHhbaV0KICB9CiAgbWVhblggPC0gc3VtWCAvbgogIAogIHZhclggPC0gMAogIGZvciAoaSBpbiAxOm4pewogICAgdmFyWCA8LSB2YXJYICsgKHhbaV0tbWVhblgpXjIKICB9CiAgCiAgcmV0dXJuKHZhclgvKG4tMSkpCn0KCnNhbXBsZV92YXIoeCkKYGBgCgpgYGB7cn0KdmFyKHgpCmBgYAoKCiMgV29ya3NwYWNlIGFuZCBGaWxlcwoKIyMgUmVhZCBDU1YgZmlsZXMKYGBge3J9CmxpbmtfdXJsIDwtICJodHRwczovL2dpdGh1Yi5jb20vbm92cmlzdWhlcm1pL2RhdGFzZXQvcmF3L3JlZnMvaGVhZHMvbWFpbi9kYXRhLmNzdiIKCmRhdGEgPC0gcmVhZC5jc3YobGlua191cmwsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikKaGVhZChkYXRhLCAxMCkKYGBgCgojIyBSZWFkIEV4Y2VsIGZpbGVzCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmBgYAoKCmBgYHtyfQpkb3dubG9hZC5maWxlKAogICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbm92cmlzdWhlcm1pL2RhdGFzZXQvbWFpbi9kYXRhLnhsc3giLAogIGRlc3RmaWxlID0gImRhdGEueGxzeCIsCiAgbW9kZSA9ICJ3YiIKKQpkYXRhMiA8LSByZWFkX2V4Y2VsKCJkYXRhLnhsc3giKQpgYGAKCmBgYHtyfQpoZWFkKGRhdGEyLCAxMCkKYGBgCgojIyBXcml0ZSBDU1YgZmlsZXMKCmBgYHtyfQpsaWJyYXJ5KHN1bW1hcnl0b29scykKYGBgCgoKYGBge3J9CnN1bW1hcnlEYXRhIDwtIGRlc2NyKGRhdGEpCnByaW50KHN1bW1hcnlEYXRhKQpgYGAKCmBgYHtyfQp3cml0ZS5jc3Yoc3VtbWFyeURhdGEsICJzdW1tYXJ5X2RhdGEuY3N2IikKYGBgCgoKCgoK