Vector Element Names

The elements of a vector can optionally be given names. For example, say we have a 50-element vector showing the population of each state in the United States. We could name each element according to its state name, such as “Montana” and “New Jersey”. This in turn might lead to naming points in plots, and so on.

names(x)
NULL

MY EXERCISE 1

Since there is no columns header the output of names(x) is NULL

names(x1)
NULL

Creating the column names (headers)

names(x1) <- c("Gustav","Marian","Joseph")
names(x1)
[1] "Gustav" "Marian" "Joseph"

Finally the output of x1 is a matrix of 2 rows and 3 columns, in which first row values are the headers.

x1
Gustav Marian Joseph 
     3      7     12 

It is possible to delete the column headers using NULL.

names(x1) <- NULL
x1
[1]  3  7 12

In order to see which is the value of a variable (Marian in this case), is possible to reference elements of the vector by the name.

x1 <- c(3,7,12)
names(x1) <- c("Gustav","Marian","Joseph")
x1["Marian"]
Marian 
     7 

EXAMPLE EXERCISE 1

We can assign or query vector element names via the names() function:

names(x)
[1] "a"  "b"  "ab"
x
 a  b ab 
 1  2  4 

We can remove the names from a vector by assigning NULL:

x
[1] 1 2 4

We can even reference elements of the vector by name:

x["b"]
b 
2 

MATRICES AND ARRAYS

A matrix is a vector with two additional attributes: the number of rows and the number of columns. Since matrices are vectors, they also have modes, such as numeric and character.

Creating Matrices

y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
y
     [,1] [,2]
[1,]    1    3
[2,]    2    4

MY EXERCISE 2 (MATRIX)

#Please create a matrix y1 and follow the steps below
y1 <- matrix(c(3,27,8,15),nrow=2, ncol=2)
y1
     [,1] [,2]
[1,]    3    8
[2,]   27   15

It is not necessary to to specify ncol and nrow, just ncol or nrow. Since there 4 elements and 2 row, with 2 columns should be enough.

y1
     [,1] [,2]
[1,]    3    8
[2,]   27   15

As could be seen in the output above, the notation for columns is [,x] and for rows [x,]. So in this example it is selected the column 1.

y1[,1]
[1]  3 27

A matrix could be created without values and them introduce the values. In this example the structure of a 2x2 matrix is created

y1
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA

Then values are introduced

y1[1,1] <- 3
y1[2,1] <- 27
y1[1,2] <- 8
y1[2,2] <- 15 
y1
     [,1] [,2]
[1,]    3    8
[2,]   27   15

EXAMPLE EXERCISE 2 (MATRIX)

Since we specified the matrix entries in the preceding example, and there were four of them, we did not need to specify both ncol and nrow; just nrow or ncol would have been enough. Having four elements in all, in two rows, implies two columns:

y <- matrix(c(1,2,3,4),nrow=2)
y
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Note that when we then print out y, R shows us its notation for rows and columns. For instance, [,2] means the entirety of column 2, as can be seen in this check:

y[,2]
[1] 3 4

Another way to build y is to specify elements individually:

y
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
y
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Note that we do need to warn R ahead of time that y will be a matrix and give the number of rows and columns.

Though internal storage of a matrix is in column-major order, you can set the byrow argument in matrix() to true to indicate that the data is coming in row-major order. Here’s an example of using byrow:

m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

MY EXERCISE 3 (MATRIX_2)

Using byrow the data is coming in row-major order. In this example for 2 rows the output has 3 columns, for 3 rows 2 columns and for 6 rows 1 column.

m
     [,1] [,2] [,3]
[1,]    3    6    7
[2,]    4    5   13

EXAMPLE EXERCISE 3 (MATRIX_2)

General Matrix Operations

Performing Linear Algebra Operations on Matrices

You can perform various linear algebra operations on matrices, such as matrix multiplication, matrix scalar multiplication, and matrix addition. Using y from the preceding example, here is how to perform those three operations:

y %*% y # mathematical matrix multiplication
3*y # mathematical multiplication of matrix by scalar
y+y # mathematical matrix addition

MY EXERCISE 3 (MATRIX_2)

#Perform the operations shown above using y1

General Matrix Operations Performing linear algebra operations on matrices Using the created matrix y1.

y1 %*% y1 # matrix y1 times matrix y1. Matrix y1 multiplicated by itself.
     [,1] [,2]
[1,]  225  144
[2,]  486  441
4*y1 # Multiplication of a escalar number times a matrix.
     [,1] [,2]
[1,]   12   32
[2,]  108   60
y1 + y1 #Sum of matrix.
     [,1] [,2]
[1,]    6   16
[2,]   54   30

EXAMPLE EXERCISE 4 (MATRIX_3)

Matrix Indexing

Let us say that we have a matrix z:

z <- matrix(nrow=4,ncol=3)
z[1,1] <- 1
z[2,1] <- 2
z[1,2] <- 1
z[2,2] <- 1
z[3,1] <- 3
z[3,2] <- 0
z[3,3] <- 1
z[1,3] <- 1
z[2,3] <- 0
z[4,1] <- 4
z[4,2] <- 0
z[4,3] <- 0
z
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    1    0
[3,]    3    0    1
[4,]    4    0    0

Let us obtain the submatrix of z consisting of all elements with column numbers 2 and 3 and any row number. This extracts the second and third columns.

z[,2:3]
     [,1] [,2]
[1,]    1    1
[2,]    1    0
[3,]    0    1
[4,]    0    0

Let us now extract rows instead of columns.

z[3:4,]
     [,1] [,2] [,3]
[1,]    3    0    1
[2,]    4    0    0
y
y[2:1,]

MY EXERCISE 4 (MATRIX_3)

#Create amatrix z1 and recreate a similar case scenario.
z1 <- matrix(nrow=4,ncol=3)
z1[1,1] <- 3
z1[2,1] <- 0
z1[1,2] <- 1
z1[2,2] <- 2
z1[3,1] <- 2
z1[3,2] <- 1
z1[3,3] <- 0
z1[1,3] <- 0
z1[2,3] <- 3
z1[4,1] <- 2
z1[4,2] <- 4
z1[4,3] <- 0

Lets output matrix z1

z1
     [,1] [,2] [,3]
[1,]    3    1    0
[2,]    0    2    3
[3,]    2    1    0
[4,]    2    4    0

In this example, columns between 2 and 3 are the output.

z1[,2:3]
     [,1] [,2]
[1,]    1    0
[2,]    2    3
[3,]    1    0
[4,]    4    0

Rows between 2 and 4, both included, are the output.

z1[2:4,]
     [,1] [,2] [,3]
[1,]    0    2    3
[2,]    2    1    0
[3,]    2    4    0

Adding and Deleting Matrix Rows and Columns Technically, matrices are of fixed length and dimensions, so we cannot add or delete rows or columns. However, matrices can be reassigned, and thus we can achieve the same effect as if we had directly done additions or deletions.

Changing the Size of a Matrix

Creating a vector called x

x
[1]  1 12  5 13 16  8

Add variable 20 to the vector

x
[1]  1 12  5 13 16  8 20

In order to introduce number 20 in the exact position desired of the vector.

x
[1]  1 12  5 20 13 16  8

Deleting values from column 2 to 4, both included.

x
[1]  1 13 16  8

Analogous operations can be used to change the size of a matrix. For instance, the rbind() (row bind) and cbind() (column bind) functions let you add rows or columns to a matrix.

Creating a vector of 4 columns with value 1 in each column

one<-c(1,1,1,1)
one
[1] 1 1 1 1

Matrix have been defined before.

z
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    1    0
[3,]    3    0    1
[4,]    4    0    0

Combining vector “one” with matrix z, using function cbind(). Creating a matrix of 4 columns and rows, in which first column is the vector “one”

cbind(one,z)
     one      
[1,]   1 1 1 1
[2,]   1 2 1 0
[3,]   1 3 0 1
[4,]   1 4 0 0

Here, cbind() creates a new matrix by combining a column of 1s with the columns of z. We choose to get a quick printout, but we could have assigned the result to z (or another variable), as follows:

Combining vector “one” with matrix z, using function cbind(). Creating a matrix of 4 columns and rows, in which last column is the vector “one”

cbind(z,one)
           one
[1,] 1 1 1   1
[2,] 2 1 0   1
[3,] 3 0 1   1
[4,] 4 0 0   1

Changing the value of matrix z for the matrix have been created below.

Note, too, that we could have relied on recycling: Adding value 1 to the new matrix z. Which have 5 columns and 4 rows. First row is filled with ones.

cbind(1,z)
       one      
[1,] 1   1 1 1 1
[2,] 1   1 2 1 0
[3,] 1   1 3 0 1
[4,] 1   1 4 0 0

You can also use the rbind() and cbind() functions as a quick way to create small matrices. Here’s an example:

Using cbind to create a matrix.

q
     [,1] [,2]
[1,]    1    3
[2,]    2    4

You can delete rows or columns by reassignment, too:

Example of how to create a matrix with values from 1 to 6 and that have 3 rows.

m
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

Output the rows number 1 and 3 of the matrix m

m <- m[c(1,3),]
m
     [,1] [,2]
[1,]    1    4
[2,]    3    6
LS0tDQp0aXRsZTogIkxlY3R1cmUgNDogSW4tY2xhc3MgYWN0aXZpdHlfNiINCmF1dGhvcjogIlJhdWwgUm9jZXMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoqKlZlY3RvciBFbGVtZW50IE5hbWVzKioNCg0KVGhlIGVsZW1lbnRzIG9mIGEgdmVjdG9yIGNhbiBvcHRpb25hbGx5IGJlIGdpdmVuIG5hbWVzLiBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSA1MC1lbGVtZW50IHZlY3RvciBzaG93aW5nIHRoZSBwb3B1bGF0aW9uIG9mIGVhY2ggc3RhdGUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFdlIGNvdWxkIG5hbWUgZWFjaCBlbGVtZW50IGFjY29yZGluZyB0byBpdHMgc3RhdGUgbmFtZSwgc3VjaCBhcyAiTW9udGFuYSIgYW5kICJOZXcgSmVyc2V5Ii4gVGhpcyBpbiB0dXJuIG1pZ2h0IGxlYWQgdG8gbmFtaW5nIHBvaW50cyBpbiBwbG90cywgYW5kIHNvIG9uLg0KDQpgYGB7cn0NCnggPC0gYygxLDIsNCkNCm5hbWVzKHgpDQpgYGANCg0KIyMgTVkgRVhFUkNJU0UgMQ0KU2luY2UgdGhlcmUgaXMgbm8gY29sdW1ucyBoZWFkZXIgdGhlIG91dHB1dCBvZiBuYW1lcyh4KSBpcyBOVUxMDQpgYGB7cn0NCiMgUGxlYXNlIGNyZWF0ZSBhIHZlY3RvciB4MSBhbmQgZm9sbG93IHRoZSBzdGVwcyBvZiB0aGlzIGV4ZXJjaXNlLg0KeDEgPC0gYygzLDcsMTIpDQpuYW1lcyh4MSkNCmBgYA0KQ3JlYXRpbmcgdGhlIGNvbHVtbiBuYW1lcyAoaGVhZGVycykNCmBgYHtyfQ0KbmFtZXMoeDEpIDwtIGMoIkd1c3RhdiIsIk1hcmlhbiIsIkpvc2VwaCIpDQpuYW1lcyh4MSkNCmBgYA0KDQpGaW5hbGx5IHRoZSBvdXRwdXQgb2YgeDEgaXMgYSBtYXRyaXggb2YgMiByb3dzIGFuZCAzIGNvbHVtbnMsIGluIHdoaWNoIGZpcnN0IHJvdyB2YWx1ZXMgYXJlIHRoZSBoZWFkZXJzLg0KYGBge3J9DQp4MQ0KYGBgDQpJdCBpcyBwb3NzaWJsZSB0byBkZWxldGUgdGhlIGNvbHVtbiBoZWFkZXJzIHVzaW5nIE5VTEwuDQpgYGB7cn0NCm5hbWVzKHgxKSA8LSBOVUxMDQp4MQ0KYGBgDQpJbiBvcmRlciB0byBzZWUgd2hpY2ggaXMgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgKE1hcmlhbiBpbiB0aGlzIGNhc2UpLCBpcyBwb3NzaWJsZSB0byByZWZlcmVuY2UgZWxlbWVudHMgb2YgdGhlIHZlY3RvciBieSB0aGUgbmFtZS4NCmBgYHtyfQ0KeDEgPC0gYygzLDcsMTIpDQpuYW1lcyh4MSkgPC0gYygiR3VzdGF2IiwiTWFyaWFuIiwiSm9zZXBoIikNCngxWyJNYXJpYW4iXQ0KYGBgDQoNCg0KDQoNCiMjIEVYQU1QTEUgRVhFUkNJU0UgMQ0KV2UgY2FuIGFzc2lnbiBvciBxdWVyeSB2ZWN0b3IgZWxlbWVudCBuYW1lcyB2aWEgdGhlIG5hbWVzKCkgZnVuY3Rpb246DQoNCmBgYHtyfQ0KbmFtZXMoeCkgPC0gYygiYSIsImIiLCJhYiIpDQpuYW1lcyh4KQ0KYGBgDQoNCg0KYGBge3J9DQp4DQpgYGANCg0KV2UgY2FuIHJlbW92ZSB0aGUgbmFtZXMgZnJvbSBhIHZlY3RvciBieSBhc3NpZ25pbmcgTlVMTDoNCg0KYGBge3J9DQpuYW1lcyh4KSA8LSBOVUxMDQp4DQpgYGANCg0KV2UgY2FuIGV2ZW4gcmVmZXJlbmNlIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IgYnkgbmFtZToNCg0KYGBge3J9DQp4IDwtIGMoMSwyLDQpDQpuYW1lcyh4KSA8LSBjKCJhIiwiYiIsImFiIikNCnhbImIiXQ0KYGBgDQoNCg0KDQoqKk1BVFJJQ0VTIEFORCBBUlJBWVMqKg0KDQpBIG1hdHJpeCBpcyBhIHZlY3RvciB3aXRoIHR3byBhZGRpdGlvbmFsIGF0dHJpYnV0ZXM6IHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zLiBTaW5jZSBtYXRyaWNlcyBhcmUgdmVjdG9ycywNCnRoZXkgYWxzbyBoYXZlIG1vZGVzLCBzdWNoIGFzIG51bWVyaWMgYW5kIGNoYXJhY3Rlci4NCg0KKipDcmVhdGluZyBNYXRyaWNlcyoqDQoNCg0KYGBge3J9DQp5PC1tYXRyaXgoYygxLDIsMyw0KSxucm93PTIsbmNvbD0yKQ0KeQ0KYGBgDQoNCiMjIE1ZIEVYRVJDSVNFIDIgKE1BVFJJWCkNCg0KYGBge3J9DQojUGxlYXNlIGNyZWF0ZSBhIG1hdHJpeCB5MSBhbmQgZm9sbG93IHRoZSBzdGVwcyBiZWxvdw0KeTEgPC0gbWF0cml4KGMoMywyNyw4LDE1KSxucm93PTIsIG5jb2w9MikNCnkxDQpgYGANCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdG8gc3BlY2lmeSBuY29sIGFuZCBucm93LCBqdXN0IG5jb2wgb3IgbnJvdy4gU2luY2UgdGhlcmUgNCBlbGVtZW50cyBhbmQgMiByb3csIHdpdGggMiBjb2x1bW5zIHNob3VsZCBiZSBlbm91Z2guDQpgYGB7cn0NCnkxPC1tYXRyaXgoYygzLDI3LDgsMTUpLG5yb3c9MikNCnkxDQpgYGANCkFzIGNvdWxkIGJlIHNlZW4gaW4gdGhlIG91dHB1dCBhYm92ZSwgdGhlIG5vdGF0aW9uIGZvciBjb2x1bW5zIGlzIFsseF0gYW5kIGZvciByb3dzIFt4LF0uIFNvIGluIHRoaXMgZXhhbXBsZSBpdCBpcyBzZWxlY3RlZCB0aGUgY29sdW1uIDEuDQpgYGB7cn0NCnkxWywxXQ0KYGBgDQpBIG1hdHJpeCBjb3VsZCBiZSBjcmVhdGVkIHdpdGhvdXQgdmFsdWVzIGFuZCB0aGVtIGludHJvZHVjZSB0aGUgdmFsdWVzLiBJbiB0aGlzIGV4YW1wbGUgdGhlIHN0cnVjdHVyZSBvZiBhIDJ4MiBtYXRyaXggaXMgY3JlYXRlZA0KYGBge3J9DQp5MSA8LSBtYXRyaXgobnJvdz0yLG5jb2w9MikNCnkxDQpgYGANClRoZW4gdmFsdWVzIGFyZSBpbnRyb2R1Y2VkDQpgYGB7cn0NCnkxWzEsMV0gPC0gMw0KeTFbMiwxXSA8LSAyNw0KeTFbMSwyXSA8LSA4DQp5MVsyLDJdIDwtIDE1IA0KeTENCmBgYA0KDQoNCg0KIyMgRVhBTVBMRSBFWEVSQ0lTRSAyIChNQVRSSVgpDQoNClNpbmNlIHdlIHNwZWNpZmllZCB0aGUgbWF0cml4IGVudHJpZXMgaW4gdGhlIHByZWNlZGluZyBleGFtcGxlLCBhbmQgdGhlcmUgd2VyZSBmb3VyIG9mIHRoZW0sIHdlIGRpZCBub3QgbmVlZCB0byBzcGVjaWZ5IGJvdGggbmNvbCBhbmQgbnJvdzsganVzdCBucm93IG9yIG5jb2wgd291bGQgaGF2ZSBiZWVuIGVub3VnaC4gSGF2aW5nIGZvdXIgZWxlbWVudHMgaW4gYWxsLCBpbiB0d28gcm93cywgaW1wbGllcyB0d28gY29sdW1uczoNCg0KYGBge3J9DQp5IDwtIG1hdHJpeChjKDEsMiwzLDQpLG5yb3c9MikNCnkNCmBgYA0KDQoNCk5vdGUgdGhhdCB3aGVuIHdlIHRoZW4gcHJpbnQgb3V0IHksIFIgc2hvd3MgdXMgaXRzIG5vdGF0aW9uIGZvciByb3dzIGFuZCBjb2x1bW5zLiBGb3IgaW5zdGFuY2UsIFssMl0gbWVhbnMgdGhlIGVudGlyZXR5IG9mIGNvbHVtbiAyLCBhcyBjYW4gYmUgc2VlbiBpbiB0aGlzIGNoZWNrOg0KDQpgYGB7cn0NCnlbLDJdDQpgYGANCg0KQW5vdGhlciB3YXkgdG8gYnVpbGQgeSBpcyB0byBzcGVjaWZ5IGVsZW1lbnRzIGluZGl2aWR1YWxseToNCg0KDQpgYGB7cn0NCnkgPC0gbWF0cml4KG5yb3c9MixuY29sPTIpDQp5DQpgYGANCg0KDQpgYGB7cn0NCnlbMSwxXSA8LSAxDQp5WzIsMV0gPC0gMg0KeVsxLDJdIDwtIDMNCnlbMiwyXSA8LSA0IA0KeQ0KYGBgDQoNCg0KTm90ZSB0aGF0IHdlIGRvIG5lZWQgdG8gd2FybiBSIGFoZWFkIG9mIHRpbWUgdGhhdCB5IHdpbGwgYmUgYSBtYXRyaXggYW5kIGdpdmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zLg0KDQpUaG91Z2ggaW50ZXJuYWwgc3RvcmFnZSBvZiBhIG1hdHJpeCBpcyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIsIHlvdSBjYW4gc2V0IHRoZSBieXJvdyBhcmd1bWVudCBpbiBtYXRyaXgoKSB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaXMgY29taW5nIGluIHJvdy1tYWpvciBvcmRlci4gSGVyZeKAmXMgYW4gZXhhbXBsZSBvZiB1c2luZyBieXJvdzoNCg0KYGBge3J9DQptIDwtIG1hdHJpeChjKDEsMiwzLDQsNSw2KSxucm93PTIsYnlyb3c9VCkNCm0NCmBgYA0KIyMgTVkgRVhFUkNJU0UgMyAoTUFUUklYXzIpDQoNClVzaW5nIGJ5cm93IHRoZSBkYXRhIGlzIGNvbWluZyBpbiByb3ctbWFqb3Igb3JkZXIuIEluIHRoaXMgZXhhbXBsZSBmb3IgMiByb3dzIHRoZSBvdXRwdXQgaGFzIDMgY29sdW1ucywgZm9yIDMgcm93cyAyIGNvbHVtbnMgYW5kIGZvciA2IHJvd3MgMSBjb2x1bW4uDQpgYGB7cn0NCiNDcmVhdGUgYSBtYXRyaXggbTEgYW5kIHJlY3JlYXRlIGEgc2ltaWxhciBjYXNlIHNjZW5hcmlvIHRvIHRoZSBvbmUgYWJvdmUuDQptMSA8LSBtYXRyaXgoYygzLDYsNyw0LDUsMTMpLG5yb3c9MixieXJvdz1UKQ0KbTENCg0KYGBgDQoNCg0KIyMgRVhBTVBMRSBFWEVSQ0lTRSAzIChNQVRSSVhfMikNCg0KKipHZW5lcmFsIE1hdHJpeCBPcGVyYXRpb25zKioNCg0KUGVyZm9ybWluZyBMaW5lYXIgQWxnZWJyYSBPcGVyYXRpb25zIG9uIE1hdHJpY2VzDQoNCllvdSBjYW4gcGVyZm9ybSB2YXJpb3VzIGxpbmVhciBhbGdlYnJhIG9wZXJhdGlvbnMgb24gbWF0cmljZXMsIHN1Y2ggYXMgbWF0cml4IG11bHRpcGxpY2F0aW9uLCBtYXRyaXggc2NhbGFyIG11bHRpcGxpY2F0aW9uLCBhbmQgbWF0cml4IGFkZGl0aW9uLiBVc2luZyB5IGZyb20gdGhlIHByZWNlZGluZyBleGFtcGxlLCBoZXJlIGlzIGhvdyB0byBwZXJmb3JtIHRob3NlIHRocmVlIG9wZXJhdGlvbnM6DQoNCmBgYHtyfQ0KeSAlKiUgeSAjIG1hdGhlbWF0aWNhbCBtYXRyaXggbXVsdGlwbGljYXRpb24NCmBgYA0KDQpgYGB7cn0NCjMqeSAjIG1hdGhlbWF0aWNhbCBtdWx0aXBsaWNhdGlvbiBvZiBtYXRyaXggYnkgc2NhbGFyDQpgYGANCg0KDQoNCmBgYHtyfQ0KeSt5ICMgbWF0aGVtYXRpY2FsIG1hdHJpeCBhZGRpdGlvbg0KYGBgDQoNCiMjIE1ZIEVYRVJDSVNFIDMgKE1BVFJJWF8yKQ0KDQpgYGB7cn0NCiNQZXJmb3JtIHRoZSBvcGVyYXRpb25zIHNob3duIGFib3ZlIHVzaW5nIHkxDQpgYGANCg0KKipHZW5lcmFsIE1hdHJpeCBPcGVyYXRpb25zKioNClBlcmZvcm1pbmcgbGluZWFyIGFsZ2VicmEgb3BlcmF0aW9ucyBvbiBtYXRyaWNlcw0KVXNpbmcgdGhlIGNyZWF0ZWQgbWF0cml4IHkxLg0KDQpgYGB7cn0NCnkxICUqJSB5MSAjIG1hdHJpeCB5MSB0aW1lcyBtYXRyaXggeTEuIE1hdHJpeCB5MSBtdWx0aXBsaWNhdGVkIGJ5IGl0c2VsZi4NCmBgYA0KDQpgYGB7cn0NCjQqeTEgIyBNdWx0aXBsaWNhdGlvbiBvZiBhIGVzY2FsYXIgbnVtYmVyIHRpbWVzIGEgbWF0cml4Lg0KYGBgDQoNCmBgYHtyfQ0KeTEgKyB5MSAjU3VtIG9mIG1hdHJpeC4NCmBgYA0KDQojIyBFWEFNUExFIEVYRVJDSVNFIDQgKE1BVFJJWF8zKQ0KDQoqKk1hdHJpeCBJbmRleGluZyoqDQoNCkxldCB1cyBzYXkgdGhhdCB3ZSBoYXZlIGEgbWF0cml4IHo6DQoNCmBgYHtyfQ0KeiA8LSBtYXRyaXgobnJvdz00LG5jb2w9MykNCnpbMSwxXSA8LSAxDQp6WzIsMV0gPC0gMg0KelsxLDJdIDwtIDENCnpbMiwyXSA8LSAxDQp6WzMsMV0gPC0gMw0KelszLDJdIDwtIDANCnpbMywzXSA8LSAxDQp6WzEsM10gPC0gMQ0KelsyLDNdIDwtIDANCnpbNCwxXSA8LSA0DQp6WzQsMl0gPC0gMA0Kels0LDNdIDwtIDANCmBgYA0KDQoNCmBgYHtyfQ0Keg0KYGBgDQoNCkxldCB1cyBvYnRhaW4gdGhlIHN1Ym1hdHJpeCBvZiB6IGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIHdpdGggY29sdW1uIG51bWJlcnMgMiBhbmQgMyBhbmQgYW55IHJvdyBudW1iZXIuIFRoaXMgZXh0cmFjdHMgdGhlIHNlY29uZCBhbmQgdGhpcmQgY29sdW1ucy4NCg0KYGBge3J9DQp6WywyOjNdDQpgYGANCkxldCB1cyBub3cgZXh0cmFjdCByb3dzIGluc3RlYWQgb2YgY29sdW1ucy4NCg0KYGBge3J9DQp6WzM6NCxdDQpgYGANCg0KYGBge3J9DQp5DQpgYGANCg0KDQpgYGB7cn0NCnlbMjoxLF0NCmBgYA0KDQojIyBNWSBFWEVSQ0lTRSA0IChNQVRSSVhfMykNCmBgYHtyfQ0KI0NyZWF0ZSBhbWF0cml4IHoxIGFuZCByZWNyZWF0ZSBhIHNpbWlsYXIgY2FzZSBzY2VuYXJpby4NCg0KejEgPC0gbWF0cml4KG5yb3c9NCxuY29sPTMpDQp6MVsxLDFdIDwtIDMNCnoxWzIsMV0gPC0gMA0KejFbMSwyXSA8LSAxDQp6MVsyLDJdIDwtIDINCnoxWzMsMV0gPC0gMg0KejFbMywyXSA8LSAxDQp6MVszLDNdIDwtIDANCnoxWzEsM10gPC0gMA0KejFbMiwzXSA8LSAzDQp6MVs0LDFdIDwtIDINCnoxWzQsMl0gPC0gNA0KejFbNCwzXSA8LSAwDQpgYGANCg0KTGV0cyBvdXRwdXQgbWF0cml4IHoxDQpgYGB7cn0NCnoxDQpgYGANCg0KSW4gdGhpcyBleGFtcGxlLCBjb2x1bW5zIGJldHdlZW4gMiBhbmQgMyBhcmUgdGhlIG91dHB1dC4NCmBgYHtyfQ0KejFbLDI6M10NCmBgYA0KUm93cyBiZXR3ZWVuIDIgYW5kIDQsIGJvdGggaW5jbHVkZWQsIGFyZSB0aGUgb3V0cHV0Lg0KYGBge3J9DQp6MVsyOjQsXQ0KYGBgDQoNCg0KDQoqKkFkZGluZyBhbmQgRGVsZXRpbmcgTWF0cml4IFJvd3MgYW5kIENvbHVtbnMqKg0KVGVjaG5pY2FsbHksIG1hdHJpY2VzIGFyZSBvZiBmaXhlZCBsZW5ndGggYW5kIGRpbWVuc2lvbnMsIHNvIHdlIGNhbm5vdCBhZGQgb3IgZGVsZXRlIHJvd3Mgb3IgY29sdW1ucy4gSG93ZXZlciwgbWF0cmljZXMgY2FuIGJlIHJlYXNzaWduZWQsIGFuZCB0aHVzIHdlIGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiB3ZSBoYWQgZGlyZWN0bHkgZG9uZSBhZGRpdGlvbnMgb3IgZGVsZXRpb25zLg0KDQpDaGFuZ2luZyB0aGUgU2l6ZSBvZiBhIE1hdHJpeA0KDQpDcmVhdGluZyBhIHZlY3RvciBjYWxsZWQgeCANCmBgYHtyfQ0KeDwtYygxLDEyLDUsMTMsMTYsOCkNCngNCmBgYA0KDQpBZGQgdmFyaWFibGUgMjAgdG8gdGhlIHZlY3Rvcg0KYGBge3J9DQp4IDwtIGMoeCwyMCkgIyBhcHBlbmQgMjANCngNCmBgYA0KSW4gb3JkZXIgdG8gaW50cm9kdWNlIG51bWJlciAyMCBpbiB0aGUgZXhhY3QgcG9zaXRpb24gZGVzaXJlZCBvZiB0aGUgdmVjdG9yLg0KYGBge3J9DQp4IDwtIGMoeFsxOjNdLDIwLHhbNDo2XSkgIyBpbnNlcnQgMjANCngNCmBgYA0KRGVsZXRpbmcgdmFsdWVzIGZyb20gY29sdW1uIDIgdG8gNCwgYm90aCBpbmNsdWRlZC4NCmBgYHtyfQ0KeCA8LSB4Wy0yOi00XSAjIGRlbGV0ZSBlbGVtZW50cyAyIHRocm91Z2ggNA0KeA0KYGBgDQoNCkFuYWxvZ291cyBvcGVyYXRpb25zIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiBhIG1hdHJpeC4gRm9yIGluc3RhbmNlLCB0aGUgcmJpbmQoKSAocm93IGJpbmQpIGFuZCBjYmluZCgpIChjb2x1bW4gYmluZCkgZnVuY3Rpb25zIGxldCB5b3UgYWRkIHJvd3Mgb3IgY29sdW1ucyB0byBhIG1hdHJpeC4NCg0KDQpDcmVhdGluZyBhIHZlY3RvciBvZiA0IGNvbHVtbnMgd2l0aCB2YWx1ZSAxIGluIGVhY2ggY29sdW1uDQpgYGB7cn0NCm9uZTwtYygxLDEsMSwxKQ0Kb25lDQpgYGANCk1hdHJpeCBoYXZlIGJlZW4gZGVmaW5lZCBiZWZvcmUuDQpgYGB7cn0NCnoNCmBgYA0KQ29tYmluaW5nIHZlY3RvciAib25lIiB3aXRoIG1hdHJpeCB6LCB1c2luZyBmdW5jdGlvbiBjYmluZCgpLiBDcmVhdGluZyBhIG1hdHJpeCBvZiA0IGNvbHVtbnMgYW5kIHJvd3MsIGluIHdoaWNoIGZpcnN0IGNvbHVtbiBpcyB0aGUgdmVjdG9yICJvbmUiDQpgYGB7cn0NCmNiaW5kKG9uZSx6KQ0KYGBgDQoNCkhlcmUsIGNiaW5kKCkgY3JlYXRlcyBhIG5ldyBtYXRyaXggYnkgY29tYmluaW5nIGEgY29sdW1uIG9mIDFzIHdpdGggdGhlIGNvbHVtbnMgb2Ygei4gV2UgY2hvb3NlIHRvIGdldCBhIHF1aWNrIHByaW50b3V0LCBidXQgd2UgY291bGQgaGF2ZSBhc3NpZ25lZCB0aGUgcmVzdWx0IHRvIHogKG9yIGFub3RoZXIgdmFyaWFibGUpLCBhcyBmb2xsb3dzOg0KDQpDb21iaW5pbmcgdmVjdG9yICJvbmUiIHdpdGggbWF0cml4IHosIHVzaW5nIGZ1bmN0aW9uIGNiaW5kKCkuIENyZWF0aW5nIGEgbWF0cml4IG9mIDQgY29sdW1ucyBhbmQgcm93cywgaW4gd2hpY2ggbGFzdCBjb2x1bW4gaXMgdGhlIHZlY3RvciAib25lIg0KYGBge3J9DQpjYmluZCh6LG9uZSkNCmBgYA0KDQpDaGFuZ2luZyB0aGUgdmFsdWUgb2YgbWF0cml4IHogZm9yIHRoZSBtYXRyaXggaGF2ZSBiZWVuIGNyZWF0ZWQgYmVsb3cuIA0KYGBge3J9DQp6IDwtIGNiaW5kKG9uZSx6KQ0KYGBgDQoNCg0KTm90ZSwgdG9vLCB0aGF0IHdlIGNvdWxkIGhhdmUgcmVsaWVkIG9uIHJlY3ljbGluZzoNCkFkZGluZyB2YWx1ZSAxIHRvIHRoZSBuZXcgbWF0cml4IHouIFdoaWNoIGhhdmUgNSBjb2x1bW5zIGFuZCA0IHJvd3MuIEZpcnN0IHJvdyBpcyBmaWxsZWQgd2l0aCBvbmVzLg0KYGBge3J9DQpjYmluZCgxLHopDQpgYGANCg0KWW91IGNhbiBhbHNvIHVzZSB0aGUgcmJpbmQoKSBhbmQgY2JpbmQoKSBmdW5jdGlvbnMgYXMgYSBxdWljayB3YXkgdG8gY3JlYXRlIHNtYWxsIG1hdHJpY2VzLiBIZXJl4oCZcyBhbiBleGFtcGxlOg0KDQogVXNpbmcgY2JpbmQgdG8gY3JlYXRlIGEgbWF0cml4Lg0KYGBge3J9DQpxIDwtIGNiaW5kKGMoMSwyKSxjKDMsNCkpDQpxDQpgYGANCg0KWW91IGNhbiBkZWxldGUgcm93cyBvciBjb2x1bW5zIGJ5IHJlYXNzaWdubWVudCwgdG9vOg0KDQpFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYSBtYXRyaXggd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDYgYW5kIHRoYXQgaGF2ZSAzIHJvd3MuIA0KYGBge3J9DQptIDwtIG1hdHJpeCgxOjYsbnJvdz0zKQ0KbQ0KYGBgDQoNCk91dHB1dCB0aGUgcm93cyBudW1iZXIgMSBhbmQgMyBvZiB0aGUgbWF0cml4IG0NCmBgYHtyfQ0KbSA8LSBtW2MoMSwzKSxdDQptDQpgYGANCg0K