A. Creating Vectors

In this section, you are expected to be able to shape data in vectors, perform basic mathematical operations, and also manipulate vectors.

Exercise 1

Create a vector A containing numeric values, starting from the last 2 digits of your student id up to 30.

A <- c(02:30)
A
##  [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## [26] 27 28 29 30

Exercise 2

Create a vector B containing 12 character values; all names of your classmate including yourself.

B <- c("Angel", "Irene", "Jeffry", "Julian", "Kefas", "Lala", "Nikita", "Sherly", "Siana", "Supit", "Ardifo", "Fallen")
B
##  [1] "Angel"  "Irene"  "Jeffry" "Julian" "Kefas"  "Lala"   "Nikita" "Sherly"
##  [9] "Siana"  "Supit"  "Ardifo" "Fallen"

Exercise 3

Create a vector C containing 12 numeric values, random number between 60 and 100.

C <- runif(12,60,100)
C
##  [1] 83.06539 72.71245 94.20521 73.14817 92.73011 86.79504 96.19773 78.06197
##  [9] 87.26555 96.34301 70.37458 67.14578

B. Creating Matrices

In this section, you are expected to be able to shape data in Matrices, perform basic mathematical operations, and also manipulate Matrices.

Exercise 4

Create a matrices M1 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 60 and 100.

 d <- runif(16,60,100)
M1 <- matrix(d, nrow = 4, ncol = 4)
M1
##          [,1]     [,2]     [,3]     [,4]
## [1,] 73.90680 71.43729 70.82227 66.26045
## [2,] 98.04732 72.10280 74.11385 95.80472
## [3,] 81.68304 80.22039 76.32970 71.64045
## [4,] 60.87155 75.40760 80.17859 75.58125

Exercise 5

Create a matrices M2 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 30 and 60. Find out the following tasks:

  • 3 * M1, give your opinion about the result.
  • M1 + M2, give your opinion about the result.
  • M1 - M2, give your opinion about the result.
  • M1 * M2, give your opinion about the result.
  • M1 / M2, give your opinion about the result.
  • determinan of M1, give your opinion about the result. library(matlib)
  • invers of M1, give your opinion about the result.
d <- runif(16,30,60)
M2 <- matrix(d, nrow = 4, ncol = 4)
M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 56.11872 58.41173 58.17010 31.41097
## [2,] 43.05740 39.01182 56.41392 52.72082
## [3,] 46.22255 36.71104 56.13462 36.78458
## [4,] 52.05576 53.14185 56.76434 32.06309
3*M1          #semua hasil data dari M1 akan dikalikan dengan 3
##          [,1]     [,2]     [,3]     [,4]
## [1,] 221.7204 214.3119 212.4668 198.7814
## [2,] 294.1420 216.3084 222.3416 287.4142
## [3,] 245.0491 240.6612 228.9891 214.9214
## [4,] 182.6147 226.2228 240.5358 226.7438
M1+M2         #semua data dari M1 akan ditambah dengan data M2
##          [,1]     [,2]     [,3]      [,4]
## [1,] 130.0255 129.8490 128.9924  97.67142
## [2,] 141.1047 111.1146 130.5278 148.52555
## [3,] 127.9056 116.9314 132.4643 108.42504
## [4,] 112.9273 128.5494 136.9429 107.64434
M1-M2         #semua data dari M1 akan dikurang dengan data M2
##           [,1]     [,2]     [,3]     [,4]
## [1,] 17.788080 13.02556 12.65217 34.84948
## [2,] 54.989916 33.09098 17.69993 43.08390
## [3,] 35.460499 43.50935 20.19508 34.85587
## [4,]  8.815789 22.26574 23.41425 43.51816
M1*M2         #semua data dari M1 akan dikalikan dengan data M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 4147.554 4172.776 4119.739 2081.305
## [2,] 4221.663 2812.861 4181.053 5050.904
## [3,] 3775.598 2944.974 4284.738 2635.264
## [4,] 3168.715 4007.299 4551.285 2423.368
M1/M2         #semua data dari M1 akan dibagi dengan data M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 1.316972 1.222996 1.217503 2.109468
## [2,] 2.277130 1.848230 1.313751 1.817208
## [3,] 1.767169 2.185184 1.359762 1.947567
## [4,] 1.169353 1.418987 1.412482 2.357267
det(M1)       #akan menghasilkan determinan dari M1
## [1] 122839.2
library("matlib")
inv(M1)    #akan menghasilkan invers dari M1
##            [,1]        [,2]        [,3]        [,4]
## [1,]  0.1432684  0.00177201 -0.08255202 -0.04959873
## [2,] -0.4103731 -0.00365155  0.35464041  0.02824433
## [3,]  0.4589275 -0.03187841 -0.36528230 -0.01568714
## [4,] -0.1927977  0.03603349  0.10016123  0.04163846

Exercise 6

Create a matrix data that is contain the following vectors:

  • B that you has been created in the exercise 2. Name it as a ‘names’ variable
  • C that you has been created in the exercise 3. Name it as a ‘scores’ variable.
names <- B
scores <- C
data <- cbind(names,scores)
data
##       names    scores            
##  [1,] "Angel"  "83.0653871688992"
##  [2,] "Irene"  "72.7124506328255"
##  [3,] "Jeffry" "94.2052064090967"
##  [4,] "Julian" "73.1481749005616"
##  [5,] "Kefas"  "92.7301126066595"
##  [6,] "Lala"   "86.7950434144586"
##  [7,] "Nikita" "96.1977332923561"
##  [8,] "Sherly" "78.0619682371616"
##  [9,] "Siana"  "87.2655522078276"
## [10,] "Supit"  "96.3430074974895"
## [11,] "Ardifo" "70.3745798580348"
## [12,] "Fallen" "67.1457812003791"

C. Lists

In this section, you are expected to be able to shape data by using the list() function, perform some basic manipulations.

Exercise 7

Please create a data set as the List variable by using the list() function, contain the following vectors:

  • a variable name, the values including your classmate and yourself
  • a variable age, the values including your classmate and yourself
  • a variable gender, the values including your classmate and yourself
name<-c("Angel", "Irene", "Jeffry", "Julian", "Kefas", "Lala", "Nikita", "Sherly", "Siana", "Supit", "Ardifo", "Fallen", "sofia")
age<-c(18,18,19,19,19,19,18,19,19,18,18,20,20)
gender<-c("female","female","male","male","male","female","female","female","female","female","male","male","female")
list<-list(name,age,gender)
list
## [[1]]
##  [1] "Angel"  "Irene"  "Jeffry" "Julian" "Kefas"  "Lala"   "Nikita" "Sherly"
##  [9] "Siana"  "Supit"  "Ardifo" "Fallen" "sofia" 
## 
## [[2]]
##  [1] 18 18 19 19 19 19 18 19 19 18 18 20 20
## 
## [[3]]
##  [1] "female" "female" "male"   "male"   "male"   "female" "female" "female"
##  [9] "female" "female" "male"   "male"   "female"

D. Factors

In this section, you are expected to be able to shape data by using the factor() function, perform some basic manipulations.

Exercise 8

Please create a data set as the Factor variable as you have done at Exercise 7. Here, you add one more variable called marital_status by using the factor() function, as the following code:

marital_status <- factor(c("yes","no","yes","no", until 12 students))
name<-c("Angel", "Irene", "Jeffry", "Julian", "Kefas", "Lala", "Nikita", "Sherly", "Siana", "Supit", "Ardifo", "Fallen", "sofia")
marital_status<-factor(c("no","no","no","no","no","yes","no","no","yes","yes","no","yes","no"))
marital_status
##  [1] no  no  no  no  no  yes no  no  yes yes no  yes no 
## Levels: no yes

E. Data Frames

In this section, you are expected to be able to shape data by using the data.frame() function, perform some basic manipulations.

Exercise 9

Please create a data set as the DF1 variable, contain the following vectors:

  • id, assume 1 up to 6
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
df1<-data.frame(id = c (1:6),
                   name = c("Angel", "Irene", "Jeffry", "Julian", "Kefas", "Lala"),
                   gender = c("female","female","male","male","male","female"),
                   age = c(18,18,19,19,19,19),
                   marital_status = c("no","no","no","no","no","yes"),
                   address_by_city = c("Tangerang","Tangerang","Tangerang","Tangerang","Tangerang","Tangerang"), stringsAsFactors = F)
df1
##   id   name gender age marital_status address_by_city
## 1  1  Angel female  18             no       Tangerang
## 2  2  Irene female  18             no       Tangerang
## 3  3 Jeffry   male  19             no       Tangerang
## 4  4 Julian   male  19             no       Tangerang
## 5  5  Kefas   male  19             no       Tangerang
## 6  6   Lala female  19            yes       Tangerang

Please create a data set as the DF2 variable, contain the following vectors:

  • id, assume 7 up to 12
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
df2<-data.frame(id = c (1:6),
                   name = c("Nikita", "Sherly", "Siana", "Supit", "Ardifo", "Fallen"),
                   gender = c("female","female","female","female","male","male"),
                   age = c(18,19,18,18,19,20),
                   marital_status = c("no","no","yes","yes","no","yes"),
                   address_by_city = c("Tangerang","Tangerang","Tangerang","Manado","Kalimantan","Tangerang"), stringsAsFactors = F)
df2
##   id   name gender age marital_status address_by_city
## 1  1 Nikita female  18             no       Tangerang
## 2  2 Sherly female  19             no       Tangerang
## 3  3  Siana female  18            yes       Tangerang
## 4  4  Supit female  18            yes          Manado
## 5  5 Ardifo   male  19             no      Kalimantan
## 6  6 Fallen   male  20            yes       Tangerang

Exercise 10

In this final exercise, please consider the following tasks:

  • Combine DF1 and DF2, assign it as SB19 variable!
  • Print the result of data frame SB19!
  • Print first 3 rows of the SB19 dataset!
  • How can you preview the SB19 dataset like an Excel file on your Rstudio?
  • Review the structure of the data frame SB19!
  • Check the dimension of the data.
  • Please apply piping functions to the data frame SB19, filter it by their gender accordingly! (as you have learn last week)
SB19 <- rbind(df1,df2)                  
print(SB19)     
##    id   name gender age marital_status address_by_city
## 1   1  Angel female  18             no       Tangerang
## 2   2  Irene female  18             no       Tangerang
## 3   3 Jeffry   male  19             no       Tangerang
## 4   4 Julian   male  19             no       Tangerang
## 5   5  Kefas   male  19             no       Tangerang
## 6   6   Lala female  19            yes       Tangerang
## 7   1 Nikita female  18             no       Tangerang
## 8   2 Sherly female  19             no       Tangerang
## 9   3  Siana female  18            yes       Tangerang
## 10  4  Supit female  18            yes          Manado
## 11  5 Ardifo   male  19             no      Kalimantan
## 12  6 Fallen   male  20            yes       Tangerang
head(SB19)
##   id   name gender age marital_status address_by_city
## 1  1  Angel female  18             no       Tangerang
## 2  2  Irene female  18             no       Tangerang
## 3  3 Jeffry   male  19             no       Tangerang
## 4  4 Julian   male  19             no       Tangerang
## 5  5  Kefas   male  19             no       Tangerang
## 6  6   Lala female  19            yes       Tangerang
#View(SB19)                            
str(SB19)                             
## 'data.frame':    12 obs. of  6 variables:
##  $ id             : int  1 2 3 4 5 6 1 2 3 4 ...
##  $ name           : chr  "Angel" "Irene" "Jeffry" "Julian" ...
##  $ gender         : chr  "female" "female" "male" "male" ...
##  $ age            : num  18 18 19 19 19 19 18 19 18 18 ...
##  $ marital_status : chr  "no" "no" "no" "no" ...
##  $ address_by_city: chr  "Tangerang" "Tangerang" "Tangerang" "Tangerang" ...
dim(SB19) 
## [1] 12  6
library("dplyr")
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
male<-SB19 %>% filter(gender == 'Male') %>% print()
## [1] id              name            gender          age            
## [5] marital_status  address_by_city
## <0 rows> (or 0-length row.names)
LS0tDQp0aXRsZTogIkxhYjM6IFIgQmFzaWNzIg0KYXV0aG9yOiAiSm9jZWx5biBJcmVuZSBHYW5pIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBMb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzQwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9naXRodWIuY29tL0Jha3RpLVNpcmVnYXIvaW1hZ2VzL2Jsb2IvbWFzdGVyL2xvZ28ucG5nP3Jhdz10cnVlIikNCmBgYA0KDQojIyBBLiBDcmVhdGluZyBWZWN0b3JzIA0KDQpJbiB0aGlzIHNlY3Rpb24sIHlvdSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBzaGFwZSBkYXRhIGluIHZlY3RvcnMsIHBlcmZvcm0gYmFzaWMgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMsIGFuZCBhbHNvIG1hbmlwdWxhdGUgdmVjdG9ycy4NCg0KIyMjIEV4ZXJjaXNlIDENCg0KQ3JlYXRlIGEgdmVjdG9yIGBBYCBjb250YWluaW5nIG51bWVyaWMgdmFsdWVzLCBzdGFydGluZyBmcm9tIHRoZSBsYXN0IDIgZGlnaXRzIG9mIHlvdXIgc3R1ZGVudCBpZCB1cCB0byAzMC4NCg0KYGBge3J9DQpBIDwtIGMoMDI6MzApDQpBDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDINCg0KQ3JlYXRlIGEgdmVjdG9yIGBCYCBjb250YWluaW5nIDEyIGNoYXJhY3RlciB2YWx1ZXM7IGFsbCBuYW1lcyBvZiB5b3VyIGNsYXNzbWF0ZSBpbmNsdWRpbmcgeW91cnNlbGYuDQoNCmBgYHtyfQ0KQiA8LSBjKCJBbmdlbCIsICJJcmVuZSIsICJKZWZmcnkiLCAiSnVsaWFuIiwgIktlZmFzIiwgIkxhbGEiLCAiTmlraXRhIiwgIlNoZXJseSIsICJTaWFuYSIsICJTdXBpdCIsICJBcmRpZm8iLCAiRmFsbGVuIikNCkINCmBgYA0KDQojIyMgRXhlcmNpc2UgMw0KDQpDcmVhdGUgYSB2ZWN0b3IgIGBDYCBjb250YWluaW5nIDEyIG51bWVyaWMgdmFsdWVzLCByYW5kb20gbnVtYmVyIGJldHdlZW4gNjAgYW5kIDEwMC4NCg0KYGBge3J9DQpDIDwtIHJ1bmlmKDEyLDYwLDEwMCkNCkMNCmBgYA0KDQoNCiMjIEIuIENyZWF0aW5nIE1hdHJpY2VzIA0KDQpJbiB0aGlzIHNlY3Rpb24sIHlvdSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBzaGFwZSBkYXRhIGluIE1hdHJpY2VzLCBwZXJmb3JtIGJhc2ljIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zLCBhbmQgYWxzbyBtYW5pcHVsYXRlIE1hdHJpY2VzLg0KDQoNCiMjIyBFeGVyY2lzZSA0DQoNCkNyZWF0ZSBhIG1hdHJpY2VzIGBNMWAgb3JkZXIgYnkgJHJvd3MgXHRpbWVzIGNvbHVtbnMgXHNwYWNlICg0IFx0aW1lcyA0KSQgY29udGFpbmluZyAxNiBudW1lcmljIHZhbHVlcywgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDYwIGFuZCAxMDAuDQoNCmBgYHtyfQ0KIGQgPC0gcnVuaWYoMTYsNjAsMTAwKQ0KTTEgPC0gbWF0cml4KGQsIG5yb3cgPSA0LCBuY29sID0gNCkNCk0xDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgNQ0KDQpDcmVhdGUgYSBtYXRyaWNlcyBgTTJgIG9yZGVyIGJ5ICRyb3dzIFx0aW1lcyBjb2x1bW5zIFxzcGFjZSAoNCBcdGltZXMgNCkkIGNvbnRhaW5pbmcgMTYgbnVtZXJpYyB2YWx1ZXMsIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAzMCBhbmQgNjAuIEZpbmQgb3V0IHRoZSBmb2xsb3dpbmcgdGFza3M6DQoNCiogYDMgKiBNMWAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuIA0KKiBgTTEgKyBNMmAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuIA0KKiBgTTEgLSBNMmAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuDQoqIGBNMSAqIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGBNMSAvIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGRldGVybWluYW4gb2YgYE0xYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4NCmxpYnJhcnkobWF0bGliKQ0KKiBpbnZlcnMgb2YgYE0xYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4NCg0KDQpgYGB7cn0NCmQgPC0gcnVuaWYoMTYsMzAsNjApDQpNMiA8LSBtYXRyaXgoZCwgbnJvdyA9IDQsIG5jb2wgPSA0KQ0KTTINCg0KMypNMSAgICAgICAgICAjc2VtdWEgaGFzaWwgZGF0YSBkYXJpIE0xIGFrYW4gZGlrYWxpa2FuIGRlbmdhbiAzDQpNMStNMiAgICAgICAgICNzZW11YSBkYXRhIGRhcmkgTTEgYWthbiBkaXRhbWJhaCBkZW5nYW4gZGF0YSBNMg0KTTEtTTIgICAgICAgICAjc2VtdWEgZGF0YSBkYXJpIE0xIGFrYW4gZGlrdXJhbmcgZGVuZ2FuIGRhdGEgTTINCk0xKk0yICAgICAgICAgI3NlbXVhIGRhdGEgZGFyaSBNMSBha2FuIGRpa2FsaWthbiBkZW5nYW4gZGF0YSBNMg0KTTEvTTIgICAgICAgICAjc2VtdWEgZGF0YSBkYXJpIE0xIGFrYW4gZGliYWdpIGRlbmdhbiBkYXRhIE0yDQpkZXQoTTEpICAgICAgICNha2FuIG1lbmdoYXNpbGthbiBkZXRlcm1pbmFuIGRhcmkgTTENCmxpYnJhcnkoIm1hdGxpYiIpDQppbnYoTTEpICAgICNha2FuIG1lbmdoYXNpbGthbiBpbnZlcnMgZGFyaSBNMQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA2DQoNCkNyZWF0ZSBhIG1hdHJpeCBgZGF0YWAgdGhhdCBpcyBjb250YWluIHRoZSBmb2xsb3dpbmcgdmVjdG9yczoNCg0KKiBgQmAgdGhhdCB5b3UgaGFzIGJlZW4gY3JlYXRlZCBpbiB0aGUgZXhlcmNpc2UgMi4gTmFtZSBpdCBhcyBhICduYW1lcycgdmFyaWFibGUNCiogYENgIHRoYXQgeW91IGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIGV4ZXJjaXNlIDMuIE5hbWUgaXQgYXMgYSAnc2NvcmVzJyB2YXJpYWJsZS4NCg0KYGBge3J9DQpuYW1lcyA8LSBCDQpzY29yZXMgPC0gQw0KZGF0YSA8LSBjYmluZChuYW1lcyxzY29yZXMpDQpkYXRhDQoNCmBgYA0KDQoNCiMjIEMuIExpc3RzIA0KDQpJbiB0aGlzIHNlY3Rpb24sIHlvdSBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBzaGFwZSBkYXRhIGJ5IHVzaW5nIHRoZSBgbGlzdCgpYCBmdW5jdGlvbiwgcGVyZm9ybSBzb21lIGJhc2ljIG1hbmlwdWxhdGlvbnMuDQoNCg0KIyMjIEV4ZXJjaXNlIDcNCg0KUGxlYXNlIGNyZWF0ZSBhIGRhdGEgc2V0IGFzIHRoZSBgTGlzdGAgdmFyaWFibGUgYnkgdXNpbmcgdGhlIGBsaXN0KClgIGZ1bmN0aW9uLCBjb250YWluIHRoZSBmb2xsb3dpbmcgdmVjdG9yczoNCg0KKiBhIHZhcmlhYmxlIGBuYW1lYCwgdGhlIHZhbHVlcyBpbmNsdWRpbmcgeW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGEgdmFyaWFibGUgYGFnZWAsIHRoZSB2YWx1ZXMgaW5jbHVkaW5nIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBhIHZhcmlhYmxlIGBnZW5kZXJgLCB0aGUgdmFsdWVzIGluY2x1ZGluZyB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCg0KYGBge3J9DQpuYW1lPC1jKCJBbmdlbCIsICJJcmVuZSIsICJKZWZmcnkiLCAiSnVsaWFuIiwgIktlZmFzIiwgIkxhbGEiLCAiTmlraXRhIiwgIlNoZXJseSIsICJTaWFuYSIsICJTdXBpdCIsICJBcmRpZm8iLCAiRmFsbGVuIiwgInNvZmlhIikNCmFnZTwtYygxOCwxOCwxOSwxOSwxOSwxOSwxOCwxOSwxOSwxOCwxOCwyMCwyMCkNCmdlbmRlcjwtYygiZmVtYWxlIiwiZmVtYWxlIiwibWFsZSIsIm1hbGUiLCJtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwibWFsZSIsIm1hbGUiLCJmZW1hbGUiKQ0KbGlzdDwtbGlzdChuYW1lLGFnZSxnZW5kZXIpDQpsaXN0DQpgYGANCg0KDQojIyBELiBGYWN0b3JzDQoNCkluIHRoaXMgc2VjdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHNoYXBlIGRhdGEgYnkgdXNpbmcgdGhlIGBmYWN0b3IoKWAgZnVuY3Rpb24sIHBlcmZvcm0gc29tZSBiYXNpYyBtYW5pcHVsYXRpb25zLg0KDQoNCiMjIyBFeGVyY2lzZSA4DQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYEZhY3RvcmAgdmFyaWFibGUgYXMgeW91IGhhdmUgZG9uZSBhdCBFeGVyY2lzZSA3LiBIZXJlLCB5b3UgYWRkIG9uZSBtb3JlIHZhcmlhYmxlIGNhbGxlZCBgbWFyaXRhbF9zdGF0dXNgIGJ5IHVzaW5nIHRoZSBgZmFjdG9yKClgIGZ1bmN0aW9uLCBhcyB0aGUgZm9sbG93aW5nIGNvZGU6DQoNCmBgYHlhbWwNCm1hcml0YWxfc3RhdHVzIDwtIGZhY3RvcihjKCJ5ZXMiLCJubyIsInllcyIsIm5vIiwgdW50aWwgMTIgc3R1ZGVudHMpKQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZTwtYygiQW5nZWwiLCAiSXJlbmUiLCAiSmVmZnJ5IiwgIkp1bGlhbiIsICJLZWZhcyIsICJMYWxhIiwgIk5pa2l0YSIsICJTaGVybHkiLCAiU2lhbmEiLCAiU3VwaXQiLCAiQXJkaWZvIiwgIkZhbGxlbiIsICJzb2ZpYSIpDQptYXJpdGFsX3N0YXR1czwtZmFjdG9yKGMoIm5vIiwibm8iLCJubyIsIm5vIiwibm8iLCJ5ZXMiLCJubyIsIm5vIiwieWVzIiwieWVzIiwibm8iLCJ5ZXMiLCJubyIpKQ0KbWFyaXRhbF9zdGF0dXMNCmBgYA0KDQoNCiMjIEUuIERhdGEgRnJhbWVzDQoNCkluIHRoaXMgc2VjdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHNoYXBlIGRhdGEgYnkgdXNpbmcgdGhlIGBkYXRhLmZyYW1lKClgIGZ1bmN0aW9uLCBwZXJmb3JtIHNvbWUgYmFzaWMgbWFuaXB1bGF0aW9ucy4NCg0KDQojIyMgRXhlcmNpc2UgOQ0KDQpQbGVhc2UgY3JlYXRlIGEgZGF0YSBzZXQgYXMgdGhlIGBERjFgIHZhcmlhYmxlLCBjb250YWluIHRoZSBmb2xsb3dpbmcgdmVjdG9yczoNCg0KKiBgaWRgLCBhc3N1bWUgMSB1cCB0byA2DQoqIGBuYW1lYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGdlbmRlcmAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBhZ2VgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgbWFyaXRhbF9zdGF0dXNgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgYWRkcmVzc19ieV9jaXR5YCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCg0KYGBge3J9DQpkZjE8LWRhdGEuZnJhbWUoaWQgPSBjICgxOjYpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjKCJBbmdlbCIsICJJcmVuZSIsICJKZWZmcnkiLCAiSnVsaWFuIiwgIktlZmFzIiwgIkxhbGEiKSwNCiAgICAgICAgICAgICAgICAgICBnZW5kZXIgPSBjKCJmZW1hbGUiLCJmZW1hbGUiLCJtYWxlIiwibWFsZSIsIm1hbGUiLCJmZW1hbGUiKSwNCiAgICAgICAgICAgICAgICAgICBhZ2UgPSBjKDE4LDE4LDE5LDE5LDE5LDE5KSwNCiAgICAgICAgICAgICAgICAgICBtYXJpdGFsX3N0YXR1cyA9IGMoIm5vIiwibm8iLCJubyIsIm5vIiwibm8iLCJ5ZXMiKSwNCiAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2J5X2NpdHkgPSBjKCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQpkZjENCg0KYGBgDQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYERGMmAgdmFyaWFibGUsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2ZWN0b3JzOg0KDQoqIGBpZGAsIGFzc3VtZSA3IHVwIHRvIDEyDQoqIGBuYW1lYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGdlbmRlcmAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBhZ2VgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgbWFyaXRhbF9zdGF0dXNgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgYWRkcmVzc19ieV9jaXR5YCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCg0KYGBge3J9DQpkZjI8LWRhdGEuZnJhbWUoaWQgPSBjICgxOjYpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjKCJOaWtpdGEiLCAiU2hlcmx5IiwgIlNpYW5hIiwgIlN1cGl0IiwgIkFyZGlmbyIsICJGYWxsZW4iKSwNCiAgICAgICAgICAgICAgICAgICBnZW5kZXIgPSBjKCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJtYWxlIiwibWFsZSIpLA0KICAgICAgICAgICAgICAgICAgIGFnZSA9IGMoMTgsMTksMTgsMTgsMTksMjApLA0KICAgICAgICAgICAgICAgICAgIG1hcml0YWxfc3RhdHVzID0gYygibm8iLCJubyIsInllcyIsInllcyIsIm5vIiwieWVzIiksDQogICAgICAgICAgICAgICAgICAgYWRkcmVzc19ieV9jaXR5ID0gYygiVGFuZ2VyYW5nIiwiVGFuZ2VyYW5nIiwiVGFuZ2VyYW5nIiwiTWFuYWRvIiwiS2FsaW1hbnRhbiIsIlRhbmdlcmFuZyIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRikNCmRmMg0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDEwDQoNCkluIHRoaXMgZmluYWwgZXhlcmNpc2UsIHBsZWFzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRhc2tzOiANCg0KKiBDb21iaW5lIGBERjFgIGFuZCBgREYyYCwgIGFzc2lnbiBpdCBhcyBgU0IxOWAgdmFyaWFibGUhDQoqIFByaW50IHRoZSByZXN1bHQgb2YgZGF0YSBmcmFtZSBgU0IxOWAhDQoqIFByaW50IGZpcnN0IDMgcm93cyBvZiB0aGUgYFNCMTlgIGRhdGFzZXQhDQoqIEhvdyBjYW4geW91IHByZXZpZXcgIHRoZSBgU0IxOWAgZGF0YXNldCBsaWtlIGFuIEV4Y2VsIGZpbGUgb24geW91ciBSc3R1ZGlvPw0KKiBSZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBmcmFtZSBgU0IxOWAhDQoqIENoZWNrIHRoZSBkaW1lbnNpb24gb2YgdGhlIGRhdGEuIA0KKiBQbGVhc2UgYXBwbHkgcGlwaW5nIGZ1bmN0aW9ucyB0byB0aGUgZGF0YSBmcmFtZSBgU0IxOWAsIGZpbHRlciBpdCBieSB0aGVpciBnZW5kZXIgYWNjb3JkaW5nbHkhIChhcyB5b3UgaGF2ZSBsZWFybiBsYXN0IHdlZWspDQoNCmBgYHtyfQ0KU0IxOSA8LSByYmluZChkZjEsZGYyKSAgICAgICAgICAgICAgICAgIA0KcHJpbnQoU0IxOSkgICAgIA0KaGVhZChTQjE5KQ0KI1ZpZXcoU0IxOSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpzdHIoU0IxOSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZGltKFNCMTkpIA0KbGlicmFyeSgiZHBseXIiKQ0KbWFsZTwtU0IxOSAlPiUgZmlsdGVyKGdlbmRlciA9PSAnTWFsZScpICU+JSBwcmludCgpDQpgYGANCg0K