Data Camp: Introduction to R

Using my own data and examples

Also included information from video: https://youtu.be/p3EC-V9MiWU

Chapter 3 - Matrices

Outline

  • Create matrix from integers:
    • demonstrate the byrow and nrow arguments
    • use data argument to put non-sequential numbers
    • specify number of rows and columns with nrow and ncol
    • specify order in which integers will appear using byrow argument with TRUE or FALSE value *Create matrix from collection of vectors
  • Name matrix rows and columns
  • Create row totals
  • Create column totals
  • Select elements from a matrix
  • Arithentic with matrices

Create matrix of integers to demonstrate the byrow and nrows arguments

Create a matrix containing 6 integers from of odd numbers with 2 and 3 columns Example: matrix_odd <- matrix(data = c(1,3,5,7,9,11), nrow = 2, ncol = 3, byrow=FALSE) The first arguemnt, (data = c(1,3,5,7,9,11) in this example) is the contents of the matrix The second and third arguments define the shape of the matrix, 2 rows and 3 columns in this example. The fourth argument byrow=TRUE or byrow=FALSE determines the order in which the integers will appear

If the number of components of the matrix is not evenly divisible by the number of rows, R will fill the rest of the matrix starting from the first component and give a warning message.

Example 1- How matrix looks when byrow=TRUE

matrix_odd <- matrix(data = c(1,3,5,7,9,11), nrow = 2, ncol = 3, byrow=TRUE)
matrix_odd
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    7    9   11

Example 2 - Shows what happens when byrow=FALSE

matrix_odd <- matrix(data = c(1,3,5,7,9,11), nrow = 2, ncol = 3, byrow=FALSE)
matrix_odd
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    3    7   11

Example 3 - Show what happens when the number of components in the matrix is not evenly divisible by the number of rows.

#Create a matrix of 8 digits with byrow=TRUE

#Number of rows (3) is not evenly divisible by number of digits (8)
matrix(1:8, byrow=TRUE, nrow = 3)
Warning: data length [8] is not a sub-multiple or multiple of the number of rows [3]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    1

Create matrix from collection of vectors

Create vectors which must all be of the same data typeand combine them into a matrix

#Create nutrition vectors with data points for 5 weeks
nutrition_calories <- c(8926, 7768, 9043, 9406, 9640)
nutrition_carbs <- c(1257.6, 1183.5, 1315.3, 1393.5, 1491.7)
nutrition_protien <- c(470.7, 410.8, 416.9, 431.3, 386.1)
nutrition_fat <- c(218.5, 211.8, 282.1, 306.1, 270.3)
# Show contents of vectors
nutrition_calories
nutrition_carbs
nutrition_protien
nutrition_fat

#Combine vectors using the c() function
nutrients_5weeks <- c(nutrition_calories,nutrition_carbs,nutrition_protien,nutrition_fat)

#Create matrix from the combined vectors with a row for each of 5 weeks and the nutrients in columns
nutrients_matrix <-matrix(nutrients_5weeks, byrow=TRUE, nrow = 5)
#Display nutrients_matrix
nutrients_matrix

Name matrix rows

Name the rows of the matrix using rownames(matrix_name)

#Create a vector containing names for the rows
nutrition_weeks <- c("Week 1","Week 2","Week 3","Week 4","Week 5")
#Display nutrition_weeks
nutrition_weeks

#Name the rows of nutrients_matrix with the contents of the nutrition_weeks vector
rownames(nutrients_matrix) <- nutrition_weeks

#Display nutrients_matrix
nutrients_matrix

Name matrix columns Name the columns of the matrix using colnames(matrix_name)

#Create a vector containing names for the columns
nutrient_names <- c("Calories","Carbohydrates","Protein","Fat")
#Display nutrient_names
nutrient_names

#Name the rows of nutrients_matrix with the contents of the nutrition_weeks vector
colnames(nutrients_matrix) <- nutrient_names

#Display nutrients_matrix
nutrients_matrix

Create totals for matrix rows

Add a total column containing the sum of values in the rows of the matrix.

Calculate the total of each row of the matrix using rowsum() and store it in a vector. (The result isn’t useful for our nutrition example.)

#Calculate total nutrients for each week and store result in the week_total_nutrients vector
week_total_nutrients <- rowSums(nutrients_matrix)

#Display totals for rows
week_total_nutrients

Add the vector containing the row totals as a column to the matrix using the cbind() function. Example: new_matrix <- cbind(original_matrix, row_totals_vector)

#Combine nutrients matrix with vector containing row totals
nutrients_rowtot_matrix <- cbind(nutrients_matrix, week_total_nutrients)

#Display new matrix
nutrients_rowtot_matrix 

Create totals for matrix columns

Add a total row containing the sum of values in the columns of the matrix.

Calculate the total of each column of the matrix using colsum() and store it in a vector.

#Calculate total of each nutrient for the 5-week period  and store result in the week_total_nutrients vector
total_each_nutrient <- colSums(nutrients_matrix)

#Display totals for columns
total_each_nutrient

Add the vector containing the column totals as a row to the matrix using the rbind() function. Example: new_matrix <- rbind(original_matrix, cpl_totals_vector)

#Combine nutrients matrix with vector containing row totals
nutrients_coltot_matrix <- rbind(nutrients_matrix, total_each_nutrient)

#Display new matrix
nutrients_coltot_matrix 

Selecting elements from a matrix

Must use square brackets, not parentheses.

Select entire column - When there is no number preceding the comma, all rows are selected for the column indicated by the number following the comma. Example - new_vector <- matrix_name[,3] selects all rows for the 3rd column of the matrix.

#Select column from a matrix and assign it to a vector

#Display nutrients_coltot_matrix
nutrients_coltot_matrix
#Select 1st column of matrix (Calories)
calories_5wks_vector <- nutrients_coltot_matrix[,1]
#Display 1st column
calories_5wks_vector

Select sequential set of rows from a particular column To select a sequential set of rows use a colon between the numbers of the desired rows Example - new_vector <- matrix_name[4:5,2] selects the 4th & 5th rows for the 2nd column of the matrix.

#Select rows 4 & 5 from the 2nd column of a matrix (Calories for weeks 4 & 5)
calories_wks_4_5 <- nutrients_matrix[4:5,2]
#Display result
calories_wks_4_5

Select entire row - When there is no number following the comma, all columns are selected for the row indicated by the number preceding the comma.


#Select row from a matrix and assign it to a vector

#Display nutrients_coltot_matrix
nutrients_rowtot_matrix
week2_vector <- nutrients_rowtot_matrix[2,]
#Display 2nd row
week2_vector

Select sequential rows - To select several rows, put a column between the numbers of the desired rows. Example - new_vector <- matrix_name[3:5,] selects the 3rd, 4th & 5th rows for all columns of the matrix.

#Select rows 3-5 from the matrix (All nutrients for weeks 3-5)
all_nutrients_wks_3_5 <- nutrients_matrix[3:5,]
#Display result
all_nutrients_wks_3_5

Arithmetic With Matrices

Add all nutrients from week 1 and week 2 from nutrients_matrix

#Create 2 matrices to sum
nutrients_wks_1_2 <- nutrients_matrix[1:2,]
nutrients_wks_3_4 <- nutrients_matrix[3:4,]
#Display 2 new matrices
nutrients_wks_1_2 
nutrients_wks_3_4 
#Add matrices to create nutrients_wks_1_4
nutrients_wks_1_4 <- nutrients_wks_1_2 + nutrients_wks_3_4
#Display result of addition
nutrients_wks_1_4

Arithmetic With Matrices

Example 1: Add 100 to elements of a matrix and assigning a name to the resulting matrix. Another option is to just do the calculation and the console will display the result. The example shows adding 200 to the original matrix.

200 + matrix_odd
     [,1] [,2] [,3]
[1,]  201  205  209
[2,]  203  207  211

Example 2 - Multiply two matrices of the same size and shape.

#Create two matrices
 matrix_odd <- matrix(data = c(1,3,5,7), nrow = 2, ncol = 2, byrow=TRUE)
matrix_even <- matrix(data = c(2,4,6,8), nrow = 2, ncol = 2, byrow=TRUE)

#Multiply mattrices
matrix_odd
     [,1] [,2]
[1,]    1    3
[2,]    5    7
matrix_even
     [,1] [,2]
[1,]    2    4
[2,]    6    8
matrix_odd * matrix_even
     [,1] [,2]
[1,]    2   12
[2,]   30   56
LS0tCnRpdGxlOiAiTGVhcm5pbmcgUiAtIE1hdHJpY2VzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCiMgRGF0YSBDYW1wOiBJbnRyb2R1Y3Rpb24gdG8gUgojIyMgVXNpbmcgbXkgb3duIGRhdGEgYW5kIGV4YW1wbGVzCkFsc28gaW5jbHVkZWQgaW5mb3JtYXRpb24gZnJvbSB2aWRlbzogaHR0cHM6Ly95b3V0dS5iZS9wM0VDLVY5TWlXVQoKIyMgQ2hhcHRlciAzIC0gTWF0cmljZXMgCgojIyMgT3V0bGluZQoqIENyZWF0ZSBtYXRyaXggZnJvbSBpbnRlZ2VyczoKICAgLSBkZW1vbnN0cmF0ZSB0aGUgYnlyb3cgYW5kIG5yb3cgYXJndW1lbnRzCiAgIC0gdXNlIGRhdGEgYXJndW1lbnQgdG8gcHV0IG5vbi1zZXF1ZW50aWFsIG51bWJlcnMKICAgLSBzcGVjaWZ5IG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIHdpdGggbnJvdyBhbmQgbmNvbAogICAtIHNwZWNpZnkgb3JkZXIgaW4gd2hpY2ggaW50ZWdlcnMgd2lsbCBhcHBlYXIgdXNpbmcgYnlyb3cgYXJndW1lbnQgd2l0aCBUUlVFIG9yIEZBTFNFIHZhbHVlCipDcmVhdGUgbWF0cml4IGZyb20gY29sbGVjdGlvbiBvZiB2ZWN0b3JzCiogTmFtZSBtYXRyaXggcm93cyBhbmQgY29sdW1ucwoqIENyZWF0ZSByb3cgdG90YWxzCiogQ3JlYXRlIGNvbHVtbiB0b3RhbHMKKiBTZWxlY3QgZWxlbWVudHMgZnJvbSBhIG1hdHJpeAoqIEFyaXRoZW50aWMgd2l0aCBtYXRyaWNlcwoKKkNyZWF0ZSBtYXRyaXggb2YgaW50ZWdlcnMgdG8gZGVtb25zdHJhdGUgdGhlIGJ5cm93IGFuZCBucm93cyBhcmd1bWVudHMqCgpDcmVhdGUgYSBtYXRyaXggY29udGFpbmluZyA2IGludGVnZXJzIGZyb20gb2Ygb2RkIG51bWJlcnMgd2l0aCAyIGFuZCAzIGNvbHVtbnMKICBFeGFtcGxlOiBtYXRyaXhfb2RkIDwtIG1hdHJpeChkYXRhID0gYygxLDMsNSw3LDksMTEpLCBucm93ID0gMiwgbmNvbCA9IDMsIGJ5cm93PUZBTFNFKQpUaGUgZmlyc3QgYXJndWVtbnQsIChkYXRhID0gYygxLDMsNSw3LDksMTEpIGluIHRoaXMgZXhhbXBsZSkgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYXRyaXgKVGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnRzIGRlZmluZSB0aGUgc2hhcGUgb2YgdGhlIG1hdHJpeCwgMiByb3dzIGFuZCAzIGNvbHVtbnMgaW4gdGhpcyBleGFtcGxlLgpUaGUgZm91cnRoIGFyZ3VtZW50IGJ5cm93PVRSVUUgb3IgYnlyb3c9RkFMU0UgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGludGVnZXJzIHdpbGwgYXBwZWFyCgpJZiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIG1hdHJpeCBpcyBub3QgZXZlbmx5IGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHJvd3MsIFIgd2lsbCBmaWxsIHRoZSByZXN0IG9mIHRoZSBtYXRyaXggc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY29tcG9uZW50IGFuZCBnaXZlIGEgd2FybmluZyBtZXNzYWdlLgoKRXhhbXBsZSAxLSBIb3cgbWF0cml4IGxvb2tzIHdoZW4gYnlyb3c9VFJVRQoKYGBge3J9Cm1hdHJpeF9vZGQgPC0gbWF0cml4KGRhdGEgPSBjKDEsMyw1LDcsOSwxMSksIG5yb3cgPSAyLCBuY29sID0gMywgYnlyb3c9VFJVRSkKbWF0cml4X29kZAoKYGBgCgpFeGFtcGxlIDIgLSBTaG93cyB3aGF0IGhhcHBlbnMgd2hlbiBieXJvdz1GQUxTRQpgYGB7cn0KbWF0cml4X29kZCA8LSBtYXRyaXgoZGF0YSA9IGMoMSwzLDUsNyw5LDExKSwgbnJvdyA9IDIsIG5jb2wgPSAzLCBieXJvdz1GQUxTRSkKbWF0cml4X29kZAoKYGBgCgpFeGFtcGxlIDMgLSBTaG93IHdoYXQgaGFwcGVucyB3aGVuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgbWF0cml4IGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2Ygcm93cy4gCmBgYHtyfQojQ3JlYXRlIGEgbWF0cml4IG9mIDggZGlnaXRzIHdpdGggYnlyb3c9VFJVRQoKI051bWJlciBvZiByb3dzICgzKSBpcyBub3QgZXZlbmx5IGRpdmlzaWJsZSBieSBudW1iZXIgb2YgZGlnaXRzICg4KQptYXRyaXgoMTo4LCBieXJvdz1UUlVFLCBucm93ID0gMykKYGBgCgoqQ3JlYXRlIG1hdHJpeCBmcm9tIGNvbGxlY3Rpb24gb2YgdmVjdG9ycyoKCkNyZWF0ZSB2ZWN0b3JzIHdoaWNoIG11c3QgYWxsIGJlIG9mIHRoZSBzYW1lIGRhdGEgdHlwZWFuZCBjb21iaW5lIHRoZW0gaW50byBhIG1hdHJpeApgYGB7cn0KI0NyZWF0ZSBudXRyaXRpb24gdmVjdG9ycyB3aXRoIGRhdGEgcG9pbnRzIGZvciA1IHdlZWtzCm51dHJpdGlvbl9jYWxvcmllcyA8LSBjKDg5MjYsIDc3NjgsIDkwNDMsIDk0MDYsIDk2NDApCm51dHJpdGlvbl9jYXJicyA8LSBjKDEyNTcuNiwgMTE4My41LCAxMzE1LjMsIDEzOTMuNSwgMTQ5MS43KQpudXRyaXRpb25fcHJvdGllbiA8LSBjKDQ3MC43LCA0MTAuOCwgNDE2LjksIDQzMS4zLCAzODYuMSkKbnV0cml0aW9uX2ZhdCA8LSBjKDIxOC41LCAyMTEuOCwgMjgyLjEsIDMwNi4xLCAyNzAuMykKIyBTaG93IGNvbnRlbnRzIG9mIHZlY3RvcnMKbnV0cml0aW9uX2NhbG9yaWVzCm51dHJpdGlvbl9jYXJicwpudXRyaXRpb25fcHJvdGllbgpudXRyaXRpb25fZmF0CgojQ29tYmluZSB2ZWN0b3JzIHVzaW5nIHRoZSBjKCkgZnVuY3Rpb24KbnV0cmllbnRzXzV3ZWVrcyA8LSBjKG51dHJpdGlvbl9jYWxvcmllcyxudXRyaXRpb25fY2FyYnMsbnV0cml0aW9uX3Byb3RpZW4sbnV0cml0aW9uX2ZhdCkKCiNDcmVhdGUgbWF0cml4IGZyb20gdGhlIGNvbWJpbmVkIHZlY3RvcnMgd2l0aCBhIHJvdyBmb3IgZWFjaCBvZiA1IHdlZWtzIGFuZCB0aGUgbnV0cmllbnRzIGluIGNvbHVtbnMKbnV0cmllbnRzX21hdHJpeCA8LW1hdHJpeChudXRyaWVudHNfNXdlZWtzLCBieXJvdz1UUlVFLCBucm93ID0gNSkKI0Rpc3BsYXkgbnV0cmllbnRzX21hdHJpeApudXRyaWVudHNfbWF0cml4CmBgYAoKKk5hbWUgbWF0cml4IHJvd3MqCgpOYW1lIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgcm93bmFtZXMobWF0cml4X25hbWUpCmBgYHtyfQojQ3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgbmFtZXMgZm9yIHRoZSByb3dzCm51dHJpdGlvbl93ZWVrcyA8LSBjKCJXZWVrIDEiLCJXZWVrIDIiLCJXZWVrIDMiLCJXZWVrIDQiLCJXZWVrIDUiKQojRGlzcGxheSBudXRyaXRpb25fd2Vla3MKbnV0cml0aW9uX3dlZWtzCgojTmFtZSB0aGUgcm93cyBvZiBudXRyaWVudHNfbWF0cml4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBudXRyaXRpb25fd2Vla3MgdmVjdG9yCnJvd25hbWVzKG51dHJpZW50c19tYXRyaXgpIDwtIG51dHJpdGlvbl93ZWVrcwoKI0Rpc3BsYXkgbnV0cmllbnRzX21hdHJpeApudXRyaWVudHNfbWF0cml4CgpgYGAKCipOYW1lIG1hdHJpeCBjb2x1bW5zKgpOYW1lIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXggdXNpbmcgY29sbmFtZXMobWF0cml4X25hbWUpCmBgYHtyfQojQ3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgbmFtZXMgZm9yIHRoZSBjb2x1bW5zCm51dHJpZW50X25hbWVzIDwtIGMoIkNhbG9yaWVzIiwiQ2FyYm9oeWRyYXRlcyIsIlByb3RlaW4iLCJGYXQiKQojRGlzcGxheSBudXRyaWVudF9uYW1lcwpudXRyaWVudF9uYW1lcwoKI05hbWUgdGhlIHJvd3Mgb2YgbnV0cmllbnRzX21hdHJpeCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbnV0cml0aW9uX3dlZWtzIHZlY3Rvcgpjb2xuYW1lcyhudXRyaWVudHNfbWF0cml4KSA8LSBudXRyaWVudF9uYW1lcwoKI0Rpc3BsYXkgbnV0cmllbnRzX21hdHJpeApudXRyaWVudHNfbWF0cml4CgpgYGAKCipDcmVhdGUgdG90YWxzIGZvciBtYXRyaXggcm93cyoKCkFkZCBhIHRvdGFsIGNvbHVtbiBjb250YWluaW5nIHRoZSBzdW0gb2YgdmFsdWVzIGluIHRoZSByb3dzIG9mIHRoZSBtYXRyaXguCgpDYWxjdWxhdGUgdGhlIHRvdGFsIG9mIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggdXNpbmcgcm93c3VtKCkgYW5kIHN0b3JlIGl0IGluIGEgdmVjdG9yLiAoVGhlIHJlc3VsdCBpc24ndCB1c2VmdWwgZm9yIG91ciBudXRyaXRpb24gZXhhbXBsZS4pCgpgYGB7cn0KI0NhbGN1bGF0ZSB0b3RhbCBudXRyaWVudHMgZm9yIGVhY2ggd2VlayBhbmQgc3RvcmUgcmVzdWx0IGluIHRoZSB3ZWVrX3RvdGFsX251dHJpZW50cyB2ZWN0b3IKd2Vla190b3RhbF9udXRyaWVudHMgPC0gcm93U3VtcyhudXRyaWVudHNfbWF0cml4KQoKI0Rpc3BsYXkgdG90YWxzIGZvciByb3dzCndlZWtfdG90YWxfbnV0cmllbnRzCgpgYGAKCkFkZCB0aGUgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJvdyB0b3RhbHMgYXMgYSBjb2x1bW4gdG8gdGhlIG1hdHJpeCB1c2luZyB0aGUgY2JpbmQoKSBmdW5jdGlvbi4KRXhhbXBsZTogbmV3X21hdHJpeCA8LSBjYmluZChvcmlnaW5hbF9tYXRyaXgsIHJvd190b3RhbHNfdmVjdG9yKQpgYGB7cn0KI0NvbWJpbmUgbnV0cmllbnRzIG1hdHJpeCB3aXRoIHZlY3RvciBjb250YWluaW5nIHJvdyB0b3RhbHMKbnV0cmllbnRzX3Jvd3RvdF9tYXRyaXggPC0gY2JpbmQobnV0cmllbnRzX21hdHJpeCwgd2Vla190b3RhbF9udXRyaWVudHMpCgojRGlzcGxheSBuZXcgbWF0cml4Cm51dHJpZW50c19yb3d0b3RfbWF0cml4IAoKYGBgCgoqQ3JlYXRlIHRvdGFscyBmb3IgbWF0cml4IGNvbHVtbnMqCgpBZGQgYSB0b3RhbCByb3cgY29udGFpbmluZyB0aGUgc3VtIG9mIHZhbHVlcyBpbiB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4LgoKQ2FsY3VsYXRlIHRoZSB0b3RhbCBvZiBlYWNoIGNvbHVtbiBvZiB0aGUgbWF0cml4IHVzaW5nIGNvbHN1bSgpIGFuZCBzdG9yZSBpdCBpbiBhIHZlY3Rvci4KYGBge3J9CiNDYWxjdWxhdGUgdG90YWwgb2YgZWFjaCBudXRyaWVudCBmb3IgdGhlIDUtd2VlayBwZXJpb2QgIGFuZCBzdG9yZSByZXN1bHQgaW4gdGhlIHdlZWtfdG90YWxfbnV0cmllbnRzIHZlY3Rvcgp0b3RhbF9lYWNoX251dHJpZW50IDwtIGNvbFN1bXMobnV0cmllbnRzX21hdHJpeCkKCiNEaXNwbGF5IHRvdGFscyBmb3IgY29sdW1ucwp0b3RhbF9lYWNoX251dHJpZW50CgpgYGAKCkFkZCB0aGUgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbHVtbiB0b3RhbHMgYXMgYSByb3cgdG8gdGhlIG1hdHJpeCB1c2luZyB0aGUgcmJpbmQoKSBmdW5jdGlvbi4KRXhhbXBsZTogbmV3X21hdHJpeCA8LSByYmluZChvcmlnaW5hbF9tYXRyaXgsIGNwbF90b3RhbHNfdmVjdG9yKQpgYGB7cn0KI0NvbWJpbmUgbnV0cmllbnRzIG1hdHJpeCB3aXRoIHZlY3RvciBjb250YWluaW5nIHJvdyB0b3RhbHMKbnV0cmllbnRzX2NvbHRvdF9tYXRyaXggPC0gcmJpbmQobnV0cmllbnRzX21hdHJpeCwgdG90YWxfZWFjaF9udXRyaWVudCkKCiNEaXNwbGF5IG5ldyBtYXRyaXgKbnV0cmllbnRzX2NvbHRvdF9tYXRyaXggCgpgYGAKCipTZWxlY3RpbmcgZWxlbWVudHMgZnJvbSBhIG1hdHJpeCoKCk11c3QgdXNlIHNxdWFyZSBicmFja2V0cywgbm90IHBhcmVudGhlc2VzLgoKU2VsZWN0IGVudGlyZSBjb2x1bW4KLSBXaGVuIHRoZXJlIGlzIG5vIG51bWJlciBwcmVjZWRpbmcgdGhlIGNvbW1hLCBhbGwgcm93cyBhcmUgc2VsZWN0ZWQgZm9yIHRoZSBjb2x1bW4gaW5kaWNhdGVkIGJ5IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZSBjb21tYS4KRXhhbXBsZSAtIG5ld192ZWN0b3IgPC0gbWF0cml4X25hbWVbLDNdIHNlbGVjdHMgYWxsIHJvd3MgZm9yIHRoZSAzcmQgY29sdW1uIG9mIHRoZSBtYXRyaXguCmBgYHtyfQojU2VsZWN0IGNvbHVtbiBmcm9tIGEgbWF0cml4IGFuZCBhc3NpZ24gaXQgdG8gYSB2ZWN0b3IKCiNEaXNwbGF5IG51dHJpZW50c19jb2x0b3RfbWF0cml4Cm51dHJpZW50c19jb2x0b3RfbWF0cml4CiNTZWxlY3QgMXN0IGNvbHVtbiBvZiBtYXRyaXggKENhbG9yaWVzKQpjYWxvcmllc181d2tzX3ZlY3RvciA8LSBudXRyaWVudHNfY29sdG90X21hdHJpeFssMV0KI0Rpc3BsYXkgMXN0IGNvbHVtbgpjYWxvcmllc181d2tzX3ZlY3RvcgpgYGAKClNlbGVjdCBzZXF1ZW50aWFsIHNldCBvZiByb3dzIGZyb20gYSBwYXJ0aWN1bGFyIGNvbHVtbgpUbyBzZWxlY3QgYSBzZXF1ZW50aWFsIHNldCBvZiByb3dzIHVzZSBhIGNvbG9uIGJldHdlZW4gdGhlIG51bWJlcnMgb2YgdGhlIGRlc2lyZWQgcm93cwpFeGFtcGxlIC0gbmV3X3ZlY3RvciA8LSBtYXRyaXhfbmFtZVs0OjUsMl0gc2VsZWN0cyB0aGUgNHRoICYgNXRoICByb3dzIGZvciB0aGUgMm5kIGNvbHVtbiBvZiB0aGUgbWF0cml4LgpgYGB7cn0KI1NlbGVjdCByb3dzIDQgJiA1IGZyb20gdGhlIDJuZCBjb2x1bW4gb2YgYSBtYXRyaXggKENhbG9yaWVzIGZvciB3ZWVrcyA0ICYgNSkKY2Fsb3JpZXNfd2tzXzRfNSA8LSBudXRyaWVudHNfbWF0cml4WzQ6NSwyXQojRGlzcGxheSByZXN1bHQKY2Fsb3JpZXNfd2tzXzRfNQoKYGBgCgpTZWxlY3QgZW50aXJlIHJvdwotIFdoZW4gdGhlcmUgaXMgbm8gbnVtYmVyIGZvbGxvd2luZyB0aGUgY29tbWEsIGFsbCBjb2x1bW5zIGFyZSBzZWxlY3RlZCBmb3IgdGhlIHJvdyBpbmRpY2F0ZWQgYnkgdGhlIG51bWJlciBwcmVjZWRpbmcgdGhlIGNvbW1hLgpgYGB7cn0KCiNTZWxlY3Qgcm93IGZyb20gYSBtYXRyaXggYW5kIGFzc2lnbiBpdCB0byBhIHZlY3RvcgoKI0Rpc3BsYXkgbnV0cmllbnRzX2NvbHRvdF9tYXRyaXgKbnV0cmllbnRzX3Jvd3RvdF9tYXRyaXgKd2VlazJfdmVjdG9yIDwtIG51dHJpZW50c19yb3d0b3RfbWF0cml4WzIsXQojRGlzcGxheSAybmQgcm93CndlZWsyX3ZlY3RvcgoKYGBgCgpTZWxlY3Qgc2VxdWVudGlhbCByb3dzCi0gVG8gc2VsZWN0IHNldmVyYWwgcm93cywgcHV0IGEgY29sdW1uIGJldHdlZW4gdGhlIG51bWJlcnMgb2YgdGhlIGRlc2lyZWQgcm93cy4KRXhhbXBsZSAtIG5ld192ZWN0b3IgPC0gbWF0cml4X25hbWVbMzo1LF0gc2VsZWN0cyB0aGUgM3JkLCA0dGggJiA1dGggcm93cyBmb3IgYWxsIGNvbHVtbnMgb2YgdGhlIG1hdHJpeC4KYGBge3J9CiNTZWxlY3Qgcm93cyAzLTUgZnJvbSB0aGUgbWF0cml4IChBbGwgbnV0cmllbnRzIGZvciB3ZWVrcyAzLTUpCmFsbF9udXRyaWVudHNfd2tzXzNfNSA8LSBudXRyaWVudHNfbWF0cml4WzM6NSxdCiNEaXNwbGF5IHJlc3VsdAphbGxfbnV0cmllbnRzX3drc18zXzUKCmBgYAoKKkFyaXRobWV0aWMgV2l0aCBNYXRyaWNlcyoKCkFkZCBhbGwgbnV0cmllbnRzIGZyb20gd2VlayAxIGFuZCB3ZWVrIDIgZnJvbSBudXRyaWVudHNfbWF0cml4CmBgYHtyfQojQ3JlYXRlIDIgbWF0cmljZXMgdG8gc3VtCm51dHJpZW50c193a3NfMV8yIDwtIG51dHJpZW50c19tYXRyaXhbMToyLF0KbnV0cmllbnRzX3drc18zXzQgPC0gbnV0cmllbnRzX21hdHJpeFszOjQsXQojRGlzcGxheSAyIG5ldyBtYXRyaWNlcwpudXRyaWVudHNfd2tzXzFfMiAKbnV0cmllbnRzX3drc18zXzQgCiNBZGQgbWF0cmljZXMgdG8gY3JlYXRlIG51dHJpZW50c193a3NfMV80Cm51dHJpZW50c193a3NfMV80IDwtIG51dHJpZW50c193a3NfMV8yICsgbnV0cmllbnRzX3drc18zXzQKI0Rpc3BsYXkgcmVzdWx0IG9mIGFkZGl0aW9uCm51dHJpZW50c193a3NfMV80CmBgYAoKKkFyaXRobWV0aWMgV2l0aCBNYXRyaWNlcyoKCkV4YW1wbGUgMTogQWRkIDEwMCB0byBlbGVtZW50cyBvZiBhIG1hdHJpeCBhbmQgYXNzaWduaW5nIGEgbmFtZSB0byB0aGUgcmVzdWx0aW5nIG1hdHJpeC4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIGp1c3QgZG8gdGhlIGNhbGN1bGF0aW9uIGFuZCB0aGUgY29uc29sZSB3aWxsIGRpc3BsYXkgdGhlIHJlc3VsdC4gVGhlIGV4YW1wbGUgc2hvd3MgYWRkaW5nIDIwMCB0byB0aGUgb3JpZ2luYWwgbWF0cml4LgoKYGBge3J9Cm1hdHJpeF9vZGRfcGx1c18xMDAgPC0gMTAwICsgbWF0cml4X29kZCAKbWF0cml4X29kZF9wbHVzXzEwMAoyMDAgKyBtYXRyaXhfb2RkCgpgYGAKCkV4YW1wbGUgMiAtIE11bHRpcGx5IHR3byBtYXRyaWNlcyBvZiB0aGUgc2FtZSBzaXplIGFuZCBzaGFwZS4KYGBge3J9CiNDcmVhdGUgdHdvIG1hdHJpY2VzCiBtYXRyaXhfb2RkIDwtIG1hdHJpeChkYXRhID0gYygxLDMsNSw3KSwgbnJvdyA9IDIsIG5jb2wgPSAyLCBieXJvdz1UUlVFKQptYXRyaXhfZXZlbiA8LSBtYXRyaXgoZGF0YSA9IGMoMiw0LDYsOCksIG5yb3cgPSAyLCBuY29sID0gMiwgYnlyb3c9VFJVRSkKCiNNdWx0aXBseSBtYXR0cmljZXMKbWF0cml4X29kZAptYXRyaXhfZXZlbgptYXRyaXhfb2RkICogbWF0cml4X2V2ZW4KCgpgYGAKCgo=