Question 01

a) Separation of all the strings from given sequences and storing in a variable “gene_seqs”

DNA = "ATCGATCGATCG-ATCGAT-CGATC-GATCGAT-CGATCG-ATCGATCG-CGATCG"
gene_seqs = strsplit(DNA, "-")
print(gene_seqs)

b) Reversion of all the strings in gene_seqs using loop

gene_seqs = unlist(gene_seqs)   # converting list into vector
is.vector(gene_seqs)  # checking if conversion is successful or not
length(gene_seqs) # checking total number of strings in the sequence  

library(stringi)

for (i in 1:7) {
cat("The reverse of string", i,stri_reverse(gene_seqs[i]), "\n")  
}

c) Calculation of length of each string in gene_seqs using loop

for (i in 1:7) {
cat("Total character in string",i ,"is", nchar(gene_seqs[i]), "\n")
}

d) Using loop and condition

for (i in 1:7) {
if (nchar(gene_seqs[i]) > 7) {
    cat("Character numbers of string", i, "is greater than 7.", "Successful \n", "\n", "\n")
  } else {
    cat("Character numbers of string", i, "is lower than 7.", "Error", "\n", "\n", "\n")
  }
}

e) Finding locations and number of occurrences of pattern “GATC” in each string of gene_seqs

for (i in 1:7) {
pattern = "GATC"
    locations = gregexpr(pattern, gene_seqs[i])
  locations = unlist(locations)
 cat("Location of pattern GATC in the String number",i, "is", locations, "\n")
 num_occ = sum(locations != -1)
 cat("Number of occurences of pattern GATC in string number", i, "is", num_occ, "\n", "\n", "\n")
}
  

Bonus: Solving b to e using a single loop

library(stringi)
for (i in 1:7) {
pattern = "GATC"
    locations = gregexpr(pattern, gene_seqs[i])
  locations = unlist(locations)
 cat("Location of pattern GATC in the String number",i, "is", locations, "\n")
 num_occ = sum(locations != -1)
 cat("Number of occurences of string number", i, "is", num_occ, "\n")
  cat("Total character in string",i ,"is", nchar(gene_seqs[i]), "\n")  
cat("The reverse of string", i,stri_reverse(gene_seqs[i]), "\n")  
  if (nchar(gene_seqs[i]) > 7) {
    cat("Character numbers of string", i, "is greater than 7.", "Successful \n", "\n", "\n")
  } 
  else {
    cat("Character numbers of string", i, "is lower than 7.", "Error", "\n", "\n", "\n")
    
  }
}

Question 02

a) Creation of dataframe and addition of two rows and a “Income” column with numerical values

exam_score = data.frame(
  ID = c(1, 2, 3, 4, 5),
  Name = c("Alice", "Bob", "David", "John", "Jenny"),
  Age = c(20, 25, 30, 22, 18),
  Score = c(100, 78, 90, 55, 81)
)
print(exam_score)

new_row1 = c(6, "Magnus", 25, 99)
new_row2 = c(7, "Hikaru", 24, 96)

Income= c(4500, 4800, 6200, 6500, 7100, 9900, 8500)

exam_score_new = rbind(exam_score, new_row1, new_row2)   # addition of 2 rows
exam_score_ext = cbind(exam_score_new, Income)     # addition of a column
print(exam_score_ext)

exam_score_ext$Age= as.numeric(exam_score_ext$Age)  # conversion into numerical values
exam_score_ext$Score= as.numeric(exam_score_ext$Score)
exam_score_ext$Income= as.numeric(exam_score_ext$Income)

print(exam_score_ext)

b) Arithmetic Operation in Age, Score and Income Column

cat("Max Value of Age", "is",max(exam_score_ext$Age), "\n")
cat("Min Value of Age", "is",min(exam_score_ext$Age), "\n")
cat("Median Value of Age", "is",median(exam_score_ext$Age), "\n")
cat("Summation of Age", "is",sum(exam_score_ext$Age), "\n")
cat("Mean Value of Age", "is",mean(exam_score_ext$Age), "\n")
cat("Standard deviation of Age", "is", sd(exam_score_ext$Age), "\n")
cat("Variance of Age", "is",var(exam_score_ext$Age), "\n")
cat("Quantile Value of Age", "is", quantile(exam_score_ext$Age), "\n", "\n", "\n")



cat("Max Value of Score", "is",max(exam_score_ext$Score), "\n")
cat("Min Value of Score", "is",min(exam_score_ext$Score), "\n")
cat("Median Value of Score", "is",median(exam_score_ext$Score), "\n")
cat("Summation of Score", "is",sum(exam_score_ext$Score), "\n")
cat("Mean Value of Score", "is",mean(exam_score_ext$Score), "\n")
cat("Standard deviation of Score", "is", sd(exam_score_ext$Score), "\n")
cat("Variance of Score", "is",var(exam_score_ext$Score), "\n")
cat("Quantile Value of Score", "is", quantile(exam_score_ext$Score), "\n", "\n", "\n")


cat("Max Value of Income", "is",max(exam_score_ext$Income), "\n")
cat("Min Value of Income", "is",min(exam_score_ext$Income), "\n")
cat("Median Value of Income", "is",median(exam_score_ext$Income), "\n")
cat("Summation of Income", "is",sum(exam_score_ext$Income), "\n")
cat("Mean Value of Income", "is",mean(exam_score_ext$Income), "\n")
cat("Standard deviation of Income", "is", sd(exam_score_ext$Income), "\n")
cat("Variance of Income", "is",var(exam_score_ext$Income), "\n")
cat("Quantile Value of Income", "is", quantile(exam_score_ext$Income), "\n")

b) Arithmetic Operation in Age, Score and Income Column using loop

Here, Column 1,2 and 3 denote Age, Score and Income respectively

x= data.frame(exam_score_ext$Age, exam_score_ext$Score, exam_score_ext$Income)
print(x)
for(i in 1:3){
cat("Max of column",i, "is",max(x[1:7,i]), "\n")
  
cat("Min of column",i, "is",min(x[1:7,i]), "\n")

cat("Median of column",i, "is",median(x[1:7,i]), "\n")
cat("Sum of column",i, "is",sum(x[1:7,i]), "\n")
cat("Mean of column",i, "is",mean(x[1:7,i]), "\n")
cat("Standard deviation of column",i, "is",sd(x[1:7,i]), "\n")
cat("Variance of column",i, "is",var(x[1:7,i]), "\n")
cat("Quantiles of column",i, "is",quantile(x[1:7,i]), "\n","\n","\n")

}

c) Finding Correlation among Age, Score and Income

cat("Correlation between Age and Score is",cor(exam_score_ext$Age, exam_score_ext$Score), "\n", "\n")
cat("Correlation between Age and Income is",cor(exam_score_ext$Age, exam_score_ext$Income), "\n", "\n")
cat("Correlation between Score and Income is",cor(exam_score_ext$Score, exam_score_ext$Income), "\n", "\n")

d) Selection of rows where the score is greater than or equal to 80

exam_score_ext[exam_score_ext$Score >= 80,]

e) Selection of age range form 20 to 30

exam_score_ext[exam_score_ext$Age >= 20 & exam_score_ext$Age <= 30,]
LS0tDQp0aXRsZTogIlIgQXNzaWdubWVudCAwMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyMgUXVlc3Rpb24gMDENCiMjIGEpIFNlcGFyYXRpb24gb2YgYWxsIHRoZSBzdHJpbmdzIGZyb20gZ2l2ZW4gc2VxdWVuY2VzIGFuZCBzdG9yaW5nIGluIGEgdmFyaWFibGUg4oCcZ2VuZV9zZXFz4oCdDQpgYGB7cn0NCkROQSA9ICJBVENHQVRDR0FUQ0ctQVRDR0FULUNHQVRDLUdBVENHQVQtQ0dBVENHLUFUQ0dBVENHLUNHQVRDRyINCmdlbmVfc2VxcyA9IHN0cnNwbGl0KEROQSwgIi0iKQ0KcHJpbnQoZ2VuZV9zZXFzKQ0KDQoNCmBgYCANCg0KIyMgYikgUmV2ZXJzaW9uIG9mIGFsbCB0aGUgc3RyaW5ncyBpbiBnZW5lX3NlcXMgdXNpbmcgbG9vcA0KYGBge3J9DQpnZW5lX3NlcXMgPSB1bmxpc3QoZ2VuZV9zZXFzKSAgICMgY29udmVydGluZyBsaXN0IGludG8gdmVjdG9yDQppcy52ZWN0b3IoZ2VuZV9zZXFzKSAgIyBjaGVja2luZyBpZiBjb252ZXJzaW9uIGlzIHN1Y2Nlc3NmdWwgb3Igbm90DQpsZW5ndGgoZ2VuZV9zZXFzKSAjIGNoZWNraW5nIHRvdGFsIG51bWJlciBvZiBzdHJpbmdzIGluIHRoZSBzZXF1ZW5jZSAgDQoNCmxpYnJhcnkoc3RyaW5naSkNCg0KZm9yIChpIGluIDE6Nykgew0KY2F0KCJUaGUgcmV2ZXJzZSBvZiBzdHJpbmciLCBpLHN0cmlfcmV2ZXJzZShnZW5lX3NlcXNbaV0pLCAiXG4iKSAgDQp9DQoNCmBgYA0KDQoNCiMjIGMpIENhbGN1bGF0aW9uIG9mIGxlbmd0aCBvZiBlYWNoIHN0cmluZyBpbiBnZW5lX3NlcXMgdXNpbmcgbG9vcA0KYGBge3J9DQpmb3IgKGkgaW4gMTo3KSB7DQpjYXQoIlRvdGFsIGNoYXJhY3RlciBpbiBzdHJpbmciLGkgLCJpcyIsIG5jaGFyKGdlbmVfc2Vxc1tpXSksICJcbiIpDQp9DQpgYGANCg0KDQoNCiMjIGQpIFVzaW5nIGxvb3AgYW5kIGNvbmRpdGlvbg0KYGBge3J9DQpmb3IgKGkgaW4gMTo3KSB7DQppZiAobmNoYXIoZ2VuZV9zZXFzW2ldKSA+IDcpIHsNCiAgICBjYXQoIkNoYXJhY3RlciBudW1iZXJzIG9mIHN0cmluZyIsIGksICJpcyBncmVhdGVyIHRoYW4gNy4iLCAiU3VjY2Vzc2Z1bCBcbiIsICJcbiIsICJcbiIpDQogIH0gZWxzZSB7DQogICAgY2F0KCJDaGFyYWN0ZXIgbnVtYmVycyBvZiBzdHJpbmciLCBpLCAiaXMgbG93ZXIgdGhhbiA3LiIsICJFcnJvciIsICJcbiIsICJcbiIsICJcbiIpDQogIH0NCn0NCmBgYA0KDQoNCg0KDQojIyBlKSBGaW5kaW5nIGxvY2F0aW9ucyBhbmQgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4g4oCcR0FUQ+KAnSBpbiBlYWNoIHN0cmluZyBvZiBnZW5lX3NlcXMNCmBgYHtyfQ0KZm9yIChpIGluIDE6Nykgew0KcGF0dGVybiA9ICJHQVRDIg0KICAgIGxvY2F0aW9ucyA9IGdyZWdleHByKHBhdHRlcm4sIGdlbmVfc2Vxc1tpXSkNCiAgbG9jYXRpb25zID0gdW5saXN0KGxvY2F0aW9ucykNCiBjYXQoIkxvY2F0aW9uIG9mIHBhdHRlcm4gR0FUQyBpbiB0aGUgU3RyaW5nIG51bWJlciIsaSwgImlzIiwgbG9jYXRpb25zLCAiXG4iKQ0KIG51bV9vY2MgPSBzdW0obG9jYXRpb25zICE9IC0xKQ0KIGNhdCgiTnVtYmVyIG9mIG9jY3VyZW5jZXMgb2YgcGF0dGVybiBHQVRDIGluIHN0cmluZyBudW1iZXIiLCBpLCAiaXMiLCBudW1fb2NjLCAiXG4iLCAiXG4iLCAiXG4iKQ0KfQ0KICANCmBgYA0KDQoNCg0KDQoNCiMjIEJvbnVzOiBTb2x2aW5nIGIgdG8gZSB1c2luZyBhIHNpbmdsZSBsb29wDQpgYGB7cn0NCmxpYnJhcnkoc3RyaW5naSkNCmZvciAoaSBpbiAxOjcpIHsNCnBhdHRlcm4gPSAiR0FUQyINCiAgICBsb2NhdGlvbnMgPSBncmVnZXhwcihwYXR0ZXJuLCBnZW5lX3NlcXNbaV0pDQogIGxvY2F0aW9ucyA9IHVubGlzdChsb2NhdGlvbnMpDQogY2F0KCJMb2NhdGlvbiBvZiBwYXR0ZXJuIEdBVEMgaW4gdGhlIFN0cmluZyBudW1iZXIiLGksICJpcyIsIGxvY2F0aW9ucywgIlxuIikNCiBudW1fb2NjID0gc3VtKGxvY2F0aW9ucyAhPSAtMSkNCiBjYXQoIk51bWJlciBvZiBvY2N1cmVuY2VzIG9mIHN0cmluZyBudW1iZXIiLCBpLCAiaXMiLCBudW1fb2NjLCAiXG4iKQ0KICBjYXQoIlRvdGFsIGNoYXJhY3RlciBpbiBzdHJpbmciLGkgLCJpcyIsIG5jaGFyKGdlbmVfc2Vxc1tpXSksICJcbiIpICANCmNhdCgiVGhlIHJldmVyc2Ugb2Ygc3RyaW5nIiwgaSxzdHJpX3JldmVyc2UoZ2VuZV9zZXFzW2ldKSwgIlxuIikgIA0KICBpZiAobmNoYXIoZ2VuZV9zZXFzW2ldKSA+IDcpIHsNCiAgICBjYXQoIkNoYXJhY3RlciBudW1iZXJzIG9mIHN0cmluZyIsIGksICJpcyBncmVhdGVyIHRoYW4gNy4iLCAiU3VjY2Vzc2Z1bCBcbiIsICJcbiIsICJcbiIpDQogIH0gDQogIGVsc2Ugew0KICAgIGNhdCgiQ2hhcmFjdGVyIG51bWJlcnMgb2Ygc3RyaW5nIiwgaSwgImlzIGxvd2VyIHRoYW4gNy4iLCAiRXJyb3IiLCAiXG4iLCAiXG4iLCAiXG4iKQ0KICAgIA0KICB9DQp9DQoNCg0KYGBgDQoNCg0KIyBRdWVzdGlvbiAwMg0KIyMgYSkgQ3JlYXRpb24gb2YgZGF0YWZyYW1lIGFuZCBhZGRpdGlvbiBvZiB0d28gcm93cyBhbmQgYSAiSW5jb21lIiBjb2x1bW4gd2l0aCBudW1lcmljYWwgdmFsdWVzDQpgYGB7cn0NCmV4YW1fc2NvcmUgPSBkYXRhLmZyYW1lKA0KICBJRCA9IGMoMSwgMiwgMywgNCwgNSksDQogIE5hbWUgPSBjKCJBbGljZSIsICJCb2IiLCAiRGF2aWQiLCAiSm9obiIsICJKZW5ueSIpLA0KICBBZ2UgPSBjKDIwLCAyNSwgMzAsIDIyLCAxOCksDQogIFNjb3JlID0gYygxMDAsIDc4LCA5MCwgNTUsIDgxKQ0KKQ0KcHJpbnQoZXhhbV9zY29yZSkNCg0KbmV3X3JvdzEgPSBjKDYsICJNYWdudXMiLCAyNSwgOTkpDQpuZXdfcm93MiA9IGMoNywgIkhpa2FydSIsIDI0LCA5NikNCg0KSW5jb21lPSBjKDQ1MDAsIDQ4MDAsIDYyMDAsIDY1MDAsIDcxMDAsIDk5MDAsIDg1MDApDQoNCmV4YW1fc2NvcmVfbmV3ID0gcmJpbmQoZXhhbV9zY29yZSwgbmV3X3JvdzEsIG5ld19yb3cyKSAgICMgYWRkaXRpb24gb2YgMiByb3dzDQpleGFtX3Njb3JlX2V4dCA9IGNiaW5kKGV4YW1fc2NvcmVfbmV3LCBJbmNvbWUpICAgICAjIGFkZGl0aW9uIG9mIGEgY29sdW1uDQpwcmludChleGFtX3Njb3JlX2V4dCkNCg0KZXhhbV9zY29yZV9leHQkQWdlPSBhcy5udW1lcmljKGV4YW1fc2NvcmVfZXh0JEFnZSkgICMgY29udmVyc2lvbiBpbnRvIG51bWVyaWNhbCB2YWx1ZXMNCmV4YW1fc2NvcmVfZXh0JFNjb3JlPSBhcy5udW1lcmljKGV4YW1fc2NvcmVfZXh0JFNjb3JlKQ0KZXhhbV9zY29yZV9leHQkSW5jb21lPSBhcy5udW1lcmljKGV4YW1fc2NvcmVfZXh0JEluY29tZSkNCg0KcHJpbnQoZXhhbV9zY29yZV9leHQpDQoNCmBgYA0KDQojIyBiKSBBcml0aG1ldGljIE9wZXJhdGlvbiBpbiBBZ2UsIFNjb3JlIGFuZCBJbmNvbWUgQ29sdW1uDQpgYGB7cn0NCmNhdCgiTWF4IFZhbHVlIG9mIEFnZSIsICJpcyIsbWF4KGV4YW1fc2NvcmVfZXh0JEFnZSksICJcbiIpDQpjYXQoIk1pbiBWYWx1ZSBvZiBBZ2UiLCAiaXMiLG1pbihleGFtX3Njb3JlX2V4dCRBZ2UpLCAiXG4iKQ0KY2F0KCJNZWRpYW4gVmFsdWUgb2YgQWdlIiwgImlzIixtZWRpYW4oZXhhbV9zY29yZV9leHQkQWdlKSwgIlxuIikNCmNhdCgiU3VtbWF0aW9uIG9mIEFnZSIsICJpcyIsc3VtKGV4YW1fc2NvcmVfZXh0JEFnZSksICJcbiIpDQpjYXQoIk1lYW4gVmFsdWUgb2YgQWdlIiwgImlzIixtZWFuKGV4YW1fc2NvcmVfZXh0JEFnZSksICJcbiIpDQpjYXQoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiBBZ2UiLCAiaXMiLCBzZChleGFtX3Njb3JlX2V4dCRBZ2UpLCAiXG4iKQ0KY2F0KCJWYXJpYW5jZSBvZiBBZ2UiLCAiaXMiLHZhcihleGFtX3Njb3JlX2V4dCRBZ2UpLCAiXG4iKQ0KY2F0KCJRdWFudGlsZSBWYWx1ZSBvZiBBZ2UiLCAiaXMiLCBxdWFudGlsZShleGFtX3Njb3JlX2V4dCRBZ2UpLCAiXG4iLCAiXG4iLCAiXG4iKQ0KDQoNCg0KY2F0KCJNYXggVmFsdWUgb2YgU2NvcmUiLCAiaXMiLG1heChleGFtX3Njb3JlX2V4dCRTY29yZSksICJcbiIpDQpjYXQoIk1pbiBWYWx1ZSBvZiBTY29yZSIsICJpcyIsbWluKGV4YW1fc2NvcmVfZXh0JFNjb3JlKSwgIlxuIikNCmNhdCgiTWVkaWFuIFZhbHVlIG9mIFNjb3JlIiwgImlzIixtZWRpYW4oZXhhbV9zY29yZV9leHQkU2NvcmUpLCAiXG4iKQ0KY2F0KCJTdW1tYXRpb24gb2YgU2NvcmUiLCAiaXMiLHN1bShleGFtX3Njb3JlX2V4dCRTY29yZSksICJcbiIpDQpjYXQoIk1lYW4gVmFsdWUgb2YgU2NvcmUiLCAiaXMiLG1lYW4oZXhhbV9zY29yZV9leHQkU2NvcmUpLCAiXG4iKQ0KY2F0KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgU2NvcmUiLCAiaXMiLCBzZChleGFtX3Njb3JlX2V4dCRTY29yZSksICJcbiIpDQpjYXQoIlZhcmlhbmNlIG9mIFNjb3JlIiwgImlzIix2YXIoZXhhbV9zY29yZV9leHQkU2NvcmUpLCAiXG4iKQ0KY2F0KCJRdWFudGlsZSBWYWx1ZSBvZiBTY29yZSIsICJpcyIsIHF1YW50aWxlKGV4YW1fc2NvcmVfZXh0JFNjb3JlKSwgIlxuIiwgIlxuIiwgIlxuIikNCg0KDQpjYXQoIk1heCBWYWx1ZSBvZiBJbmNvbWUiLCAiaXMiLG1heChleGFtX3Njb3JlX2V4dCRJbmNvbWUpLCAiXG4iKQ0KY2F0KCJNaW4gVmFsdWUgb2YgSW5jb21lIiwgImlzIixtaW4oZXhhbV9zY29yZV9leHQkSW5jb21lKSwgIlxuIikNCmNhdCgiTWVkaWFuIFZhbHVlIG9mIEluY29tZSIsICJpcyIsbWVkaWFuKGV4YW1fc2NvcmVfZXh0JEluY29tZSksICJcbiIpDQpjYXQoIlN1bW1hdGlvbiBvZiBJbmNvbWUiLCAiaXMiLHN1bShleGFtX3Njb3JlX2V4dCRJbmNvbWUpLCAiXG4iKQ0KY2F0KCJNZWFuIFZhbHVlIG9mIEluY29tZSIsICJpcyIsbWVhbihleGFtX3Njb3JlX2V4dCRJbmNvbWUpLCAiXG4iKQ0KY2F0KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgSW5jb21lIiwgImlzIiwgc2QoZXhhbV9zY29yZV9leHQkSW5jb21lKSwgIlxuIikNCmNhdCgiVmFyaWFuY2Ugb2YgSW5jb21lIiwgImlzIix2YXIoZXhhbV9zY29yZV9leHQkSW5jb21lKSwgIlxuIikNCmNhdCgiUXVhbnRpbGUgVmFsdWUgb2YgSW5jb21lIiwgImlzIiwgcXVhbnRpbGUoZXhhbV9zY29yZV9leHQkSW5jb21lKSwgIlxuIikNCg0KYGBgDQoNCg0KIyMgYikgQXJpdGhtZXRpYyBPcGVyYXRpb24gaW4gQWdlLCBTY29yZSBhbmQgSW5jb21lIENvbHVtbiB1c2luZyBsb29wDQojIyMjIEhlcmUsIENvbHVtbiAxLDIgYW5kIDMgZGVub3RlIEFnZSwgU2NvcmUgYW5kIEluY29tZSByZXNwZWN0aXZlbHkNCmBgYHtyfQ0KeD0gZGF0YS5mcmFtZShleGFtX3Njb3JlX2V4dCRBZ2UsIGV4YW1fc2NvcmVfZXh0JFNjb3JlLCBleGFtX3Njb3JlX2V4dCRJbmNvbWUpDQpwcmludCh4KQ0KZm9yKGkgaW4gMTozKXsNCmNhdCgiTWF4IG9mIGNvbHVtbiIsaSwgImlzIixtYXgoeFsxOjcsaV0pLCAiXG4iKQ0KICANCmNhdCgiTWluIG9mIGNvbHVtbiIsaSwgImlzIixtaW4oeFsxOjcsaV0pLCAiXG4iKQ0KDQpjYXQoIk1lZGlhbiBvZiBjb2x1bW4iLGksICJpcyIsbWVkaWFuKHhbMTo3LGldKSwgIlxuIikNCmNhdCgiU3VtIG9mIGNvbHVtbiIsaSwgImlzIixzdW0oeFsxOjcsaV0pLCAiXG4iKQ0KY2F0KCJNZWFuIG9mIGNvbHVtbiIsaSwgImlzIixtZWFuKHhbMTo3LGldKSwgIlxuIikNCmNhdCgiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIGNvbHVtbiIsaSwgImlzIixzZCh4WzE6NyxpXSksICJcbiIpDQpjYXQoIlZhcmlhbmNlIG9mIGNvbHVtbiIsaSwgImlzIix2YXIoeFsxOjcsaV0pLCAiXG4iKQ0KY2F0KCJRdWFudGlsZXMgb2YgY29sdW1uIixpLCAiaXMiLHF1YW50aWxlKHhbMTo3LGldKSwgIlxuIiwiXG4iLCJcbiIpDQoNCn0NCg0KYGBgDQoNCiMjIGMpIEZpbmRpbmcgQ29ycmVsYXRpb24gYW1vbmcgQWdlLCBTY29yZSBhbmQgSW5jb21lDQpgYGB7cn0NCmNhdCgiQ29ycmVsYXRpb24gYmV0d2VlbiBBZ2UgYW5kIFNjb3JlIGlzIixjb3IoZXhhbV9zY29yZV9leHQkQWdlLCBleGFtX3Njb3JlX2V4dCRTY29yZSksICJcbiIsICJcbiIpDQpjYXQoIkNvcnJlbGF0aW9uIGJldHdlZW4gQWdlIGFuZCBJbmNvbWUgaXMiLGNvcihleGFtX3Njb3JlX2V4dCRBZ2UsIGV4YW1fc2NvcmVfZXh0JEluY29tZSksICJcbiIsICJcbiIpDQpjYXQoIkNvcnJlbGF0aW9uIGJldHdlZW4gU2NvcmUgYW5kIEluY29tZSBpcyIsY29yKGV4YW1fc2NvcmVfZXh0JFNjb3JlLCBleGFtX3Njb3JlX2V4dCRJbmNvbWUpLCAiXG4iLCAiXG4iKQ0KDQpgYGANCg0KDQojIyBkKSBTZWxlY3Rpb24gb2Ygcm93cyB3aGVyZSB0aGUgc2NvcmUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDgwDQpgYGB7cn0NCmV4YW1fc2NvcmVfZXh0W2V4YW1fc2NvcmVfZXh0JFNjb3JlID49IDgwLF0NCmBgYA0KDQojIyBlKSBTZWxlY3Rpb24gb2YgYWdlIHJhbmdlIGZvcm0gMjAgdG8gMzANCmBgYHtyfQ0KZXhhbV9zY29yZV9leHRbZXhhbV9zY29yZV9leHQkQWdlID49IDIwICYgZXhhbV9zY29yZV9leHQkQWdlIDw9IDMwLF0NCmBgYA0KDQoNCg==