Introduction

A vector is a fundamental data structure in R and it can store a sequence of values of the same date type, such as numbers, characters, or logical values. Vectors in R can be created using various functions such as ‘c()’ (combine), ‘seq()’ (sequence), ‘rep()’ (repeat), and ‘vector()’. Once created, we can perform various operations on vectors, including slicing, filtering, sorting, merging, and more.

Operations

Creating Vectors

Here are some examples of creating vectors.

with the c() function:

Vectors can be created using the ‘c()’ function, which concatenates values into a vector. And we can check the type of a vector using the ‘class()’ function

# a numeric vector
x <- c(1, 2, 3, 4, 5)
x
## [1] 1 2 3 4 5
class(x) # "numeric"
## [1] "numeric"
# a character vector
y <- c("apple", "banana", "cherry")
y
## [1] "apple"  "banana" "cherry"
class(y) # "character"
## [1] "character"
# a logical vector
z <- c(TRUE, FALSE, TRUE)
z
## [1]  TRUE FALSE  TRUE
class(z) # "logical"
## [1] "logical"

with the seq() function:

# create a numeric vector with sequence 1 to 10
nums_seq <- seq(from = 1, to = 10, by = 1)
nums_seq
##  [1]  1  2  3  4  5  6  7  8  9 10
# create a numeric vector with sequence 1 to 10, incrementing by 2
nums_seq2 <- seq(from = 1, to = 10, by = 2)
nums_seq2
## [1] 1 3 5 7 9

with the rep() function:

# create a numeric vector with 5 repeated values of 1
repeated_nums <- rep(1, times = 5)
repeated_nums
## [1] 1 1 1 1 1
# create a character vector with 5 repeated values of "hello"
repeated_strings <- rep("hello", times = 5)
repeated_strings
## [1] "hello" "hello" "hello" "hello" "hello"

with the vector() function:

# create an empty numeric vector with length 5
empty_nums <- vector("numeric", length = 5)
empty_nums
## [1] 0 0 0 0 0
# create an empty character vector with length 5
empty_strings <- vector("character", length = 5)
empty_strings
## [1] "" "" "" "" ""

using a formula:

# create a numeric vector with values calculated using a formula
x <- 1:5
x
## [1] 1 2 3 4 5
formula_nums <- 3 * x + 5
formula_nums
## [1]  8 11 14 17 20

Accessing Vector Elements

We can access individual elements of a vector using the square brackets notation [ ]. The index of the element we want to access goes inside the square brackets.

x <- c(1, 2, 3, 4, 10)
y <- c("apple", "banana", "cherry")
z <- c(TRUE, FALSE, TRUE)

# accessing the second element of x
x[2] # 2
## [1] 2
# accessing the first element of y
y[1] # "apple"
## [1] "apple"
# accessing the thrid element of z
z[3] # TRUE
## [1] TRUE

We can also access multiple elements of a vector using a sequence of indices. For example, to access the first three elements of x, we can use the : operator:

# accessing the first three elements of x
x[1:3] # 1 2 3
## [1] 1 2 3

We can also use logical vectors to index elements of a vector. For example, to select only the even elements of x, we can create a logical vector that identifies the even elements:

# selecting only the even elements of x
x[c(FALSE, TRUE, FALSE, TRUE, FALSE)] # 2 4
## [1] 2 4

Vector Arithmetic

We can perform arithmetic operations on vectors in R.

addition

# create two numeric vectors
# create two numeric vectors
x <- c(1, 2, 3, 4, 10)
y <- c(6, 7, 8, 9, 5)

# add two vectors element-wise
x + y # Output:  7  9 11 13 15
## [1]  7  9 11 13 15

subtraction

# subtract two vectors element-wise
x - y # Output: -5 -5 -5 -5  5
## [1] -5 -5 -5 -5  5

multiplication

# multiply two vectors element-wise
x * y # Output:   6  14  24  36  50
## [1]  6 14 24 36 50

division

# divide two vectors element-wise
y / x # Output:  6.000000  3.500000  2.666667  2.250000  0.500000
## [1] 6.000000 3.500000 2.666667 2.250000 0.500000

others

# multiplying a vector by a scalar
2 * x # 2 4 6 8 20
## [1]  2  4  6  8 20
# raise one vector to the power of another element-wise
x ^ y # Output:       1     128    6561  262144 100000
## [1]      1    128   6561 262144 100000
# compare two vectors element-wise
x < y # Output:  TRUE  TRUE  TRUE  TRUE FALSE
## [1]  TRUE  TRUE  TRUE  TRUE FALSE
# concatenate two vectors
c(x, y) # Output:   1  2  3  4 10  6  7  8  9  5
##  [1]  1  2  3  4 10  6  7  8  9  5
# calculate the dot product of two vectors
sum(x * y) # Output: 130
## [1] 130

Note that in order to add, subtract, multiply, or divide two vectors element-wise, they must be of the same length. If they are not of the same length, R will recycle the shorter vector to match the length of the longer vector, which may lead to unexpected results.

Vector Element Sorting

# create a numeric vector
x <- c(5, 2, 9, 1, 8)

# sort the elements in ascending order
sort(x) # Output:  1  2  5  8  9
## [1] 1 2 5 8 9
# sort the elements in descending order
sort(x, decreasing = TRUE) # Output:  9  8  5  2  1
## [1] 9 8 5 2 1

In this example, we create a vector x with five numeric elements. We then use the sort() function to sort the elements of x in ascending order by default. We can also sort the elements in descending order by setting the decreasing argument to TRUE. The sort() function returns a new vector with the elements sorted in the specified order. Note that the original vector x is not modified.

Slicing

To extract a range of elements from a vector, we can use square brackets ([]) with the start and end indices separated by a colon (:). For example:

x <- c(1, 2, 3, 4, 5)
x[2:4]  # extracts the second through fourth elements of x, which are 2, 3, and 4
## [1] 2 3 4

Reversing

To reverse the order of elements in a vector, we can use the ‘rev()’ function. For example:

x <- c(1, 2, 3, 4, 5)
rev(x)  # returns a new vector with the elements of x in reverse order: 5, 4, 3, 2, 1
## [1] 5 4 3 2 1

Filtering

To extract a subset of elements from a vector based on a condition, we can use logical indexing. For example, to extract all elements of x that are greater than 3:

x <- c(1, 2, 3, 4, 5)
x[x > 3]  # returns a new vector with the elements of x that are greater than 3: 4, 5
## [1] 4 5

Aggregating

To calculate statistics for a vector, we can use various functions like sum(), mean(), min(), max(), median(), sd(), and var():

x <- c(1, 2, 3, 4, 5)
sum(x)  
## [1] 15
mean(x)
## [1] 3
min(x)
## [1] 1
max(x)
## [1] 5
median(x)
## [1] 3
sd(x)
## [1] 1.581139
var(x)
## [1] 2.5

Combining

To combine two or more vectors into a single vector, we can use the ‘c()’ function.

x <- c(1, 2, 3)
y <- c(4, 5, 6)
z <- c(x, y)  # combines x and y into a single vector: 1, 2, 3, 4, 5, 6
z
## [1] 1 2 3 4 5 6

Checking for Membership

To check if a vector contains a particular element, we can use the %in% operator. For example, to check if x contains the value 3:

x <- c(1, 2, 3, 4, 5)
3 %in% x  # returns TRUE because x contains the value 3
## [1] TRUE
6 %in% x  # returns FALSE because x doesn't contain the value 6
## [1] FALSE

Summary

Overall, vectors are a powerful tool in R for storing and manipulating collections of values, and they play a critical role in many statistical and data analysis tasks.

LS0tCnRpdGxlOiAiUiBWZWN0b3JzIgphdXRob3I6ICJFbG0gQ29tcHV0aW5nIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgIGNzczogc3R5bGVzLmNzcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0aGVtZTogcmVhZGFibGUKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzInCi0tLQoKIyBJbnRyb2R1Y3Rpb24KCkEgdmVjdG9yIGlzIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgaW4gUiBhbmQgaXQgY2FuIHN0b3JlIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIHRoZSBzYW1lIGRhdGUgdHlwZSwgc3VjaCBhcyBudW1iZXJzLCBjaGFyYWN0ZXJzLCBvciBsb2dpY2FsIHZhbHVlcy4gVmVjdG9ycyBpbiBSIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHZhcmlvdXMgZnVuY3Rpb25zIHN1Y2ggYXMgJ2MoKScgKGNvbWJpbmUpLCAnc2VxKCknIChzZXF1ZW5jZSksICdyZXAoKScgKHJlcGVhdCksIGFuZCAndmVjdG9yKCknLiBPbmNlIGNyZWF0ZWQsIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgb3BlcmF0aW9ucyBvbiB2ZWN0b3JzLCBpbmNsdWRpbmcgc2xpY2luZywgZmlsdGVyaW5nLCBzb3J0aW5nLCBtZXJnaW5nLCBhbmQgbW9yZS4KCgojIE9wZXJhdGlvbnMKCiMjIENyZWF0aW5nIFZlY3RvcnMKCkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgdmVjdG9ycy4KCiMjIyB3aXRoIHRoZSBjKCkgZnVuY3Rpb246CgpWZWN0b3JzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSAnYygpJyBmdW5jdGlvbiwgd2hpY2ggY29uY2F0ZW5hdGVzIHZhbHVlcyBpbnRvIGEgdmVjdG9yLiBBbmQgd2UgY2FuIGNoZWNrIHRoZSB0eXBlIG9mIGEgdmVjdG9yIHVzaW5nIHRoZSAnY2xhc3MoKScgZnVuY3Rpb24KCgpgYGB7cn0KIyBhIG51bWVyaWMgdmVjdG9yCnggPC0gYygxLCAyLCAzLCA0LCA1KQp4CmNsYXNzKHgpICMgIm51bWVyaWMiCgoKIyBhIGNoYXJhY3RlciB2ZWN0b3IKeSA8LSBjKCJhcHBsZSIsICJiYW5hbmEiLCAiY2hlcnJ5IikKeQpjbGFzcyh5KSAjICJjaGFyYWN0ZXIiCgojIGEgbG9naWNhbCB2ZWN0b3IKeiA8LSBjKFRSVUUsIEZBTFNFLCBUUlVFKQp6CmNsYXNzKHopICMgImxvZ2ljYWwiCmBgYAoKIyMjIHdpdGggdGhlIHNlcSgpIGZ1bmN0aW9uOgoKYGBge3J9CiMgY3JlYXRlIGEgbnVtZXJpYyB2ZWN0b3Igd2l0aCBzZXF1ZW5jZSAxIHRvIDEwCm51bXNfc2VxIDwtIHNlcShmcm9tID0gMSwgdG8gPSAxMCwgYnkgPSAxKQpudW1zX3NlcQoKIyBjcmVhdGUgYSBudW1lcmljIHZlY3RvciB3aXRoIHNlcXVlbmNlIDEgdG8gMTAsIGluY3JlbWVudGluZyBieSAyCm51bXNfc2VxMiA8LSBzZXEoZnJvbSA9IDEsIHRvID0gMTAsIGJ5ID0gMikKbnVtc19zZXEyCmBgYAoKIyMjIHdpdGggdGhlIHJlcCgpIGZ1bmN0aW9uOgoKYGBge3J9CiMgY3JlYXRlIGEgbnVtZXJpYyB2ZWN0b3Igd2l0aCA1IHJlcGVhdGVkIHZhbHVlcyBvZiAxCnJlcGVhdGVkX251bXMgPC0gcmVwKDEsIHRpbWVzID0gNSkKcmVwZWF0ZWRfbnVtcwoKIyBjcmVhdGUgYSBjaGFyYWN0ZXIgdmVjdG9yIHdpdGggNSByZXBlYXRlZCB2YWx1ZXMgb2YgImhlbGxvIgpyZXBlYXRlZF9zdHJpbmdzIDwtIHJlcCgiaGVsbG8iLCB0aW1lcyA9IDUpCnJlcGVhdGVkX3N0cmluZ3MKYGBgCgojIyMgd2l0aCB0aGUgdmVjdG9yKCkgZnVuY3Rpb246CgpgYGB7cn0KIyBjcmVhdGUgYW4gZW1wdHkgbnVtZXJpYyB2ZWN0b3Igd2l0aCBsZW5ndGggNQplbXB0eV9udW1zIDwtIHZlY3RvcigibnVtZXJpYyIsIGxlbmd0aCA9IDUpCmVtcHR5X251bXMKCiMgY3JlYXRlIGFuIGVtcHR5IGNoYXJhY3RlciB2ZWN0b3Igd2l0aCBsZW5ndGggNQplbXB0eV9zdHJpbmdzIDwtIHZlY3RvcigiY2hhcmFjdGVyIiwgbGVuZ3RoID0gNSkKZW1wdHlfc3RyaW5ncwpgYGAKCiMjIyB1c2luZyBhIGZvcm11bGE6CgpgYGB7cn0KIyBjcmVhdGUgYSBudW1lcmljIHZlY3RvciB3aXRoIHZhbHVlcyBjYWxjdWxhdGVkIHVzaW5nIGEgZm9ybXVsYQp4IDwtIDE6NQp4CmZvcm11bGFfbnVtcyA8LSAzICogeCArIDUKZm9ybXVsYV9udW1zCmBgYAoKIyMgQWNjZXNzaW5nIFZlY3RvciBFbGVtZW50cwoKV2UgY2FuIGFjY2VzcyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGEgdmVjdG9yIHVzaW5nIHRoZSBzcXVhcmUgYnJhY2tldHMgbm90YXRpb24gWyBdLiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgd2Ugd2FudCB0byBhY2Nlc3MgZ29lcyBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgMTApCnkgPC0gYygiYXBwbGUiLCAiYmFuYW5hIiwgImNoZXJyeSIpCnogPC0gYyhUUlVFLCBGQUxTRSwgVFJVRSkKCiMgYWNjZXNzaW5nIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB4CnhbMl0gIyAyCgojIGFjY2Vzc2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiB5CnlbMV0gIyAiYXBwbGUiCgojIGFjY2Vzc2luZyB0aGUgdGhyaWQgZWxlbWVudCBvZiB6CnpbM10gIyBUUlVFCmBgYAoKV2UgY2FuIGFsc28gYWNjZXNzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGEgdmVjdG9yIHVzaW5nIGEgc2VxdWVuY2Ugb2YgaW5kaWNlcy4gRm9yIGV4YW1wbGUsIHRvIGFjY2VzcyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMgb2YgeCwgd2UgY2FuIHVzZSB0aGUgOiBvcGVyYXRvcjoKCmBgYHtyfQojIGFjY2Vzc2luZyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMgb2YgeAp4WzE6M10gIyAxIDIgMwpgYGAKCldlIGNhbiBhbHNvIHVzZSBsb2dpY2FsIHZlY3RvcnMgdG8gaW5kZXggZWxlbWVudHMgb2YgYSB2ZWN0b3IuIEZvciBleGFtcGxlLCB0byBzZWxlY3Qgb25seSB0aGUgZXZlbiBlbGVtZW50cyBvZiB4LCB3ZSBjYW4gY3JlYXRlIGEgbG9naWNhbCB2ZWN0b3IgdGhhdCBpZGVudGlmaWVzIHRoZSBldmVuIGVsZW1lbnRzOgoKYGBge3J9CiMgc2VsZWN0aW5nIG9ubHkgdGhlIGV2ZW4gZWxlbWVudHMgb2YgeAp4W2MoRkFMU0UsIFRSVUUsIEZBTFNFLCBUUlVFLCBGQUxTRSldICMgMiA0CmBgYAoKIyMgVmVjdG9yIEFyaXRobWV0aWMKCldlIGNhbiBwZXJmb3JtIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiB2ZWN0b3JzIGluIFIuCgojIyMgYWRkaXRpb24KCmBgYHtyfQojIGNyZWF0ZSB0d28gbnVtZXJpYyB2ZWN0b3JzCiMgY3JlYXRlIHR3byBudW1lcmljIHZlY3RvcnMKeCA8LSBjKDEsIDIsIDMsIDQsIDEwKQp5IDwtIGMoNiwgNywgOCwgOSwgNSkKCiMgYWRkIHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4ICsgeSAjIE91dHB1dDogIDcgIDkgMTEgMTMgMTUKYGBgCgojIyMgc3VidHJhY3Rpb24KCmBgYHtyfQojIHN1YnRyYWN0IHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4IC0geSAjIE91dHB1dDogLTUgLTUgLTUgLTUgIDUKYGBgCgojIyMgbXVsdGlwbGljYXRpb24KCmBgYHtyfQojIG11bHRpcGx5IHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4ICogeSAjIE91dHB1dDogICA2ICAxNCAgMjQgIDM2ICA1MApgYGAKCiMjIyBkaXZpc2lvbgoKYGBge3J9CiMgZGl2aWRlIHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp5IC8geCAjIE91dHB1dDogIDYuMDAwMDAwICAzLjUwMDAwMCAgMi42NjY2NjcgIDIuMjUwMDAwICAwLjUwMDAwMApgYGAKCiMjIyBvdGhlcnMKCmBgYHtyfQojIG11bHRpcGx5aW5nIGEgdmVjdG9yIGJ5IGEgc2NhbGFyCjIgKiB4ICMgMiA0IDYgOCAyMAoKIyByYWlzZSBvbmUgdmVjdG9yIHRvIHRoZSBwb3dlciBvZiBhbm90aGVyIGVsZW1lbnQtd2lzZQp4IF4geSAjIE91dHB1dDogICAgICAgMSAgICAgMTI4ICAgIDY1NjEgIDI2MjE0NCAxMDAwMDAKCiMgY29tcGFyZSB0d28gdmVjdG9ycyBlbGVtZW50LXdpc2UKeCA8IHkgIyBPdXRwdXQ6ICBUUlVFICBUUlVFICBUUlVFICBUUlVFIEZBTFNFCgojIGNvbmNhdGVuYXRlIHR3byB2ZWN0b3JzCmMoeCwgeSkgIyBPdXRwdXQ6ICAgMSAgMiAgMyAgNCAxMCAgNiAgNyAgOCAgOSAgNQoKIyBjYWxjdWxhdGUgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzCnN1bSh4ICogeSkgIyBPdXRwdXQ6IDEzMApgYGAKCgpOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYWRkLCBzdWJ0cmFjdCwgbXVsdGlwbHksIG9yIGRpdmlkZSB0d28gdmVjdG9ycyBlbGVtZW50LXdpc2UsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguIElmIHRoZXkgYXJlIG5vdCBvZiB0aGUgc2FtZSBsZW5ndGgsIFIgd2lsbCByZWN5Y2xlIHRoZSBzaG9ydGVyIHZlY3RvciB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXIgdmVjdG9yLCB3aGljaCBtYXkgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuCgojIyBWZWN0b3IgRWxlbWVudCBTb3J0aW5nCgpgYGB7cn0KIyBjcmVhdGUgYSBudW1lcmljIHZlY3Rvcgp4IDwtIGMoNSwgMiwgOSwgMSwgOCkKCiMgc29ydCB0aGUgZWxlbWVudHMgaW4gYXNjZW5kaW5nIG9yZGVyCnNvcnQoeCkgIyBPdXRwdXQ6ICAxICAyICA1ICA4ICA5CgojIHNvcnQgdGhlIGVsZW1lbnRzIGluIGRlc2NlbmRpbmcgb3JkZXIKc29ydCh4LCBkZWNyZWFzaW5nID0gVFJVRSkgIyBPdXRwdXQ6ICA5ICA4ICA1ICAyICAxCmBgYAoKSW4gdGhpcyBleGFtcGxlLCB3ZSBjcmVhdGUgYSB2ZWN0b3IgeCB3aXRoIGZpdmUgbnVtZXJpYyBlbGVtZW50cy4gV2UgdGhlbiB1c2UgdGhlIHNvcnQoKSBmdW5jdGlvbiB0byBzb3J0IHRoZSBlbGVtZW50cyBvZiB4IGluIGFzY2VuZGluZyBvcmRlciBieSBkZWZhdWx0LiBXZSBjYW4gYWxzbyBzb3J0IHRoZSBlbGVtZW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHNldHRpbmcgdGhlIGRlY3JlYXNpbmcgYXJndW1lbnQgdG8gVFJVRS4gVGhlIHNvcnQoKSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIHRoZSBlbGVtZW50cyBzb3J0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4gTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCB2ZWN0b3IgeCBpcyBub3QgbW9kaWZpZWQuCgojIyBTbGljaW5nCgpUbyBleHRyYWN0IGEgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhIHZlY3Rvciwgd2UgY2FuIHVzZSBzcXVhcmUgYnJhY2tldHMgKFtdKSB3aXRoIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMgc2VwYXJhdGVkIGJ5IGEgY29sb24gKDopLiBGb3IgZXhhbXBsZToKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgNSkKeFsyOjRdICAjIGV4dHJhY3RzIHRoZSBzZWNvbmQgdGhyb3VnaCBmb3VydGggZWxlbWVudHMgb2YgeCwgd2hpY2ggYXJlIDIsIDMsIGFuZCA0CmBgYAoKIyMgUmV2ZXJzaW5nCgpUbyByZXZlcnNlIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBhIHZlY3Rvciwgd2UgY2FuIHVzZSB0aGUgJ3JldigpJyBmdW5jdGlvbi4gRm9yIGV4YW1wbGU6CgpgYGB7cn0KeCA8LSBjKDEsIDIsIDMsIDQsIDUpCnJldih4KSAgIyByZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIHRoZSBlbGVtZW50cyBvZiB4IGluIHJldmVyc2Ugb3JkZXI6IDUsIDQsIDMsIDIsIDEKYGBgCgojIyBGaWx0ZXJpbmcKClRvIGV4dHJhY3QgYSBzdWJzZXQgb2YgZWxlbWVudHMgZnJvbSBhIHZlY3RvciBiYXNlZCBvbiBhIGNvbmRpdGlvbiwgd2UgY2FuIHVzZSBsb2dpY2FsIGluZGV4aW5nLiBGb3IgZXhhbXBsZSwgdG8gZXh0cmFjdCBhbGwgZWxlbWVudHMgb2YgeCB0aGF0IGFyZSBncmVhdGVyIHRoYW4gMzoKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgNSkKeFt4ID4gM10gICMgcmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgZWxlbWVudHMgb2YgeCB0aGF0IGFyZSBncmVhdGVyIHRoYW4gMzogNCwgNQpgYGAKCiMjIEFnZ3JlZ2F0aW5nCgpUbyBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSB2ZWN0b3IsIHdlIGNhbiB1c2UgdmFyaW91cyBmdW5jdGlvbnMgbGlrZSBzdW0oKSwgbWVhbigpLCBtaW4oKSwgbWF4KCksIG1lZGlhbigpLCBzZCgpLCBhbmQgdmFyKCk6CgpgYGB7cn0KeCA8LSBjKDEsIDIsIDMsIDQsIDUpCnN1bSh4KSAgCm1lYW4oeCkKbWluKHgpCm1heCh4KQptZWRpYW4oeCkKc2QoeCkKdmFyKHgpCmBgYAoKIyMgQ29tYmluaW5nCgpUbyBjb21iaW5lIHR3byBvciBtb3JlIHZlY3RvcnMgaW50byBhIHNpbmdsZSB2ZWN0b3IsIHdlIGNhbiB1c2UgdGhlICdjKCknIGZ1bmN0aW9uLiAKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMykKeSA8LSBjKDQsIDUsIDYpCnogPC0gYyh4LCB5KSAgIyBjb21iaW5lcyB4IGFuZCB5IGludG8gYSBzaW5nbGUgdmVjdG9yOiAxLCAyLCAzLCA0LCA1LCA2CnoKYGBgCgojIyBDaGVja2luZyBmb3IgTWVtYmVyc2hpcAoKVG8gY2hlY2sgaWYgYSB2ZWN0b3IgY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQsIHdlIGNhbiB1c2UgdGhlICVpbiUgb3BlcmF0b3IuIEZvciBleGFtcGxlLCB0byBjaGVjayBpZiB4IGNvbnRhaW5zIHRoZSB2YWx1ZSAzOgoKYGBge3J9CnggPC0gYygxLCAyLCAzLCA0LCA1KQozICVpbiUgeCAgIyByZXR1cm5zIFRSVUUgYmVjYXVzZSB4IGNvbnRhaW5zIHRoZSB2YWx1ZSAzCjYgJWluJSB4ICAjIHJldHVybnMgRkFMU0UgYmVjYXVzZSB4IGRvZXNuJ3QgY29udGFpbiB0aGUgdmFsdWUgNgpgYGAKCiMgU3VtbWFyeQoKT3ZlcmFsbCwgdmVjdG9ycyBhcmUgYSBwb3dlcmZ1bCB0b29sIGluIFIgZm9yIHN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyBjb2xsZWN0aW9ucyBvZiB2YWx1ZXMsIGFuZCB0aGV5IHBsYXkgYSBjcml0aWNhbCByb2xlIGluIG1hbnkgc3RhdGlzdGljYWwgYW5kIGRhdGEgYW5hbHlzaXMgdGFza3MuCg==